mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Minor extension update cleanup, default to on
This commit is contained in:
		| @@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.data.library.LibraryUpdateJob | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||
| import eu.kanade.tachiyomi.data.updater.UpdaterJob | ||||
| import eu.kanade.tachiyomi.extension.ExtensionUpdateJob | ||||
| import java.io.File | ||||
|  | ||||
| object Migrations { | ||||
| @@ -27,6 +28,9 @@ object Migrations { | ||||
|                 if (BuildConfig.INCLUDE_UPDATER && preferences.automaticUpdates()) { | ||||
|                     UpdaterJob.setupTask(context) | ||||
|                 } | ||||
|                 if (preferences.automaticExtUpdates().getOrDefault()) { | ||||
|                     ExtensionUpdateJob.setupTask(context) | ||||
|                 } | ||||
|                 return false | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -26,7 +26,7 @@ class BackupCreatorJob(private val context: Context, workerParams: WorkerParamet | ||||
|     } | ||||
|  | ||||
|     companion object { | ||||
|         const val TAG = "BackupCreator" | ||||
|         private const val TAG = "BackupCreator" | ||||
|  | ||||
|         fun setupTask(context: Context, prefInterval: Int? = null) { | ||||
|             val preferences = Injekt.get<PreferencesHelper>() | ||||
|   | ||||
| @@ -23,7 +23,7 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet | ||||
|     } | ||||
|  | ||||
|     companion object { | ||||
|         const val TAG = "LibraryUpdate" | ||||
|         private const val TAG = "LibraryUpdate" | ||||
|  | ||||
|         fun setupTask(context: Context, prefInterval: Int? = null) { | ||||
|             val preferences = Injekt.get<PreferencesHelper>() | ||||
|   | ||||
| @@ -410,11 +410,9 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|         internal fun markAsReadPendingBroadcast( | ||||
|             context: Context, | ||||
|             manga: Manga, | ||||
|             chapters: | ||||
|                     Array<Chapter>, | ||||
|             chapters: Array<Chapter>, | ||||
|             groupId: Int | ||||
|         ): | ||||
|                 PendingIntent { | ||||
|         ): PendingIntent { | ||||
|             val newIntent = Intent(context, NotificationReceiver::class.java).apply { | ||||
|                 action = ACTION_MARK_AS_READ | ||||
|                 putExtra(EXTRA_CHAPTER_URL, chapters.map { it.url }.toTypedArray()) | ||||
| @@ -442,14 +440,14 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|          * Returns [PendingIntent] that opens the extensions controller. | ||||
|          * | ||||
|          * @param context context of application | ||||
|          * @return [PendingIntent] | ||||
|          */ | ||||
|         internal fun openExtensionsPendingActivity(context: Context): PendingIntent { | ||||
|             val newIntent = | ||||
|                 Intent(context, MainActivity::class.java).setAction(MainActivity.SHORTCUT_EXTENSIONS) | ||||
|                     .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) | ||||
|             return PendingIntent.getActivity( | ||||
|                 context, 0, newIntent, PendingIntent.FLAG_UPDATE_CURRENT | ||||
|             ) | ||||
|             val intent = Intent(context, MainActivity::class.java).apply { | ||||
|                 action = MainActivity.SHORTCUT_EXTENSIONS | ||||
|                 addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) | ||||
|             } | ||||
|             return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -190,7 +190,7 @@ class PreferencesHelper(val context: Context) { | ||||
|  | ||||
|     fun automaticUpdates() = prefs.getBoolean(Keys.automaticUpdates, true) | ||||
|  | ||||
|     fun automaticExtUpdates() = rxPrefs.getBoolean(Keys.automaticExtUpdates, false) | ||||
|     fun automaticExtUpdates() = rxPrefs.getBoolean(Keys.automaticExtUpdates, true) | ||||
|  | ||||
|     fun extensionUpdatesCount() = rxPrefs.getInteger("ext_updates_count", 0) | ||||
|  | ||||
|   | ||||
| @@ -55,7 +55,7 @@ class UpdaterJob(private val context: Context, workerParams: WorkerParameters) : | ||||
|     } | ||||
|  | ||||
|     companion object { | ||||
|         const val TAG = "UpdateChecker" | ||||
|         private const val TAG = "UpdateChecker" | ||||
|  | ||||
|         fun setupTask(context: Context) { | ||||
|             val constraints = Constraints.Builder() | ||||
|   | ||||
| @@ -187,7 +187,7 @@ class ExtensionManager( | ||||
|         if (changed) { | ||||
|             installedExtensions = mutInstalledExtensions | ||||
|         } | ||||
|         preferences.extensionUpdatesCount().set(installedExtensions.count { it.hasUpdate }) | ||||
|         updatePendingUpdatesCount() | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -318,12 +318,12 @@ class ExtensionManager( | ||||
|  | ||||
|         override fun onExtensionInstalled(extension: Extension.Installed) { | ||||
|             registerNewExtension(extension.withUpdateCheck()) | ||||
|             preferences.extensionUpdatesCount().set(installedExtensions.count { it.hasUpdate }) | ||||
|             updatePendingUpdatesCount() | ||||
|         } | ||||
|  | ||||
|         override fun onExtensionUpdated(extension: Extension.Installed) { | ||||
|             registerUpdatedExtension(extension.withUpdateCheck()) | ||||
|             preferences.extensionUpdatesCount().set(installedExtensions.count { it.hasUpdate }) | ||||
|             updatePendingUpdatesCount() | ||||
|         } | ||||
|  | ||||
|         override fun onExtensionUntrusted(extension: Extension.Untrusted) { | ||||
| @@ -332,7 +332,7 @@ class ExtensionManager( | ||||
|  | ||||
|         override fun onPackageUninstalled(pkgName: String) { | ||||
|             unregisterExtension(pkgName) | ||||
|             preferences.extensionUpdatesCount().set(installedExtensions.count { it.hasUpdate }) | ||||
|             updatePendingUpdatesCount() | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -346,4 +346,8 @@ class ExtensionManager( | ||||
|         } | ||||
|         return this | ||||
|     } | ||||
|  | ||||
|     private fun updatePendingUpdatesCount() { | ||||
|         preferences.extensionUpdatesCount().set(installedExtensions.count { it.hasUpdate }) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -31,36 +31,37 @@ class ExtensionUpdateJob(private val context: Context, workerParams: WorkerParam | ||||
|         } catch (e: Exception) { | ||||
|             return@coroutineScope Result.failure() | ||||
|         } | ||||
|  | ||||
|         if (pendingUpdates.isNotEmpty()) { | ||||
|             val names = pendingUpdates.map { it.name } | ||||
|             NotificationManagerCompat.from(context).apply { | ||||
|                 notify(Notifications.ID_UPDATES_TO_EXTS, | ||||
|                     context.notification(Notifications.CHANNEL_UPDATES_TO_EXTS) { | ||||
|                         setContentTitle( | ||||
|                             context.resources.getQuantityString( | ||||
|                                 R.plurals.update_check_notification_ext_updates, | ||||
|                                 names.size, | ||||
|                                 names.size | ||||
|                             ) | ||||
|                         ) | ||||
|                         val extNames = names.joinToString(", ") | ||||
|                         setContentText(extNames) | ||||
|                         setStyle(NotificationCompat.BigTextStyle().bigText(extNames)) | ||||
|                         setSmallIcon(R.drawable.ic_extension_24dp) | ||||
|                         setContentIntent( | ||||
|                             NotificationReceiver.openExtensionsPendingActivity( | ||||
|                                 context | ||||
|                             ) | ||||
|                         ) | ||||
|                         setAutoCancel(true) | ||||
|                     }) | ||||
|             } | ||||
|             createUpdateNotification(pendingUpdates.map { it.name }) | ||||
|         } | ||||
|  | ||||
|         Result.success() | ||||
|     } | ||||
|  | ||||
|     private fun createUpdateNotification(names: List<String>) { | ||||
|         NotificationManagerCompat.from(context).apply { | ||||
|             notify(Notifications.ID_UPDATES_TO_EXTS, | ||||
|                 context.notification(Notifications.CHANNEL_UPDATES_TO_EXTS) { | ||||
|                     setContentTitle( | ||||
|                         context.resources.getQuantityString( | ||||
|                             R.plurals.update_check_notification_ext_updates, | ||||
|                             names.size, | ||||
|                             names.size | ||||
|                         ) | ||||
|                     ) | ||||
|                     val extNames = names.joinToString(", ") | ||||
|                     setContentText(extNames) | ||||
|                     setStyle(NotificationCompat.BigTextStyle().bigText(extNames)) | ||||
|                     setSmallIcon(R.drawable.ic_extension_24dp) | ||||
|                     setContentIntent(NotificationReceiver.openExtensionsPendingActivity(context)) | ||||
|                     setAutoCancel(true) | ||||
|                 }) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     companion object { | ||||
|         const val TAG = "ExtensionUpdate" | ||||
|         private const val TAG = "ExtensionUpdate" | ||||
|  | ||||
|         fun setupTask(context: Context, forceAutoUpdateJob: Boolean? = null) { | ||||
|             val preferences = Injekt.get<PreferencesHelper>() | ||||
|   | ||||
| @@ -7,12 +7,14 @@ import com.github.salomonbrys.kotson.int | ||||
| import com.github.salomonbrys.kotson.string | ||||
| import com.google.gson.Gson | ||||
| import com.google.gson.JsonArray | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.extension.model.Extension | ||||
| import eu.kanade.tachiyomi.extension.model.LoadResult | ||||
| import eu.kanade.tachiyomi.extension.util.ExtensionLoader | ||||
| import eu.kanade.tachiyomi.network.GET | ||||
| import eu.kanade.tachiyomi.network.NetworkHelper | ||||
| import eu.kanade.tachiyomi.network.await | ||||
| import java.util.Date | ||||
| import kotlinx.coroutines.Dispatchers | ||||
| import kotlinx.coroutines.withContext | ||||
| import okhttp3.Response | ||||
| @@ -21,6 +23,7 @@ import uy.kohesive.injekt.injectLazy | ||||
| internal class ExtensionGithubApi { | ||||
|  | ||||
|     private val network: NetworkHelper by injectLazy() | ||||
|     private val preferences: PreferencesHelper by injectLazy() | ||||
|  | ||||
|     private val gson: Gson by injectLazy() | ||||
|  | ||||
| @@ -33,23 +36,29 @@ internal class ExtensionGithubApi { | ||||
|     } | ||||
|  | ||||
|     suspend fun checkForUpdates(context: Context): List<Extension.Installed> { | ||||
|         val call = GET(EXT_URL) | ||||
|  | ||||
|         return withContext(Dispatchers.IO) { | ||||
|             val call = GET(EXT_URL) | ||||
|             val response = network.client.newCall(call).await() | ||||
|  | ||||
|             preferences.lastExtCheck().set(Date().time) | ||||
|  | ||||
|             if (response.isSuccessful) { | ||||
|                 val extensions = parseResponse(response) | ||||
|                 val extensionsWithUpdate = mutableListOf<Extension.Installed>() | ||||
|  | ||||
|                 val installedExtensions = ExtensionLoader.loadExtensions(context) | ||||
|                     .filterIsInstance<LoadResult.Success>() | ||||
|                     .map { it.extension } | ||||
|  | ||||
|                 val extensionsWithUpdate = mutableListOf<Extension.Installed>() | ||||
|                 for (installedExt in installedExtensions) { | ||||
|                     val pkgName = installedExt.pkgName | ||||
|                     val availableExt = extensions.find { it.pkgName == pkgName } ?: continue | ||||
|  | ||||
|                     val hasUpdate = availableExt.versionCode > installedExt.versionCode | ||||
|                     if (hasUpdate) extensionsWithUpdate.add(installedExt) | ||||
|                     if (hasUpdate) { | ||||
|                         extensionsWithUpdate.add(installedExt) | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 extensionsWithUpdate | ||||
|   | ||||
| @@ -36,6 +36,8 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(), | ||||
|         FlexibleAdapter.OnItemLongClickListener, | ||||
|         ExtensionTrustDialog.Listener { | ||||
|  | ||||
|     private val preferences: PreferencesHelper = Injekt.get() | ||||
|  | ||||
|     /** | ||||
|      * Adapter containing the list of manga from the catalogue. | ||||
|      */ | ||||
| @@ -92,7 +94,6 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(), | ||||
|             } | ||||
|             R.id.action_auto_check -> { | ||||
|                 item.isChecked = !item.isChecked | ||||
|                 val preferences: PreferencesHelper = Injekt.get() | ||||
|                 preferences.automaticExtUpdates().set(item.isChecked) | ||||
|                 ExtensionUpdateJob.setupTask(activity!!, item.isChecked) | ||||
|             } | ||||
| @@ -150,9 +151,7 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(), | ||||
|         // Fixes problem with the overflow icon showing up in lieu of search | ||||
|         searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() }) | ||||
|  | ||||
|         val autoItem = menu.findItem(R.id.action_auto_check) | ||||
|         val preferences: PreferencesHelper = Injekt.get() | ||||
|         autoItem.isChecked = preferences.automaticExtUpdates().getOrDefault() | ||||
|         menu.findItem(R.id.action_auto_check).isChecked = preferences.automaticExtUpdates().getOrDefault() | ||||
|     } | ||||
|  | ||||
|     override fun onItemClick(view: View, position: Int): Boolean { | ||||
|   | ||||
| @@ -13,7 +13,6 @@ import com.bluelinelabs.conductor.RouterTransaction | ||||
| import eu.kanade.tachiyomi.Migrations | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.notification.NotificationReceiver | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||
| import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi | ||||
| import eu.kanade.tachiyomi.ui.base.activity.BaseActivity | ||||
| @@ -39,7 +38,6 @@ import kotlinx.coroutines.Dispatchers | ||||
| import kotlinx.coroutines.GlobalScope | ||||
| import kotlinx.coroutines.launch | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| class MainActivity : BaseActivity() { | ||||
|  | ||||
| @@ -152,33 +150,33 @@ class MainActivity : BaseActivity() { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun setExtensionsBadge() { | ||||
|         val updates = preferences.extensionUpdatesCount().getOrDefault() | ||||
|         if (updates > 0) { | ||||
|             val badge = bottom_nav.getOrCreateBadge(R.id.nav_more) | ||||
|             badge.number = updates | ||||
|         } else { | ||||
|             bottom_nav.removeBadge(R.id.nav_more) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     override fun onResume() { | ||||
|         super.onResume() | ||||
|         getExtensionUpdates() | ||||
|     } | ||||
|  | ||||
|     private fun setExtensionsBadge() { | ||||
|         val updates = preferences.extensionUpdatesCount().getOrDefault() | ||||
|         if (updates > 0) { | ||||
|             bottom_nav.getOrCreateBadge(R.id.nav_more).number = updates | ||||
|         } else { | ||||
|             bottom_nav.removeBadge(R.id.nav_more) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun getExtensionUpdates() { | ||||
|         if (Date().time >= preferences.lastExtCheck().getOrDefault() + | ||||
|             TimeUnit.HOURS.toMillis(2)) { | ||||
|             GlobalScope.launch(Dispatchers.IO) { | ||||
|                 val preferences: PreferencesHelper by injectLazy() | ||||
|                 try { | ||||
|                     val pendingUpdates = ExtensionGithubApi().checkForUpdates(this@MainActivity) | ||||
|                     preferences.extensionUpdatesCount().set(pendingUpdates.size) | ||||
|                     preferences.lastExtCheck().set(Date().time) | ||||
|                 } catch (e: java.lang.Exception) { | ||||
|                     Timber.e(e) | ||||
|                 } | ||||
|         // Limit checks to once every 2 hours at most | ||||
|         val now = Date().time | ||||
|         if (now < preferences.lastExtCheck().getOrDefault() + TimeUnit.HOURS.toMillis(2)) { | ||||
|             return | ||||
|         } | ||||
|  | ||||
|         GlobalScope.launch(Dispatchers.IO) { | ||||
|             try { | ||||
|                 val pendingUpdates = ExtensionGithubApi().checkForUpdates(this@MainActivity) | ||||
|                 preferences.extensionUpdatesCount().set(pendingUpdates.size) | ||||
|             } catch (e: Exception) { | ||||
|                 Timber.e(e) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -2,6 +2,8 @@ package eu.kanade.tachiyomi.ui.more | ||||
|  | ||||
| import androidx.preference.PreferenceScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||
| import eu.kanade.tachiyomi.ui.base.controller.RootController | ||||
| import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction | ||||
| import eu.kanade.tachiyomi.ui.download.DownloadController | ||||
| @@ -9,7 +11,7 @@ import eu.kanade.tachiyomi.ui.extension.ExtensionController | ||||
| import eu.kanade.tachiyomi.ui.migration.MigrationController | ||||
| import eu.kanade.tachiyomi.ui.setting.SettingsController | ||||
| import eu.kanade.tachiyomi.ui.setting.SettingsMainController | ||||
| import eu.kanade.tachiyomi.util.preference.extensionPreference | ||||
| import eu.kanade.tachiyomi.util.preference.badgePreference | ||||
| import eu.kanade.tachiyomi.util.preference.iconRes | ||||
| import eu.kanade.tachiyomi.util.preference.iconTint | ||||
| import eu.kanade.tachiyomi.util.preference.onClick | ||||
| @@ -18,6 +20,8 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.util.system.getResourceColor | ||||
| import eu.kanade.tachiyomi.util.system.openInBrowser | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
|  | ||||
| class MoreController : SettingsController(), RootController { | ||||
|  | ||||
| @@ -26,10 +30,11 @@ class MoreController : SettingsController(), RootController { | ||||
|  | ||||
|         val tintColor = context.getResourceColor(R.attr.colorAccent) | ||||
|  | ||||
|         extensionPreference { | ||||
|         badgePreference { | ||||
|             titleRes = R.string.label_extensions | ||||
|             iconRes = R.drawable.ic_extension_24dp | ||||
|             iconTint = tintColor | ||||
|             setBadge(Injekt.get<PreferencesHelper>().extensionUpdatesCount().getOrDefault()) | ||||
|             onClick { | ||||
|                 router.pushController(ExtensionController().withFadeTransaction()) | ||||
|             } | ||||
|   | ||||
| @@ -13,7 +13,7 @@ import androidx.preference.PreferenceManager | ||||
| import androidx.preference.PreferenceScreen | ||||
| import androidx.preference.SwitchPreferenceCompat | ||||
| import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat | ||||
| import eu.kanade.tachiyomi.widget.preference.ExtensionPreference | ||||
| import eu.kanade.tachiyomi.widget.preference.BadgePreference | ||||
| import eu.kanade.tachiyomi.widget.preference.IntListPreference | ||||
| import eu.kanade.tachiyomi.widget.preference.SwitchPreferenceCategory | ||||
|  | ||||
| @@ -57,8 +57,8 @@ inline fun PreferenceGroup.multiSelectListPreference(block: (@DSL MultiSelectLis | ||||
|     return initThenAdd(MultiSelectListPreference(context), block).also(::initDialog) | ||||
| } | ||||
|  | ||||
| inline fun PreferenceGroup.extensionPreference(block: (@DSL Preference).() -> Unit): ExtensionPreference { | ||||
|     return initThenAdd(ExtensionPreference(context), block) | ||||
| inline fun PreferenceGroup.badgePreference(block: (@DSL BadgePreference).() -> Unit): BadgePreference { | ||||
|     return initThenAdd(BadgePreference(context), block) | ||||
| } | ||||
|  | ||||
| inline fun PreferenceScreen.preferenceCategory(block: (@DSL PreferenceCategory).() -> Unit): PreferenceCategory { | ||||
|   | ||||
| @@ -0,0 +1,37 @@ | ||||
| package eu.kanade.tachiyomi.widget.preference | ||||
|  | ||||
| import android.content.Context | ||||
| import android.util.AttributeSet | ||||
| import androidx.preference.Preference | ||||
| import androidx.preference.PreferenceViewHolder | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.util.view.gone | ||||
| import eu.kanade.tachiyomi.util.view.visible | ||||
| import kotlinx.android.synthetic.main.pref_badge.view.badge | ||||
|  | ||||
| class BadgePreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : | ||||
|     Preference(context, attrs) { | ||||
|  | ||||
|     private var badgeNumber: Int = 0 | ||||
|  | ||||
|     init { | ||||
|         widgetLayoutResource = R.layout.pref_badge | ||||
|     } | ||||
|  | ||||
|     override fun onBindViewHolder(holder: PreferenceViewHolder) { | ||||
|         super.onBindViewHolder(holder) | ||||
|  | ||||
|         if (badgeNumber > 0) { | ||||
|             holder.itemView.badge.text = badgeNumber.toString() | ||||
|             holder.itemView.badge.visible() | ||||
|         } else { | ||||
|             holder.itemView.badge.text = null | ||||
|             holder.itemView.badge.gone() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun setBadge(number: Int) { | ||||
|         this.badgeNumber = number | ||||
|         notifyChanged() | ||||
|     } | ||||
| } | ||||
| @@ -1,37 +0,0 @@ | ||||
| package eu.kanade.tachiyomi.widget.preference | ||||
|  | ||||
| import android.content.Context | ||||
| import android.util.AttributeSet | ||||
| import androidx.preference.Preference | ||||
| import androidx.preference.PreferenceViewHolder | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||
| import eu.kanade.tachiyomi.util.view.gone | ||||
| import eu.kanade.tachiyomi.util.view.visible | ||||
| import kotlinx.android.synthetic.main.preference_update_text.view.* | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
|  | ||||
| class ExtensionPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : | ||||
|     Preference(context, attrs) { | ||||
|  | ||||
|     init { | ||||
|         widgetLayoutResource = R.layout.preference_update_text | ||||
|     } | ||||
|  | ||||
|     override fun onBindViewHolder(holder: PreferenceViewHolder) { | ||||
|         super.onBindViewHolder(holder) | ||||
|  | ||||
|         val extUpdateText = holder.itemView.textView | ||||
|  | ||||
|         val updates = Injekt.get<PreferencesHelper>().extensionUpdatesCount().getOrDefault() | ||||
|         if (updates > 0) { | ||||
|             extUpdateText.text = updates.toString() | ||||
|             extUpdateText.visible() | ||||
|         } else { | ||||
|             extUpdateText.text = null | ||||
|             extUpdateText.gone() | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,9 +1,9 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <shape xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     android:shape="rectangle"> | ||||
|     <corners android:radius="13dp"/> | ||||
|     <corners android:radius="13dp" /> | ||||
|     <size | ||||
|         android:height="25dp" | ||||
|         android:width="25dp" /> | ||||
|     <solid android:color="@color/material_red_900"/> | ||||
| </shape> | ||||
|         android:width="25dp" | ||||
|         android:height="25dp" /> | ||||
|     <solid android:color="?attr/colorError" /> | ||||
| </shape> | ||||
|   | ||||
| @@ -1,17 +1,12 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <TextView xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:id="@+id/textView" | ||||
|     android:id="@+id/badge" | ||||
|     android:layout_width="wrap_content" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:gravity="center" | ||||
|     android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" | ||||
|     android:background="@drawable/round_textview_background" | ||||
|     android:textColor="#FFFFFF" | ||||
|     android:layout_marginTop="12dp" | ||||
|     android:layout_marginBottom="12dp" | ||||
|     android:gravity="center" | ||||
|     android:padding="3dp" | ||||
|     android:textAppearance="@style/TextAppearance.MaterialComponents.Badge" | ||||
|     android:textStyle="bold" | ||||
|     tools:text="3" | ||||
|     android:layout_marginStart="12dp" | ||||
|     android:paddingStart="3dp" | ||||
|     android:paddingEnd="3dp"/> | ||||
|     tools:text="3" /> | ||||
| @@ -18,8 +18,8 @@ | ||||
|  | ||||
|     <item | ||||
|         android:id="@+id/action_auto_check" | ||||
|         android:title="@string/action_auto_check_extensions" | ||||
|         android:checkable="true" | ||||
|         app:showAsAction="never"/> | ||||
|         android:title="@string/pref_enable_automatic_extension_updates" | ||||
|         app:showAsAction="never" /> | ||||
|  | ||||
| </menu> | ||||
|   | ||||
| @@ -211,7 +211,7 @@ | ||||
|     <string name="ext_version_info">Version: %1$s</string> | ||||
|     <string name="ext_language_info">Language: %1$s</string> | ||||
|     <string name="ext_empty_preferences">No preferences to edit for this extension</string> | ||||
|     <string name="action_auto_check_extensions">Auto-check for updates</string> | ||||
|     <string name="pref_enable_automatic_extension_updates">Check for extension updates</string> | ||||
|  | ||||
|       <!-- Reader section --> | ||||
|     <string name="pref_fullscreen">Fullscreen</string> | ||||
| @@ -601,6 +601,6 @@ | ||||
|     <string name="channel_library">Library</string> | ||||
|     <string name="channel_downloader">Downloader</string> | ||||
|     <string name="channel_new_chapters">Chapter updates</string> | ||||
|     <string name="channel_ext_updates">Extension Updates</string> | ||||
|     <string name="channel_ext_updates">Extension updates</string> | ||||
|  | ||||
| </resources> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user