From 507b7f23185b2765b8109f64d0c8ba460321fee9 Mon Sep 17 00:00:00 2001 From: Tommaso Berlose Date: Fri, 2 Oct 2020 11:23:23 +0200 Subject: [PATCH] Fix #174, fix #185 --- .idea/caches/build_file_checksums.ser | Bin 537 -> 537 bytes .idea/codeStyles/Project.xml | 16 ++++++++ .idea/modules.xml | 2 +- app/build.gradle | 38 ++++++++---------- .../anotherwidget/db/EventRepository.kt | 11 ++--- .../anotherwidget/helpers/BitmapHelper.kt | 3 +- .../services/UpdateCalendarJob.kt | 30 +++++++++----- .../ui/fragments/MainFragment.kt | 4 +- .../ui/fragments/SettingsFragment.kt | 4 +- .../ui/fragments/WeatherTabFragment.kt | 3 ++ build.gradle | 4 +- google-play-badge.png | Bin 13957 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- 13 files changed, 72 insertions(+), 47 deletions(-) delete mode 100644 google-play-badge.png diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 82891939c21b523d26a533092bee989f4980a67f..59bb54a7c593165008d1123aa1bae33532d099b5 100644 GIT binary patch delta 54 zcmV-60LlNE1epYomj!g_hD|+@oSzWiuf%v@(SW;C6n~WTHxeC_O98zR%`?uo*kO)W MZk67|cHmzmc(TzM{{R30 delta 54 zcmV-60LlNE1epYomj!Y?XnQ}AoSzWO%?Ep + + diff --git a/.idea/modules.xml b/.idea/modules.xml index e31ade1..cb3973f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3a3add9..86eb895 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,13 +59,13 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.legacy:legacy-support-v4:1.0.0' testImplementation 'junit:junit:4.13' - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' // UI - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'com.google.android.material:material:1.2.0-alpha06' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.1' + implementation 'com.google.android.material:material:1.3.0-alpha03' implementation 'androidx.browser:browser:1.2.0' implementation 'net.idik:slimadapter:2.1.2' implementation 'com.google.android:flexbox:2.0.1' @@ -75,18 +75,18 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' - implementation "androidx.work:work-runtime-ktx:2.3.4" + implementation "androidx.work:work-runtime-ktx:2.4.0" // EventBus implementation 'org.greenrobot:eventbus:3.1.1' // Navigation - implementation 'androidx.navigation:navigation-fragment:2.3.0-alpha05' - implementation 'androidx.navigation:navigation-ui-ktx:2.2.2' + implementation 'androidx.navigation:navigation-fragment:2.3.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.0' // Other implementation 'androidx.multidex:multidex:2.0.1' - implementation 'joda-time:joda-time:2.9.9' + implementation 'joda-time:joda-time:2.10.3' implementation 'me.everything:providers-android:1.0.1' implementation 'com.github.warkiz.widget:indicatorseekbar:2.1.2' @@ -96,34 +96,30 @@ dependencies { // Fitness implementation 'com.google.android.gms:play-services-fitness:18.0.0' - implementation 'com.google.android.gms:play-services-auth:18.0.0' + implementation 'com.google.android.gms:play-services-auth:18.1.0' //Weather implementation 'com.github.KwabenBerko:OpenWeatherMap-Android-Library:2.0.2' - implementation 'com.google.android.gms:play-services-location:17.0.0' + implementation 'com.google.android.gms:play-services-location:17.1.0' // Billing - implementation 'com.android.billingclient:billing:2.2.0' - implementation 'com.android.billingclient:billing-ktx:2.2.0' + implementation 'com.android.billingclient:billing:3.0.1' + implementation 'com.android.billingclient:billing-ktx:3.0.1' // KTX - implementation "androidx.core:core-ktx:1.2.0" + implementation "androidx.core:core-ktx:1.3.2" implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0" implementation "androidx.palette:palette-ktx:1.0.0" - implementation 'androidx.core:core-ktx:1.2.0' + implementation 'androidx.core:core-ktx:1.3.2' // Add the Firebase SDK for Crashlytics. - implementation 'com.google.firebase:firebase-crashlytics:17.0.0' + implementation 'com.google.firebase:firebase-crashlytics:17.2.2' // Preferences - implementation 'com.chibatching.kotpref:kotpref:2.10.0' + implementation 'com.chibatching.kotpref:kotpref:2.11.0' implementation 'com.chibatching.kotpref:livedata-support:2.10.0' implementation 'androidx.preference:preference-ktx:1.1.1' // Permissions implementation 'com.karumi:dexter:6.1.0' - - // Billing - implementation 'com.android.billingclient:billing:2.2.0' - implementation 'com.android.billingclient:billing-ktx:2.2.0' } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt index 5d2b725..1177a22 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt @@ -11,6 +11,7 @@ import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget import io.realm.Realm import io.realm.RealmResults import java.util.* +import kotlin.Comparator import kotlin.collections.ArrayList class EventRepository(val context: Context) { @@ -68,7 +69,7 @@ class EventRepository(val context: Context) { val events = getEvents() if (events.isNotEmpty()) { val newNextEvent = events.first() - Preferences.nextEventId = newNextEvent!!.eventID + Preferences.nextEventId = newNextEvent.eventID newNextEvent } else { resetNextEventData() @@ -96,9 +97,9 @@ class EventRepository(val context: Context) { if (eventList.isNotEmpty()) { val index = eventList.indexOfFirst { it.eventID == Preferences.nextEventId } if (index > -1 && index < eventList.size - 1) { - Preferences.nextEventId = eventList[index + 1]!!.eventID + Preferences.nextEventId = eventList[index + 1].eventID } else { - Preferences.nextEventId = eventList.first()!!.eventID + Preferences.nextEventId = eventList.first().eventID } } else { resetNextEventData() @@ -112,9 +113,9 @@ class EventRepository(val context: Context) { if (eventList.isNotEmpty()) { val index = eventList.indexOfFirst { it.eventID == Preferences.nextEventId } if (index > 0) { - Preferences.nextEventId = eventList[index - 1]!!.eventID + Preferences.nextEventId = eventList[index - 1].eventID } else { - Preferences.nextEventId = eventList.last()!!.eventID + Preferences.nextEventId = eventList.last().eventID } } else { resetNextEventData() diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt index 4812ce2..3ba2239 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt @@ -104,13 +104,12 @@ object BitmapHelper { } fun drawableToBitmap(drawable: Drawable): Bitmap? { - var bitmap: Bitmap? = null if (drawable is BitmapDrawable) { if (drawable.bitmap != null) { return drawable.bitmap } } - bitmap = if (drawable.intrinsicWidth <= 0 || drawable.intrinsicHeight <= 0) { + val bitmap: Bitmap = if (drawable.intrinsicWidth <= 0 || drawable.intrinsicHeight <= 0) { Bitmap.createBitmap( 1, 1, diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt index dbe9fd5..d7a463d 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/services/UpdateCalendarJob.kt @@ -3,6 +3,7 @@ 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 @@ -92,17 +93,28 @@ class UpdateCalendarJob : JobIntentService() { } } - if (eventList.isEmpty()) { + val filteredEventList = eventList + .filter { (Preferences.showDeclinedEvents || it.selfAttendeeStatus != CalendarContract.Attendees.ATTENDEE_STATUS_DECLINED) } + .filter { (Preferences.calendarAllDay || !it.allDay) } + + if (filteredEventList.isEmpty()) { eventRepository.resetNextEventData() eventRepository.clearEvents() } else { eventList.sortWith(Comparator { event: Event, event1: Event -> - if (event.allDay && event1.allDay) { - event.startDate.compareTo(event1.startDate) - } else if (event.allDay) { - 1 - } else if (event1.allDay) { - -1 + val date = Calendar.getInstance().apply { timeInMillis = event.startDate } + val date1 = Calendar.getInstance().apply { timeInMillis = event1.startDate } + + if (date.get(Calendar.DAY_OF_YEAR) == date1.get(Calendar.DAY_OF_YEAR) && date.get(Calendar.YEAR) == date1.get(Calendar.YEAR)) { + if (event.allDay && event1.allDay) { + event1.startDate.compareTo(event.startDate) + } else if (event.allDay) { + -1 + } else if (event1.allDay) { + 1 + } else { + event1.startDate.compareTo(event.startDate) + } } else { event1.startDate.compareTo(event.startDate) } @@ -111,9 +123,7 @@ class UpdateCalendarJob : JobIntentService() { eventRepository.saveEvents( eventList ) - eventRepository.saveNextEventData( - eventList[0] - ) + eventRepository.saveNextEventData(filteredEventList.first()) } } catch (ignored: java.lang.Exception) { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/MainFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/MainFragment.kt index 2bb16e7..21fd688 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/MainFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/MainFragment.kt @@ -62,8 +62,8 @@ class MainFragment : Fragment(), SharedPreferences.OnSharedPreferenceChangeList override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - enterTransition = MaterialSharedAxis.create(MaterialSharedAxis.X, true) - reenterTransition = MaterialSharedAxis.create(MaterialSharedAxis.X, false) + enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) + reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) } override fun onCreateView( diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/SettingsFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/SettingsFragment.kt index 31003cf..6f2d723 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/SettingsFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/SettingsFragment.kt @@ -50,8 +50,8 @@ class SettingsFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - enterTransition = MaterialSharedAxis.create(MaterialSharedAxis.X, true) - returnTransition = MaterialSharedAxis.create(MaterialSharedAxis.X, false) + enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) + returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) } override fun onCreateView( diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherTabFragment.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherTabFragment.kt index d019470..d09b370 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherTabFragment.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/fragments/WeatherTabFragment.kt @@ -216,6 +216,9 @@ class WeatherTabFragment : Fragment() { .addItem(getString(R.string.fahrenheit), "F") .addItem(getString(R.string.celsius), "C") .addOnSelectItemListener { value -> + if (value != Preferences.weatherTempUnit) { + WeatherHelper.updateWeather(requireContext()) + } Preferences.weatherTempUnit = value }.show() } diff --git a/build.gradle b/build.gradle index 0dcc9fe..bc5fe2b 100644 --- a/build.gradle +++ b/build.gradle @@ -10,12 +10,12 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' + classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.3' // Add the Crashlytics Gradle plugin. - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1' classpath 'io.realm:realm-gradle-plugin:6.0.2' diff --git a/google-play-badge.png b/google-play-badge.png deleted file mode 100644 index c77b7464b049c7d6666155c61df5f486f241f760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13957 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 X%LPP+756@c3`