From 8dce8a74b303c6f265d4a655616991260ff9655b Mon Sep 17 00:00:00 2001 From: Tommaso Berlose Date: Sun, 10 Jan 2021 17:20:52 +0100 Subject: [PATCH] Fix #242 --- app/src/main/AndroidManifest.xml | 2 +- .../components/GlanceSettingsDialog.kt | 6 + .../anotherwidget/global/Preferences.kt | 6 +- .../anotherwidget/helpers/IntentHelper.kt | 27 +++- .../helpers/MediaPlayerHelper.kt | 30 +++- .../tabs/ChooseApplicationActivity.kt | 69 +++++++-- .../ui/activities/tabs/CustomDateActivity.kt | 2 +- .../tabs/MediaInfoFormatActivity.kt | 109 +++++++++++++ .../tabs/MediaInfoFormatViewModel.kt | 11 ++ .../drawable-hdpi/round_text_fields_24.png | Bin 0 -> 546 bytes .../drawable-mdpi/round_text_fields_24.png | Bin 0 -> 384 bytes .../drawable-night-hdpi/round_no_cell_24.png | Bin 0 -> 328 bytes .../drawable-night-mdpi/round_no_cell_24.png | Bin 0 -> 223 bytes .../drawable-night-xhdpi/round_no_cell_24.png | Bin 0 -> 360 bytes .../round_no_cell_24.png | Bin 0 -> 509 bytes .../round_no_cell_24.png | Bin 0 -> 646 bytes .../drawable-xhdpi/round_text_fields_24.png | Bin 0 -> 601 bytes .../drawable-xxhdpi/round_text_fields_24.png | Bin 0 -> 1051 bytes .../drawable-xxxhdpi/round_text_fields_24.png | Bin 0 -> 1272 bytes .../main/res/drawable/round_no_cell_24.xml | 10 ++ .../res/layout/activity_media_info_format.xml | 143 ++++++++++++++++++ .../glance_provider_settings_layout.xml | 33 ++++ app/src/main/res/values/strings.xml | 5 +- 23 files changed, 420 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/MediaInfoFormatActivity.kt create mode 100644 app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/tabs/MediaInfoFormatViewModel.kt create mode 100644 app/src/main/res/drawable-hdpi/round_text_fields_24.png create mode 100644 app/src/main/res/drawable-mdpi/round_text_fields_24.png create mode 100644 app/src/main/res/drawable-night-hdpi/round_no_cell_24.png create mode 100644 app/src/main/res/drawable-night-mdpi/round_no_cell_24.png create mode 100644 app/src/main/res/drawable-night-xhdpi/round_no_cell_24.png create mode 100644 app/src/main/res/drawable-night-xxhdpi/round_no_cell_24.png create mode 100644 app/src/main/res/drawable-night-xxxhdpi/round_no_cell_24.png create mode 100644 app/src/main/res/drawable-xhdpi/round_text_fields_24.png create mode 100644 app/src/main/res/drawable-xxhdpi/round_text_fields_24.png create mode 100644 app/src/main/res/drawable-xxxhdpi/round_text_fields_24.png create mode 100644 app/src/main/res/drawable/round_no_cell_24.xml create mode 100644 app/src/main/res/layout/activity_media_info_format.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f25cecf..ccbaa26 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,7 +40,7 @@ - + diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceSettingsDialog.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceSettingsDialog.kt index dbdb44c..bde5deb 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceSettingsDialog.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceSettingsDialog.kt @@ -30,6 +30,7 @@ import com.tommasoberlose.anotherwidget.helpers.GreetingsHelper import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper import com.tommasoberlose.anotherwidget.receivers.ActivityDetectionReceiver import com.tommasoberlose.anotherwidget.ui.activities.tabs.AppNotificationsFilterActivity +import com.tommasoberlose.anotherwidget.ui.activities.tabs.MediaInfoFormatActivity import com.tommasoberlose.anotherwidget.ui.activities.tabs.MusicPlayersFilterActivity import com.tommasoberlose.anotherwidget.ui.fragments.MainFragment import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission @@ -68,11 +69,16 @@ class GlanceSettingsDialog(val context: Activity, val provider: Constants.Glance /* SONG */ binding.actionFilterMusicPlayers.isVisible = provider == Constants.GlanceProviderId.PLAYING_SONG + binding.actionChangeMediaInfoFormat.isVisible = provider == Constants.GlanceProviderId.PLAYING_SONG if (provider == Constants.GlanceProviderId.PLAYING_SONG) { binding.actionFilterMusicPlayers.setOnClickListener { dismiss() context.startActivityForResult(Intent(context, MusicPlayersFilterActivity::class.java), 0) } + binding.actionChangeMediaInfoFormat.setOnClickListener { + dismiss() + context.startActivityForResult(Intent(context, MediaInfoFormatActivity::class.java), 0) + } checkNotificationPermission() } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt index a25edeb..289b9d4 100755 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt @@ -4,6 +4,8 @@ import android.os.Build import androidx.appcompat.app.AppCompatDelegate.* import androidx.core.os.ConfigurationCompat import com.chibatching.kotpref.KotprefModel +import com.tommasoberlose.anotherwidget.helpers.IntentHelper +import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper import com.tommasoberlose.anotherwidget.utils.isMetric import java.util.* @@ -133,11 +135,11 @@ object Preferences : KotprefModel() { var lastNotificationPackage by stringPref(default = "") var showMusic by booleanPref(default = false) - var mediaInfoFormat by stringPref(default = "") + var mediaInfoFormat by stringPref(default = MediaPlayerHelper.DEFAULT_MEDIA_INFO_FORMAT) var mediaPlayerTitle by stringPref(default = "") var mediaPlayerAlbum by stringPref(default = "") var mediaPlayerArtist by stringPref(default = "") - var mediaPlayerPackage by stringPref(default = "") + var mediaPlayerPackage by stringPref(default = IntentHelper.DO_NOTHING_OPTION) var musicPlayersFilter by stringPref(default = "") var appNotificationsFilter by stringPref(default = "") diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt index f7bd450..5de9a74 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt @@ -21,6 +21,10 @@ import java.util.* object IntentHelper { + const val DEFAULT_OPTION = "" + const val DO_NOTHING_OPTION = "DO_NOTHING" + const val REFRESH_WIDGET_OPTION = "REFRESH_WIDGET" + fun getWidgetUpdateIntent(context: Context): Intent { val widgetManager = AppWidgetManager.getInstance(context) val widgetComponent = ComponentName(context, MainWidget::class.java) @@ -47,7 +51,7 @@ object IntentHelper { fun getWeatherIntent(context: Context): Intent { return when (Preferences.weatherAppPackage) { - "" -> { + DEFAULT_OPTION -> { Intent(Intent.ACTION_VIEW).apply { addCategory(Intent.CATEGORY_DEFAULT) flags = Intent.FLAG_ACTIVITY_NEW_TASK @@ -55,9 +59,12 @@ object IntentHelper { component = ComponentName("com.google.android.googlequicksearchbox", "com.google.android.apps.gsa.velour.DynamicActivityTrampoline") } } - "_" -> { + DO_NOTHING_OPTION -> { Intent() } + REFRESH_WIDGET_OPTION -> { + getWidgetUpdateIntent(context) + } else -> { val pm: PackageManager = context.packageManager try { @@ -79,14 +86,17 @@ object IntentHelper { .appendPath(Calendar.getInstance().timeInMillis.toString()) .build() return when (Preferences.calendarAppPackage) { - "" -> { + DEFAULT_OPTION -> { Intent(Intent.ACTION_VIEW).apply { data = calendarUri } } - "_" -> { + DO_NOTHING_OPTION -> { Intent() } + REFRESH_WIDGET_OPTION -> { + getWidgetUpdateIntent(context) + } else -> { val pm: PackageManager = context.packageManager try { @@ -164,14 +174,17 @@ object IntentHelper { fun getClockIntent(context: Context): Intent { return when (Preferences.clockAppPackage) { - "" -> { + DEFAULT_OPTION -> { Intent(AlarmClock.ACTION_SHOW_ALARMS).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK } } - "_" -> { + DO_NOTHING_OPTION -> { Intent() } + REFRESH_WIDGET_OPTION -> { + getWidgetUpdateIntent(context) + } else -> { val pm: PackageManager = context.packageManager try { @@ -191,7 +204,7 @@ object IntentHelper { fun getMusicIntent(context: Context): Intent { return when (Preferences.mediaPlayerPackage) { - "" -> { + DO_NOTHING_OPTION -> { Intent() } else -> { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/MediaPlayerHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/MediaPlayerHelper.kt index d90cb45..cd51492 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/MediaPlayerHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/MediaPlayerHelper.kt @@ -15,14 +15,32 @@ import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget import java.lang.Exception object MediaPlayerHelper { + const val MEDIA_INFO_TITLE = "%TITLE" + const val MEDIA_INFO_ARTIST = "%ARTIST" + const val MEDIA_INFO_ALBUM = "%ALBUM" + + const val DEFAULT_MEDIA_INFO_FORMAT = "%TITLE, %ARTIST" + fun isSomeonePlaying(context: Context) = Preferences.showMusic && ActiveNotificationsHelper.checkNotificationAccess(context) && Preferences.mediaPlayerTitle != "" - fun getMediaInfo(): String { - return if (Preferences.mediaPlayerArtist == "") { - Preferences.mediaPlayerTitle - } else { - "%s, %s".format(Preferences.mediaPlayerTitle, Preferences.mediaPlayerArtist) - } + fun getMediaInfo(format: String = Preferences.mediaInfoFormat, title: String = Preferences.mediaPlayerTitle, artist: String = Preferences.mediaPlayerArtist, album: String = Preferences.mediaPlayerAlbum): String { + return when (format) { + "", + DEFAULT_MEDIA_INFO_FORMAT -> { + if (Preferences.mediaPlayerArtist == "") { + Preferences.mediaPlayerTitle + } else { + DEFAULT_MEDIA_INFO_FORMAT.replace(MEDIA_INFO_TITLE, title) + .replace(MEDIA_INFO_ARTIST, artist) + .replace(MEDIA_INFO_ALBUM, album) + } + } + else -> { + format.replace(MEDIA_INFO_TITLE, title) + .replace(MEDIA_INFO_ARTIST, artist) + .replace(MEDIA_INFO_ALBUM, album) + } + } } fun updatePlayingMediaInfo(context: Context) { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/ChooseApplicationActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/ChooseApplicationActivity.kt index cffa6e3..c45fb0f 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/ChooseApplicationActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/ChooseApplicationActivity.kt @@ -17,6 +17,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide import com.tommasoberlose.anotherwidget.databinding.ActivityChooseApplicationBinding import com.tommasoberlose.anotherwidget.global.Constants +import com.tommasoberlose.anotherwidget.helpers.IntentHelper import com.tommasoberlose.anotherwidget.ui.viewmodels.tabs.ChooseApplicationViewModel import kotlinx.coroutines.* import net.idik.lib.slimadapter.SlimAdapter @@ -41,21 +42,59 @@ class ChooseApplicationActivity : AppCompatActivity() { adapter = SlimAdapterEx.create() adapter - .register(R.layout.application_info_layout) { _, injector -> - injector - .text(R.id.text, getString(R.string.default_name)) - .image(R.id.icon, R.drawable.round_add_to_home_screen_24) - .with(R.id.icon) { - it.scaleX = 0.8f - it.scaleY = 0.8f - it.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimaryText), android.graphics.PorterDuff.Mode.MULTIPLY) + .register(R.layout.application_info_layout) { item, injector -> + when (item) { + IntentHelper.DO_NOTHING_OPTION -> { + injector + .text(R.id.text, getString(R.string.gestures_do_nothing)) + .image(R.id.icon, R.drawable.round_no_cell_24) + .with(R.id.icon) { + it.scaleX = 0.8f + it.scaleY = 0.8f + it.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimaryText), android.graphics.PorterDuff.Mode.MULTIPLY) + } + .clicked(R.id.item) { + val resultIntent = Intent() + resultIntent.putExtra(Constants.RESULT_APP_NAME, IntentHelper.DO_NOTHING_OPTION) + resultIntent.putExtra(Constants.RESULT_APP_PACKAGE, IntentHelper.DO_NOTHING_OPTION) + setResult(Activity.RESULT_OK, resultIntent) + finish() + } + } + IntentHelper.REFRESH_WIDGET_OPTION -> { + injector + .text(R.id.text, getString(R.string.action_refresh_widget)) + .image(R.id.icon, R.drawable.round_refresh) + .with(R.id.icon) { + it.scaleX = 0.8f + it.scaleY = 0.8f + it.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimaryText), android.graphics.PorterDuff.Mode.MULTIPLY) + } + .clicked(R.id.item) { + val resultIntent = Intent() + resultIntent.putExtra(Constants.RESULT_APP_NAME, IntentHelper.REFRESH_WIDGET_OPTION) + resultIntent.putExtra(Constants.RESULT_APP_PACKAGE, IntentHelper.REFRESH_WIDGET_OPTION) + setResult(Activity.RESULT_OK, resultIntent) + finish() + } + } + else -> { + injector + .text(R.id.text, getString(R.string.default_name)) + .image(R.id.icon, R.drawable.round_add_to_home_screen_24) + .with(R.id.icon) { + it.scaleX = 0.8f + it.scaleY = 0.8f + it.setColorFilter(ContextCompat.getColor(this, R.color.colorPrimaryText), android.graphics.PorterDuff.Mode.MULTIPLY) + } + .clicked(R.id.item) { + val resultIntent = Intent() + resultIntent.putExtra(Constants.RESULT_APP_NAME, IntentHelper.DEFAULT_OPTION) + resultIntent.putExtra(Constants.RESULT_APP_PACKAGE, IntentHelper.DEFAULT_OPTION) + setResult(Activity.RESULT_OK, resultIntent) + finish() + } } - .clicked(R.id.item) { - val resultIntent = Intent() - resultIntent.putExtra(Constants.RESULT_APP_NAME, "") - resultIntent.putExtra(Constants.RESULT_APP_PACKAGE, "") - setResult(Activity.RESULT_OK, resultIntent) - finish() } } .register(R.layout.application_info_layout) { item, injector -> @@ -114,7 +153,7 @@ class ChooseApplicationActivity : AppCompatActivity() { } } withContext(Dispatchers.Main) { - adapter.updateData(listOf("Default") + filteredList) + adapter.updateData(listOf(IntentHelper.DO_NOTHING_OPTION, IntentHelper.DEFAULT_OPTION, IntentHelper.REFRESH_WIDGET_OPTION) + filteredList) binding.loader.visibility = View.INVISIBLE } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/CustomDateActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/CustomDateActivity.kt index f7df13f..93c2914 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/CustomDateActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/CustomDateActivity.kt @@ -22,7 +22,7 @@ import java.lang.Exception import java.text.SimpleDateFormat import java.util.* -class CustomDateActivity : AppCompatActivity() { +class CustomDateActivity : AppCompatActivity() { private lateinit var adapter: SlimAdapter private lateinit var viewModel: CustomDateViewModel diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/MediaInfoFormatActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/MediaInfoFormatActivity.kt new file mode 100644 index 0000000..9be190a --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/MediaInfoFormatActivity.kt @@ -0,0 +1,109 @@ +package com.tommasoberlose.anotherwidget.ui.activities.tabs + +import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import com.chibatching.kotpref.blockingBulk +import com.tommasoberlose.anotherwidget.R +import com.tommasoberlose.anotherwidget.databinding.ActivityMediaInfoFormatBinding +import com.tommasoberlose.anotherwidget.global.Preferences +import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper +import com.tommasoberlose.anotherwidget.ui.viewmodels.tabs.MediaInfoFormatViewModel +import com.tommasoberlose.anotherwidget.utils.getCapWordString +import com.tommasoberlose.anotherwidget.utils.openURI +import com.tommasoberlose.anotherwidget.utils.toast +import kotlinx.coroutines.* +import net.idik.lib.slimadapter.SlimAdapter +import java.lang.Exception +import java.text.SimpleDateFormat +import java.util.* + +class MediaInfoFormatActivity : AppCompatActivity() { + + private lateinit var adapter: SlimAdapter + private lateinit var viewModel: MediaInfoFormatViewModel + private lateinit var binding: ActivityMediaInfoFormatBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + viewModel = ViewModelProvider(this).get(MediaInfoFormatViewModel::class.java) + binding = ActivityMediaInfoFormatBinding.inflate(layoutInflater) + + + binding.listView.setHasFixedSize(true) + val mLayoutManager = LinearLayoutManager(this) + binding.listView.layoutManager = mLayoutManager + + adapter = SlimAdapter.create() + adapter + .register(R.layout.custom_date_example_item) { item, injector -> + injector + .text(R.id.custom_date_example_format, item) + .text( + R.id.custom_date_example_value, MediaPlayerHelper.getMediaInfo(item, EXAMPLE_TITLE, EXAMPLE_ARTIST, EXAMPLE_ALBUM)) + } + .attachTo(binding.listView) + + adapter.updateData( + listOf( + MediaPlayerHelper.MEDIA_INFO_TITLE, MediaPlayerHelper.MEDIA_INFO_ARTIST, MediaPlayerHelper.MEDIA_INFO_ALBUM + ) + ) + + setupListener() + subscribeUi(binding, viewModel) + + binding.mediaInfoFormatInput.requestFocus() + + setContentView(binding.root) + } + + private var formatJob: Job? = null + + private fun subscribeUi(binding: ActivityMediaInfoFormatBinding, viewModel: MediaInfoFormatViewModel) { + binding.viewModel = viewModel + binding.lifecycleOwner = this + + viewModel.mediaInfoFormatInput.observe(this) { mediaInfoFormatInput -> + formatJob?.cancel() + formatJob = lifecycleScope.launch(Dispatchers.IO) { + withContext(Dispatchers.Main) { + binding.loader.visibility = View.VISIBLE + } + + delay(200) + val text = MediaPlayerHelper.getMediaInfo(mediaInfoFormatInput, EXAMPLE_TITLE, EXAMPLE_ARTIST, EXAMPLE_ALBUM) + + withContext(Dispatchers.Main) { + binding.loader.visibility = View.INVISIBLE + binding.mediaInfoFormatInputValue.text = text + } + + } + } + } + + private fun setupListener() { + binding.actionBack.setOnClickListener { + onBackPressed() + } + } + + override fun onBackPressed() { + Preferences.blockingBulk { + mediaInfoFormat = viewModel.mediaInfoFormatInput.value ?: "" + } + super.onBackPressed() + } + + companion object { + const val EXAMPLE_TITLE = "Thunderstruck" + const val EXAMPLE_ARTIST = "AC/DC" + const val EXAMPLE_ALBUM = "The Razors Edge" + } +} diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/tabs/MediaInfoFormatViewModel.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/tabs/MediaInfoFormatViewModel.kt new file mode 100644 index 0000000..fd8bff6 --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/tabs/MediaInfoFormatViewModel.kt @@ -0,0 +1,11 @@ +package com.tommasoberlose.anotherwidget.ui.viewmodels.tabs + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData +import com.tommasoberlose.anotherwidget.global.Preferences +import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper + +class MediaInfoFormatViewModel(application: Application) : AndroidViewModel(application) { + val mediaInfoFormatInput: MutableLiveData = MutableLiveData(if (Preferences.mediaInfoFormat == "") MediaPlayerHelper.DEFAULT_MEDIA_INFO_FORMAT else Preferences.mediaInfoFormat) +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/round_text_fields_24.png b/app/src/main/res/drawable-hdpi/round_text_fields_24.png new file mode 100644 index 0000000000000000000000000000000000000000..648a053ab6c392cdbf13b046ad490d583ce96b5e GIT binary patch literal 546 zcmV+-0^R+IP)xml2l+@-`wOf|z6!#fU$s_!FaU1b>1qf-dw$T#33jE1x3}a>CUbDJwJ6 z)m1e*3mbaV-PQN&a}TF(6FqjY$9V7#RMn9p3Q771fF!T03Rd0E0+Q4RU=hH&D>OrL zzp7}b`^i8KW){G%SKuDNAW5Y{2rtU_O!jkpq(i zBxx0Zoz0Ia22%@2Qa^yN0KR!D`~@&h@@K9x&GpeOle7R}D^O+_z-5k!!w-o9a&0o- zG!JXj1j*A<%0w&F#=xIR9+!sc=%FC=d;@nynT`sz2|Y9Lh#!KG*~f?a zLh`6IR1}bFp-qQ-0o0gz>eV+_2V~>NbO2>WpCoxwN~vgtp11j@6c5{1%u}_2oLXHo zdJ>R>ng{Sbn2|0yF?_nYyz{W!2HJGp!M8bv$A;c1UcD#U%CvizE+`__OsOZuz@h_svm)4&U`DrqmLakr*aQ9;W)umK!O`lt;^Xz2haRh#=Dzcy$} zOT1wb5U0iKu7Ojaik9a%VMV|NumB7L2D}1aRh)$1 zMVqd#Dx}v1pgF>NeWP>GBOYUor?eI=E1OcPh!u`yA^K|{RO&Oj0W zX?rszKrI}N6iNO1p~TLT7t&Kf$Wf;-rGSzIV_ZU%4kD~Wlol$n#@R>dp%N3{wp$?b zbQ2+5QglBfuXr=lQ^Lh9m7=0Gykb23mwvRNvR8W9ZDh@3U@e`OA&iK-x} zR{l8aAw3m@w3Gt+q_#4YtB&h8bw^i%GUXLw<>u85b@`oUDrn&j`j&sgGvpvo73lr( ap7#K*ab$E(Y|hO90000^Z}p$!Q~bY0$wypub>_Ud{9whl z_r8i56&sagBz%M#rt$7b^)$KE>fgA+_)mu(XUk?!9t9iTB&PHUJOw8YZc-?n#&lr` zM^X@@lhGB1M83HFOdOlPA79nr?<4TNLw_fWh-UNL7}FU(Md^>%I_6K9*f-6sdDXtR X!iU{gTe~DWM4fx+PZd literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-xhdpi/round_no_cell_24.png b/app/src/main/res/drawable-night-xhdpi/round_no_cell_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7f1964316d9b29ff1b5f98eb0838dafbc48e9577 GIT binary patch literal 360 zcmV-u0hj)XP)uo8sWNZtWN$N|D5&rTOSg$Y=AMo~!fwb8SPB1VAQI0EtKf_7n3gpfDAuUIHK! zDS$*I0sDzGpfKHek4gm0L_1(4WI&5yB*g#&5d~Bt4pg2bA_EYK9N;@~s{=!bc+r8r z=^6XTE3n~02RiQD<(Eu2X2F^5E1_fN*r<`7$v^uHNy`Vlpa#vUE1lW^0000R8(0bcAkh>)iJcJxH}+{#1k~GzMbO$8Q0#mw5&s@Q!6S=;-k@Y> z=gcUQJumPTb7$Gh2?&2HVGbgI3UtuN2vsddQ#qWL8W$v*rc%xw2mGYjY$H~6mUK^zhl#2}GDdJ-KJN%snp0jR>Nf@A^;3X%~hpJWEgB^iS9NT#41k}*h5 zG6zXX4j>uH1tcLkfdW<%Np7H2k|QXMH1q_ekiNcl9Y8XY3rIq80;QAOK&d20P#Vb< zl)ft6K#_EpPqF~1NH!n^$qE#(oJW#?q&dZ-oMZ{gBH4m6NY)@R$sQymd4NPDACQ3L z1^SLO`CU*X)&G0HU`Y-do03X7Xh5zJ)Ja=%P?uh{*v8EV=Q?MG8rY?B_EDgPV_g1J zxtM+bwuz(?O-7-qfi4Eh@qRBf74r_-KLou2Qpw4u*q4;K00000NkvXXu0mjfxpT_y literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-night-xxxhdpi/round_no_cell_24.png b/app/src/main/res/drawable-night-xxxhdpi/round_no_cell_24.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4502de8ef46efa18e138f02cfd65bc40adc678 GIT binary patch literal 646 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VDj~JaSW+oe0z6mRj4C_>%(rd z9lPy0`E;l3h?Xv|W%`p^FrBTuyh?^|_Y9?XC+As~zkMGaTJ!J6R;J`0L$jFEn{qZq zEiYSbboGMs*S#Uvy|?ZSx$J#)Rmj`$)mM9_@YijL61LmWCc?eq^_3YS{PmNwPIyK$ zI~g&o4skwrYr?6A{-LIpEGxn{2Qkc8ziLnW(eQ(h<|xT%MzA|g{p{er((`EF1B)N6 zuh#rp_it5sR{BPzo-YsmL*zrlt^Vo#8+~LxVgcgFO>N9Zbmwki>=0;fx6`8P(ph3{~zG zCU3x+!7?x{5L+iXFf4d`SHs>!fg!RR1n^qAR@`Gg zur*>I>)Eicz>p6;eI@s5Vf@vu8Fj+9W;i!&&9&QCRH~RTCoDMWcXUF}t$B+N-=A~m z@hSF}-p+dKRe{-8UO27dwih;Aq1^eWD{5KU>e8&D#2LpVl6(HL->70W%PjGh0H!Yn MPgg&ebxsLQ0ARlGaR2}S literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/round_text_fields_24.png b/app/src/main/res/drawable-xhdpi/round_text_fields_24.png new file mode 100644 index 0000000000000000000000000000000000000000..3c690ca5afc89cfc151c09e13cf5b207e70a1c55 GIT binary patch literal 601 zcmV-f0;c_mP)Xmbg8Sqk1`{tldz^f_mM zvNn@ge*zDD97y_;CBO`AJXRmH*MY+!g7*%h262Nnp830ydi@n=?u`I%{Fi}wDaZJAV{GAZSF{VG1yd7({Lz2R@$^uC`WCA z02;LMHhh6P96_7kz!yp1s`{F#keRIl2UA<(5n`?E!gsR19p94lE_e`|*$!|kRn!&z z`hIGo4S*j=ZqGBo*~0PDi6J^G%-uV_2zPx)3J1F4G^f)P2klSmFNtRi%zis$#seX$U&!G00MOK#m;A^Jg*iDfI6Li0Bc!a z?l$O@|MmLxykD`{eE_b`Iu^#P8NH2x5`gP;2DnySAo~xGk8|^jDJG+Bza69kZG(t; ne*qAay*|EORG^P6#OgQ%|4(GAN_~DuDcgNKsHx zP*IQ{fubNkep$pIrIgsQ2*45m^8XEhS0t66d;YCk2c(pm1z-n&OB#-NC18#K7$N!B z-_7Pd6o)0z}Xt*h-be6%pv*3-_7PdBn70D61D6BaM57$F96F)zHaVXn3kyl zNxYG`Q#Y=_SxxeJ7#IC|Ne0LwAd4qI0c;@o*w3wSt)m0d)9R?Da@OYrM=(bPqyzF! z9dkM}t*ZKq4d@_%^9I4oYPBqffIO9*(Eur>P69Y#P^rY6wIs*FMUAjMMFFJY$cj~$ z1PYu@Bp-%#DQs^+0qK~tPrqB$^)1tCP0q@hz#I&aUafZPxAMBjm`xIBqqUHLI+p|{ z1JuFCxKA`^+OUE8<1@hxRj*Sm^=Av6r}ql3AA})&VU?}z>Opy*%*=YJ=TC6 zl0fnIDS(%mIxagVp8&ik`Q2or6(GHDwF|%%Q->Y8{uO}in*6A<*%r`3y_r|{Zq*?+ z|4qG5a$N{Odo5lex(MhS$=M+QNum967YP__4hCoefVYP7MHl%6n_?2Hh5+1%U8YS) zIb4tyqm@!K0c_VRnJHM019+CuS(l;0FZ0#Wl~RWRoCYAkdi|szww2^v7t3?J*J_!c zY`BJW#t@SPlI(G1T~akYltzH`l#}h8tA?2L2fzvd<2f9LGQpVYx(^_kV%q>*w>X3_ zKytK+fo->G3`na;+RI4|+54&s+%ny^ki6Hn!>;3d0h$<0DJ93{Byjf~q#%H_nhpTC zU^CqSjCCa@g#;vh4O_;fl_X!d%Ds*Ig8_0(CS`S#6yQM{PP>d56i_85*(Q^NB=5Kw zoci7&XQUbRmlUcpsMhDa& znarvRkPMJRGAT+L05Fj9=n5Fu( zEh>{kByYu3h^g<^6jV`Cugatp*XNS_XmTRv^&9|6GC8QL02B2j`3zGwE3ZxaPckdX zsQiu9LK-%<6@{~nu!-eXqwBcj7Cd3lL&^El0vT2EHCRK=4GaZB`Yyd+|T<)wx;)FqlZ{R4K+9(>-f_p|qd&pEHmU?#%`?TiKh z*aY~~SPP6?JWJ$48uC)U1OToIpl#oCGTeBh_1!o06;J%u?CtjLpsux?UDJ5QllgMxp*%IqW-U9e)sHyJSF#pc#$%@q_h$a}<5fb__NKtvdToYR09r z2`1i*Hcni&9->-)fOzRo(wkh&>w(y!CbMNpSU~5^y$H$jc_=cd(^MMkl73MA_42J^ z557*<1uXGZumOuzh4@dj`(El@1XEFAag3-Ebo~19v^rHUbgxi4_PP_&N&}*jQ~n0I z^1^);cdgxuCA*>~Xve^&I7ZH_Q}1Vlh`yFQoWc|2H%JXCYgb!QnyEy7styCZ z;r_ao_-O7@YnVDd`c(*b9Q1QniVY(U6f151Q{x_DWj^`pbC>ko z26oraN!8PLTM>7Rk5-RvgZjCK$K#85_Go-Xx|Z2EU1*W0{oP(=4-&{`!)@fkRHKMX z4A#MB2&{-d57@PiArAKmyI(Q%v64o_BpvKW-h=M>>j+|m+c^nu!f$`%wWOvSRTD9~ z{J8?=HK@HL?qVR)ma4QrSy?M8A^p+)d2|zN92G856uW}Tj6ro4_stD$>4`T9e8CSm z_Cr_j?)oy0son>1ozI)xQhtkI3JE-Lg>H@C26J71cy~ykJL+C(3Rp%`!F1%r$48g+ zG$FiE1Mu+d>9CTOn#Og}DqNIzjOF&Q`C0YD1bWX4n;x6O%{j;iTJ@m1?wrSQyJ>Wp z0ax9UYD2ayI4ig75D!m25%eybagTI)A9Lul!>Ue+STVJ{M=J@(qh_(HRa-fs83U$+Wini{DlqJwk#e) zs*tu>D6#HagOB(47;l;R3eAg<4Ne_Na?)Dz+l42QeNk~vJI2dWfOje*?F+u*&KTAP zCZUh}6St#caqY2=CpLlvM*XZ0AC^dN#6Hl2eqq9eNSN9`d0C+T}ir{D~%O(0km710&yo?fvc{HA=VI#2dLEU{>jdEEJ` U*NNs#<)YU>0G&yzrbeFq7m7|tHvj+t literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/round_no_cell_24.xml b/app/src/main/res/drawable/round_no_cell_24.xml new file mode 100644 index 0000000..072bedb --- /dev/null +++ b/app/src/main/res/drawable/round_no_cell_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_media_info_format.xml b/app/src/main/res/layout/activity_media_info_format.xml new file mode 100644 index 0000000..5138a46 --- /dev/null +++ b/app/src/main/res/layout/activity_media_info_format.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/glance_provider_settings_layout.xml b/app/src/main/res/layout/glance_provider_settings_layout.xml index 668be7d..0da3c92 100644 --- a/app/src/main/res/layout/glance_provider_settings_layout.xml +++ b/app/src/main/res/layout/glance_provider_settings_layout.xml @@ -177,6 +177,39 @@ style="@style/AnotherWidget.Settings.Subtitle"/> + + + + + + Widget background Rows spacing Custom font… + Font family Thin Light @@ -341,6 +342,9 @@ Nothing Dismiss Accept + None + Song info format + Change the visible song info @@ -353,5 +357,4 @@ Set size, color and time zones Widget spacing and tweaks Smart content - Font family