diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 1f02b2c..fb20352 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index 501c162..714428c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,7 +18,7 @@ android { applicationId "com.tommasoberlose.anotherwidget" minSdkVersion 23 targetSdkVersion 29 - versionCode 65 + versionCode 68 versionName "2.0.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/release/app-release.aab b/app/release/app-release.aab index 573e547..b1b9b9b 100644 Binary files a/app/release/app-release.aab and b/app/release/app-release.aab differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3efe230..e6e01d8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -65,6 +65,7 @@ + diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/components/MaterialBottomSheetDialog.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/components/MaterialBottomSheetDialog.kt new file mode 100644 index 0000000..2170d08 --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/components/MaterialBottomSheetDialog.kt @@ -0,0 +1,63 @@ +package com.tommasoberlose.anotherwidget.components + +import android.content.Context +import android.view.View +import androidx.core.view.isVisible +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.tommasoberlose.anotherwidget.R +import kotlinx.android.synthetic.main.bottom_sheet_dialog.view.* + +typealias DialogCallback = () -> Unit + +class MaterialBottomSheetDialog( + context: Context, + private val title: String? = "", + private val message: String? = "" +) : BottomSheetDialog(context, R.style.BottomSheetDialogTheme) { + + private var positiveButtonLabel: String? = null + private var negativeButtonLabel: String? = null + private var positiveCallback: DialogCallback? = null + private var negativeCallback: DialogCallback? = null + + fun setPositiveButton(label: String? = context.getString(android.R.string.ok), callback: DialogCallback? = null): MaterialBottomSheetDialog { + positiveButtonLabel = label + positiveCallback = callback + return this + } + + fun setNegativeButton(label: String? = context.getString(android.R.string.cancel), callback: DialogCallback? = null): MaterialBottomSheetDialog { + negativeButtonLabel = label + negativeCallback = callback + return this + } + + override fun show() { + val view = View.inflate(context, R.layout.bottom_sheet_dialog, null) + + // Header + view.message.isVisible = title != null + view.title.text = title ?: "" + + view.message.isVisible = message != null + view.message.text = message ?: "" + + view.action_positive.isVisible = positiveButtonLabel != null + view.action_positive.text = positiveButtonLabel ?: "" + view.action_positive.setOnClickListener { + positiveCallback?.invoke() + this.dismiss() + } + + view.action_negative.isVisible = negativeButtonLabel != null + view.action_negative.text = negativeButtonLabel ?: "" + view.action_negative.setOnClickListener { + negativeCallback?.invoke() + this.dismiss() + } + + setContentView(view) + super.show() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt index 2520692..fc42acf 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt @@ -1,12 +1,10 @@ package com.tommasoberlose.anotherwidget.db import android.content.Context -import android.util.Log import com.chibatching.kotpref.bulk import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.models.Event import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver -import com.tommasoberlose.anotherwidget.services.UpdatesWorker import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget import io.realm.Realm import io.realm.RealmResults @@ -43,6 +41,8 @@ class EventRepository(val context: Context) { fun getNextEvent(): Event? = realm.where(Event::class.java).equalTo("id", Preferences.nextEventId).findFirst() ?: realm.where(Event::class.java).findFirst() + fun getEventById(id: Long): Event? = realm.where(Event::class.java).equalTo("id", id).findFirst() + fun goToNextEvent() { val eventList = realm.where(Event::class.java).findAll() @@ -56,7 +56,7 @@ class EventRepository(val context: Context) { } else { resetNextEventData() } - UpdatesWorker.setUpdates(context) + UpdatesReceiver.setUpdates(context) MainWidget.updateWidget(context) } @@ -73,7 +73,7 @@ class EventRepository(val context: Context) { } else { resetNextEventData() } - UpdatesWorker.setUpdates(context) + UpdatesReceiver.setUpdates(context) MainWidget.updateWidget(context) } 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 4cb84db..700f13f 100755 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Preferences.kt @@ -59,4 +59,6 @@ object Preferences : KotprefModel() { var showWallpaper by booleanPref(default = true) var showBigClockWarning by booleanPref(default = true) var showWeatherWarning by booleanPref(default = true) + var showPreview by booleanPref(default = true) + var showXiaomiWarning by booleanPref(default = true) } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt index 84964e7..617a0ea 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt @@ -20,7 +20,9 @@ object BitmapHelper { view.measure(measuredWidth, measuredHeight) return try { - Log.d("ciao", "bitmap ${view.measuredWidth}, ${view.measuredHeight} - draw = ${draw}") + if (draw) { + Log.d("ciao", "bitmap ${view.measuredWidth}, ${view.measuredHeight}") + } val btm = Bitmap.createBitmap( view.measuredWidth, view.measuredHeight, diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/CalendarHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/CalendarHelper.kt index eb92b32..ae8e423 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/CalendarHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/CalendarHelper.kt @@ -10,7 +10,6 @@ import com.tommasoberlose.anotherwidget.db.EventRepository import com.tommasoberlose.anotherwidget.models.Event import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver -import com.tommasoberlose.anotherwidget.services.UpdatesWorker import com.tommasoberlose.anotherwidget.ui.activities.MainActivity import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission @@ -125,7 +124,7 @@ object CalendarHelper { eventRepository.resetNextEventData() } - UpdatesWorker.setUpdates(context) + UpdatesReceiver.setUpdates(context) Log.d("ciao", "force update? 7") MainWidget.updateWidget(context) 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 ac6086d..8899b8a 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/IntentHelper.kt @@ -95,7 +95,6 @@ object IntentHelper { return when (Preferences.openEventDetails || forceEventDetails) { true -> { val uri = ContentUris.withAppendedId(Events.CONTENT_URI, e.eventID) - if (Preferences.calendarAppPackage == "") { Intent(Intent.ACTION_VIEW).apply { data = uri diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/models/Event.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/models/Event.kt index 9a4ac79..e19369a 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/models/Event.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/models/Event.kt @@ -14,9 +14,8 @@ open class Event(var id: Long = 0, var endDate: Long = 0, var calendarID: Int = 0, var allDay: Boolean = false, - var address: String = "") : RealmObject(){ - + var address: String = "") : RealmObject() { override fun toString(): String { - return "Event:\nID: " + id + "\nTITLE: " + title + "\nSTART DATE: " + Date(startDate) + "\nEND DATE: " + Date(endDate) + "\nCAL DAY: " + calendarID + "\nADDRESS: " + address + return "Event:\nID: " + eventID + "\nTITLE: " + title + "\nSTART DATE: " + Date(startDate) + "\nEND DATE: " + Date(endDate) + "\nCAL ID: " + calendarID + "\nADDRESS: " + address } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt index c8be36f..84c7c4a 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt @@ -1,23 +1,25 @@ package com.tommasoberlose.anotherwidget.receivers +import android.app.AlarmManager +import android.app.PendingIntent import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.app.AlarmManager -import android.app.PendingIntent import android.util.Log +import androidx.core.app.AlarmManagerCompat +import androidx.core.content.ContextCompat.getSystemService import com.tommasoberlose.anotherwidget.db.EventRepository import com.tommasoberlose.anotherwidget.global.Actions import com.tommasoberlose.anotherwidget.helpers.CalendarHelper import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget import org.joda.time.Period -import java.text.DateFormat import java.util.* class UpdatesReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { + Log.d("ciao", "che palle - ${intent.action}") when (intent.action) { Intent.ACTION_BOOT_COMPLETED, Intent.ACTION_MY_PACKAGE_REPLACED, @@ -35,4 +37,53 @@ class UpdatesReceiver : BroadcastReceiver() { } } } + + companion object { + + fun setUpdates(context: Context) { + removeUpdates(context) + + + val eventRepository = EventRepository(context) + with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) { + eventRepository.getEvents().forEach { event -> + val now = Calendar.getInstance().apply { + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) + } + val diff = Period(now.timeInMillis, event.startDate) + if (event.startDate > now.timeInMillis) { + // Update the widget every hour till the event + (0..diff.hours).forEach { + AlarmManagerCompat.setExactAndAllowWhileIdle( + this, + AlarmManager.RTC_WAKEUP, + if (event.startDate - it * 1000 * 60 * 60 > 60 * 1000) event.startDate - it * 1000 * 60 * 60 else 120000, + PendingIntent.getBroadcast( + context, + 0, + Intent(context, UpdatesReceiver::class.java).apply { + action = Actions.ACTION_TIME_UPDATE + }, + 0 + ) + ) + } + } + + // Update the widget one second after the event is finished + AlarmManagerCompat.setExactAndAllowWhileIdle(this, + AlarmManager.RTC_WAKEUP, + if (event.endDate > 60 *1000) event.endDate else 120000, + PendingIntent.getBroadcast(context, 0, Intent(context, UpdatesReceiver::class.java).apply { action = Actions.ACTION_TIME_UPDATE }, 0)) + } + } + } + + fun removeUpdates(context: Context) { + with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) { + cancel(PendingIntent.getBroadcast(context, 0, Intent(context, UpdatesReceiver::class.java), 0)) + } + } + } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdatesWorker.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdatesWorker.kt deleted file mode 100644 index 790225b..0000000 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdatesWorker.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.tommasoberlose.anotherwidget.services - -import android.app.AlarmManager -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import androidx.work.OneTimeWorkRequestBuilder -import androidx.work.WorkManager -import androidx.work.Worker -import androidx.work.WorkerParameters -import com.tommasoberlose.anotherwidget.db.EventRepository -import com.tommasoberlose.anotherwidget.global.Actions -import com.tommasoberlose.anotherwidget.helpers.CalendarHelper -import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver -import org.joda.time.Period -import java.util.* -import java.util.concurrent.TimeUnit - - -class UpdatesWorker(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) { - override fun doWork(): Result { - CalendarHelper.updateEventList(applicationContext) - return Result.success() - } - - companion object { - private const val JOB_TAG = "UPDATES_WORKER" - - fun setUpdates(context: Context) { - removeUpdates(context) - val now = Calendar.getInstance().timeInMillis - val workManager = WorkManager.getInstance(context) - val eventRepository = EventRepository(context) - eventRepository.getEvents().forEach { event -> - val hoursDiff = Period(Calendar.getInstance().timeInMillis, event.startDate).hours - - // Update the widget every hour till the event - (0 .. hoursDiff).forEach { - workManager.enqueue(OneTimeWorkRequestBuilder().setInitialDelay((event.startDate + 1000) - now - it * 1000 * 60* 60, TimeUnit.MILLISECONDS).build()) - } - - // Update the widget one second after the event is finished - workManager.enqueue(OneTimeWorkRequestBuilder().setInitialDelay(event.endDate + 1000 - now, TimeUnit.MILLISECONDS).build()) - } - } - - fun removeUpdates(context: Context) { - WorkManager.getInstance(context).cancelAllWorkByTag(JOB_TAG) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/services/WeatherWorker.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/services/WeatherWorker.kt index 8c96584..df24bbf 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/services/WeatherWorker.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/services/WeatherWorker.kt @@ -4,6 +4,7 @@ import android.app.AlarmManager import android.app.PendingIntent import android.content.Context import android.content.Intent +import android.util.Log import androidx.work.* import com.tommasoberlose.anotherwidget.global.Actions import com.tommasoberlose.anotherwidget.global.Preferences @@ -27,27 +28,31 @@ class WeatherWorker(appContext: Context, workerParams: WorkerParameters) : Worke if (Preferences.showWeather && Preferences.weatherProviderApi != "") { WeatherHelper.updateWeather(context) - - WorkManager.getInstance(context).enqueue(PeriodicWorkRequestBuilder( - when (Preferences.weatherRefreshPeriod) { - 0 -> 30 - 1 -> 60 - 2 -> 60L * 3 - 3 -> 60L * 6 - 4 -> 60L * 12 - 5 -> 60L * 24 - else -> 60 - } - , TimeUnit.MINUTES) + WorkManager.getInstance(context).enqueueUniquePeriodicWork( + "WEATHER_JOB_PERIODIC", + ExistingPeriodicWorkPolicy.KEEP, + PeriodicWorkRequestBuilder( + when (Preferences.weatherRefreshPeriod) { + 0 -> 30 + 1 -> 60 + 2 -> 60L * 3 + 3 -> 60L * 6 + 4 -> 60L * 12 + 5 -> 60L * 24 + else -> 60 + } + , TimeUnit.MINUTES + ) .addTag(JOB_TAG) - .build()) + .build() + ) } } fun setOneTimeUpdate(context: Context) { val workManager = WorkManager.getInstance(context) - listOf(10L, 15L, 20L).forEach { - workManager.enqueue(OneTimeWorkRequestBuilder().setInitialDelay(it, TimeUnit.MINUTES).addTag(JOB_TAG).build()) + listOf(10L, 20L, 30L).forEach { + workManager.enqueueUniqueWork("WEATHER_JOB_ONE_TIME_$it", ExistingWorkPolicy.KEEP, OneTimeWorkRequestBuilder().setInitialDelay(it, TimeUnit.MINUTES).addTag(JOB_TAG).build()) } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MainActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MainActivity.kt index 626019e..7ccf993 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/MainActivity.kt @@ -6,8 +6,10 @@ import android.appwidget.AppWidgetManager import android.content.Intent import android.content.SharedPreferences import android.graphics.drawable.BitmapDrawable +import android.net.Uri +import android.os.Build import android.os.Bundle -import android.util.Log +import android.provider.Settings import android.util.TypedValue import android.view.View import android.widget.RelativeLayout @@ -19,12 +21,12 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import com.google.android.material.tabs.TabLayoutMediator import com.tommasoberlose.anotherwidget.R +import com.tommasoberlose.anotherwidget.components.MaterialBottomSheetDialog import com.tommasoberlose.anotherwidget.global.Actions import com.tommasoberlose.anotherwidget.global.Constants import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.global.RequestCode import com.tommasoberlose.anotherwidget.helpers.BitmapHelper -import com.tommasoberlose.anotherwidget.helpers.CalendarHelper import com.tommasoberlose.anotherwidget.helpers.ColorHelper import com.tommasoberlose.anotherwidget.helpers.ColorHelper.isColorDark import com.tommasoberlose.anotherwidget.helpers.WeatherHelper @@ -39,7 +41,6 @@ import kotlinx.coroutines.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode -import java.lang.Exception class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener { @@ -83,96 +84,158 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh updateUI() WeatherHelper.updateWeather(this) + + if (getString(R.string.xiaomi_manufacturer).equals(Build.MANUFACTURER, ignoreCase = true) && Preferences.showXiaomiWarning) { + MaterialBottomSheetDialog(this, getString(R.string.xiaomi_warning_title), getString(R.string.xiaomi_warning_message)) + .setNegativeButton(getString(R.string.action_ignore)) { + Preferences.showXiaomiWarning = false + } + .setPositiveButton(getString(R.string.action_grant_permission)) { + Preferences.showXiaomiWarning = false + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.parse("package:$packageName") + } + startActivity(intent) + } + .show() + } } private var uiJob: Job? = null private fun updateUI() { - preview.setCardBackgroundColor(getColor(if (ColorHelper.getFontColor().isColorDark()) android.R.color.white else R.color.colorAccent)) - uiJob?.cancel() - uiJob = lifecycleScope.launch(Dispatchers.IO) { - delay(200) - val generatedView = MainWidget.generateWidgetView(this@MainActivity) - withContext(Dispatchers.Main) { - generatedView.measure(0, 0) - preview.measure(0, 0) - try { - // Try to recycle old bitmaps - (bitmap_container.drawable as BitmapDrawable).bitmap.recycle() - } catch (ignore: Exception) {} - } + if (Preferences.showPreview) { + preview.setCardBackgroundColor( + getColor( + if (ColorHelper.getFontColor() + .isColorDark() + ) android.R.color.white else R.color.colorAccent + ) + ) + uiJob = lifecycleScope.launch(Dispatchers.IO) { + delay(200) + val generatedView = MainWidget.generateWidgetView(this@MainActivity) - val bitmap = BitmapHelper.getBitmapFromView(generatedView, if (preview.width > 0) preview.width else generatedView.measuredWidth, generatedView.measuredHeight) - withContext(Dispatchers.Main) { - // Clock - time.setTextColor(ColorHelper.getFontColor()) - time.setTextSize(TypedValue.COMPLEX_UNIT_SP, Preferences.clockTextSize.toPixel(this@MainActivity)) - time.format12Hour = "hh:mm" + withContext(Dispatchers.Main) { + generatedView.measure(0, 0) + preview.measure(0, 0) + } - // Clock bottom margin - clock_bottom_margin_none.isVisible = Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.NONE.value - clock_bottom_margin_small.isVisible = Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.SMALL.value - clock_bottom_margin_medium.isVisible = Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.MEDIUM.value - clock_bottom_margin_large.isVisible = Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.LARGE.value + val bitmap = BitmapHelper.getBitmapFromView( + generatedView, + if (preview.width > 0) preview.width else generatedView.measuredWidth, + generatedView.measuredHeight + ) + withContext(Dispatchers.Main) { + // Clock + time.setTextColor(ColorHelper.getFontColor()) + time.setTextSize( + TypedValue.COMPLEX_UNIT_SP, + Preferences.clockTextSize.toPixel(this@MainActivity) + ) + time.format12Hour = "hh:mm" - if ((Preferences.showClock && !time.isVisible) || (!Preferences.showClock && time.isVisible)) { - if (Preferences.showClock) { + // Clock bottom margin + clock_bottom_margin_none.isVisible = + Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.NONE.value + clock_bottom_margin_small.isVisible = + Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.SMALL.value + clock_bottom_margin_medium.isVisible = + Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.MEDIUM.value + clock_bottom_margin_large.isVisible = + Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.LARGE.value + + if ((Preferences.showClock && !time.isVisible) || (!Preferences.showClock && time.isVisible)) { + if (Preferences.showClock) { + time.layoutParams = time.layoutParams.apply { + height = RelativeLayout.LayoutParams.WRAP_CONTENT + } + time.measure(0, 0) + } + val initialHeight = time.measuredHeight + ValueAnimator.ofFloat( + if (Preferences.showClock) 0f else 1f, + if (Preferences.showClock) 1f else 0f + ).apply { + duration = 500L + addUpdateListener { + val animatedValue = animatedValue as Float + time.layoutParams = time.layoutParams.apply { + height = (initialHeight * animatedValue).toInt() + } + } + addListener( + onStart = { + if (Preferences.showClock) { + time.isVisible = true + } + }, + onEnd = { + if (!Preferences.showClock) { + time.isVisible = false + } + } + ) + }.start() + + ValueAnimator.ofInt( + preview.height, + 160.toPixel(this@MainActivity) + if (Preferences.showClock) 100.toPixel( + this@MainActivity + ) else 0 + ).apply { + duration = 500L + addUpdateListener { + val animatedValue = animatedValue as Int + val layoutParams = preview.layoutParams + layoutParams.height = animatedValue + preview.layoutParams = layoutParams + } + }.start() + } else { time.layoutParams = time.layoutParams.apply { height = RelativeLayout.LayoutParams.WRAP_CONTENT } time.measure(0, 0) } - val initialHeight = time.measuredHeight - ValueAnimator.ofFloat( - if (Preferences.showClock) 0f else 1f, - if (Preferences.showClock) 1f else 0f - ).apply { - duration = 500L - addUpdateListener { - val animatedValue = animatedValue as Float - time.layoutParams = time.layoutParams.apply { - height = (initialHeight * animatedValue).toInt() - } - } - addListener( - onStart = { - if (Preferences.showClock) { - time.isVisible = true - } - }, - onEnd = { - if (!Preferences.showClock) { - time.isVisible = false - } - } - ) - }.start() - ValueAnimator.ofInt( - preview.height, - 160.toPixel(this@MainActivity) + if (Preferences.showClock) 100.toPixel(this@MainActivity) else 0 - ).apply { - duration = 500L - addUpdateListener { - val animatedValue = animatedValue as Int - val layoutParams = preview.layoutParams - layoutParams.height = animatedValue - preview.layoutParams = layoutParams - } - }.start() - } else { - time.layoutParams = time.layoutParams.apply { - height = RelativeLayout.LayoutParams.WRAP_CONTENT + if (preview.height == 0) { + ValueAnimator.ofInt( + preview.height, + 160.toPixel(this@MainActivity) + if (Preferences.showClock) 100.toPixel( + this@MainActivity + ) else 0 + ).apply { + duration = 300L + addUpdateListener { + val animatedValue = animatedValue as Int + val layoutParams = preview.layoutParams + layoutParams.height = animatedValue + preview.layoutParams = layoutParams + } + }.start() } - time.measure(0, 0) - } - bitmap_container.setImageBitmap(bitmap) - widget_loader.animate().scaleX(0f).scaleY(0f).start() - widget.animate().alpha(1f).start() + bitmap_container.setImageBitmap(bitmap) + widget_loader.animate().scaleX(0f).scaleY(0f).start() + widget.animate().alpha(1f).start() + } } + } else { + ValueAnimator.ofInt( + preview.height, + 0 + ).apply { + duration = 300L + addUpdateListener { + val animatedValue = animatedValue as Int + val layoutParams = preview.layoutParams + layoutParams.height = animatedValue + preview.layoutParams = layoutParams + } + }.start() } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/AdvancedSettingsFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/AdvancedSettingsFragment.kt index 14d8c84..0b825a5 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/AdvancedSettingsFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/AdvancedSettingsFragment.kt @@ -79,7 +79,7 @@ class AdvancedSettingsFragment : Fragment() { ) { viewModel.darkThemePreference.observe(viewLifecycleOwner, Observer { AppCompatDelegate.setDefaultNightMode(it) - theme.text = when (it) { + theme?.text = when (it) { AppCompatDelegate.MODE_NIGHT_NO -> getString(R.string.settings_subtitle_dark_theme_light) AppCompatDelegate.MODE_NIGHT_YES -> getString(R.string.settings_subtitle_dark_theme_dark) AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY -> getString(R.string.settings_subtitle_dark_theme_by_battery_saver) @@ -88,8 +88,12 @@ class AdvancedSettingsFragment : Fragment() { } }) + viewModel.showPreview.observe(viewLifecycleOwner, Observer { + show_widget_preview_label?.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) + }) + viewModel.showWallpaper.observe(viewLifecycleOwner, Observer { - show_wallpaper_label.text = if (it && activity?.checkGrantedPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == true) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) + show_wallpaper_label?.text = if (it && activity?.checkGrantedPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == true) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) }) } @@ -116,6 +120,24 @@ class AdvancedSettingsFragment : Fragment() { } } + action_show_widget_preview.setOnClickListener { + maintainScrollPosition { + BottomSheetMenu(requireContext(), header = getString(R.string.action_show_widget_preview)) + .setSelectedValue(Preferences.showPreview) + .addItem( + getString(R.string.settings_visible), + true + ) + .addItem( + getString(R.string.settings_not_visible), + false + ) + .addOnSelectItemListener { value -> + Preferences.showPreview = value + }.show() + } + } + action_show_wallpaper.setOnClickListener { maintainScrollPosition { BottomSheetMenu(requireContext(), header = getString(R.string.settings_title_show_wallpaper)) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/CalendarSettingsFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/CalendarSettingsFragment.kt index b7d83e8..2bbdd08 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/CalendarSettingsFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/CalendarSettingsFragment.kt @@ -100,7 +100,7 @@ class CalendarSettingsFragment : Fragment() { viewModel.calendarAllDay.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - all_day_label.text = + all_day_label?.text = if (it) getString(R.string.settings_all_day_subtitle_visible) else getString(R.string.settings_all_day_subtitle_gone) } checkReadEventsPermission() @@ -108,49 +108,49 @@ class CalendarSettingsFragment : Fragment() { viewModel.showDeclinedEvents.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - show_declined_events_label.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) + show_declined_events_label?.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) } checkReadEventsPermission() }) viewModel.secondRowInformation.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - second_row_info_label.text = getString(SettingsStringHelper.getSecondRowInfoString(it)) + second_row_info_label?.text = getString(SettingsStringHelper.getSecondRowInfoString(it)) } }) viewModel.showDiffTime.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - show_diff_time_label.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) + show_diff_time_label?.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) } }) viewModel.showUntil.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - show_until_label.text = getString(SettingsStringHelper.getShowUntilString(it)) + show_until_label?.text = getString(SettingsStringHelper.getShowUntilString(it)) } checkReadEventsPermission() }) viewModel.showNextEvent.observe(viewLifecycleOwner, Observer { - show_multiple_events_label.setTextKeepState(if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)) + show_multiple_events_label?.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) }) viewModel.dateFormat.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - date_format_label.text = DateHelper.getDateText(requireContext(), Calendar.getInstance()) + date_format_label?.text = DateHelper.getDateText(requireContext(), Calendar.getInstance()) } }) viewModel.calendarAppName.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - calendar_app_label.text = if (it != "") it else getString(R.string.default_calendar_app) + calendar_app_label?.text = if (it != "") it else getString(R.string.default_calendar_app) } }) viewModel.openEventDetails.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - open_event_details_label.text = if (it) getString(R.string.default_event_app) else getString(R.string.default_calendar_app) + open_event_details_label?.text = if (it) getString(R.string.default_event_app) else getString(R.string.default_calendar_app) } }) @@ -320,13 +320,13 @@ class CalendarSettingsFragment : Fragment() { private fun checkReadEventsPermission(showEvents: Boolean = Preferences.showEvents) { if (activity?.checkGrantedPermission(Manifest.permission.READ_CALENDAR) == true) { - show_events_label.text = if (showEvents) getString(R.string.show_events_visible) else getString(R.string.show_events_not_visible) - read_calendar_permission_alert_icon.isVisible = false + show_events_label?.text = if (showEvents) getString(R.string.show_events_visible) else getString(R.string.show_events_not_visible) + read_calendar_permission_alert_icon?.isVisible = false CalendarHelper.updateEventList(requireContext()) } else { - show_events_label.text = if (showEvents) getString(R.string.description_permission_calendar) else getString(R.string.show_events_not_visible) - read_calendar_permission_alert_icon.isVisible = showEvents - read_calendar_permission_alert_icon.setOnClickListener { + show_events_label?.text = if (showEvents) getString(R.string.description_permission_calendar) else getString(R.string.show_events_not_visible) + read_calendar_permission_alert_icon?.isVisible = showEvents + read_calendar_permission_alert_icon?.setOnClickListener { requirePermission() } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/ClockSettingsFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/ClockSettingsFragment.kt index 1e7befc..f99585c 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/ClockSettingsFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/ClockSettingsFragment.kt @@ -65,13 +65,13 @@ class ClockSettingsFragment : Fragment() { viewModel: MainViewModel ) { viewModel.showBigClockWarning.observe(viewLifecycleOwner, Observer { - large_clock_warning.isVisible = it - small_clock_warning.isVisible = !it + large_clock_warning?.isVisible = it + small_clock_warning?.isVisible = !it }) viewModel.showClock.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - show_clock_label.text = + show_clock_label?.text = if (it) getString(R.string.show_clock_visible) else getString(R.string.show_clock_not_visible) binding.isClockVisible = it } @@ -79,13 +79,13 @@ class ClockSettingsFragment : Fragment() { viewModel.clockTextSize.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - clock_text_size_label.text = String.format("%.0fsp", it) + clock_text_size_label?.text = String.format("%.0fsp", it) } }) viewModel.clockBottomMargin.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - clock_bottom_margin_label.text = when (it) { + clock_bottom_margin_label?.text = when (it) { Constants.ClockBottomMargin.NONE.value -> getString(R.string.settings_clock_bottom_margin_subtitle_none) Constants.ClockBottomMargin.SMALL.value -> getString(R.string.settings_clock_bottom_margin_subtitle_small) Constants.ClockBottomMargin.LARGE.value -> getString(R.string.settings_clock_bottom_margin_subtitle_large) @@ -96,13 +96,13 @@ class ClockSettingsFragment : Fragment() { viewModel.showNextAlarm.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - show_next_alarm_label.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) + show_next_alarm_label?.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible) } }) viewModel.clockAppName.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - clock_app_label.text = + clock_app_label?.text = if (Preferences.clockAppName != "") Preferences.clockAppName else getString(R.string.default_clock_app) } }) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GeneralSettingsFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GeneralSettingsFragment.kt index 9ebfd86..4152004 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GeneralSettingsFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/GeneralSettingsFragment.kt @@ -77,13 +77,13 @@ class GeneralSettingsFragment : Fragment() { viewModel.textMainSize.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - main_text_size_label.text = String.format("%.0fsp", it) + main_text_size_label?.text = String.format("%.0fsp", it) } }) viewModel.textSecondSize.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - second_text_size_label.text = String.format("%.0fsp", it) + second_text_size_label?.text = String.format("%.0fsp", it) } }) @@ -94,19 +94,19 @@ class GeneralSettingsFragment : Fragment() { } catch (e: Exception) { Preferences.textGlobalColor = "#FFFFFF" } - font_color_label.text = it.toUpperCase() + font_color_label?.text = it.toUpperCase() } }) viewModel.textShadow.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - text_shadow_label.text = getString(SettingsStringHelper.getTextShadowString(it)) + text_shadow_label?.text = getString(SettingsStringHelper.getTextShadowString(it)) } }) viewModel.customFont.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - custom_font_label.text = getString(SettingsStringHelper.getCustomFontLabel(it)) + custom_font_label?.text = getString(SettingsStringHelper.getCustomFontLabel(it)) } }) } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherSettingsFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherSettingsFragment.kt index 951077c..492057a 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherSettingsFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherSettingsFragment.kt @@ -80,12 +80,12 @@ class WeatherSettingsFragment : Fragment() { viewModel: MainViewModel ) { viewModel.showWeatherWarning.observe(viewLifecycleOwner, Observer { - weather_warning.isVisible = it + weather_warning?.isVisible = it }) viewModel.showWeather.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - show_weather_label.text = + show_weather_label?.text = if (it) getString(R.string.show_weather_visible) else getString(R.string.show_weather_not_visible) binding.isWeatherVisible = it } @@ -94,18 +94,18 @@ class WeatherSettingsFragment : Fragment() { viewModel.weatherProviderApi.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - label_weather_provider_api_key.text = + label_weather_provider_api_key?.text = if (it == "") getString(R.string.settings_weather_provider_api_key_subtitle_not_set) else getString( R.string.settings_weather_provider_api_key_subtitle_all_set ) - api_key_alert_icon.isVisible = it == "" + api_key_alert_icon?.isVisible = it == "" } checkLocationPermission() }) viewModel.customLocationAdd.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - label_custom_location.text = + label_custom_location?.text = if (it == "") getString(R.string.custom_location_gps) else it } checkLocationPermission() @@ -113,7 +113,7 @@ class WeatherSettingsFragment : Fragment() { viewModel.weatherTempUnit.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - temp_unit.text = + temp_unit?.text = if (it == "F") getString(R.string.fahrenheit) else getString(R.string.celsius) } checkLocationPermission() @@ -121,14 +121,14 @@ class WeatherSettingsFragment : Fragment() { viewModel.weatherRefreshPeriod.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - label_weather_refresh_period.text = getString(SettingsStringHelper.getRefreshPeriodString(it)) + label_weather_refresh_period?.text = getString(SettingsStringHelper.getRefreshPeriodString(it)) } checkLocationPermission() }) viewModel.weatherAppName.observe(viewLifecycleOwner, Observer { maintainScrollPosition { - weather_app_label.text = + weather_app_label?.text = if (it != "") it else getString(R.string.default_weather_app) } }) @@ -136,11 +136,11 @@ class WeatherSettingsFragment : Fragment() { private fun checkLocationPermission() { if (activity?.checkGrantedPermission(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) Manifest.permission.ACCESS_BACKGROUND_LOCATION else Manifest.permission.ACCESS_FINE_LOCATION) == true) { - location_permission_alert_icon.isVisible = false + location_permission_alert_icon?.isVisible = false WeatherWorker.setUpdates(requireContext()) } else if (Preferences.showWeather && Preferences.customLocationAdd == "") { - location_permission_alert_icon.isVisible = true - location_permission_alert_icon.setOnClickListener { + location_permission_alert_icon?.isVisible = true + location_permission_alert_icon?.setOnClickListener { requirePermission() } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt index 8bff75f..326e141 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/MainViewModel.kt @@ -51,4 +51,5 @@ class MainViewModel : ViewModel() { // Advanced Settings val darkThemePreference = Preferences.asLiveData(Preferences::darkThemePreference) val showWallpaper = Preferences.asLiveData(Preferences::showWallpaper) + val showPreview = Preferences.asLiveData(Preferences::showPreview) } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/MainWidget.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/MainWidget.kt index 09ab82d..6734e16 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/MainWidget.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/MainWidget.kt @@ -12,7 +12,6 @@ import android.graphics.Color import android.graphics.Typeface import android.os.Bundle import android.text.format.DateUtils -import android.util.Log import android.util.TypedValue import android.view.View import android.widget.ImageView @@ -30,9 +29,7 @@ import com.tommasoberlose.anotherwidget.helpers.* import com.tommasoberlose.anotherwidget.helpers.WidgetHelper.reduceDimensionWithMaxWidth import com.tommasoberlose.anotherwidget.receivers.NewCalendarEventReceiver import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver -import com.tommasoberlose.anotherwidget.receivers.WeatherReceiver import com.tommasoberlose.anotherwidget.receivers.WidgetClickListenerReceiver -import com.tommasoberlose.anotherwidget.services.UpdatesWorker import com.tommasoberlose.anotherwidget.services.WeatherWorker import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission import com.tommasoberlose.anotherwidget.utils.getCapWordString @@ -70,7 +67,7 @@ class MainWidget : AppWidgetProvider() { override fun onDisabled(context: Context) { if (getWidgetCount(context) == 0) { - UpdatesWorker.removeUpdates(context) + UpdatesReceiver.removeUpdates(context) WeatherWorker.removeUpdates(context) } } diff --git a/app/src/main/res/drawable-hdpi/round_aspect_ratio.png b/app/src/main/res/drawable-hdpi/round_aspect_ratio.png new file mode 100644 index 0000000..dfcfb64 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_aspect_ratio.png differ diff --git a/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_18.png b/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_18.png new file mode 100644 index 0000000..2c4a60d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_18.png differ diff --git a/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_36.png b/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_36.png new file mode 100644 index 0000000..8bdf149 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_36.png differ diff --git a/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_48.png b/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_48.png new file mode 100644 index 0000000..ec7c3bd Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_aspect_ratio_black_48.png differ diff --git a/app/src/main/res/drawable-hdpi/round_compare.png b/app/src/main/res/drawable-hdpi/round_compare.png new file mode 100644 index 0000000..7b190ec Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_compare.png differ diff --git a/app/src/main/res/drawable-hdpi/round_compare_black_18.png b/app/src/main/res/drawable-hdpi/round_compare_black_18.png new file mode 100644 index 0000000..4eb13b8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_compare_black_18.png differ diff --git a/app/src/main/res/drawable-hdpi/round_compare_black_36.png b/app/src/main/res/drawable-hdpi/round_compare_black_36.png new file mode 100644 index 0000000..eb9026f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_compare_black_36.png differ diff --git a/app/src/main/res/drawable-hdpi/round_compare_black_48.png b/app/src/main/res/drawable-hdpi/round_compare_black_48.png new file mode 100644 index 0000000..926639c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_compare_black_48.png differ diff --git a/app/src/main/res/drawable-hdpi/round_crop_original.png b/app/src/main/res/drawable-hdpi/round_crop_original.png new file mode 100644 index 0000000..356b8ad Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_crop_original.png differ diff --git a/app/src/main/res/drawable-hdpi/round_crop_original_black_18.png b/app/src/main/res/drawable-hdpi/round_crop_original_black_18.png new file mode 100644 index 0000000..ae1928e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_crop_original_black_18.png differ diff --git a/app/src/main/res/drawable-hdpi/round_crop_original_black_24.png b/app/src/main/res/drawable-hdpi/round_crop_original_black_24.png new file mode 100644 index 0000000..f0322b0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_crop_original_black_24.png differ diff --git a/app/src/main/res/drawable-hdpi/round_crop_original_black_36.png b/app/src/main/res/drawable-hdpi/round_crop_original_black_36.png new file mode 100644 index 0000000..e490869 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/round_crop_original_black_36.png differ diff --git a/app/src/main/res/drawable-mdpi/round_aspect_ratio.png b/app/src/main/res/drawable-mdpi/round_aspect_ratio.png new file mode 100644 index 0000000..3a43f2d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_aspect_ratio.png differ diff --git a/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_18.png b/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_18.png new file mode 100644 index 0000000..24f72a7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_18.png differ diff --git a/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_36.png b/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_36.png new file mode 100644 index 0000000..dfcfb64 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_36.png differ diff --git a/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_48.png b/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_48.png new file mode 100644 index 0000000..59f1b7a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_aspect_ratio_black_48.png differ diff --git a/app/src/main/res/drawable-mdpi/round_compare.png b/app/src/main/res/drawable-mdpi/round_compare.png new file mode 100644 index 0000000..ea8092e Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_compare.png differ diff --git a/app/src/main/res/drawable-mdpi/round_compare_black_18.png b/app/src/main/res/drawable-mdpi/round_compare_black_18.png new file mode 100644 index 0000000..c5eed04 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_compare_black_18.png differ diff --git a/app/src/main/res/drawable-mdpi/round_compare_black_36.png b/app/src/main/res/drawable-mdpi/round_compare_black_36.png new file mode 100644 index 0000000..7b190ec Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_compare_black_36.png differ diff --git a/app/src/main/res/drawable-mdpi/round_compare_black_48.png b/app/src/main/res/drawable-mdpi/round_compare_black_48.png new file mode 100644 index 0000000..6e765f7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_compare_black_48.png differ diff --git a/app/src/main/res/drawable-mdpi/round_crop_original.png b/app/src/main/res/drawable-mdpi/round_crop_original.png new file mode 100644 index 0000000..bbabcc5 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_crop_original.png differ diff --git a/app/src/main/res/drawable-mdpi/round_crop_original_black_18.png b/app/src/main/res/drawable-mdpi/round_crop_original_black_18.png new file mode 100644 index 0000000..447c00c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_crop_original_black_18.png differ diff --git a/app/src/main/res/drawable-mdpi/round_crop_original_black_24.png b/app/src/main/res/drawable-mdpi/round_crop_original_black_24.png new file mode 100644 index 0000000..fc5d368 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_crop_original_black_24.png differ diff --git a/app/src/main/res/drawable-mdpi/round_crop_original_black_36.png b/app/src/main/res/drawable-mdpi/round_crop_original_black_36.png new file mode 100644 index 0000000..f0322b0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/round_crop_original_black_36.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_aspect_ratio.png b/app/src/main/res/drawable-xhdpi/round_aspect_ratio.png new file mode 100644 index 0000000..59f1b7a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_aspect_ratio.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_18.png b/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_18.png new file mode 100644 index 0000000..dfcfb64 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_18.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_36.png b/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_36.png new file mode 100644 index 0000000..ec7c3bd Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_36.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_48.png b/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_48.png new file mode 100644 index 0000000..d5a6a74 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_48.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_compare.png b/app/src/main/res/drawable-xhdpi/round_compare.png new file mode 100644 index 0000000..6e765f7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_compare.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_compare_black_18.png b/app/src/main/res/drawable-xhdpi/round_compare_black_18.png new file mode 100644 index 0000000..7b190ec Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_compare_black_18.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_compare_black_36.png b/app/src/main/res/drawable-xhdpi/round_compare_black_36.png new file mode 100644 index 0000000..926639c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_compare_black_36.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_compare_black_48.png b/app/src/main/res/drawable-xhdpi/round_compare_black_48.png new file mode 100644 index 0000000..33be931 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_compare_black_48.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_crop_original.png b/app/src/main/res/drawable-xhdpi/round_crop_original.png new file mode 100644 index 0000000..8b7b3a8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_crop_original.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_crop_original_black_18.png b/app/src/main/res/drawable-xhdpi/round_crop_original_black_18.png new file mode 100644 index 0000000..f0322b0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_crop_original_black_18.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_crop_original_black_24.png b/app/src/main/res/drawable-xhdpi/round_crop_original_black_24.png new file mode 100644 index 0000000..bbabcc5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_crop_original_black_24.png differ diff --git a/app/src/main/res/drawable-xhdpi/round_crop_original_black_36.png b/app/src/main/res/drawable-xhdpi/round_crop_original_black_36.png new file mode 100644 index 0000000..356b8ad Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/round_crop_original_black_36.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_aspect_ratio.png b/app/src/main/res/drawable-xxhdpi/round_aspect_ratio.png new file mode 100644 index 0000000..ec7c3bd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_aspect_ratio.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_18.png b/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_18.png new file mode 100644 index 0000000..8bdf149 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_18.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_36.png b/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_36.png new file mode 100644 index 0000000..546cb96 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_36.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_48.png b/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_48.png new file mode 100644 index 0000000..6f06b57 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_48.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_compare.png b/app/src/main/res/drawable-xxhdpi/round_compare.png new file mode 100644 index 0000000..926639c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_compare.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_compare_black_18.png b/app/src/main/res/drawable-xxhdpi/round_compare_black_18.png new file mode 100644 index 0000000..eb9026f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_compare_black_18.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_compare_black_36.png b/app/src/main/res/drawable-xxhdpi/round_compare_black_36.png new file mode 100644 index 0000000..403c07b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_compare_black_36.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_compare_black_48.png b/app/src/main/res/drawable-xxhdpi/round_compare_black_48.png new file mode 100644 index 0000000..6624f5e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_compare_black_48.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_crop_original.png b/app/src/main/res/drawable-xxhdpi/round_crop_original.png new file mode 100644 index 0000000..53aa7ac Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_crop_original.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_crop_original_black_18.png b/app/src/main/res/drawable-xxhdpi/round_crop_original_black_18.png new file mode 100644 index 0000000..e490869 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_crop_original_black_18.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_crop_original_black_24.png b/app/src/main/res/drawable-xxhdpi/round_crop_original_black_24.png new file mode 100644 index 0000000..356b8ad Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_crop_original_black_24.png differ diff --git a/app/src/main/res/drawable-xxhdpi/round_crop_original_black_36.png b/app/src/main/res/drawable-xxhdpi/round_crop_original_black_36.png new file mode 100644 index 0000000..aac9973 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/round_crop_original_black_36.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio.png b/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio.png new file mode 100644 index 0000000..d5a6a74 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_18.png b/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_18.png new file mode 100644 index 0000000..ec7c3bd Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_18.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_36.png b/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_36.png new file mode 100644 index 0000000..6f06b57 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_36.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_48.png b/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_48.png new file mode 100644 index 0000000..e763238 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_aspect_ratio_black_48.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_compare.png b/app/src/main/res/drawable-xxxhdpi/round_compare.png new file mode 100644 index 0000000..33be931 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_compare.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_compare_black_18.png b/app/src/main/res/drawable-xxxhdpi/round_compare_black_18.png new file mode 100644 index 0000000..926639c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_compare_black_18.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_compare_black_36.png b/app/src/main/res/drawable-xxxhdpi/round_compare_black_36.png new file mode 100644 index 0000000..6624f5e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_compare_black_36.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_compare_black_48.png b/app/src/main/res/drawable-xxxhdpi/round_compare_black_48.png new file mode 100644 index 0000000..117bebf Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_compare_black_48.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_crop_original.png b/app/src/main/res/drawable-xxxhdpi/round_crop_original.png new file mode 100644 index 0000000..b77d345 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_crop_original.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_18.png b/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_18.png new file mode 100644 index 0000000..356b8ad Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_18.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_24.png b/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_24.png new file mode 100644 index 0000000..8b7b3a8 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_24.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_36.png b/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_36.png new file mode 100644 index 0000000..53aa7ac Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/round_crop_original_black_36.png differ diff --git a/app/src/main/res/drawable/round_aspect_ratio_24.xml b/app/src/main/res/drawable/round_aspect_ratio_24.xml new file mode 100644 index 0000000..aed6621 --- /dev/null +++ b/app/src/main/res/drawable/round_aspect_ratio_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/round_compare_24.xml b/app/src/main/res/drawable/round_compare_24.xml new file mode 100644 index 0000000..d03f133 --- /dev/null +++ b/app/src/main/res/drawable/round_compare_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/round_crop_original_24.xml b/app/src/main/res/drawable/round_crop_original_24.xml new file mode 100644 index 0000000..06e9e2e --- /dev/null +++ b/app/src/main/res/drawable/round_crop_original_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/bottom_sheet_dialog.xml b/app/src/main/res/layout/bottom_sheet_dialog.xml new file mode 100644 index 0000000..a6fe0ab --- /dev/null +++ b/app/src/main/res/layout/bottom_sheet_dialog.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet_menu.xml b/app/src/main/res/layout/bottom_sheet_menu.xml index da12d0a..24d7057 100644 --- a/app/src/main/res/layout/bottom_sheet_menu.xml +++ b/app/src/main/res/layout/bottom_sheet_menu.xml @@ -16,6 +16,8 @@ android:letterSpacing="0" android:layout_width="match_parent" android:layout_height="wrap_content" + android:gravity="start" + android:textAlignment="viewStart" android:paddingTop="16dp" android:paddingBottom="8dp" android:paddingLeft="32dp" diff --git a/app/src/main/res/layout/bottom_sheet_menu_hor.xml b/app/src/main/res/layout/bottom_sheet_menu_hor.xml index bd4493e..3846072 100644 --- a/app/src/main/res/layout/bottom_sheet_menu_hor.xml +++ b/app/src/main/res/layout/bottom_sheet_menu_hor.xml @@ -21,6 +21,8 @@ android:paddingLeft="32dp" android:paddingRight="32dp" android:textSize="16sp" + android:gravity="start" + android:textAlignment="viewStart" android:id="@+id/header_text" android:text="" android:textColor="@color/colorPrimaryText"/> diff --git a/app/src/main/res/layout/fragment_advanced_settings.xml b/app/src/main/res/layout/fragment_advanced_settings.xml index d58953f..641310e 100644 --- a/app/src/main/res/layout/fragment_advanced_settings.xml +++ b/app/src/main/res/layout/fragment_advanced_settings.xml @@ -35,7 +35,7 @@ + + + + + + + Small Medium Large + Xiaomi Devices + Enable the permission to display pop-up windows when running in the background inside the "Other permission" section of the app settings. Otherwise, you will not able to open any applications tapping on the widget. + Ignore + Grant permission \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3a745fb..5f1e3d3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -176,4 +176,10 @@ Petit Moyen Grand + + + Xiaomi Devices + Enable the permission to display pop-up windows when running in the background inside the "Other permission" section of the app settings. Otherwise, you will not able to open any applications tapping on the widget. + Ignore + Grant permission \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e699205..7441845 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -177,4 +177,8 @@ Piccolo Medio Grande + Dispositivi Xiaomi + Concedi il permesso per mostrare finstre pop-up quando l\'applicazione è in background. Puoi trovare l\'impostazione nella sezione Altri permessi nei dettagli dell\'app. Nel caso non fosse attivata non sarà possibile aprire applicazioni cliccando sul widget. + Ignora + Concedi permesso \ 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 732e94f..329f59e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -188,4 +188,9 @@ Small Medium Large + xiaomi + Xiaomi Devices + Enable the permission to display pop-up windows when running in the background inside the "Other permission" section of the app settings. Otherwise, you will not able to open any applications tapping on the widget. + Ignore + Grant permission diff --git a/tasksintegration/build/intermediates/bundle_manifest/debug/bundle-manifest/AndroidManifest.xml b/tasksintegration/build/intermediates/bundle_manifest/debug/bundle-manifest/AndroidManifest.xml index 270c35a..79516fa 100644 --- a/tasksintegration/build/intermediates/bundle_manifest/debug/bundle-manifest/AndroidManifest.xml +++ b/tasksintegration/build/intermediates/bundle_manifest/debug/bundle-manifest/AndroidManifest.xml @@ -3,7 +3,7 @@ xmlns:dist="http://schemas.android.com/apk/distribution" featureSplit="tasksintegration" package="com.tommasoberlose.anotherwidget" - android:versionCode="64" + android:versionCode="67" android:versionName="2.0.5" > 8 9