diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922560e99..8771cc28c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -67,8 +67,11 @@ - + android:permission="android.permission.BIND_REMOTEVIEWS" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 4127264fa..953f25656 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -26,6 +26,7 @@ import org.koitharu.kotatsu.core.parser.UserAgentInterceptor import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.domain.MangaLoaderContext import org.koitharu.kotatsu.domain.favourites.FavouritesRepository +import org.koitharu.kotatsu.domain.history.HistoryRepository import org.koitharu.kotatsu.ui.tracker.TrackerJobService import org.koitharu.kotatsu.ui.utils.AppCrashHandler import org.koitharu.kotatsu.ui.widget.WidgetUpdater @@ -51,6 +52,7 @@ class KotatsuApp : Application() { AppCompatDelegate.setDefaultNightMode(AppSettings(this).theme) val widgetUpdater = WidgetUpdater(applicationContext) FavouritesRepository.subscribe(widgetUpdater) + HistoryRepository.subscribe(widgetUpdater) } private fun initKoin() { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/WidgetUpdater.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/WidgetUpdater.kt index fd398e734..ac762dc3c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/WidgetUpdater.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/WidgetUpdater.kt @@ -5,17 +5,27 @@ import android.content.ComponentName import android.content.Context import android.content.Intent import org.koitharu.kotatsu.domain.favourites.OnFavouritesChangeListener +import org.koitharu.kotatsu.domain.history.OnHistoryChangeListener +import org.koitharu.kotatsu.ui.widget.recent.RecentWidgetProvider import org.koitharu.kotatsu.ui.widget.shelf.ShelfWidgetProvider -class WidgetUpdater(private val context: Context) : OnFavouritesChangeListener { +class WidgetUpdater(private val context: Context) : OnFavouritesChangeListener, + OnHistoryChangeListener { override fun onFavouritesChanged(mangaId: Long) { - val intent = Intent(context, ShelfWidgetProvider::class.java) + updateWidget(ShelfWidgetProvider::class.java) + } + + override fun onHistoryChanged() { + updateWidget(RecentWidgetProvider::class.java) + } + + private fun updateWidget(cls: Class<*>) { + val intent = Intent(context, cls) intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE val ids = AppWidgetManager.getInstance(context) - .getAppWidgetIds(ComponentName(context, ShelfWidgetProvider::class.java)) + .getAppWidgetIds(ComponentName(context, cls)) intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) context.sendBroadcast(intent) } - } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentListFactory.kt new file mode 100644 index 000000000..27d308ab2 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentListFactory.kt @@ -0,0 +1,61 @@ +package org.koitharu.kotatsu.ui.widget.recent + +import android.content.Context +import android.content.Intent +import android.widget.RemoteViews +import android.widget.RemoteViewsService +import androidx.core.graphics.drawable.toBitmap +import coil.Coil +import coil.api.get +import kotlinx.coroutines.runBlocking +import okio.IOException +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.model.Manga +import org.koitharu.kotatsu.domain.history.HistoryRepository +import org.koitharu.kotatsu.ui.details.MangaDetailsActivity + +class RecentListFactory(context: Context, private val intent: Intent) : RemoteViewsService.RemoteViewsFactory { + + private val packageName = context.packageName + + private val dataSet = ArrayList() + + override fun onCreate() { + } + + override fun getLoadingView() = null + + override fun getItemId(position: Int) = dataSet[position].id + + override fun onDataSetChanged() { + dataSet.clear() + val data = runBlocking { HistoryRepository().getList(0, 10) } + dataSet.addAll(data) + } + + override fun hasStableIds() = true + + override fun getViewAt(position: Int): RemoteViews { + val views = RemoteViews(packageName, R.layout.item_recent) + val item = dataSet[position] + try { + val cover = runBlocking { + Coil.loader().get(item.coverUrl).toBitmap() + } + views.setImageViewBitmap(R.id.imageView_cover, cover) + } catch (e: IOException) { + views.setImageViewResource(R.id.imageView_cover, R.drawable.ic_placeholder) + } + val intent = Intent() + intent.putExtra(MangaDetailsActivity.EXTRA_MANGA_ID, item.id) + views.setOnClickFillInIntent(R.id.imageView_cover, intent) + return views + } + + override fun getCount() = dataSet.size + + override fun getViewTypeCount() = 1 + + override fun onDestroy() { + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetProvider.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetProvider.kt new file mode 100644 index 000000000..25f2623e3 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetProvider.kt @@ -0,0 +1,39 @@ +package org.koitharu.kotatsu.ui.widget.recent + +import android.app.PendingIntent +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetProvider +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.widget.RemoteViews +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.ui.details.MangaDetailsActivity + +class RecentWidgetProvider : AppWidgetProvider() { + + override fun onUpdate( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetIds: IntArray + ) { + appWidgetIds.forEach { id -> + val views = RemoteViews(context.packageName, R.layout.widget_recent) + val adapter = Intent(context, RecentWidgetService::class.java) + adapter.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id) + adapter.data = Uri.parse(adapter.toUri(Intent.URI_INTENT_SCHEME)) + views.setRemoteAdapter(R.id.stackView, adapter) + val intent = Intent(context, MangaDetailsActivity::class.java) + intent.action = MangaDetailsActivity.ACTION_MANGA_VIEW + views.setPendingIntentTemplate(R.id.stackView, PendingIntent.getActivity( + context, + 0, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + )) + views.setEmptyView(R.id.stackView, R.id.textView_holder) + appWidgetManager.updateAppWidget(id, views) + } + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.stackView) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetService.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetService.kt new file mode 100644 index 000000000..1b1d9691b --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetService.kt @@ -0,0 +1,11 @@ +package org.koitharu.kotatsu.ui.widget.recent + +import android.content.Intent +import android.widget.RemoteViewsService + +class RecentWidgetService : RemoteViewsService() { + + override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { + return RecentListFactory(this, intent) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-nodpi/ic_appwidget_recent.png b/app/src/main/res/drawable-nodpi/ic_appwidget_recent.png new file mode 100644 index 000000000..f0188ff69 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/ic_appwidget_recent.png differ diff --git a/app/src/main/res/layout/item_recent.xml b/app/src/main/res/layout/item_recent.xml new file mode 100644 index 000000000..e5b884dd4 --- /dev/null +++ b/app/src/main/res/layout/item_recent.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_recent.xml b/app/src/main/res/layout/widget_recent.xml new file mode 100644 index 000000000..e10f76b3e --- /dev/null +++ b/app/src/main/res/layout/widget_recent.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index bb6e330ff..3641f7b63 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -119,4 +119,5 @@ Читать с начала Перезапустить Полка с мангой + Recent manga \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ac12e5bc0..856f1e880 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -120,4 +120,5 @@ Read from start Restart Manga shelf + Recent manga \ No newline at end of file diff --git a/app/src/main/res/xml/widget_recent.xml b/app/src/main/res/xml/widget_recent.xml new file mode 100644 index 000000000..5265e8a9a --- /dev/null +++ b/app/src/main/res/xml/widget_recent.xml @@ -0,0 +1,12 @@ + +