
* feat: add per-widget configuration * fix: no need to overengineer it * feat: add cache to bitmap download dfgdfg * fix: elvis has left the operation
229 lines
No EOL
10 KiB
Kotlin
229 lines
No EOL
10 KiB
Kotlin
package ani.dantotsu.widgets.statistics
|
|
|
|
import android.app.PendingIntent
|
|
import android.appwidget.AppWidgetManager
|
|
import android.appwidget.AppWidgetProvider
|
|
import android.content.Context
|
|
import android.content.Intent
|
|
import android.graphics.Color
|
|
import android.graphics.drawable.GradientDrawable
|
|
import android.net.Uri
|
|
import android.widget.RemoteViews
|
|
import androidx.core.content.res.ResourcesCompat
|
|
import androidx.core.graphics.drawable.toBitmap
|
|
import ani.dantotsu.MainActivity
|
|
import ani.dantotsu.R
|
|
import ani.dantotsu.connections.anilist.Anilist
|
|
import ani.dantotsu.profile.ProfileActivity
|
|
import ani.dantotsu.settings.saving.PrefManager
|
|
import ani.dantotsu.settings.saving.PrefName
|
|
import ani.dantotsu.util.BitmapUtil.Companion.downloadImageAsBitmap
|
|
import ani.dantotsu.widgets.WidgetSizeProvider
|
|
import kotlinx.coroutines.DelicateCoroutinesApi
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.withContext
|
|
import tachiyomi.core.util.lang.launchIO
|
|
|
|
/**
|
|
* Implementation of App Widget functionality.
|
|
*/
|
|
class ProfileStatsWidget : AppWidgetProvider() {
|
|
override fun onUpdate(
|
|
context: Context,
|
|
appWidgetManager: AppWidgetManager,
|
|
appWidgetIds: IntArray
|
|
) {
|
|
appWidgetIds.forEach { appWidgetId ->
|
|
updateAppWidget(context, appWidgetManager, appWidgetId)
|
|
}
|
|
super.onUpdate(context, appWidgetManager, appWidgetIds)
|
|
}
|
|
|
|
override fun onDeleted(context: Context, appWidgetIds: IntArray) {
|
|
super.onDeleted(context, appWidgetIds)
|
|
}
|
|
|
|
override fun onEnabled(context: Context) {
|
|
super.onEnabled(context)
|
|
}
|
|
|
|
override fun onDisabled(context: Context) {
|
|
super.onDisabled(context)
|
|
}
|
|
|
|
companion object {
|
|
@OptIn(DelicateCoroutinesApi::class)
|
|
fun updateAppWidget(
|
|
context: Context,
|
|
appWidgetManager: AppWidgetManager,
|
|
appWidgetId: Int
|
|
) {
|
|
|
|
val prefs = context.getSharedPreferences(getPrefsName(appWidgetId), Context.MODE_PRIVATE)
|
|
val backgroundColor =
|
|
prefs.getInt(PREF_BACKGROUND_COLOR, Color.parseColor("#80000000"))
|
|
val backgroundFade = prefs.getInt(PREF_BACKGROUND_FADE, Color.parseColor("#00000000"))
|
|
val titleTextColor = prefs.getInt(PREF_TITLE_TEXT_COLOR, Color.WHITE)
|
|
val statsTextColor = prefs.getInt(PREF_STATS_TEXT_COLOR, Color.WHITE)
|
|
|
|
val gradientDrawable = ResourcesCompat.getDrawable(
|
|
context.resources,
|
|
R.drawable.linear_gradient_black,
|
|
null
|
|
) as GradientDrawable
|
|
gradientDrawable.colors = intArrayOf(backgroundColor, backgroundFade)
|
|
val widgetSizeProvider = WidgetSizeProvider(context)
|
|
var (width, height) = widgetSizeProvider.getWidgetsSize(appWidgetId)
|
|
if (width > 0 && height > 0) {
|
|
gradientDrawable.cornerRadius = 64f
|
|
} else {
|
|
width = 300
|
|
height = 300
|
|
}
|
|
|
|
launchIO {
|
|
val userPref = PrefManager.getVal(PrefName.AnilistUserId, "")
|
|
if (userPref.isNotEmpty()) {
|
|
val respond = Anilist.query.getUserProfile(userPref.toInt())
|
|
respond?.data?.user?.let { user ->
|
|
withContext(Dispatchers.Main) {
|
|
val views = RemoteViews(context.packageName, R.layout.statistics_widget).apply {
|
|
setImageViewBitmap(
|
|
R.id.backgroundView,
|
|
gradientDrawable.toBitmap(
|
|
width,
|
|
height
|
|
)
|
|
)
|
|
setOnClickPendingIntent(
|
|
R.id.userAvatar,
|
|
PendingIntent.getActivity(
|
|
context,
|
|
1,
|
|
Intent(context, ProfileStatsConfigure::class.java).apply {
|
|
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
|
|
data = Uri.parse(toUri(Intent.URI_INTENT_SCHEME))
|
|
},
|
|
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
|
)
|
|
)
|
|
setTextColor(R.id.userLabel, titleTextColor)
|
|
setTextColor(R.id.topLeftItem, titleTextColor)
|
|
setTextColor(R.id.topLeftLabel, statsTextColor)
|
|
setTextColor(R.id.topRightItem, titleTextColor)
|
|
setTextColor(R.id.topRightLabel, statsTextColor)
|
|
setTextColor(R.id.bottomLeftItem, titleTextColor)
|
|
setTextColor(R.id.bottomLeftLabel, statsTextColor)
|
|
setTextColor(R.id.bottomRightItem, titleTextColor)
|
|
setTextColor(R.id.bottomRightLabel, statsTextColor)
|
|
|
|
setImageViewBitmap(
|
|
R.id.userAvatar,
|
|
user.avatar?.medium?.let { it1 -> downloadImageAsBitmap(it1) }
|
|
)
|
|
setTextViewText(
|
|
R.id.userLabel,
|
|
context.getString(R.string.user_stats, user.name)
|
|
)
|
|
|
|
setTextViewText(
|
|
R.id.topLeftItem,
|
|
user.statistics.anime.count.toString()
|
|
)
|
|
setTextViewText(
|
|
R.id.topLeftLabel,
|
|
context.getString(R.string.anime_watched)
|
|
)
|
|
|
|
setTextViewText(
|
|
R.id.topRightItem,
|
|
user.statistics.anime.episodesWatched.toString()
|
|
)
|
|
setTextViewText(
|
|
R.id.topRightLabel,
|
|
context.getString(R.string.episodes_watched_n)
|
|
)
|
|
|
|
setTextViewText(
|
|
R.id.bottomLeftItem,
|
|
user.statistics.manga.count.toString()
|
|
)
|
|
setTextViewText(
|
|
R.id.bottomLeftLabel,
|
|
context.getString(R.string.manga_read)
|
|
)
|
|
|
|
setTextViewText(
|
|
R.id.bottomRightItem,
|
|
user.statistics.manga.chaptersRead.toString()
|
|
)
|
|
setTextViewText(
|
|
R.id.bottomRightLabel,
|
|
context.getString(R.string.chapters_read_n)
|
|
)
|
|
|
|
val intent = Intent(context, ProfileActivity::class.java)
|
|
.putExtra("userId", userPref.toInt())
|
|
val pendingIntent = PendingIntent.getActivity(
|
|
context, 0, intent, PendingIntent.FLAG_IMMUTABLE
|
|
)
|
|
setOnClickPendingIntent(R.id.widgetContainer, pendingIntent)
|
|
}
|
|
// Instruct the widget manager to update the widget
|
|
appWidgetManager.updateAppWidget(appWidgetId, views)
|
|
}
|
|
} ?: showLoginCascade(context, appWidgetManager, appWidgetId)
|
|
} else showLoginCascade(context, appWidgetManager, appWidgetId)
|
|
}
|
|
}
|
|
|
|
private suspend fun showLoginCascade(
|
|
context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int
|
|
) {
|
|
|
|
withContext(Dispatchers.Main) {
|
|
val views = RemoteViews(context.packageName, R.layout.statistics_widget)
|
|
|
|
views.setTextViewText(R.id.topLeftItem, "")
|
|
views.setTextViewText(
|
|
R.id.topLeftLabel,
|
|
context.getString(R.string.please)
|
|
)
|
|
|
|
views.setTextViewText(R.id.topRightItem, "")
|
|
views.setTextViewText(
|
|
R.id.topRightLabel,
|
|
context.getString(R.string.log_in)
|
|
)
|
|
|
|
views.setTextViewText(
|
|
R.id.bottomLeftItem,
|
|
context.getString(R.string.or_join)
|
|
)
|
|
views.setTextViewText(R.id.bottomLeftLabel, "")
|
|
|
|
views.setTextViewText(
|
|
R.id.bottomRightItem,
|
|
context.getString(R.string.anilist)
|
|
)
|
|
views.setTextViewText(R.id.bottomRightLabel, "")
|
|
|
|
val intent = Intent(context, MainActivity::class.java)
|
|
val pendingIntent = PendingIntent.getActivity(
|
|
context, 0, intent, PendingIntent.FLAG_IMMUTABLE
|
|
)
|
|
views.setOnClickPendingIntent(R.id.widgetContainer, pendingIntent)
|
|
|
|
appWidgetManager.updateAppWidget(appWidgetId, views)
|
|
}
|
|
}
|
|
|
|
fun getPrefsName(appWidgetId: Int): String {
|
|
return "ani.dantotsu.widgets.Statistics.${appWidgetId}"
|
|
}
|
|
const val PREF_BACKGROUND_COLOR = "background_color"
|
|
const val PREF_BACKGROUND_FADE = "background_fade"
|
|
const val PREF_TITLE_TEXT_COLOR = "title_text_color"
|
|
const val PREF_STATS_TEXT_COLOR = "stats_text_color"
|
|
}
|
|
} |