diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7cc2e732..0401d77f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,20 +49,21 @@ android:name=".App" android:allowBackup="true" android:banner="@mipmap/ic_banner_foreground" + android:enableOnBackInvokedCallback="true" android:icon="${icon_placeholder}" android:label="@string/app_name" android:largeHeap="true" android:requestLegacyExternalStorage="true" - android:enableOnBackInvokedCallback="true" android:roundIcon="${icon_placeholder_round}" android:supportsRtl="true" android:theme="@style/Theme.Dantotsu" android:usesCleartextTraffic="true" tools:ignore="AllowBackup" tools:targetApi="tiramisu"> + + android:exported="true"> @@ -71,9 +72,15 @@ android:name="android.appwidget.provider" android:resource="@xml/currently_airing_widget_info" /> + + + + + - + android:parentActivityName=".MainActivity" + android:windowSoftInputMode="adjustResize|stateHidden" /> + android:parentActivityName=".MainActivity" + android:windowSoftInputMode="adjustResize|stateHidden" /> + android:parentActivityName=".MainActivity" + android:windowSoftInputMode="adjustResize|stateHidden" /> - + android:label="Inbox Activity" + android:parentActivityName=".MainActivity" /> - + android:parentActivityName=".MainActivity" /> @@ -139,8 +144,9 @@ android:name=".media.CalendarActivity" android:parentActivityName=".MainActivity" /> - + + android:windowSoftInputMode="adjustResize|stateHidden" /> - + + @@ -306,22 +313,23 @@ android:exported="false" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> - - - - - - + + + { + val res = executeQuery( + """{MediaListCollection(userId:$id,type:ANIME){lists{name entries{media{id,isFavourite,title{userPreferred,romaji}coverImage{medium}nextAiringEpisode{timeUntilAiring}}}}}}""", + force = true + ) + val list = mutableListOf() + res?.data?.mediaListCollection?.lists?.forEach { listEntry -> + listEntry.entries?.forEach { entry -> + entry.media?.nextAiringEpisode?.timeUntilAiring?.let { + list.add(Media(entry.media!!)) + } + } + } + return list.sortedBy { it.timeUntilAiring } + .distinctBy { it.id } + .filter { it.timeUntilAiring != null } + } + suspend fun isUserFav(favType: AnilistMutations.FavType, id: Int): Boolean { //anilist isFavourite is broken, so we need to check it manually val res = getUserProfile(Anilist.userid?: return false) return when (favType) { diff --git a/app/src/main/java/ani/dantotsu/media/Media.kt b/app/src/main/java/ani/dantotsu/media/Media.kt index c0196218..cd5a8f73 100644 --- a/app/src/main/java/ani/dantotsu/media/Media.kt +++ b/app/src/main/java/ani/dantotsu/media/Media.kt @@ -58,6 +58,8 @@ data class Media( var endDate: FuzzyDate? = null, var popularity: Int? = null, + var timeUntilAiring: Long? = null, + var characters: ArrayList? = null, var staff: ArrayList? = null, var prequel: Media? = null, @@ -84,7 +86,7 @@ data class Media( name = apiMedia.title!!.english, nameRomaji = apiMedia.title!!.romaji, userPreferredName = apiMedia.title!!.userPreferred, - cover = apiMedia.coverImage?.large, + cover = apiMedia.coverImage?.large ?: apiMedia.coverImage?.medium, banner = apiMedia.bannerImage, status = apiMedia.status.toString(), isFav = apiMedia.isFavourite!!, @@ -97,6 +99,7 @@ data class Media( startDate = apiMedia.startDate, endDate = apiMedia.endDate, favourites = apiMedia.favourites, + timeUntilAiring = apiMedia.nextAiringEpisode?.timeUntilAiring?.let { it.toLong() * 1000}, anime = if (apiMedia.type == MediaType.ANIME) Anime( totalEpisodes = apiMedia.episodes, nextAiringEpisode = apiMedia.nextAiringEpisode?.episode?.minus(1) diff --git a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsFactory.kt b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsFactory.kt index 8cf8029a..70a0aa25 100644 --- a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsFactory.kt +++ b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsFactory.kt @@ -1,12 +1,24 @@ package ani.dantotsu.widgets import android.content.Context +import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory +import android.graphics.BitmapShader +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.RectF +import android.graphics.Shader import android.widget.RemoteViews import android.widget.RemoteViewsService import ani.dantotsu.R +import ani.dantotsu.connections.anilist.Anilist +import ani.dantotsu.settings.saving.PrefManager +import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.util.Logger +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking import java.io.InputStream import java.net.HttpURLConnection import java.net.URL @@ -14,59 +26,47 @@ import java.net.URL class CurrentlyAiringRemoteViewsFactory(private val context: Context) : RemoteViewsService.RemoteViewsFactory { private var widgetItems = mutableListOf() + private var refreshing = false + private val prefs = + context.getSharedPreferences(CurrentlyAiringWidget.PREFS_NAME, Context.MODE_PRIVATE) override fun onCreate() { - // 4 items for testing - widgetItems.clear() Logger.log("CurrentlyAiringRemoteViewsFactory onCreate") - widgetItems = List(4) { - WidgetItem( - "Show $it", - "$it days $it hours $it minutes", - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx14741-alxqoP4yx6WF.jpg" - ) - }.toMutableList() + fillWidgetItems() + } + + private fun timeUntil(timeUntil: Long): String { + val days = timeUntil / (1000 * 60 * 60 * 24) + val hours = (timeUntil % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60) + val minutes = ((timeUntil % (1000 * 60 * 60 * 24)) % (1000 * 60 * 60)) / (1000 * 60) + return "$days days $hours hours $minutes minutes" } override fun onDataSetChanged() { - // 4 items for testing + if (refreshing) return Logger.log("CurrentlyAiringRemoteViewsFactory onDataSetChanged") widgetItems.clear() - widgetItems.add( - WidgetItem( - "Show 1", - "1 day 2 hours 3 minutes", - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx14741-alxqoP4yx6WF.jpg" - ) - ) - widgetItems.add( - WidgetItem( - "Show 2", - "2 days 3 hours 4 minutes", - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx14741-alxqoP4yx6WF.jpg" - ) - ) - widgetItems.add( - WidgetItem( - "Show 3", - "3 days 4 hours 5 minutes", - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx14741-alxqoP4yx6WF.jpg" - ) - ) - widgetItems.add( - WidgetItem( - "Show 4", - "4 days 5 hours 6 minutes", - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx14741-alxqoP4yx6WF.jpg" - ) - ) - widgetItems.add( - WidgetItem( - "Show 5", - "5 days 6 hours 7 minutes", - "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx14741-alxqoP4yx6WF.jpg" - ) - ) + fillWidgetItems() + + } + + private fun fillWidgetItems() { + refreshing = true + val userId = PrefManager.getVal(PrefName.AnilistUserId) + runBlocking(Dispatchers.IO) { + val upcoming = Anilist.query.getUpcomingAnime(userId) + upcoming.forEach { + widgetItems.add( + WidgetItem( + it.userPreferredName, + timeUntil(it.timeUntilAiring ?: 0), + it.cover ?: "", + it.id + ) + ) + } + refreshing = false + } } override fun onDestroy() { @@ -80,12 +80,20 @@ class CurrentlyAiringRemoteViewsFactory(private val context: Context) : override fun getViewAt(position: Int): RemoteViews { Logger.log("CurrentlyAiringRemoteViewsFactory getViewAt") val item = widgetItems[position] + val titleTextColor = prefs.getInt(CurrentlyAiringWidget.PREF_TITLE_TEXT_COLOR, Color.WHITE) + val countdownTextColor = + prefs.getInt(CurrentlyAiringWidget.PREF_COUNTDOWN_TEXT_COLOR, Color.WHITE) val rv = RemoteViews(context.packageName, R.layout.item_currently_airing_widget).apply { setTextViewText(R.id.text_show_title, item.title) setTextViewText(R.id.text_show_countdown, item.countdown) + setTextColor(R.id.text_show_title, titleTextColor) + setTextColor(R.id.text_show_countdown, countdownTextColor) val bitmap = downloadImageAsBitmap(item.image) - //setImageViewUri(R.id.image_show_icon, Uri.parse(item.image)) setImageViewBitmap(R.id.image_show_icon, bitmap) + val fillInIntent = Intent().apply { + putExtra("mediaId", item.id) + } + setOnClickFillInIntent(R.id.widget_item, fillInIntent) } return rv @@ -108,16 +116,27 @@ class CurrentlyAiringRemoteViewsFactory(private val context: Context) : } } catch (e: Exception) { e.printStackTrace() - // Handle the error according to your needs } finally { - // Clean up resources inputStream?.close() urlConnection?.disconnect() } - - return bitmap + return bitmap?.let { roundCorners(it) } } + private fun roundCorners(bitmap: Bitmap): Bitmap { + val cornerRadius = 20f + val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(output) + val paint = Paint() + paint.isAntiAlias = true + paint.shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP) + val rect = RectF(0f, 0f, bitmap.width.toFloat(), bitmap.height.toFloat()) + canvas.drawRoundRect(rect, cornerRadius, cornerRadius, paint) + + return output + } + + override fun getLoadingView(): RemoteViews { return RemoteViews(context.packageName, R.layout.item_currently_airing_widget) } @@ -135,4 +154,4 @@ class CurrentlyAiringRemoteViewsFactory(private val context: Context) : } } -data class WidgetItem(val title: String, val countdown: String, val image: String) \ No newline at end of file +data class WidgetItem(val title: String, val countdown: String, val image: String, val id: Int) \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidget.kt b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidget.kt index b2c3948c..f1b6528a 100644 --- a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidget.kt +++ b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidget.kt @@ -12,7 +12,9 @@ import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.net.Uri import android.widget.RemoteViews +import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat +import ani.dantotsu.MainActivity import ani.dantotsu.R /** @@ -26,25 +28,15 @@ class CurrentlyAiringWidget : AppWidgetProvider() { appWidgetIds: IntArray ) { appWidgetIds.forEach { appWidgetId -> - val intent = Intent(context, CurrentlyAiringRemoteViewsService::class.java).apply { - putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) - data = Uri.parse(toUri(Intent.URI_INTENT_SCHEME)) - } - - val rv = RemoteViews(context.packageName, R.layout.currently_airing_widget).apply { - setRemoteAdapter(R.id.widgetListView, intent) - setEmptyView(R.id.widgetListView, R.id.empty_view) - } - + val rv = updateAppWidget(context, appWidgetId) appWidgetManager.updateAppWidget(appWidgetId, rv) } super.onUpdate(context, appWidgetManager, appWidgetIds) } override fun onDeleted(context: Context, appWidgetIds: IntArray) { - // When the user deletes the widget, delete the preference associated with it. for (appWidgetId in appWidgetIds) { - deleteTitlePref(context, appWidgetId) + context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit().clear().apply() } super.onDeleted(context, appWidgetIds) } @@ -57,34 +49,65 @@ class CurrentlyAiringWidget : AppWidgetProvider() { super.onDisabled(context) } + companion object { fun updateAppWidget( context: Context, - appWidgetManager: AppWidgetManager, appWidgetId: Int, - color: Int - ) { - // Create an intent to launch the configuration activity when the widget is clicked - val intent = Intent(context, CurrentlyAiringWidgetConfigureActivity::class.java) - val pendingIntent = - PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) + ): RemoteViews { + val prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + val backgroundColor = + prefs.getInt(PREF_BACKGROUND_COLOR, ContextCompat.getColor(context, R.color.theme)) + val backgroundFade = prefs.getInt(PREF_BACKGROUND_FADE, Color.GRAY) + val titleTextColor = prefs.getInt(PREF_TITLE_TEXT_COLOR, Color.WHITE) + val countdownTextColor = prefs.getInt(PREF_COUNTDOWN_TEXT_COLOR, Color.WHITE) - // Get the gradient drawable resource and update its start color with the user-selected color + val intent = Intent(context, CurrentlyAiringRemoteViewsService::class.java).apply { + putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) + data = Uri.parse(toUri(Intent.URI_INTENT_SCHEME)) + } val gradientDrawable = ResourcesCompat.getDrawable( context.resources, R.drawable.gradient_background, null ) as GradientDrawable - gradientDrawable.colors = intArrayOf(color, Color.GRAY) // End color is gray. + gradientDrawable.colors = intArrayOf(backgroundColor, backgroundFade) + + val intentTemplate = Intent(context, MainActivity::class.java) + intentTemplate.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + intentTemplate.putExtra("fromWidget", true) - // Create the RemoteViews object and set the background val views = RemoteViews(context.packageName, R.layout.currently_airing_widget).apply { - //setImageViewBitmap(R.id.backgroundView, convertDrawableToBitmap(gradientDrawable)) - //setOnClickPendingIntent(R.id.backgroundView, pendingIntent) + setImageViewBitmap(R.id.backgroundView, convertDrawableToBitmap(gradientDrawable)) + setTextColor(R.id.text_show_title, titleTextColor) + setTextColor(R.id.text_show_countdown, countdownTextColor) + setTextColor(R.id.widgetTitle, titleTextColor) + setRemoteAdapter(R.id.widgetListView, intent) + setEmptyView(R.id.widgetListView, R.id.empty_view) + setPendingIntentTemplate( + R.id.widgetListView, + PendingIntent.getActivity( + context, + 0, + intentTemplate, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE + ) + ) + setOnClickPendingIntent( + R.id.logoView, + PendingIntent.getActivity( + context, + 1, + Intent(context, CurrentlyAiringWidgetConfigureActivity::class.java).apply { + putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) + }, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + ) } - // Instruct the widget manager to update the widget - appWidgetManager.updateAppWidget(appWidgetId, views) + return views + } private fun convertDrawableToBitmap(drawable: Drawable): Bitmap { @@ -94,6 +117,12 @@ class CurrentlyAiringWidget : AppWidgetProvider() { drawable.draw(canvas) return bitmap } + + const val PREFS_NAME = "ani.dantotsu.widgets.CurrentlyAiringWidget" + 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_COUNTDOWN_TEXT_COLOR = "countdown_text_color" } } @@ -102,11 +131,7 @@ internal fun updateAppWidget( appWidgetManager: AppWidgetManager, appWidgetId: Int ) { - val widgetText = loadTitlePref(context, appWidgetId) - // Construct the RemoteViews object - val views = RemoteViews(context.packageName, R.layout.currently_airing_widget) - views.setTextViewText(R.id.appwidget_text, widgetText) - - // Instruct the widget manager to update the widget + val views = CurrentlyAiringWidget.updateAppWidget(context, appWidgetId) appWidgetManager.updateAppWidget(appWidgetId, views) + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widgetListView) } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidgetConfigureActivity.kt b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidgetConfigureActivity.kt index 186f5151..9041f2a7 100644 --- a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidgetConfigureActivity.kt +++ b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidgetConfigureActivity.kt @@ -1,42 +1,36 @@ package ani.dantotsu.widgets -import android.app.Activity import android.appwidget.AppWidgetManager import android.content.Context import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.view.View -import android.widget.EditText +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import ani.dantotsu.R import ani.dantotsu.databinding.CurrentlyAiringWidgetConfigureBinding import ani.dantotsu.themes.ThemeManager +import eltos.simpledialogfragment.SimpleDialog +import eltos.simpledialogfragment.color.SimpleColorDialog /** * The configuration screen for the [CurrentlyAiringWidget] AppWidget. */ -class CurrentlyAiringWidgetConfigureActivity : Activity() { +class CurrentlyAiringWidgetConfigureActivity : AppCompatActivity(), + SimpleDialog.OnDialogResultListener { private var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID - private lateinit var appWidgetText: EditText + private var onClickListener = View.OnClickListener { val context = this@CurrentlyAiringWidgetConfigureActivity - - // When the button is clicked, store the string locally - val widgetText = appWidgetText.text.toString() - saveTitlePref(context, appWidgetId, widgetText) - - // It is the responsibility of the configuration activity to update the app widget val appWidgetManager = AppWidgetManager.getInstance(context) - //updateAppWidget(context, appWidgetManager, appWidgetId) - - CurrentlyAiringWidget.updateAppWidget( + updateAppWidget( context, appWidgetManager, appWidgetId, - -1 ) - // Make sure we pass back the original appWidgetId val resultValue = Intent() resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) setResult(RESULT_OK, resultValue) @@ -45,21 +39,87 @@ class CurrentlyAiringWidgetConfigureActivity : Activity() { private lateinit var binding: CurrentlyAiringWidgetConfigureBinding public override fun onCreate(icicle: Bundle?) { - ThemeManager(this).applyTheme() super.onCreate(icicle) - - // Set the result to CANCELED. This will cause the widget host to cancel - // out of the widget placement if the user presses the back button. setResult(RESULT_CANCELED) binding = CurrentlyAiringWidgetConfigureBinding.inflate(layoutInflater) setContentView(binding.root) + val prefs = getSharedPreferences(CurrentlyAiringWidget.PREFS_NAME, Context.MODE_PRIVATE) + + binding.topBackgroundButton.setOnClickListener { + val tag = CurrentlyAiringWidget.PREF_BACKGROUND_COLOR + SimpleColorDialog().title(R.string.custom_theme) + .colorPreset( + prefs.getInt( + CurrentlyAiringWidget.PREF_BACKGROUND_COLOR, + ContextCompat.getColor(this, R.color.theme) + ) + ) + .colors( + this@CurrentlyAiringWidgetConfigureActivity, + SimpleColorDialog.MATERIAL_COLOR_PALLET + ) + .allowCustom(true) + .showOutline(0x46000000) + .gridNumColumn(5) + .choiceMode(SimpleColorDialog.SINGLE_CHOICE) + .neg() + .show(this@CurrentlyAiringWidgetConfigureActivity, tag) + } + binding.bottomBackgroundButton.setOnClickListener { + val tag = CurrentlyAiringWidget.PREF_BACKGROUND_FADE + SimpleColorDialog().title(R.string.custom_theme) + .colorPreset(prefs.getInt(CurrentlyAiringWidget.PREF_BACKGROUND_FADE, Color.GRAY)) + .colors( + this@CurrentlyAiringWidgetConfigureActivity, + SimpleColorDialog.MATERIAL_COLOR_PALLET + ) + .allowCustom(true) + .showOutline(0x46000000) + .gridNumColumn(5) + .choiceMode(SimpleColorDialog.SINGLE_CHOICE) + .neg() + .show(this@CurrentlyAiringWidgetConfigureActivity, tag) + } + binding.titleColorButton.setOnClickListener { + val tag = CurrentlyAiringWidget.PREF_TITLE_TEXT_COLOR + SimpleColorDialog().title(R.string.custom_theme) + .colorPreset(prefs.getInt(CurrentlyAiringWidget.PREF_TITLE_TEXT_COLOR, Color.WHITE)) + .colors( + this@CurrentlyAiringWidgetConfigureActivity, + SimpleColorDialog.MATERIAL_COLOR_PALLET + ) + .allowCustom(true) + .showOutline(0x46000000) + .gridNumColumn(5) + .choiceMode(SimpleColorDialog.SINGLE_CHOICE) + .neg() + .show(this@CurrentlyAiringWidgetConfigureActivity, tag) + } + binding.countdownColorButton.setOnClickListener { + val tag = CurrentlyAiringWidget.PREF_COUNTDOWN_TEXT_COLOR + SimpleColorDialog().title(R.string.custom_theme) + .colorPreset( + prefs.getInt( + CurrentlyAiringWidget.PREF_COUNTDOWN_TEXT_COLOR, + Color.WHITE + ) + ) + .colors( + this@CurrentlyAiringWidgetConfigureActivity, + SimpleColorDialog.MATERIAL_COLOR_PALLET + ) + .allowCustom(true) + .showOutline(0x46000000) + .gridNumColumn(5) + .choiceMode(SimpleColorDialog.SINGLE_CHOICE) + .neg() + .show(this@CurrentlyAiringWidgetConfigureActivity, tag) + } - appWidgetText = binding.appwidgetText binding.addButton.setOnClickListener(onClickListener) - // Find the widget id from the intent. val intent = intent val extras = intent.extras if (extras != null) { @@ -68,43 +128,66 @@ class CurrentlyAiringWidgetConfigureActivity : Activity() { ) } - // If this activity was started with an intent without an app widget ID, finish with an error. if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish() return } - - appWidgetText.setText( - loadTitlePref( - this@CurrentlyAiringWidgetConfigureActivity, - appWidgetId - ) - ) - } -} + override fun onResult(dialogTag: String, which: Int, extras: Bundle): Boolean { + if (which == SimpleDialog.OnDialogResultListener.BUTTON_POSITIVE) { + when (dialogTag) { + CurrentlyAiringWidget.PREF_BACKGROUND_COLOR -> { + getSharedPreferences( + CurrentlyAiringWidget.PREFS_NAME, + Context.MODE_PRIVATE + ).edit() + .putInt( + CurrentlyAiringWidget.PREF_BACKGROUND_COLOR, + extras.getInt(SimpleColorDialog.COLOR) + ) + .apply() + } -private const val PREFS_NAME = "ani.dantotsu.parsers.CurrentlyAiringWidget" -private const val PREF_PREFIX_KEY = "appwidget_" + CurrentlyAiringWidget.PREF_BACKGROUND_FADE -> { + getSharedPreferences( + CurrentlyAiringWidget.PREFS_NAME, + Context.MODE_PRIVATE + ).edit() + .putInt( + CurrentlyAiringWidget.PREF_BACKGROUND_FADE, + extras.getInt(SimpleColorDialog.COLOR) + ) + .apply() + } -// Write the prefix to the SharedPreferences object for this widget -internal fun saveTitlePref(context: Context, appWidgetId: Int, text: String) { - val prefs = context.getSharedPreferences(PREFS_NAME, 0).edit() - prefs.putString(PREF_PREFIX_KEY + appWidgetId, text) - prefs.apply() -} + CurrentlyAiringWidget.PREF_TITLE_TEXT_COLOR -> { + getSharedPreferences( + CurrentlyAiringWidget.PREFS_NAME, + Context.MODE_PRIVATE + ).edit() + .putInt( + CurrentlyAiringWidget.PREF_TITLE_TEXT_COLOR, + extras.getInt(SimpleColorDialog.COLOR) + ) + .apply() + } -// Read the prefix from the SharedPreferences object for this widget. -// If there is no preference saved, get the default from a resource -internal fun loadTitlePref(context: Context, appWidgetId: Int): String { - val prefs = context.getSharedPreferences(PREFS_NAME, 0) - val titleValue = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null) - return titleValue ?: context.getString(R.string.appwidget_text) -} + CurrentlyAiringWidget.PREF_COUNTDOWN_TEXT_COLOR -> { + getSharedPreferences( + CurrentlyAiringWidget.PREFS_NAME, + Context.MODE_PRIVATE + ).edit() + .putInt( + CurrentlyAiringWidget.PREF_COUNTDOWN_TEXT_COLOR, + extras.getInt(SimpleColorDialog.COLOR) + ) + .apply() + } + + } + } + return true + } -internal fun deleteTitlePref(context: Context, appWidgetId: Int) { - val prefs = context.getSharedPreferences(PREFS_NAME, 0).edit() - prefs.remove(PREF_PREFIX_KEY + appWidgetId) - prefs.apply() } \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_background.xml b/app/src/main/res/drawable/gradient_background.xml index 20e9ffd6..d4b19a1f 100644 --- a/app/src/main/res/drawable/gradient_background.xml +++ b/app/src/main/res/drawable/gradient_background.xml @@ -4,5 +4,5 @@ + android:startColor="@color/theme"/> diff --git a/app/src/main/res/layout/currently_airing_widget.xml b/app/src/main/res/layout/currently_airing_widget.xml index 028ef044..3ecd527e 100644 --- a/app/src/main/res/layout/currently_airing_widget.xml +++ b/app/src/main/res/layout/currently_airing_widget.xml @@ -20,8 +20,8 @@ @@ -9,14 +10,103 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" - android:labelFor="@id/appwidget_text" android:text="@string/configure" /> - + android:layout_height="64dp" + android:layout_marginStart="-31dp" + android:layout_marginEnd="-31dp" + android:background="@drawable/ui_bg" + android:backgroundTint="?attr/colorSecondary" + android:backgroundTintMode="src_atop" + android:fontFamily="@font/poppins_bold" + android:insetTop="0dp" + android:insetBottom="0dp" + android:paddingStart="31dp" + android:paddingEnd="31dp" + android:text="@string/top_background_color" + android:textAlignment="viewStart" + android:textAllCaps="false" + android:textColor="?attr/colorOnBackground" + app:cornerRadius="0dp" + app:icon="@drawable/ic_round_color_picker_24" + app:iconPadding="16dp" + app:iconSize="24dp" + app:iconTint="?attr/colorPrimary" /> + +