Move back to alarmmanager for events update, add xiaomi warning
BIN
.idea/caches/build_file_checksums.ser
generated
@ -18,7 +18,7 @@ android {
|
|||||||
applicationId "com.tommasoberlose.anotherwidget"
|
applicationId "com.tommasoberlose.anotherwidget"
|
||||||
minSdkVersion 23
|
minSdkVersion 23
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
versionCode 65
|
versionCode 68
|
||||||
versionName "2.0.5"
|
versionName "2.0.5"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
<action android:name="com.tommasoberlose.anotherwidget.action.ACTION_CALENDAR_UPDATE" />
|
<action android:name="com.tommasoberlose.anotherwidget.action.ACTION_CALENDAR_UPDATE" />
|
||||||
|
<action android:name="com.tommasoberlose.anotherwidget.action.ACTION_TIME_UPDATE" />
|
||||||
<action android:name="com.sec.android.widgetapp.APPWIDGET_RESIZE" />
|
<action android:name="com.sec.android.widgetapp.APPWIDGET_RESIZE" />
|
||||||
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
||||||
<action android:name="android.app.action.NEXT_ALARM_CLOCK_CHANGED" />
|
<action android:name="android.app.action.NEXT_ALARM_CLOCK_CHANGED" />
|
||||||
|
@ -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()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,12 +1,10 @@
|
|||||||
package com.tommasoberlose.anotherwidget.db
|
package com.tommasoberlose.anotherwidget.db
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.Log
|
|
||||||
import com.chibatching.kotpref.bulk
|
import com.chibatching.kotpref.bulk
|
||||||
import com.tommasoberlose.anotherwidget.global.Preferences
|
import com.tommasoberlose.anotherwidget.global.Preferences
|
||||||
import com.tommasoberlose.anotherwidget.models.Event
|
import com.tommasoberlose.anotherwidget.models.Event
|
||||||
import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver
|
import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver
|
||||||
import com.tommasoberlose.anotherwidget.services.UpdatesWorker
|
|
||||||
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
||||||
import io.realm.Realm
|
import io.realm.Realm
|
||||||
import io.realm.RealmResults
|
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 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() {
|
fun goToNextEvent() {
|
||||||
val eventList = realm.where(Event::class.java).findAll()
|
val eventList = realm.where(Event::class.java).findAll()
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ class EventRepository(val context: Context) {
|
|||||||
} else {
|
} else {
|
||||||
resetNextEventData()
|
resetNextEventData()
|
||||||
}
|
}
|
||||||
UpdatesWorker.setUpdates(context)
|
UpdatesReceiver.setUpdates(context)
|
||||||
MainWidget.updateWidget(context)
|
MainWidget.updateWidget(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ class EventRepository(val context: Context) {
|
|||||||
} else {
|
} else {
|
||||||
resetNextEventData()
|
resetNextEventData()
|
||||||
}
|
}
|
||||||
UpdatesWorker.setUpdates(context)
|
UpdatesReceiver.setUpdates(context)
|
||||||
MainWidget.updateWidget(context)
|
MainWidget.updateWidget(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,4 +59,6 @@ object Preferences : KotprefModel() {
|
|||||||
var showWallpaper by booleanPref(default = true)
|
var showWallpaper by booleanPref(default = true)
|
||||||
var showBigClockWarning by booleanPref(default = true)
|
var showBigClockWarning by booleanPref(default = true)
|
||||||
var showWeatherWarning by booleanPref(default = true)
|
var showWeatherWarning by booleanPref(default = true)
|
||||||
|
var showPreview by booleanPref(default = true)
|
||||||
|
var showXiaomiWarning by booleanPref(default = true)
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,9 @@ object BitmapHelper {
|
|||||||
view.measure(measuredWidth, measuredHeight)
|
view.measure(measuredWidth, measuredHeight)
|
||||||
|
|
||||||
return try {
|
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(
|
val btm = Bitmap.createBitmap(
|
||||||
view.measuredWidth,
|
view.measuredWidth,
|
||||||
view.measuredHeight,
|
view.measuredHeight,
|
||||||
|
@ -10,7 +10,6 @@ import com.tommasoberlose.anotherwidget.db.EventRepository
|
|||||||
import com.tommasoberlose.anotherwidget.models.Event
|
import com.tommasoberlose.anotherwidget.models.Event
|
||||||
import com.tommasoberlose.anotherwidget.global.Preferences
|
import com.tommasoberlose.anotherwidget.global.Preferences
|
||||||
import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver
|
import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver
|
||||||
import com.tommasoberlose.anotherwidget.services.UpdatesWorker
|
|
||||||
import com.tommasoberlose.anotherwidget.ui.activities.MainActivity
|
import com.tommasoberlose.anotherwidget.ui.activities.MainActivity
|
||||||
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
||||||
import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission
|
import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission
|
||||||
@ -125,7 +124,7 @@ object CalendarHelper {
|
|||||||
eventRepository.resetNextEventData()
|
eventRepository.resetNextEventData()
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdatesWorker.setUpdates(context)
|
UpdatesReceiver.setUpdates(context)
|
||||||
Log.d("ciao", "force update? 7")
|
Log.d("ciao", "force update? 7")
|
||||||
MainWidget.updateWidget(context)
|
MainWidget.updateWidget(context)
|
||||||
|
|
||||||
|
@ -95,7 +95,6 @@ object IntentHelper {
|
|||||||
return when (Preferences.openEventDetails || forceEventDetails) {
|
return when (Preferences.openEventDetails || forceEventDetails) {
|
||||||
true -> {
|
true -> {
|
||||||
val uri = ContentUris.withAppendedId(Events.CONTENT_URI, e.eventID)
|
val uri = ContentUris.withAppendedId(Events.CONTENT_URI, e.eventID)
|
||||||
|
|
||||||
if (Preferences.calendarAppPackage == "") {
|
if (Preferences.calendarAppPackage == "") {
|
||||||
Intent(Intent.ACTION_VIEW).apply {
|
Intent(Intent.ACTION_VIEW).apply {
|
||||||
data = uri
|
data = uri
|
||||||
|
@ -14,9 +14,8 @@ open class Event(var id: Long = 0,
|
|||||||
var endDate: Long = 0,
|
var endDate: Long = 0,
|
||||||
var calendarID: Int = 0,
|
var calendarID: Int = 0,
|
||||||
var allDay: Boolean = false,
|
var allDay: Boolean = false,
|
||||||
var address: String = "") : RealmObject(){
|
var address: String = "") : RealmObject() {
|
||||||
|
|
||||||
override fun toString(): String {
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,25 @@
|
|||||||
package com.tommasoberlose.anotherwidget.receivers
|
package com.tommasoberlose.anotherwidget.receivers
|
||||||
|
|
||||||
|
import android.app.AlarmManager
|
||||||
|
import android.app.PendingIntent
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.app.AlarmManager
|
|
||||||
import android.app.PendingIntent
|
|
||||||
import android.util.Log
|
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.db.EventRepository
|
||||||
import com.tommasoberlose.anotherwidget.global.Actions
|
import com.tommasoberlose.anotherwidget.global.Actions
|
||||||
import com.tommasoberlose.anotherwidget.helpers.CalendarHelper
|
import com.tommasoberlose.anotherwidget.helpers.CalendarHelper
|
||||||
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
||||||
import org.joda.time.Period
|
import org.joda.time.Period
|
||||||
import java.text.DateFormat
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
class UpdatesReceiver : BroadcastReceiver() {
|
class UpdatesReceiver : BroadcastReceiver() {
|
||||||
|
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
Log.d("ciao", "che palle - ${intent.action}")
|
||||||
when (intent.action) {
|
when (intent.action) {
|
||||||
Intent.ACTION_BOOT_COMPLETED,
|
Intent.ACTION_BOOT_COMPLETED,
|
||||||
Intent.ACTION_MY_PACKAGE_REPLACED,
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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<UpdatesWorker>().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<UpdatesWorker>().setInitialDelay(event.endDate + 1000 - now, TimeUnit.MILLISECONDS).build())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun removeUpdates(context: Context) {
|
|
||||||
WorkManager.getInstance(context).cancelAllWorkByTag(JOB_TAG)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,6 +4,7 @@ import android.app.AlarmManager
|
|||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.util.Log
|
||||||
import androidx.work.*
|
import androidx.work.*
|
||||||
import com.tommasoberlose.anotherwidget.global.Actions
|
import com.tommasoberlose.anotherwidget.global.Actions
|
||||||
import com.tommasoberlose.anotherwidget.global.Preferences
|
import com.tommasoberlose.anotherwidget.global.Preferences
|
||||||
@ -27,27 +28,31 @@ class WeatherWorker(appContext: Context, workerParams: WorkerParameters) : Worke
|
|||||||
|
|
||||||
if (Preferences.showWeather && Preferences.weatherProviderApi != "") {
|
if (Preferences.showWeather && Preferences.weatherProviderApi != "") {
|
||||||
WeatherHelper.updateWeather(context)
|
WeatherHelper.updateWeather(context)
|
||||||
|
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
|
||||||
WorkManager.getInstance(context).enqueue(PeriodicWorkRequestBuilder<WeatherWorker>(
|
"WEATHER_JOB_PERIODIC",
|
||||||
when (Preferences.weatherRefreshPeriod) {
|
ExistingPeriodicWorkPolicy.KEEP,
|
||||||
0 -> 30
|
PeriodicWorkRequestBuilder<WeatherWorker>(
|
||||||
1 -> 60
|
when (Preferences.weatherRefreshPeriod) {
|
||||||
2 -> 60L * 3
|
0 -> 30
|
||||||
3 -> 60L * 6
|
1 -> 60
|
||||||
4 -> 60L * 12
|
2 -> 60L * 3
|
||||||
5 -> 60L * 24
|
3 -> 60L * 6
|
||||||
else -> 60
|
4 -> 60L * 12
|
||||||
}
|
5 -> 60L * 24
|
||||||
, TimeUnit.MINUTES)
|
else -> 60
|
||||||
|
}
|
||||||
|
, TimeUnit.MINUTES
|
||||||
|
)
|
||||||
.addTag(JOB_TAG)
|
.addTag(JOB_TAG)
|
||||||
.build())
|
.build()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setOneTimeUpdate(context: Context) {
|
fun setOneTimeUpdate(context: Context) {
|
||||||
val workManager = WorkManager.getInstance(context)
|
val workManager = WorkManager.getInstance(context)
|
||||||
listOf(10L, 15L, 20L).forEach {
|
listOf(10L, 20L, 30L).forEach {
|
||||||
workManager.enqueue(OneTimeWorkRequestBuilder<WeatherWorker>().setInitialDelay(it, TimeUnit.MINUTES).addTag(JOB_TAG).build())
|
workManager.enqueueUniqueWork("WEATHER_JOB_ONE_TIME_$it", ExistingWorkPolicy.KEEP, OneTimeWorkRequestBuilder<WeatherWorker>().setInitialDelay(it, TimeUnit.MINUTES).addTag(JOB_TAG).build())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,8 +6,10 @@ import android.appwidget.AppWidgetManager
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.graphics.drawable.BitmapDrawable
|
import android.graphics.drawable.BitmapDrawable
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.provider.Settings
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.RelativeLayout
|
import android.widget.RelativeLayout
|
||||||
@ -19,12 +21,12 @@ import androidx.lifecycle.ViewModelProvider
|
|||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.google.android.material.tabs.TabLayoutMediator
|
import com.google.android.material.tabs.TabLayoutMediator
|
||||||
import com.tommasoberlose.anotherwidget.R
|
import com.tommasoberlose.anotherwidget.R
|
||||||
|
import com.tommasoberlose.anotherwidget.components.MaterialBottomSheetDialog
|
||||||
import com.tommasoberlose.anotherwidget.global.Actions
|
import com.tommasoberlose.anotherwidget.global.Actions
|
||||||
import com.tommasoberlose.anotherwidget.global.Constants
|
import com.tommasoberlose.anotherwidget.global.Constants
|
||||||
import com.tommasoberlose.anotherwidget.global.Preferences
|
import com.tommasoberlose.anotherwidget.global.Preferences
|
||||||
import com.tommasoberlose.anotherwidget.global.RequestCode
|
import com.tommasoberlose.anotherwidget.global.RequestCode
|
||||||
import com.tommasoberlose.anotherwidget.helpers.BitmapHelper
|
import com.tommasoberlose.anotherwidget.helpers.BitmapHelper
|
||||||
import com.tommasoberlose.anotherwidget.helpers.CalendarHelper
|
|
||||||
import com.tommasoberlose.anotherwidget.helpers.ColorHelper
|
import com.tommasoberlose.anotherwidget.helpers.ColorHelper
|
||||||
import com.tommasoberlose.anotherwidget.helpers.ColorHelper.isColorDark
|
import com.tommasoberlose.anotherwidget.helpers.ColorHelper.isColorDark
|
||||||
import com.tommasoberlose.anotherwidget.helpers.WeatherHelper
|
import com.tommasoberlose.anotherwidget.helpers.WeatherHelper
|
||||||
@ -39,7 +41,6 @@ import kotlinx.coroutines.*
|
|||||||
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.EventBus
|
||||||
import org.greenrobot.eventbus.Subscribe
|
import org.greenrobot.eventbus.Subscribe
|
||||||
import org.greenrobot.eventbus.ThreadMode
|
import org.greenrobot.eventbus.ThreadMode
|
||||||
import java.lang.Exception
|
|
||||||
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
|
class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
@ -83,96 +84,158 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh
|
|||||||
updateUI()
|
updateUI()
|
||||||
|
|
||||||
WeatherHelper.updateWeather(this)
|
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 var uiJob: Job? = null
|
||||||
|
|
||||||
private fun updateUI() {
|
private fun updateUI() {
|
||||||
preview.setCardBackgroundColor(getColor(if (ColorHelper.getFontColor().isColorDark()) android.R.color.white else R.color.colorAccent))
|
|
||||||
|
|
||||||
uiJob?.cancel()
|
uiJob?.cancel()
|
||||||
uiJob = lifecycleScope.launch(Dispatchers.IO) {
|
|
||||||
delay(200)
|
|
||||||
val generatedView = MainWidget.generateWidgetView(this@MainActivity)
|
|
||||||
|
|
||||||
withContext(Dispatchers.Main) {
|
if (Preferences.showPreview) {
|
||||||
generatedView.measure(0, 0)
|
preview.setCardBackgroundColor(
|
||||||
preview.measure(0, 0)
|
getColor(
|
||||||
try {
|
if (ColorHelper.getFontColor()
|
||||||
// Try to recycle old bitmaps
|
.isColorDark()
|
||||||
(bitmap_container.drawable as BitmapDrawable).bitmap.recycle()
|
) android.R.color.white else R.color.colorAccent
|
||||||
} catch (ignore: Exception) {}
|
)
|
||||||
}
|
)
|
||||||
|
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) {
|
||||||
withContext(Dispatchers.Main) {
|
generatedView.measure(0, 0)
|
||||||
// Clock
|
preview.measure(0, 0)
|
||||||
time.setTextColor(ColorHelper.getFontColor())
|
}
|
||||||
time.setTextSize(TypedValue.COMPLEX_UNIT_SP, Preferences.clockTextSize.toPixel(this@MainActivity))
|
|
||||||
time.format12Hour = "hh:mm"
|
|
||||||
|
|
||||||
// Clock bottom margin
|
val bitmap = BitmapHelper.getBitmapFromView(
|
||||||
clock_bottom_margin_none.isVisible = Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.NONE.value
|
generatedView,
|
||||||
clock_bottom_margin_small.isVisible = Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.SMALL.value
|
if (preview.width > 0) preview.width else generatedView.measuredWidth,
|
||||||
clock_bottom_margin_medium.isVisible = Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.MEDIUM.value
|
generatedView.measuredHeight
|
||||||
clock_bottom_margin_large.isVisible = Preferences.showClock && Preferences.clockBottomMargin == Constants.ClockBottomMargin.LARGE.value
|
)
|
||||||
|
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)) {
|
// Clock bottom margin
|
||||||
if (Preferences.showClock) {
|
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 {
|
time.layoutParams = time.layoutParams.apply {
|
||||||
height = RelativeLayout.LayoutParams.WRAP_CONTENT
|
height = RelativeLayout.LayoutParams.WRAP_CONTENT
|
||||||
}
|
}
|
||||||
time.measure(0, 0)
|
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(
|
if (preview.height == 0) {
|
||||||
preview.height,
|
ValueAnimator.ofInt(
|
||||||
160.toPixel(this@MainActivity) + if (Preferences.showClock) 100.toPixel(this@MainActivity) else 0
|
preview.height,
|
||||||
).apply {
|
160.toPixel(this@MainActivity) + if (Preferences.showClock) 100.toPixel(
|
||||||
duration = 500L
|
this@MainActivity
|
||||||
addUpdateListener {
|
) else 0
|
||||||
val animatedValue = animatedValue as Int
|
).apply {
|
||||||
val layoutParams = preview.layoutParams
|
duration = 300L
|
||||||
layoutParams.height = animatedValue
|
addUpdateListener {
|
||||||
preview.layoutParams = layoutParams
|
val animatedValue = animatedValue as Int
|
||||||
}
|
val layoutParams = preview.layoutParams
|
||||||
}.start()
|
layoutParams.height = animatedValue
|
||||||
} else {
|
preview.layoutParams = layoutParams
|
||||||
time.layoutParams = time.layoutParams.apply {
|
}
|
||||||
height = RelativeLayout.LayoutParams.WRAP_CONTENT
|
}.start()
|
||||||
}
|
}
|
||||||
time.measure(0, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
bitmap_container.setImageBitmap(bitmap)
|
bitmap_container.setImageBitmap(bitmap)
|
||||||
widget_loader.animate().scaleX(0f).scaleY(0f).start()
|
widget_loader.animate().scaleX(0f).scaleY(0f).start()
|
||||||
widget.animate().alpha(1f).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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ class AdvancedSettingsFragment : Fragment() {
|
|||||||
) {
|
) {
|
||||||
viewModel.darkThemePreference.observe(viewLifecycleOwner, Observer {
|
viewModel.darkThemePreference.observe(viewLifecycleOwner, Observer {
|
||||||
AppCompatDelegate.setDefaultNightMode(it)
|
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_NO -> getString(R.string.settings_subtitle_dark_theme_light)
|
||||||
AppCompatDelegate.MODE_NIGHT_YES -> getString(R.string.settings_subtitle_dark_theme_dark)
|
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)
|
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 {
|
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<Boolean>(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 {
|
action_show_wallpaper.setOnClickListener {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
BottomSheetMenu<Boolean>(requireContext(), header = getString(R.string.settings_title_show_wallpaper))
|
BottomSheetMenu<Boolean>(requireContext(), header = getString(R.string.settings_title_show_wallpaper))
|
||||||
|
@ -100,7 +100,7 @@ class CalendarSettingsFragment : Fragment() {
|
|||||||
|
|
||||||
viewModel.calendarAllDay.observe(viewLifecycleOwner, Observer {
|
viewModel.calendarAllDay.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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)
|
if (it) getString(R.string.settings_all_day_subtitle_visible) else getString(R.string.settings_all_day_subtitle_gone)
|
||||||
}
|
}
|
||||||
checkReadEventsPermission()
|
checkReadEventsPermission()
|
||||||
@ -108,49 +108,49 @@ class CalendarSettingsFragment : Fragment() {
|
|||||||
|
|
||||||
viewModel.showDeclinedEvents.observe(viewLifecycleOwner, Observer {
|
viewModel.showDeclinedEvents.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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()
|
checkReadEventsPermission()
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.secondRowInformation.observe(viewLifecycleOwner, Observer {
|
viewModel.secondRowInformation.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
second_row_info_label.text = getString(SettingsStringHelper.getSecondRowInfoString(it))
|
second_row_info_label?.text = getString(SettingsStringHelper.getSecondRowInfoString(it))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.showDiffTime.observe(viewLifecycleOwner, Observer {
|
viewModel.showDiffTime.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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 {
|
viewModel.showUntil.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
show_until_label.text = getString(SettingsStringHelper.getShowUntilString(it))
|
show_until_label?.text = getString(SettingsStringHelper.getShowUntilString(it))
|
||||||
}
|
}
|
||||||
checkReadEventsPermission()
|
checkReadEventsPermission()
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.showNextEvent.observe(viewLifecycleOwner, Observer {
|
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 {
|
viewModel.dateFormat.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
date_format_label.text = DateHelper.getDateText(requireContext(), Calendar.getInstance())
|
date_format_label?.text = DateHelper.getDateText(requireContext(), Calendar.getInstance())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.calendarAppName.observe(viewLifecycleOwner, Observer {
|
viewModel.calendarAppName.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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 {
|
viewModel.openEventDetails.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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) {
|
private fun checkReadEventsPermission(showEvents: Boolean = Preferences.showEvents) {
|
||||||
if (activity?.checkGrantedPermission(Manifest.permission.READ_CALENDAR) == true) {
|
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)
|
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
|
read_calendar_permission_alert_icon?.isVisible = false
|
||||||
CalendarHelper.updateEventList(requireContext())
|
CalendarHelper.updateEventList(requireContext())
|
||||||
} else {
|
} else {
|
||||||
show_events_label.text = if (showEvents) getString(R.string.description_permission_calendar) else getString(R.string.show_events_not_visible)
|
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?.isVisible = showEvents
|
||||||
read_calendar_permission_alert_icon.setOnClickListener {
|
read_calendar_permission_alert_icon?.setOnClickListener {
|
||||||
requirePermission()
|
requirePermission()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,13 +65,13 @@ class ClockSettingsFragment : Fragment() {
|
|||||||
viewModel: MainViewModel
|
viewModel: MainViewModel
|
||||||
) {
|
) {
|
||||||
viewModel.showBigClockWarning.observe(viewLifecycleOwner, Observer {
|
viewModel.showBigClockWarning.observe(viewLifecycleOwner, Observer {
|
||||||
large_clock_warning.isVisible = it
|
large_clock_warning?.isVisible = it
|
||||||
small_clock_warning.isVisible = !it
|
small_clock_warning?.isVisible = !it
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.showClock.observe(viewLifecycleOwner, Observer {
|
viewModel.showClock.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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)
|
if (it) getString(R.string.show_clock_visible) else getString(R.string.show_clock_not_visible)
|
||||||
binding.isClockVisible = it
|
binding.isClockVisible = it
|
||||||
}
|
}
|
||||||
@ -79,13 +79,13 @@ class ClockSettingsFragment : Fragment() {
|
|||||||
|
|
||||||
viewModel.clockTextSize.observe(viewLifecycleOwner, Observer {
|
viewModel.clockTextSize.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
clock_text_size_label.text = String.format("%.0fsp", it)
|
clock_text_size_label?.text = String.format("%.0fsp", it)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.clockBottomMargin.observe(viewLifecycleOwner, Observer {
|
viewModel.clockBottomMargin.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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.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.SMALL.value -> getString(R.string.settings_clock_bottom_margin_subtitle_small)
|
||||||
Constants.ClockBottomMargin.LARGE.value -> getString(R.string.settings_clock_bottom_margin_subtitle_large)
|
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 {
|
viewModel.showNextAlarm.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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 {
|
viewModel.clockAppName.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
clock_app_label.text =
|
clock_app_label?.text =
|
||||||
if (Preferences.clockAppName != "") Preferences.clockAppName else getString(R.string.default_clock_app)
|
if (Preferences.clockAppName != "") Preferences.clockAppName else getString(R.string.default_clock_app)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -77,13 +77,13 @@ class GeneralSettingsFragment : Fragment() {
|
|||||||
|
|
||||||
viewModel.textMainSize.observe(viewLifecycleOwner, Observer {
|
viewModel.textMainSize.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
main_text_size_label.text = String.format("%.0fsp", it)
|
main_text_size_label?.text = String.format("%.0fsp", it)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.textSecondSize.observe(viewLifecycleOwner, Observer {
|
viewModel.textSecondSize.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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) {
|
} catch (e: Exception) {
|
||||||
Preferences.textGlobalColor = "#FFFFFF"
|
Preferences.textGlobalColor = "#FFFFFF"
|
||||||
}
|
}
|
||||||
font_color_label.text = it.toUpperCase()
|
font_color_label?.text = it.toUpperCase()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.textShadow.observe(viewLifecycleOwner, Observer {
|
viewModel.textShadow.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
text_shadow_label.text = getString(SettingsStringHelper.getTextShadowString(it))
|
text_shadow_label?.text = getString(SettingsStringHelper.getTextShadowString(it))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.customFont.observe(viewLifecycleOwner, Observer {
|
viewModel.customFont.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
custom_font_label.text = getString(SettingsStringHelper.getCustomFontLabel(it))
|
custom_font_label?.text = getString(SettingsStringHelper.getCustomFontLabel(it))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -80,12 +80,12 @@ class WeatherSettingsFragment : Fragment() {
|
|||||||
viewModel: MainViewModel
|
viewModel: MainViewModel
|
||||||
) {
|
) {
|
||||||
viewModel.showWeatherWarning.observe(viewLifecycleOwner, Observer {
|
viewModel.showWeatherWarning.observe(viewLifecycleOwner, Observer {
|
||||||
weather_warning.isVisible = it
|
weather_warning?.isVisible = it
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.showWeather.observe(viewLifecycleOwner, Observer {
|
viewModel.showWeather.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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)
|
if (it) getString(R.string.show_weather_visible) else getString(R.string.show_weather_not_visible)
|
||||||
binding.isWeatherVisible = it
|
binding.isWeatherVisible = it
|
||||||
}
|
}
|
||||||
@ -94,18 +94,18 @@ class WeatherSettingsFragment : Fragment() {
|
|||||||
|
|
||||||
viewModel.weatherProviderApi.observe(viewLifecycleOwner, Observer {
|
viewModel.weatherProviderApi.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
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(
|
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
|
R.string.settings_weather_provider_api_key_subtitle_all_set
|
||||||
)
|
)
|
||||||
api_key_alert_icon.isVisible = it == ""
|
api_key_alert_icon?.isVisible = it == ""
|
||||||
}
|
}
|
||||||
checkLocationPermission()
|
checkLocationPermission()
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.customLocationAdd.observe(viewLifecycleOwner, Observer {
|
viewModel.customLocationAdd.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
label_custom_location.text =
|
label_custom_location?.text =
|
||||||
if (it == "") getString(R.string.custom_location_gps) else it
|
if (it == "") getString(R.string.custom_location_gps) else it
|
||||||
}
|
}
|
||||||
checkLocationPermission()
|
checkLocationPermission()
|
||||||
@ -113,7 +113,7 @@ class WeatherSettingsFragment : Fragment() {
|
|||||||
|
|
||||||
viewModel.weatherTempUnit.observe(viewLifecycleOwner, Observer {
|
viewModel.weatherTempUnit.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
temp_unit.text =
|
temp_unit?.text =
|
||||||
if (it == "F") getString(R.string.fahrenheit) else getString(R.string.celsius)
|
if (it == "F") getString(R.string.fahrenheit) else getString(R.string.celsius)
|
||||||
}
|
}
|
||||||
checkLocationPermission()
|
checkLocationPermission()
|
||||||
@ -121,14 +121,14 @@ class WeatherSettingsFragment : Fragment() {
|
|||||||
|
|
||||||
viewModel.weatherRefreshPeriod.observe(viewLifecycleOwner, Observer {
|
viewModel.weatherRefreshPeriod.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
label_weather_refresh_period.text = getString(SettingsStringHelper.getRefreshPeriodString(it))
|
label_weather_refresh_period?.text = getString(SettingsStringHelper.getRefreshPeriodString(it))
|
||||||
}
|
}
|
||||||
checkLocationPermission()
|
checkLocationPermission()
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.weatherAppName.observe(viewLifecycleOwner, Observer {
|
viewModel.weatherAppName.observe(viewLifecycleOwner, Observer {
|
||||||
maintainScrollPosition {
|
maintainScrollPosition {
|
||||||
weather_app_label.text =
|
weather_app_label?.text =
|
||||||
if (it != "") it else getString(R.string.default_weather_app)
|
if (it != "") it else getString(R.string.default_weather_app)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -136,11 +136,11 @@ class WeatherSettingsFragment : Fragment() {
|
|||||||
|
|
||||||
private fun checkLocationPermission() {
|
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) {
|
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())
|
WeatherWorker.setUpdates(requireContext())
|
||||||
} else if (Preferences.showWeather && Preferences.customLocationAdd == "") {
|
} else if (Preferences.showWeather && Preferences.customLocationAdd == "") {
|
||||||
location_permission_alert_icon.isVisible = true
|
location_permission_alert_icon?.isVisible = true
|
||||||
location_permission_alert_icon.setOnClickListener {
|
location_permission_alert_icon?.setOnClickListener {
|
||||||
requirePermission()
|
requirePermission()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,4 +51,5 @@ class MainViewModel : ViewModel() {
|
|||||||
// Advanced Settings
|
// Advanced Settings
|
||||||
val darkThemePreference = Preferences.asLiveData(Preferences::darkThemePreference)
|
val darkThemePreference = Preferences.asLiveData(Preferences::darkThemePreference)
|
||||||
val showWallpaper = Preferences.asLiveData(Preferences::showWallpaper)
|
val showWallpaper = Preferences.asLiveData(Preferences::showWallpaper)
|
||||||
|
val showPreview = Preferences.asLiveData(Preferences::showPreview)
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,6 @@ import android.graphics.Color
|
|||||||
import android.graphics.Typeface
|
import android.graphics.Typeface
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.format.DateUtils
|
import android.text.format.DateUtils
|
||||||
import android.util.Log
|
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
@ -30,9 +29,7 @@ import com.tommasoberlose.anotherwidget.helpers.*
|
|||||||
import com.tommasoberlose.anotherwidget.helpers.WidgetHelper.reduceDimensionWithMaxWidth
|
import com.tommasoberlose.anotherwidget.helpers.WidgetHelper.reduceDimensionWithMaxWidth
|
||||||
import com.tommasoberlose.anotherwidget.receivers.NewCalendarEventReceiver
|
import com.tommasoberlose.anotherwidget.receivers.NewCalendarEventReceiver
|
||||||
import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver
|
import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver
|
||||||
import com.tommasoberlose.anotherwidget.receivers.WeatherReceiver
|
|
||||||
import com.tommasoberlose.anotherwidget.receivers.WidgetClickListenerReceiver
|
import com.tommasoberlose.anotherwidget.receivers.WidgetClickListenerReceiver
|
||||||
import com.tommasoberlose.anotherwidget.services.UpdatesWorker
|
|
||||||
import com.tommasoberlose.anotherwidget.services.WeatherWorker
|
import com.tommasoberlose.anotherwidget.services.WeatherWorker
|
||||||
import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission
|
import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission
|
||||||
import com.tommasoberlose.anotherwidget.utils.getCapWordString
|
import com.tommasoberlose.anotherwidget.utils.getCapWordString
|
||||||
@ -70,7 +67,7 @@ class MainWidget : AppWidgetProvider() {
|
|||||||
|
|
||||||
override fun onDisabled(context: Context) {
|
override fun onDisabled(context: Context) {
|
||||||
if (getWidgetCount(context) == 0) {
|
if (getWidgetCount(context) == 0) {
|
||||||
UpdatesWorker.removeUpdates(context)
|
UpdatesReceiver.removeUpdates(context)
|
||||||
WeatherWorker.removeUpdates(context)
|
WeatherWorker.removeUpdates(context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIN
app/src/main/res/drawable-hdpi/round_aspect_ratio.png
Normal file
After Width: | Height: | Size: 295 B |
BIN
app/src/main/res/drawable-hdpi/round_aspect_ratio_black_18.png
Normal file
After Width: | Height: | Size: 275 B |
BIN
app/src/main/res/drawable-hdpi/round_aspect_ratio_black_36.png
Normal file
After Width: | Height: | Size: 399 B |
BIN
app/src/main/res/drawable-hdpi/round_aspect_ratio_black_48.png
Normal file
After Width: | Height: | Size: 428 B |
BIN
app/src/main/res/drawable-hdpi/round_compare.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
app/src/main/res/drawable-hdpi/round_compare_black_18.png
Normal file
After Width: | Height: | Size: 285 B |
BIN
app/src/main/res/drawable-hdpi/round_compare_black_36.png
Normal file
After Width: | Height: | Size: 440 B |
BIN
app/src/main/res/drawable-hdpi/round_compare_black_48.png
Normal file
After Width: | Height: | Size: 509 B |
BIN
app/src/main/res/drawable-hdpi/round_crop_original.png
Normal file
After Width: | Height: | Size: 479 B |
BIN
app/src/main/res/drawable-hdpi/round_crop_original_black_18.png
Normal file
After Width: | Height: | Size: 239 B |
BIN
app/src/main/res/drawable-hdpi/round_crop_original_black_24.png
Normal file
After Width: | Height: | Size: 283 B |
BIN
app/src/main/res/drawable-hdpi/round_crop_original_black_36.png
Normal file
After Width: | Height: | Size: 403 B |
BIN
app/src/main/res/drawable-mdpi/round_aspect_ratio.png
Normal file
After Width: | Height: | Size: 185 B |
BIN
app/src/main/res/drawable-mdpi/round_aspect_ratio_black_18.png
Normal file
After Width: | Height: | Size: 211 B |
BIN
app/src/main/res/drawable-mdpi/round_aspect_ratio_black_36.png
Normal file
After Width: | Height: | Size: 295 B |
BIN
app/src/main/res/drawable-mdpi/round_aspect_ratio_black_48.png
Normal file
After Width: | Height: | Size: 304 B |
BIN
app/src/main/res/drawable-mdpi/round_compare.png
Normal file
After Width: | Height: | Size: 218 B |
BIN
app/src/main/res/drawable-mdpi/round_compare_black_18.png
Normal file
After Width: | Height: | Size: 218 B |
BIN
app/src/main/res/drawable-mdpi/round_compare_black_36.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
app/src/main/res/drawable-mdpi/round_compare_black_48.png
Normal file
After Width: | Height: | Size: 361 B |
BIN
app/src/main/res/drawable-mdpi/round_crop_original.png
Normal file
After Width: | Height: | Size: 324 B |
BIN
app/src/main/res/drawable-mdpi/round_crop_original_black_18.png
Normal file
After Width: | Height: | Size: 196 B |
BIN
app/src/main/res/drawable-mdpi/round_crop_original_black_24.png
Normal file
After Width: | Height: | Size: 190 B |
BIN
app/src/main/res/drawable-mdpi/round_crop_original_black_36.png
Normal file
After Width: | Height: | Size: 283 B |
BIN
app/src/main/res/drawable-xhdpi/round_aspect_ratio.png
Normal file
After Width: | Height: | Size: 304 B |
BIN
app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_18.png
Normal file
After Width: | Height: | Size: 295 B |
BIN
app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_36.png
Normal file
After Width: | Height: | Size: 428 B |
BIN
app/src/main/res/drawable-xhdpi/round_aspect_ratio_black_48.png
Normal file
After Width: | Height: | Size: 572 B |
BIN
app/src/main/res/drawable-xhdpi/round_compare.png
Normal file
After Width: | Height: | Size: 361 B |
BIN
app/src/main/res/drawable-xhdpi/round_compare_black_18.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
app/src/main/res/drawable-xhdpi/round_compare_black_36.png
Normal file
After Width: | Height: | Size: 509 B |
BIN
app/src/main/res/drawable-xhdpi/round_compare_black_48.png
Normal file
After Width: | Height: | Size: 645 B |
BIN
app/src/main/res/drawable-xhdpi/round_crop_original.png
Normal file
After Width: | Height: | Size: 621 B |
BIN
app/src/main/res/drawable-xhdpi/round_crop_original_black_18.png
Normal file
After Width: | Height: | Size: 283 B |
BIN
app/src/main/res/drawable-xhdpi/round_crop_original_black_24.png
Normal file
After Width: | Height: | Size: 324 B |
BIN
app/src/main/res/drawable-xhdpi/round_crop_original_black_36.png
Normal file
After Width: | Height: | Size: 479 B |
BIN
app/src/main/res/drawable-xxhdpi/round_aspect_ratio.png
Normal file
After Width: | Height: | Size: 428 B |
BIN
app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_18.png
Normal file
After Width: | Height: | Size: 399 B |
BIN
app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_36.png
Normal file
After Width: | Height: | Size: 711 B |
BIN
app/src/main/res/drawable-xxhdpi/round_aspect_ratio_black_48.png
Normal file
After Width: | Height: | Size: 825 B |
BIN
app/src/main/res/drawable-xxhdpi/round_compare.png
Normal file
After Width: | Height: | Size: 509 B |
BIN
app/src/main/res/drawable-xxhdpi/round_compare_black_18.png
Normal file
After Width: | Height: | Size: 440 B |
BIN
app/src/main/res/drawable-xxhdpi/round_compare_black_36.png
Normal file
After Width: | Height: | Size: 781 B |
BIN
app/src/main/res/drawable-xxhdpi/round_compare_black_48.png
Normal file
After Width: | Height: | Size: 927 B |
BIN
app/src/main/res/drawable-xxhdpi/round_crop_original.png
Normal file
After Width: | Height: | Size: 881 B |
After Width: | Height: | Size: 403 B |
After Width: | Height: | Size: 479 B |
After Width: | Height: | Size: 721 B |
BIN
app/src/main/res/drawable-xxxhdpi/round_aspect_ratio.png
Normal file
After Width: | Height: | Size: 572 B |
After Width: | Height: | Size: 428 B |
After Width: | Height: | Size: 825 B |
After Width: | Height: | Size: 1006 B |
BIN
app/src/main/res/drawable-xxxhdpi/round_compare.png
Normal file
After Width: | Height: | Size: 645 B |
BIN
app/src/main/res/drawable-xxxhdpi/round_compare_black_18.png
Normal file
After Width: | Height: | Size: 509 B |
BIN
app/src/main/res/drawable-xxxhdpi/round_compare_black_36.png
Normal file
After Width: | Height: | Size: 927 B |
BIN
app/src/main/res/drawable-xxxhdpi/round_compare_black_48.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/round_crop_original.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 479 B |
After Width: | Height: | Size: 621 B |
After Width: | Height: | Size: 881 B |
10
app/src/main/res/drawable/round_aspect_ratio_24.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M18,12c-0.55,0 -1,0.45 -1,1v2h-2c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h3c0.55,0 1,-0.45 1,-1v-3c0,-0.55 -0.45,-1 -1,-1zM7,9h2c0.55,0 1,-0.45 1,-1s-0.45,-1 -1,-1L6,7c-0.55,0 -1,0.45 -1,1v3c0,0.55 0.45,1 1,1s1,-0.45 1,-1L7,9zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM20,19.01L4,19.01c-0.55,0 -1,-0.45 -1,-1L3,5.99c0,-0.55 0.45,-1 1,-1h16c0.55,0 1,0.45 1,1v12.02c0,0.55 -0.45,1 -1,1z"/>
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/round_compare_24.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M10,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h5v1c0,0.55 0.45,1 1,1s1,-0.45 1,-1L12,2c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v1zM10,18L5,18l5,-6v6zM19,3h-5v2h4c0.55,0 1,0.45 1,1v12l-5,-6v9h5c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2z"/>
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/round_crop_original_24.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM18,19L6,19c-0.55,0 -1,-0.45 -1,-1L5,6c0,-0.55 0.45,-1 1,-1h12c0.55,0 1,0.45 1,1v12c0,0.55 -0.45,1 -1,1zM13.56,12.81l-2.35,3.02 -1.56,-1.88c-0.2,-0.25 -0.58,-0.24 -0.78,0.01l-1.74,2.23c-0.26,0.33 -0.02,0.81 0.39,0.81h8.98c0.41,0 0.65,-0.47 0.4,-0.8l-2.55,-3.39c-0.19,-0.26 -0.59,-0.26 -0.79,0z"/>
|
||||||
|
</vector>
|
77
app/src/main/res/layout/bottom_sheet_dialog.xml
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:paddingLeft="32dp"
|
||||||
|
android:paddingRight="32dp"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/header"
|
||||||
|
android:paddingTop="16dp"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
|
android:textAppearance="@style/TextAppearance.MaterialComponents.Button"
|
||||||
|
app:textAllCaps="false"
|
||||||
|
android:letterSpacing="0"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
|
android:gravity="start"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:id="@+id/title"
|
||||||
|
android:text="Titolo"
|
||||||
|
android:textColor="@color/colorPrimaryText"/>
|
||||||
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
||||||
|
app:textAllCaps="false"
|
||||||
|
android:letterSpacing="0"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:id="@+id/message"
|
||||||
|
android:gravity="start"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:text="Messaggio molto lungo di cui voirre akjcbasaskdask flasdas fashbdfjah fahsbd ajsbd "
|
||||||
|
android:textColor="@color/colorPrimaryText"/>
|
||||||
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:gravity="end">
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/Widget.MaterialComponents.Button.TextButton"
|
||||||
|
android:textColor="@color/colorSecondaryText"
|
||||||
|
android:alpha="0.8"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:textSize="16sp"
|
||||||
|
app:rippleColor="@color/colorSecondaryText"
|
||||||
|
android:id="@+id/action_negative"
|
||||||
|
android:letterSpacing="0"
|
||||||
|
android:text="Dismiss"
|
||||||
|
app:textAllCaps="false" />
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/Widget.MaterialComponents.Button.TextButton"
|
||||||
|
android:textColor="@color/colorAccent"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:textSize="16sp"
|
||||||
|
app:rippleColor="@color/colorAccent_op30"
|
||||||
|
android:id="@+id/action_positive"
|
||||||
|
android:letterSpacing="0"
|
||||||
|
android:text="Accept"
|
||||||
|
app:textAllCaps="false" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
@ -16,6 +16,8 @@
|
|||||||
android:letterSpacing="0"
|
android:letterSpacing="0"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="start"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
android:paddingTop="16dp"
|
android:paddingTop="16dp"
|
||||||
android:paddingBottom="8dp"
|
android:paddingBottom="8dp"
|
||||||
android:paddingLeft="32dp"
|
android:paddingLeft="32dp"
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
android:paddingLeft="32dp"
|
android:paddingLeft="32dp"
|
||||||
android:paddingRight="32dp"
|
android:paddingRight="32dp"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
|
android:gravity="start"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
android:id="@+id/header_text"
|
android:id="@+id/header_text"
|
||||||
android:text=""
|
android:text=""
|
||||||
android:textColor="@color/colorPrimaryText"/>
|
android:textColor="@color/colorPrimaryText"/>
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
<ImageView
|
<ImageView
|
||||||
android:layout_width="48dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
android:padding="10dp"
|
android:padding="11dp"
|
||||||
android:src="@drawable/round_refresh"
|
android:src="@drawable/round_refresh"
|
||||||
android:tint="@color/colorPrimaryText"/>
|
android:tint="@color/colorPrimaryText"/>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@ -56,6 +56,43 @@
|
|||||||
style="@style/AnotherWidget.Settings.Subtitle" />
|
style="@style/AnotherWidget.Settings.Subtitle" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="16dp"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:background="?android:attr/selectableItemBackground"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:id="@+id/action_show_widget_preview"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:padding="13dp"
|
||||||
|
android:src="@drawable/round_aspect_ratio"
|
||||||
|
android:tint="@color/colorPrimaryText"/>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/AnotherWidget.Settings.Title"
|
||||||
|
android:text="@string/action_show_widget_preview"/>
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/show_widget_preview_label"
|
||||||
|
style="@style/AnotherWidget.Settings.Subtitle" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -198,4 +198,8 @@
|
|||||||
<string name="settings_clock_bottom_margin_subtitle_small">Small</string>
|
<string name="settings_clock_bottom_margin_subtitle_small">Small</string>
|
||||||
<string name="settings_clock_bottom_margin_subtitle_medium">Medium</string>
|
<string name="settings_clock_bottom_margin_subtitle_medium">Medium</string>
|
||||||
<string name="settings_clock_bottom_margin_subtitle_large">Large</string>
|
<string name="settings_clock_bottom_margin_subtitle_large">Large</string>
|
||||||
|
<string name="xiaomi_warning_title">Xiaomi Devices</string>
|
||||||
|
<string name="xiaomi_warning_message">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.</string>
|
||||||
|
<string name="action_ignore">Ignore</string>
|
||||||
|
<string name="action_grant_permission">Grant permission</string>
|
||||||
</resources>
|
</resources>
|
@ -176,4 +176,10 @@
|
|||||||
<string name="settings_clock_bottom_margin_subtitle_small">Petit</string>
|
<string name="settings_clock_bottom_margin_subtitle_small">Petit</string>
|
||||||
<string name="settings_clock_bottom_margin_subtitle_medium">Moyen</string>
|
<string name="settings_clock_bottom_margin_subtitle_medium">Moyen</string>
|
||||||
<string name="settings_clock_bottom_margin_subtitle_large">Grand</string>
|
<string name="settings_clock_bottom_margin_subtitle_large">Grand</string>
|
||||||
|
|
||||||
|
<!-- TODO -->
|
||||||
|
<string name="xiaomi_warning_title">Xiaomi Devices</string>
|
||||||
|
<string name="xiaomi_warning_message">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.</string>
|
||||||
|
<string name="action_ignore">Ignore</string>
|
||||||
|
<string name="action_grant_permission">Grant permission</string>
|
||||||
</resources>
|
</resources>
|
@ -177,4 +177,8 @@
|
|||||||
<string name="settings_clock_bottom_margin_subtitle_small">Piccolo</string>
|
<string name="settings_clock_bottom_margin_subtitle_small">Piccolo</string>
|
||||||
<string name="settings_clock_bottom_margin_subtitle_medium">Medio</string>
|
<string name="settings_clock_bottom_margin_subtitle_medium">Medio</string>
|
||||||
<string name="settings_clock_bottom_margin_subtitle_large">Grande</string>
|
<string name="settings_clock_bottom_margin_subtitle_large">Grande</string>
|
||||||
|
<string name="xiaomi_warning_title">Dispositivi Xiaomi</string>
|
||||||
|
<string name="xiaomi_warning_message">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.</string>
|
||||||
|
<string name="action_ignore">Ignora</string>
|
||||||
|
<string name="action_grant_permission">Concedi permesso</string>
|
||||||
</resources>
|
</resources>
|
@ -188,4 +188,9 @@
|
|||||||
<string name="settings_clock_bottom_margin_subtitle_small">Small</string>
|
<string name="settings_clock_bottom_margin_subtitle_small">Small</string>
|
||||||
<string name="settings_clock_bottom_margin_subtitle_medium">Medium</string>
|
<string name="settings_clock_bottom_margin_subtitle_medium">Medium</string>
|
||||||
<string name="settings_clock_bottom_margin_subtitle_large">Large</string>
|
<string name="settings_clock_bottom_margin_subtitle_large">Large</string>
|
||||||
|
<string name="xiaomi_manufacturer" translatable="false">xiaomi</string>
|
||||||
|
<string name="xiaomi_warning_title">Xiaomi Devices</string>
|
||||||
|
<string name="xiaomi_warning_message">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.</string>
|
||||||
|
<string name="action_ignore">Ignore</string>
|
||||||
|
<string name="action_grant_permission">Grant permission</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
xmlns:dist="http://schemas.android.com/apk/distribution"
|
xmlns:dist="http://schemas.android.com/apk/distribution"
|
||||||
featureSplit="tasksintegration"
|
featureSplit="tasksintegration"
|
||||||
package="com.tommasoberlose.anotherwidget"
|
package="com.tommasoberlose.anotherwidget"
|
||||||
android:versionCode="64"
|
android:versionCode="67"
|
||||||
android:versionName="2.0.5" >
|
android:versionName="2.0.5" >
|
||||||
|
|
||||||
<uses-sdk
|
<uses-sdk
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#Tue May 05 14:08:04 CEST 2020
|
#Tue May 05 19:30:12 CEST 2020
|
||||||
base.0=/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/intermediates/dex/debug/mergeProjectDexDebug/out/classes.dex
|
base.0=/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/intermediates/dex/debug/mergeProjectDexDebug/out/classes.dex
|
||||||
path.0=classes.dex
|
path.0=classes.dex
|
||||||
renamed.0=classes.dex
|
renamed.0=classes.dex
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
featureSplit="tasksintegration"
|
featureSplit="tasksintegration"
|
||||||
package="com.tommasoberlose.anotherwidget"
|
package="com.tommasoberlose.anotherwidget"
|
||||||
android:targetSandboxVersion="2"
|
android:targetSandboxVersion="2"
|
||||||
android:versionCode="64"
|
android:versionCode="67"
|
||||||
android:versionName="2.0.5" >
|
android:versionName="2.0.5" >
|
||||||
|
|
||||||
<uses-sdk
|
<uses-sdk
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
3 xmlns:dist="http://schemas.android.com/apk/distribution"
|
3 xmlns:dist="http://schemas.android.com/apk/distribution"
|
||||||
4 featureSplit="tasksintegration"
|
4 featureSplit="tasksintegration"
|
||||||
5 package="com.tommasoberlose.anotherwidget"
|
5 package="com.tommasoberlose.anotherwidget"
|
||||||
6 android:versionCode="64"
|
6 android:versionCode="67"
|
||||||
7 android:versionName="2.0.5" >
|
7 android:versionName="2.0.5" >
|
||||||
8
|
8
|
||||||
9 <uses-sdk
|
9 <uses-sdk
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
xmlns:dist="http://schemas.android.com/apk/distribution"
|
xmlns:dist="http://schemas.android.com/apk/distribution"
|
||||||
featureSplit="tasksintegration"
|
featureSplit="tasksintegration"
|
||||||
package="com.tommasoberlose.anotherwidget"
|
package="com.tommasoberlose.anotherwidget"
|
||||||
android:versionCode="64"
|
android:versionCode="67"
|
||||||
android:versionName="2.0.5" >
|
android:versionName="2.0.5" >
|
||||||
|
|
||||||
<uses-sdk
|
<uses-sdk
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
xmlns:dist="http://schemas.android.com/apk/distribution"
|
xmlns:dist="http://schemas.android.com/apk/distribution"
|
||||||
featureSplit="tasksintegration"
|
featureSplit="tasksintegration"
|
||||||
package="com.tommasoberlose.anotherwidget"
|
package="com.tommasoberlose.anotherwidget"
|
||||||
android:versionCode="64"
|
android:versionCode="67"
|
||||||
android:versionName="2.0.5" >
|
android:versionName="2.0.5" >
|
||||||
|
|
||||||
<uses-sdk android:targetSdkVersion="29" />
|
<uses-sdk android:targetSdkVersion="29" />
|
||||||
|