diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c6de634..93d20a3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -150,9 +150,9 @@ + android:name=".services.UpdateCalendarService" + android:enabled="true" + android:exported="false"/> { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/SettingsStringHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/SettingsStringHelper.kt index 0c58b4a..f80505c 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/SettingsStringHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/SettingsStringHelper.kt @@ -63,10 +63,20 @@ object SettingsStringHelper { } fun getVariantLabel(context: Context, variant: String): String = when { + variant == "italic" -> context.getString(R.string.font_italic) + variant.contains("100") && variant.contains("italic") -> context.getString(R.string.font_100_italic) + variant.contains("200") && variant.contains("italic") -> context.getString(R.string.font_200_italic) + variant.contains("300") && variant.contains("italic") -> context.getString(R.string.font_300_italic) + variant.contains("400") && variant.contains("italic") -> context.getString(R.string.font_400_italic) + variant.contains("500") && variant.contains("italic") -> context.getString(R.string.font_500_italic) + variant.contains("600") && variant.contains("italic") -> context.getString(R.string.font_600_italic) + variant.contains("700") && variant.contains("italic") -> context.getString(R.string.font_700_italic) + variant.contains("800") && variant.contains("italic") -> context.getString(R.string.font_800_italic) + variant.contains("900") && variant.contains("italic") -> context.getString(R.string.font_900_italic) + variant == "regular" || variant.contains("400") -> context.getString(R.string.font_400) variant.contains("100") -> context.getString(R.string.font_100) variant.contains("200") -> context.getString(R.string.font_200) variant.contains("300") -> context.getString(R.string.font_300) - variant.contains("regular") || variant.contains("400") -> context.getString(R.string.font_400) variant.contains("500") -> context.getString(R.string.font_500) variant.contains("600") -> context.getString(R.string.font_600) variant.contains("700") -> context.getString(R.string.font_700) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/network/WeatherNetworkApi.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/network/WeatherNetworkApi.kt index 69afc62..436944f 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/network/WeatherNetworkApi.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/network/WeatherNetworkApi.kt @@ -2,6 +2,7 @@ package com.tommasoberlose.anotherwidget.network import android.content.Context import android.util.Log +import com.chibatching.kotpref.Kotpref import com.google.gson.internal.LinkedTreeMap import com.haroldadmin.cnradapter.NetworkResponse import com.haroldadmin.cnradapter.executeWithRetry @@ -26,6 +27,7 @@ import java.util.* class WeatherNetworkApi(val context: Context) { suspend fun updateWeather() { + Kotpref.init(context) Preferences.weatherProviderError = "-" Preferences.weatherProviderLocationError = "" diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/services/LocationService.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/services/LocationService.kt index 529e44a..8c3b398 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/services/LocationService.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/services/LocationService.kt @@ -26,7 +26,7 @@ import kotlin.collections.ArrayList class LocationService : Service() { - private val jobs: ArrayList = ArrayList() + private var job: Job? = null override fun onCreate() { super.onCreate() @@ -34,13 +34,13 @@ class LocationService : Service() { } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - if (ActivityCompat.checkSelfPermission( - this, - Manifest.permission.ACCESS_FINE_LOCATION - ) == PackageManager.PERMISSION_GRANTED - ) { - - jobs += GlobalScope.launch(Dispatchers.IO) { + job?.cancel() + job = GlobalScope.launch(Dispatchers.IO) { + if (ActivityCompat.checkSelfPermission( + this@LocationService, + Manifest.permission.ACCESS_FINE_LOCATION + ) == PackageManager.PERMISSION_GRANTED + ) { LocationServices.getFusedLocationProviderClient(this@LocationService).lastLocation.addOnCompleteListener { task -> val networkApi = WeatherNetworkApi(this@LocationService) if (task.isSuccessful) { @@ -67,18 +67,17 @@ class LocationService : Service() { EventBus.getDefault().post(MainFragment.UpdateUiMessageEvent()) } } + } else { + stopSelf() } - } else { - stopSelf() } return START_STICKY } override fun onDestroy() { super.onDestroy() - jobs.forEach { - it.cancel() - } + job?.cancel() + job = null } companion object { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt deleted file mode 100644 index 651ba3a..0000000 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt +++ /dev/null @@ -1,153 +0,0 @@ -package com.tommasoberlose.anotherwidget.services - -import android.Manifest -import android.content.Context -import android.content.Intent -import android.provider.CalendarContract -import android.util.Log -import androidx.core.app.JobIntentService -import com.tommasoberlose.anotherwidget.db.EventRepository -import com.tommasoberlose.anotherwidget.global.Preferences -import com.tommasoberlose.anotherwidget.helpers.CalendarHelper -import com.tommasoberlose.anotherwidget.helpers.CalendarHelper.applyFilters -import com.tommasoberlose.anotherwidget.helpers.CalendarHelper.sortEvents -import com.tommasoberlose.anotherwidget.models.Event -import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver -import com.tommasoberlose.anotherwidget.ui.fragments.MainFragment -import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget -import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission -import me.everything.providers.android.calendar.CalendarProvider -import org.greenrobot.eventbus.EventBus -import java.util.* -import kotlin.Comparator -import kotlin.collections.ArrayList - -class UpdateCalendarJob : JobIntentService() { - - companion object { - private const val jobId = 1200 - - fun enqueueWork(context: Context, work: Intent) { - enqueueWork(context, UpdateCalendarJob::class.java, jobId, work) - } - } - - override fun onHandleWork(intent: Intent) { - val eventRepository = EventRepository(this) - if (Preferences.showEvents) { - val eventList = ArrayList() - - val now = Calendar.getInstance() - val begin = Calendar.getInstance().apply { - set(Calendar.MILLISECOND, 0) - set(Calendar.SECOND, 0) - set(Calendar.MINUTE, 0) - set(Calendar.HOUR_OF_DAY, 0) - } - val limit = Calendar.getInstance().apply { - when (Preferences.showUntil) { - 0 -> add(Calendar.HOUR, 3) - 1 -> add(Calendar.HOUR, 6) - 2 -> add(Calendar.HOUR, 12) - 3 -> add(Calendar.DAY_OF_MONTH, 1) - 4 -> add(Calendar.DAY_OF_MONTH, 3) - 5 -> add(Calendar.DAY_OF_MONTH, 7) - 6 -> add(Calendar.MINUTE, 30) - 7 -> add(Calendar.HOUR, 1) - else -> add(Calendar.HOUR, 6) - } - } - - if (!checkGrantedPermission( - Manifest.permission.READ_CALENDAR - ) - ) { - eventRepository.resetNextEventData() - } else { - try { - val provider = CalendarProvider(this) - val data = provider.getInstances(begin.timeInMillis, limit.timeInMillis) - if (data != null) { - val instances = data.list - for (instance in instances) { - try { - val e = provider.getEvent(instance.eventId) - if (e != null && !e.deleted && instance.begin <= limit.timeInMillis && now.timeInMillis < instance.end && !CalendarHelper.getFilteredCalendarIdList() - .contains(e.calendarId) - ) { - if (e.allDay) { - val start = Calendar.getInstance() - start.timeInMillis = instance.begin - val end = Calendar.getInstance() - end.timeInMillis = instance.end - instance.begin = - start.timeInMillis - start.timeZone.getOffset(start.timeInMillis) - instance.end = - end.timeInMillis - end.timeZone.getOffset(end.timeInMillis) - } - - // Check all day events - val startDate = Calendar.getInstance() - startDate.timeInMillis = instance.begin - val endDate = Calendar.getInstance() - endDate.timeInMillis = instance.end - - val isAllDay = e.allDay || ( - startDate.get(Calendar.MILLISECOND) == 0 - && startDate.get(Calendar.SECOND) == 0 - && startDate.get(Calendar.MINUTE) == 0 - && startDate.get(Calendar.HOUR_OF_DAY) == 0 - && endDate.get(Calendar.MILLISECOND) == 0 - && endDate.get(Calendar.SECOND) == 0 - && endDate.get(Calendar.MINUTE) == 0 - && endDate.get(Calendar.HOUR_OF_DAY) == 0 - ) - - eventList.add( - Event( - id = instance.id, - eventID = e.id, - title = e.title ?: "", - startDate = instance.begin, - endDate = instance.end, - calendarID = e.calendarId.toInt(), - allDay = isAllDay, - address = e.eventLocation ?: "", - selfAttendeeStatus = e.selfAttendeeStatus.toInt(), - availability = e.availability - ) - ) - } - } catch (ignored: Exception) { - } - } - } - - val sortedEvents = eventList.sortEvents() - val filteredEventList = sortedEvents - .applyFilters() - - if (filteredEventList.isEmpty()) { - eventRepository.resetNextEventData() - eventRepository.clearEvents() - } else { - eventRepository.saveEvents( - sortedEvents - ) - eventRepository.saveNextEventData(filteredEventList.first()) - } - } catch (ignored: java.lang.Exception) { - - } - } - } else { - eventRepository.resetNextEventData() - } - - UpdatesReceiver.setUpdates(this) - MainWidget.updateWidget(this) - - EventBus.getDefault().post(MainFragment.UpdateUiMessageEvent()) - eventRepository.close() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarService.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarService.kt new file mode 100644 index 0000000..bce293c --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarService.kt @@ -0,0 +1,174 @@ +package com.tommasoberlose.anotherwidget.services + +import android.Manifest +import android.app.Service +import android.content.Context +import android.content.Intent +import android.os.IBinder +import android.util.Log +import com.tommasoberlose.anotherwidget.db.EventRepository +import com.tommasoberlose.anotherwidget.global.Preferences +import com.tommasoberlose.anotherwidget.helpers.CalendarHelper +import com.tommasoberlose.anotherwidget.helpers.CalendarHelper.applyFilters +import com.tommasoberlose.anotherwidget.helpers.CalendarHelper.sortEvents +import com.tommasoberlose.anotherwidget.models.Event +import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver +import com.tommasoberlose.anotherwidget.ui.fragments.MainFragment +import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget +import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import me.everything.providers.android.calendar.CalendarProvider +import org.greenrobot.eventbus.EventBus +import java.util.* +import kotlin.collections.ArrayList + +class UpdateCalendarService : Service() { + + companion object { + fun enqueueWork(context: Context) { + context.startService(Intent(context, UpdateCalendarService::class.java)) + } + } + + private var job: Job? = null + + override fun onBind(intent: Intent?): IBinder? { + return null + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + job?.cancel() + job = GlobalScope.launch(Dispatchers.IO) { + + val eventRepository = EventRepository(this@UpdateCalendarService) + if (Preferences.showEvents) { + val eventList = ArrayList() + + val now = Calendar.getInstance() + val begin = Calendar.getInstance().apply { + set(Calendar.MILLISECOND, 0) + set(Calendar.SECOND, 0) + set(Calendar.MINUTE, 0) + set(Calendar.HOUR_OF_DAY, 0) + } + val limit = Calendar.getInstance().apply { + when (Preferences.showUntil) { + 0 -> add(Calendar.HOUR, 3) + 1 -> add(Calendar.HOUR, 6) + 2 -> add(Calendar.HOUR, 12) + 3 -> add(Calendar.DAY_OF_MONTH, 1) + 4 -> add(Calendar.DAY_OF_MONTH, 3) + 5 -> add(Calendar.DAY_OF_MONTH, 7) + 6 -> add(Calendar.MINUTE, 30) + 7 -> add(Calendar.HOUR, 1) + else -> add(Calendar.HOUR, 6) + } + } + + if (!checkGrantedPermission( + Manifest.permission.READ_CALENDAR + ) + ) { + eventRepository.resetNextEventData() + } else { + try { + val provider = CalendarProvider(this@UpdateCalendarService) + val data = provider.getInstances(begin.timeInMillis, limit.timeInMillis) + if (data != null) { + val instances = data.list + for (instance in instances) { + try { + val e = provider.getEvent(instance.eventId) + if (e != null && !e.deleted && instance.begin <= limit.timeInMillis && now.timeInMillis < instance.end && !CalendarHelper.getFilteredCalendarIdList() + .contains(e.calendarId) + ) { + if (e.allDay) { + val start = Calendar.getInstance() + start.timeInMillis = instance.begin + val end = Calendar.getInstance() + end.timeInMillis = instance.end + instance.begin = + start.timeInMillis - start.timeZone.getOffset(start.timeInMillis) + instance.end = + end.timeInMillis - end.timeZone.getOffset(end.timeInMillis) + } + + // Check all day events + val startDate = Calendar.getInstance() + startDate.timeInMillis = instance.begin + val endDate = Calendar.getInstance() + endDate.timeInMillis = instance.end + + val isAllDay = e.allDay || ( + startDate.get(Calendar.MILLISECOND) == 0 + && startDate.get(Calendar.SECOND) == 0 + && startDate.get(Calendar.MINUTE) == 0 + && startDate.get(Calendar.HOUR_OF_DAY) == 0 + && endDate.get(Calendar.MILLISECOND) == 0 + && endDate.get(Calendar.SECOND) == 0 + && endDate.get(Calendar.MINUTE) == 0 + && endDate.get(Calendar.HOUR_OF_DAY) == 0 + ) + + eventList.add( + Event( + id = instance.id, + eventID = e.id, + title = e.title ?: "", + startDate = instance.begin, + endDate = instance.end, + calendarID = e.calendarId.toInt(), + allDay = isAllDay, + address = e.eventLocation ?: "", + selfAttendeeStatus = e.selfAttendeeStatus.toInt(), + availability = e.availability + ) + ) + } + } catch (ignored: Exception) { + } + } + } + + val sortedEvents = eventList.sortEvents() + val filteredEventList = sortedEvents + .applyFilters() + + if (filteredEventList.isEmpty()) { + eventRepository.resetNextEventData() + eventRepository.clearEvents() + } else { + eventRepository.saveEvents( + sortedEvents + ) + eventRepository.saveNextEventData(filteredEventList.first()) + } + } catch (ignored: java.lang.Exception) { + + } + } + } else { + eventRepository.resetNextEventData() + } + + UpdatesReceiver.setUpdates(this@UpdateCalendarService) + MainWidget.updateWidget(this@UpdateCalendarService) + + EventBus.getDefault().post(MainFragment.UpdateUiMessageEvent()) + eventRepository.close() + + stopSelf() + } + + return START_STICKY + } + + override fun onDestroy() { + super.onDestroy() + job?.cancel() + job = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/CustomFontActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/CustomFontActivity.kt index 6a8e25d..96d9f6c 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/CustomFontActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/tabs/CustomFontActivity.kt @@ -6,6 +6,7 @@ import android.graphics.Typeface import android.os.Bundle import android.os.Handler import android.os.HandlerThread +import android.util.Log import android.view.View import android.view.ViewGroup import android.widget.TextView @@ -18,6 +19,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.chibatching.kotpref.blockingBulk +import com.google.gson.Gson import com.koolio.library.Font import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.components.BottomSheetMenu @@ -125,7 +127,7 @@ class CustomFontActivity : AppCompatActivity() { if (item.fontVariants.isEmpty()) { dialog.addItem(SettingsStringHelper.getVariantLabel(this, "regular"), -1) } else { - item.fontVariants.filter { !it.contains("italic") } + item.fontVariants .forEachIndexed { index, s -> dialog.addItem(SettingsStringHelper.getVariantLabel(this, s), index) } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/GlanceTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/GlanceTabFragment.kt index 0650e1c..b0f4f86 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/GlanceTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/tabs/GlanceTabFragment.kt @@ -274,22 +274,23 @@ class GlanceTabFragment : Fragment() { } Constants.GlanceProviderId.EVENTS -> { isVisible = - Preferences.showEventsAsGlanceProvider && Preferences.showEvents && requireContext().checkGrantedPermission( - Manifest.permission.READ_CALENDAR - ) + Preferences.showEventsAsGlanceProvider + val hasError = !Preferences.showEvents || !requireContext().checkGrantedPermission( + Manifest.permission.READ_CALENDAR + ) injector.text( R.id.label, - if (isVisible) getString(R.string.settings_visible) else getString( + if (isVisible && !hasError) getString(R.string.settings_visible) else getString( R.string.settings_not_visible ) ) injector.visibility( R.id.error_icon, - if (isVisible) View.GONE else View.VISIBLE + if (isVisible && hasError) View.VISIBLE else View.GONE ) injector.visibility( R.id.info_icon, - if (isVisible) View.VISIBLE else View.GONE + if (!(isVisible && hasError)) View.VISIBLE else View.GONE ) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 40e4f78..856db05 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,6 +40,16 @@ Bold Black Heavy + Italic + Thin Italic + Light Italic + Book Italic + Regular Italic + Medium Italic + Semi-bold Italic + Bold Italic + Black Italic + Heavy Italic Calendar