Fixes batch
This commit is contained in:
@@ -165,13 +165,14 @@ class AutoFixService : CoroutineIntentService() {
|
||||
} else {
|
||||
error.getDisplayMessage(applicationContext.resources)
|
||||
},
|
||||
)
|
||||
.setSmallIcon(android.R.drawable.stat_notify_error)
|
||||
.addAction(
|
||||
).setSmallIcon(android.R.drawable.stat_notify_error)
|
||||
ErrorReporterReceiver.getPendingIntent(applicationContext, error)?.let { reportIntent ->
|
||||
notification.addAction(
|
||||
R.drawable.ic_alert_outline,
|
||||
applicationContext.getString(R.string.report),
|
||||
ErrorReporterReceiver.getPendingIntent(applicationContext, error),
|
||||
reportIntent,
|
||||
)
|
||||
}
|
||||
}
|
||||
return notification.build()
|
||||
}
|
||||
|
||||
@@ -5,9 +5,11 @@ import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.BadParcelableException
|
||||
import androidx.core.app.PendingIntentCompat
|
||||
import org.koitharu.kotatsu.BuildConfig
|
||||
import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat
|
||||
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
||||
import org.koitharu.kotatsu.core.util.ext.report
|
||||
|
||||
class ErrorReporterReceiver : BroadcastReceiver() {
|
||||
@@ -22,12 +24,15 @@ class ErrorReporterReceiver : BroadcastReceiver() {
|
||||
private const val EXTRA_ERROR = "err"
|
||||
private const val ACTION_REPORT = "${BuildConfig.APPLICATION_ID}.action.REPORT_ERROR"
|
||||
|
||||
fun getPendingIntent(context: Context, e: Throwable): PendingIntent {
|
||||
fun getPendingIntent(context: Context, e: Throwable): PendingIntent? = try {
|
||||
val intent = Intent(context, ErrorReporterReceiver::class.java)
|
||||
intent.setAction(ACTION_REPORT)
|
||||
intent.setData(Uri.parse("err://${e.hashCode()}"))
|
||||
intent.putExtra(EXTRA_ERROR, e)
|
||||
return checkNotNull(PendingIntentCompat.getBroadcast(context, 0, intent, 0, false))
|
||||
PendingIntentCompat.getBroadcast(context, 0, intent, 0, false)
|
||||
} catch (e: BadParcelableException) {
|
||||
e.printStackTraceDebug()
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import kotlinx.coroutines.flow.FlowCollector
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.koitharu.kotatsu.list.ui.adapter.ListItemType
|
||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||
import java.util.Collections
|
||||
import org.koitharu.kotatsu.parsers.util.move
|
||||
import java.util.LinkedList
|
||||
|
||||
open class ReorderableListAdapter<T : ListModel> : ListDelegationAdapter<List<T>>(), FlowCollector<List<T>?> {
|
||||
@@ -36,7 +36,9 @@ open class ReorderableListAdapter<T : ListModel> : ListDelegationAdapter<List<T>
|
||||
override fun setItems(items: List<T>?) = super.setItems(items)
|
||||
|
||||
fun reorderItems(oldPos: Int, newPos: Int) {
|
||||
Collections.swap(items ?: return, oldPos, newPos)
|
||||
val reordered = items?.toMutableList() ?: return
|
||||
reordered.move(oldPos, newPos)
|
||||
super.setItems(reordered)
|
||||
notifyItemMoved(oldPos, newPos)
|
||||
}
|
||||
|
||||
|
||||
@@ -213,13 +213,15 @@ class DownloadNotificationFactory @AssistedInject constructor(
|
||||
builder.setWhen(System.currentTimeMillis())
|
||||
builder.setStyle(NotificationCompat.BigTextStyle().bigText(state.errorMessage))
|
||||
if (state.error.isReportable()) {
|
||||
builder.addAction(
|
||||
NotificationCompat.Action(
|
||||
0,
|
||||
context.getString(R.string.report),
|
||||
ErrorReporterReceiver.getPendingIntent(context, state.error),
|
||||
),
|
||||
)
|
||||
ErrorReporterReceiver.getPendingIntent(context, state.error)?.let { reportIntent ->
|
||||
builder.addAction(
|
||||
NotificationCompat.Action(
|
||||
0,
|
||||
context.getString(R.string.report),
|
||||
reportIntent,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -139,11 +139,13 @@ class ImportService : CoroutineIntentService() {
|
||||
notification.setContentTitle(applicationContext.getString(R.string.error_occurred))
|
||||
.setContentText(error.getDisplayMessage(applicationContext.resources))
|
||||
.setSmallIcon(android.R.drawable.stat_notify_error)
|
||||
.addAction(
|
||||
ErrorReporterReceiver.getPendingIntent(applicationContext, error)?.let { reportIntent ->
|
||||
notification.addAction(
|
||||
R.drawable.ic_alert_outline,
|
||||
applicationContext.getString(R.string.report),
|
||||
ErrorReporterReceiver.getPendingIntent(applicationContext, error),
|
||||
reportIntent,
|
||||
)
|
||||
}
|
||||
}
|
||||
return notification.build()
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import androidx.core.graphics.Insets
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.core.view.updatePadding
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentFactory
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.fragment.app.commit
|
||||
import androidx.preference.Preference
|
||||
@@ -70,10 +71,12 @@ class SettingsActivity :
|
||||
caller: PreferenceFragmentCompat,
|
||||
pref: Preference,
|
||||
): Boolean {
|
||||
val fm = supportFragmentManager
|
||||
val fragment = fm.fragmentFactory.instantiate(classLoader, pref.fragment ?: return false)
|
||||
fragment.arguments = pref.extras
|
||||
openFragment(fragment, isFromRoot = caller is RootSettingsFragment)
|
||||
val fragmentName = pref.fragment ?: return false
|
||||
openFragment(
|
||||
fragmentClass = FragmentFactory.loadFragmentClass(classLoader, fragmentName),
|
||||
args = pref.peekExtras(),
|
||||
isFromRoot = caller is RootSettingsFragment,
|
||||
)
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -93,11 +96,11 @@ class SettingsActivity :
|
||||
} ?: setTitle(title ?: getString(R.string.settings))
|
||||
}
|
||||
|
||||
fun openFragment(fragment: Fragment, isFromRoot: Boolean) {
|
||||
fun openFragment(fragmentClass: Class<out Fragment>, args: Bundle?, isFromRoot: Boolean) {
|
||||
val hasFragment = supportFragmentManager.findFragmentById(R.id.container) != null
|
||||
supportFragmentManager.commit {
|
||||
setReorderingAllowed(true)
|
||||
replace(R.id.container, fragment)
|
||||
replace(R.id.container, fragmentClass, args)
|
||||
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
if (!isMasterDetails || (hasFragment && !isFromRoot)) {
|
||||
addToBackStack(null)
|
||||
|
||||
@@ -18,10 +18,13 @@ import org.koitharu.kotatsu.R
|
||||
import org.koitharu.kotatsu.core.db.TABLE_SOURCES
|
||||
import org.koitharu.kotatsu.core.model.getTitle
|
||||
import org.koitharu.kotatsu.core.model.isNsfw
|
||||
import org.koitharu.kotatsu.core.model.unwrap
|
||||
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||
import org.koitharu.kotatsu.core.util.ext.lifecycleScope
|
||||
import org.koitharu.kotatsu.explore.data.MangaSourcesRepository
|
||||
import org.koitharu.kotatsu.explore.data.SourcesSortOrder
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.util.mapToSet
|
||||
import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem
|
||||
import javax.inject.Inject
|
||||
|
||||
@@ -63,8 +66,8 @@ class SourcesListProducer @Inject constructor(
|
||||
}
|
||||
|
||||
private suspend fun buildList(): List<SourceConfigItem> {
|
||||
val enabledSources = repository.getEnabledSources()
|
||||
val pinned = repository.getPinnedSources()
|
||||
val enabledSources = repository.getEnabledSources().filter { it.unwrap() is MangaParserSource }
|
||||
val pinned = repository.getPinnedSources().mapToSet { it.name }
|
||||
val isNsfwDisabled = settings.isNsfwContentDisabled
|
||||
val isReorderAvailable = settings.sourcesSortOrder == SourcesSortOrder.MANUAL
|
||||
val withTip = isReorderAvailable && settings.isTipEnabled(TIP_REORDER)
|
||||
@@ -79,7 +82,7 @@ class SourcesListProducer @Inject constructor(
|
||||
isEnabled = it in enabledSet,
|
||||
isDraggable = false,
|
||||
isAvailable = !isNsfwDisabled || !it.isNsfw(),
|
||||
isPinned = it in pinned,
|
||||
isPinned = it.name in pinned,
|
||||
)
|
||||
}.ifEmpty {
|
||||
listOf(SourceConfigItem.EmptySearchResult)
|
||||
@@ -100,7 +103,7 @@ class SourcesListProducer @Inject constructor(
|
||||
isEnabled = true,
|
||||
isDraggable = isReorderAvailable,
|
||||
isAvailable = false,
|
||||
isPinned = it in pinned,
|
||||
isPinned = it.name in pinned,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,8 +106,11 @@ class SourcesManageFragment :
|
||||
}
|
||||
|
||||
override fun onItemSettingsClick(item: SourceConfigItem.SourceItem) {
|
||||
val fragment = SourceSettingsFragment.newInstance(item.source)
|
||||
(activity as? SettingsActivity)?.openFragment(fragment, false)
|
||||
(activity as? SettingsActivity)?.openFragment(
|
||||
fragmentClass = SourceSettingsFragment::class.java,
|
||||
args = Bundle(1).apply { putString(SourceSettingsFragment.EXTRA_SOURCE, item.source.name) },
|
||||
isFromRoot = false,
|
||||
)
|
||||
}
|
||||
|
||||
override fun onItemLiftClick(item: SourceConfigItem.SourceItem) {
|
||||
|
||||
Reference in New Issue
Block a user