From 564962dc9cf8f7e24109d39267a7aa12372d03a5 Mon Sep 17 00:00:00 2001 From: dm1sh Date: Fri, 24 Mar 2023 06:18:16 +0300 Subject: [PATCH] Removed google shit --- .idea/gradle.xml | 2 +- .idea/misc.xml | 2 +- .idea/modules.xml | 3 + app/build.gradle | 21 -- app/src/main/AndroidManifest.xml | 11 - .../anotherwidget/AWApplication.kt | 6 - .../components/GlanceSettingsDialog.kt | 129 ------------ .../anotherwidget/global/Actions.kt | 1 - .../anotherwidget/helpers/AlarmHelper.kt | 2 - .../anotherwidget/helpers/BitmapHelper.kt | 12 -- .../anotherwidget/helpers/WidgetHelper.kt | 9 - .../receivers/ActivityDetectionReceiver.kt | 197 ------------------ .../anotherwidget/services/WeatherWorker.kt | 35 +--- .../activities/settings/SupportDevActivity.kt | 96 --------- .../ui/fragments/SettingsFragment.kt | 10 - .../ui/fragments/tabs/GlanceTabFragment.kt | 66 ------ .../settings/SupportDevViewModel.kt | 69 ------ .../ui/viewmodels/tabs/CustomFontViewModel.kt | 5 +- .../anotherwidget/ui/widgets/AlignedWidget.kt | 2 - .../anotherwidget/ui/widgets/ClockWidget.kt | 1 - .../ui/widgets/StandardWidget.kt | 2 - build.gradle | 4 - privacy-policy.md | 11 - 23 files changed, 17 insertions(+), 679 deletions(-) delete mode 100644 app/src/main/java/com/tommasoberlose/anotherwidget/receivers/ActivityDetectionReceiver.kt delete mode 100644 app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/settings/SupportDevActivity.kt delete mode 100644 app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/settings/SupportDevViewModel.kt diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a0de2a1 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -7,13 +7,13 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index 7dbe2e1..aeb9408 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -61,7 +61,7 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index d4aead2..0952a9f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,9 @@ + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0d8e421..aeb4998 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,16 +1,8 @@ apply plugin: 'com.android.application' -apply plugin: 'com.google.gms.google-services' - -// Apply the Crashlytics Gradle plugin -apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -def apikeyPropertiesFile = rootProject.file("apikey.properties") -def apikeyProperties = new Properties() -apikeyProperties.load(new FileInputStream(apikeyPropertiesFile)) - android { compileSdkVersion 30 @@ -23,7 +15,6 @@ android { versionName "2.3.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - buildConfigField("String", "GOOGLE_API_KEY", apikeyProperties['GOOGLE_API_KEY']) renderscriptSupportModeEnabled true } @@ -103,17 +94,8 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.12.0' kapt 'com.github.bumptech.glide:compiler:4.11.0' - // Fitness - implementation 'com.google.android.gms:play-services-fitness:20.0.0' - implementation 'com.google.android.gms:play-services-auth:19.0.0' - //Weather implementation 'com.github.KwabenBerko:OpenWeatherMap-Android-Library:2.0.2' - implementation 'com.google.android.gms:play-services-location:18.0.0' - - // Billing - implementation 'com.android.billingclient:billing:3.0.3' - implementation 'com.android.billingclient:billing-ktx:3.0.3' // KTX implementation "androidx.core:core-ktx:1.5.0" @@ -131,9 +113,6 @@ dependencies { //Coroutines implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1' - // Add the Firebase SDK for Crashlytics. - implementation 'com.google.firebase:firebase-crashlytics:18.0.0' - // Preferences implementation 'com.chibatching.kotpref:kotpref:2.13.1' implementation 'com.chibatching.kotpref:livedata-support:2.13.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b6284b3..bbe79b1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,7 +37,6 @@ - @@ -126,16 +125,6 @@ - - - - - - - - diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/AWApplication.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/AWApplication.kt index 4d3c3f0..053b0cf 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/AWApplication.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/AWApplication.kt @@ -1,20 +1,14 @@ package com.tommasoberlose.anotherwidget -import android.Manifest import android.app.Application -import android.util.Log import androidx.appcompat.app.AppCompatDelegate import com.chibatching.kotpref.Kotpref -import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tommasoberlose.anotherwidget.global.Preferences class AWApplication : Application() { override fun onCreate() { super.onCreate() - // Firebase crashlitycs - FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG) - // Preferences Kotpref.init(this) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceSettingsDialog.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceSettingsDialog.kt index 38641cc..e754eb4 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceSettingsDialog.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/components/GlanceSettingsDialog.kt @@ -6,18 +6,9 @@ import android.app.AlarmManager import android.content.Context import android.content.Intent import android.content.pm.PackageManager -import android.os.Build import android.view.LayoutInflater import androidx.core.view.isVisible -import com.google.android.gms.auth.api.signin.GoogleSignIn -import com.google.android.gms.auth.api.signin.GoogleSignInAccount -import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.android.material.bottomsheet.BottomSheetDialog -import com.karumi.dexter.Dexter -import com.karumi.dexter.MultiplePermissionsReport -import com.karumi.dexter.PermissionToken -import com.karumi.dexter.listener.PermissionRequest -import com.karumi.dexter.listener.multi.MultiplePermissionsListener import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.databinding.GlanceProviderSettingsLayoutBinding import com.tommasoberlose.anotherwidget.global.Constants @@ -26,7 +17,6 @@ import com.tommasoberlose.anotherwidget.helpers.ActiveNotificationsHelper import com.tommasoberlose.anotherwidget.helpers.AlarmHelper import com.tommasoberlose.anotherwidget.helpers.GreetingsHelper import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper -import com.tommasoberlose.anotherwidget.receivers.ActivityDetectionReceiver import com.tommasoberlose.anotherwidget.ui.activities.tabs.AppNotificationsFilterActivity import com.tommasoberlose.anotherwidget.ui.activities.tabs.MediaInfoFormatActivity import com.tommasoberlose.anotherwidget.ui.activities.tabs.MusicPlayersFilterActivity @@ -90,14 +80,6 @@ class GlanceSettingsDialog(val context: Activity, val provider: Constants.Glance checkNextAlarm() } - /* GOOGLE STEPS */ - binding.actionToggleGoogleFit.isVisible = provider == Constants.GlanceProviderId.GOOGLE_FIT_STEPS - if (provider == Constants.GlanceProviderId.GOOGLE_FIT_STEPS) { - binding.warningContainer.isVisible = false - checkFitnessPermission() - checkGoogleFitConnection() - } - /* BATTERY INFO */ if (provider == Constants.GlanceProviderId.BATTERY_LEVEL_LOW) { binding.warningContainer.isVisible = false @@ -193,32 +175,6 @@ class GlanceSettingsDialog(val context: Activity, val provider: Constants.Glance Preferences.showGreetings = isChecked GreetingsHelper.toggleGreetings(context) } - Constants.GlanceProviderId.GOOGLE_FIT_STEPS -> { - if (isChecked) { - val account: GoogleSignInAccount? = - GoogleSignIn.getLastSignedInAccount(context) - if (!GoogleSignIn.hasPermissions(account, - ActivityDetectionReceiver.FITNESS_OPTIONS - ) - ) { - val mGoogleSignInClient = - GoogleSignIn.getClient(context, GoogleSignInOptions.Builder( - GoogleSignInOptions.DEFAULT_SIGN_IN).addExtension( - ActivityDetectionReceiver.FITNESS_OPTIONS - ).build()) - context.startActivityForResult(mGoogleSignInClient.signInIntent, - 2) - } else { - Preferences.showDailySteps = true - } - } else { - Preferences.showDailySteps = false - } - - binding.warningContainer.isVisible = false - checkFitnessPermission() - checkGoogleFitConnection() - } Constants.GlanceProviderId.EVENTS -> { Preferences.showEventsAsGlanceProvider = isChecked if (isChecked) { @@ -333,89 +289,4 @@ class GlanceSettingsDialog(val context: Activity, val provider: Constants.Glance } statusCallback?.invoke() } - - private fun checkFitnessPermission() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || context.checkGrantedPermission( - Manifest.permission.ACTIVITY_RECOGNITION) - ) { - if (Preferences.showDailySteps) { - ActivityDetectionReceiver.registerFence(context) - } else { - ActivityDetectionReceiver.unregisterFence(context) - } - } else if (Preferences.showDailySteps) { - ActivityDetectionReceiver.unregisterFence(context) - binding.warningContainer.isVisible = true - binding.warningTitle.text = context.getString(R.string.settings_request_fitness_access) - binding.warningContainer.setOnClickListener { - requireFitnessPermission() - } - } else { - ActivityDetectionReceiver.unregisterFence(context) - } - statusCallback?.invoke() - } - - private fun checkGoogleFitConnection() { - val account: GoogleSignInAccount? = GoogleSignIn.getLastSignedInAccount(context) - if (!GoogleSignIn.hasPermissions(account, - ActivityDetectionReceiver.FITNESS_OPTIONS - )) { - binding.warningContainer.isVisible = true - binding.warningTitle.text = context.getString(R.string.settings_request_fitness_access) - binding.warningContainer.setOnClickListener { - GoogleSignIn.requestPermissions( - context, - 1, - account, - ActivityDetectionReceiver.FITNESS_OPTIONS) - } - binding.actionConnectToGoogleFit.isVisible = true - binding.actionDisconnectToGoogleFit.isVisible = false - binding.actionConnectToGoogleFit.setOnClickListener { - GoogleSignIn.requestPermissions( - context, - 1, - account, - ActivityDetectionReceiver.FITNESS_OPTIONS) - } - binding.actionDisconnectToGoogleFit.setOnClickListener(null) - binding.googleFitStatusLabel.text = context.getString(R.string.google_fit_account_not_connected) - } else { - binding.actionConnectToGoogleFit.isVisible = false - binding.actionDisconnectToGoogleFit.isVisible = true - binding.actionConnectToGoogleFit.setOnClickListener(null) - binding.actionDisconnectToGoogleFit.setOnClickListener { - GoogleSignIn.getClient(context, GoogleSignInOptions.Builder( - GoogleSignInOptions.DEFAULT_SIGN_IN).addExtension( - ActivityDetectionReceiver.FITNESS_OPTIONS - ).build()).signOut().addOnCompleteListener { - show() - } - } - binding.googleFitStatusLabel.text = context.getString(R.string.google_fit_account_connected) - } - } - - private fun requireFitnessPermission() { - Dexter.withContext(context) - .withPermissions( - "com.google.android.gms.permission.ACTIVITY_RECOGNITION", - "android.gms.permission.ACTIVITY_RECOGNITION", - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) Manifest.permission.ACTIVITY_RECOGNITION else "com.google.android.gms.permission.ACTIVITY_RECOGNITION" - ).withListener(object: MultiplePermissionsListener { - override fun onPermissionsChecked(report: MultiplePermissionsReport?) { - checkFitnessPermission() - } - override fun onPermissionRationaleShouldBeShown( - permissions: MutableList?, - token: PermissionToken? - ) { - // Remember to invoke this method when the custom rationale is closed - // or just by default if you don't want to use any custom rationale. - token?.continuePermissionRequest() - } - }) - .check() - } } \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Actions.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Actions.kt index 3fd88ec..d933e6d 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/global/Actions.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/global/Actions.kt @@ -10,7 +10,6 @@ object Actions { const val ACTION_OPEN_WEATHER_INTENT = "com.tommasoberlose.anotherwidget.action.OPEN_WEATHER_INTENT" const val ACTION_GO_TO_NEXT_EVENT = "com.tommasoberlose.anotherwidget.action.GO_TO_NEXT_EVENT" const val ACTION_GO_TO_PREVIOUS_EVENT = "com.tommasoberlose.anotherwidget.action.GO_TO_PREVIOUS_EVENT" - const val ACTION_REPORT_CRASH = "com.tommasoberlose.anotherwidget.action.REPORT_CRASH" const val ACTION_CLEAR_NOTIFICATION = "com.tommasoberlose.anotherwidget.action.CLEAR_NOTIFICATION" const val ACTION_UPDATE_GREETINGS = "com.tommasoberlose.anotherwidget.action.UPDATE_GREETINGS" diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/AlarmHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/AlarmHelper.kt index 94a9c53..b567bf3 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/AlarmHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/AlarmHelper.kt @@ -5,9 +5,7 @@ import android.app.PendingIntent import android.content.Context import android.content.Intent import android.text.format.DateFormat -import android.util.Log import com.tommasoberlose.anotherwidget.global.Actions -import com.tommasoberlose.anotherwidget.receivers.ActivityDetectionReceiver import com.tommasoberlose.anotherwidget.receivers.UpdatesReceiver import com.tommasoberlose.anotherwidget.utils.setExactIfCanSchedule import java.text.SimpleDateFormat 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 5b83982..cbc484f 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/BitmapHelper.kt @@ -4,11 +4,9 @@ import android.content.Context import android.graphics.* import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable -import android.util.Log import android.view.View import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat -import com.google.firebase.crashlytics.FirebaseCrashlytics object BitmapHelper { @@ -39,15 +37,6 @@ object BitmapHelper { 1 } - if (draw) { - FirebaseCrashlytics.getInstance().setCustomKey("WIDTH SPEC", measuredWidth) - FirebaseCrashlytics.getInstance().setCustomKey("HEIGHT SPEC", measuredHeight) - FirebaseCrashlytics.getInstance().setCustomKey("VIEW measuredWidth", view.measuredWidth) - FirebaseCrashlytics.getInstance().setCustomKey("VIEW measuredHeight", view.measuredHeight) - FirebaseCrashlytics.getInstance().setCustomKey("WIDGET final width", widgetWidth) - FirebaseCrashlytics.getInstance().setCustomKey("WIDGET final height", widgetHeight) - } - return try { val btm = Bitmap.createBitmap( widgetWidth, @@ -64,7 +53,6 @@ object BitmapHelper { } btm } catch (ex: Exception) { - FirebaseCrashlytics.getInstance().recordException(ex) Bitmap.createBitmap(5, 5, Bitmap.Config.ALPHA_8) } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WidgetHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WidgetHelper.kt index 4548ed2..0d1b0f7 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WidgetHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/WidgetHelper.kt @@ -6,17 +6,10 @@ import android.content.res.Configuration.ORIENTATION_PORTRAIT import android.graphics.Typeface import android.os.Handler import android.os.HandlerThread -import android.os.Looper -import android.util.Log import androidx.core.provider.FontRequest import androidx.core.provider.FontsContractCompat -import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tommasoberlose.anotherwidget.R -import com.tommasoberlose.anotherwidget.db.EventRepository import com.tommasoberlose.anotherwidget.global.Preferences -import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget -import com.tommasoberlose.anotherwidget.utils.toPixel -import kotlin.math.min object WidgetHelper { class WidgetSizeProvider( @@ -36,8 +29,6 @@ object WidgetHelper { ) val widthInPx = context.dip(width) val heightInPx = context.dip(height) - FirebaseCrashlytics.getInstance().setCustomKey("widthInPx", widthInPx) - FirebaseCrashlytics.getInstance().setCustomKey("heightInPx", heightInPx) return widthInPx to heightInPx } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/ActivityDetectionReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/ActivityDetectionReceiver.kt deleted file mode 100644 index 23fc02c..0000000 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/ActivityDetectionReceiver.kt +++ /dev/null @@ -1,197 +0,0 @@ -package com.tommasoberlose.anotherwidget.receivers - -import android.Manifest -import android.app.AlarmManager -import android.app.PendingIntent -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.os.Build -import android.util.Log -import com.chibatching.kotpref.Kotpref -import com.chibatching.kotpref.blockingBulk -import com.google.android.gms.auth.api.signin.GoogleSignIn -import com.google.android.gms.auth.api.signin.GoogleSignInAccount -import com.google.android.gms.fitness.Fitness -import com.google.android.gms.fitness.FitnessOptions -import com.google.android.gms.fitness.data.DataType -import com.google.android.gms.fitness.data.Field.FIELD_STEPS -import com.google.android.gms.fitness.request.DataReadRequest -import com.google.android.gms.location.* -import com.tommasoberlose.anotherwidget.global.Preferences -import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget -import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission -import com.tommasoberlose.anotherwidget.utils.setExactIfCanSchedule -import java.util.* -import java.util.concurrent.TimeUnit - - -class ActivityDetectionReceiver : BroadcastReceiver() { - - override fun onReceive(context: Context, intent: Intent) { - if (ActivityTransitionResult.hasResult(intent)) { - val result = ActivityTransitionResult.extractResult(intent)!! - val lastEvent = result.transitionEvents.last() - - if ((lastEvent.activityType == DetectedActivity.WALKING || lastEvent.activityType == DetectedActivity.RUNNING) && lastEvent.transitionType == ActivityTransition.ACTIVITY_TRANSITION_EXIT) { - requestDailySteps(context) - } - } else { - if ((intent.action == Intent.ACTION_BOOT_COMPLETED || intent.action == Intent.ACTION_MY_PACKAGE_REPLACED) && Preferences.showDailySteps && (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || context.checkGrantedPermission(Manifest.permission.ACTIVITY_RECOGNITION))) { - resetDailySteps(context) - registerFence(context) - } else { - resetDailySteps(context) - } - } - } - - companion object { - val FITNESS_OPTIONS: FitnessOptions = FitnessOptions.builder() - .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ) - .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ) - .build() - - fun registerFence(context: Context) { - Kotpref.init(context) - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || context.checkGrantedPermission( - Manifest.permission.ACTIVITY_RECOGNITION)) { - val transitions = mutableListOf() - - transitions += - ActivityTransition.Builder() - .setActivityType(DetectedActivity.WALKING) - .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) - .build() - - transitions += - ActivityTransition.Builder() - .setActivityType(DetectedActivity.RUNNING) - .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) - .build() - - val request = ActivityTransitionRequest(transitions) - - // myPendingIntent is the instance of PendingIntent where the app receives callbacks. - val task = ActivityRecognition.getClient(context) - .requestActivityTransitionUpdates( - request, - PendingIntent.getBroadcast( - context, - 2, - Intent(context, ActivityDetectionReceiver::class.java), - PendingIntent.FLAG_IMMUTABLE - ) - ) - - task.addOnFailureListener { e: Exception -> - e.printStackTrace() - Preferences.showDailySteps = false - } - - } - } - - fun unregisterFence(context: Context) { - val task = ActivityRecognition.getClient(context) - .removeActivityTransitionUpdates( - PendingIntent.getBroadcast( - context, - 2, - Intent(context, ActivityDetectionReceiver::class.java), - PendingIntent.FLAG_IMMUTABLE - ) - ) - - task.addOnCompleteListener { - if (it.isSuccessful) { - PendingIntent.getBroadcast( - context, - 2, - Intent(context, ActivityDetectionReceiver::class.java), - PendingIntent.FLAG_IMMUTABLE - ).cancel() - } - } - - resetDailySteps(context) - clearTimeout(context) - } - - fun requestDailySteps(context: Context) { - Kotpref.init(context) - - val account: GoogleSignInAccount? = GoogleSignIn.getLastSignedInAccount(context) - if (account != null && GoogleSignIn.hasPermissions(account, FITNESS_OPTIONS)) { - - val cal: Calendar = Calendar.getInstance() - cal.set(Calendar.HOUR_OF_DAY, 0) - cal.set(Calendar.MINUTE, 0) - cal.set(Calendar.SECOND, 0) - cal.set(Calendar.MILLISECOND, 0) - val startTime: Long = cal.timeInMillis - - cal.add(Calendar.DAY_OF_YEAR, 1) - val endTime: Long = cal.timeInMillis - - val readRequest = DataReadRequest.Builder() - .aggregate(DataType.TYPE_STEP_COUNT_DELTA) - .aggregate(DataType.AGGREGATE_STEP_COUNT_DELTA) - .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) - .bucketByTime(1, TimeUnit.DAYS) - .build() - - Fitness.getHistoryClient(context, account) - .readData(readRequest) - .addOnSuccessListener { response -> - Preferences.googleFitSteps = response.buckets.sumBy { - try { - it.getDataSet(DataType.AGGREGATE_STEP_COUNT_DELTA)?.dataPoints?.get( - 0 - )?.getValue(FIELD_STEPS)?.asInt() ?: 0 - } catch (ex: Exception) { - 0 - } - }.toLong() - MainWidget.updateWidget(context) - setTimeout(context) - } - } - } - - private fun resetDailySteps(context: Context) { - Kotpref.init(context) - Preferences.blockingBulk { - remove(Preferences::googleFitSteps) - } - } - - private fun setTimeout(context: Context) { - with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) { - setExactIfCanSchedule( - AlarmManager.RTC, - Calendar.getInstance().timeInMillis + 5 * 60 * 1000, - PendingIntent.getBroadcast( - context, - 5, - Intent(context, ActivityDetectionReceiver::class.java), - PendingIntent.FLAG_IMMUTABLE - ) - ) - } - } - - private fun clearTimeout(context: Context) { - with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) { - cancel( - PendingIntent.getBroadcast( - context, - 5, - Intent(context, ActivityDetectionReceiver::class.java), - PendingIntent.FLAG_IMMUTABLE - ) - ) - } - } - } -} diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/services/WeatherWorker.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/services/WeatherWorker.kt index 91761a1..f32f21b 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/services/WeatherWorker.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/services/WeatherWorker.kt @@ -10,16 +10,11 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.Worker import androidx.work.WorkerParameters -import com.google.android.gms.common.ConnectionResult -import com.google.android.gms.common.GoogleApiAvailability -import com.google.android.gms.location.LocationServices import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.network.WeatherNetworkApi import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission import java.util.concurrent.TimeUnit -import kotlin.coroutines.resume import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext class WeatherWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) { @@ -29,27 +24,17 @@ class WeatherWorker(context: Context, params: WorkerParameters) : CoroutineWorke if (Preferences.customLocationAdd == "" && context.checkGrantedPermission(Manifest.permission.ACCESS_COARSE_LOCATION) ) { - if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) - == ConnectionResult.SUCCESS - ) { - suspendCancellableCoroutine { continuation -> - LocationServices.getFusedLocationProviderClient(context).lastLocation.addOnCompleteListener { - continuation.resume(if (it.isSuccessful) it.result else null) - } + val lm = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager + var location: Location? = null + for (provider in lm.getProviders(true)) { + lm.getLastKnownLocation(provider)?.let { + if (location == null || + it.time - location!!.time > 2 * 60 * 1000 || + (it.time - location!!.time > -2 * 60 * 1000 && it.accuracy < location!!.accuracy)) + location = it } - } else { - val lm = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager - var location: Location? = null - for (provider in lm.getProviders(true)) { - lm.getLastKnownLocation(provider)?.let { - if (location == null || - it.time - location!!.time > 2 * 60 * 1000 || - (it.time - location!!.time > -2 * 60 * 1000 && it.accuracy < location!!.accuracy)) - location = it - } - } - location - }?.let { location -> + } + location?.let { location -> Preferences.customLocationLat = location.latitude.toString() Preferences.customLocationLon = location.longitude.toString() } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/settings/SupportDevActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/settings/SupportDevActivity.kt deleted file mode 100644 index 06d0319..0000000 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activities/settings/SupportDevActivity.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.tommasoberlose.anotherwidget.ui.activities.settings - -import android.os.Bundle -import android.widget.TextView -import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.isVisible -import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.LinearLayoutManager -import com.android.billingclient.api.* -import com.android.billingclient.api.BillingClient.BillingResponseCode.OK -import com.android.billingclient.api.BillingClient.BillingResponseCode.USER_CANCELED -import com.tommasoberlose.anotherwidget.R -import com.tommasoberlose.anotherwidget.databinding.ActivitySupportDevBinding -import com.tommasoberlose.anotherwidget.ui.viewmodels.settings.SupportDevViewModel -import com.tommasoberlose.anotherwidget.utils.toast -import net.idik.lib.slimadapter.SlimAdapter - -class SupportDevActivity : AppCompatActivity(), PurchasesUpdatedListener { - - private lateinit var viewModel: SupportDevViewModel - private lateinit var adapter: SlimAdapter - private lateinit var binding: ActivitySupportDevBinding - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - viewModel = ViewModelProvider(this).get(SupportDevViewModel::class.java) - viewModel.billingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build() - binding = ActivitySupportDevBinding.inflate(layoutInflater) - - - binding.listView.setHasFixedSize(true) - val mLayoutManager = LinearLayoutManager(this) - binding.listView.layoutManager = mLayoutManager - - adapter = SlimAdapter.create() - adapter - .register(R.layout.inapp_product_layout) { item, injector -> - item.sku - injector - .with(R.id.product_title) { - it.text = when (item.sku) { - "donation_coffee" -> getString(R.string.donation_coffee) - "donation_donuts" -> getString(R.string.donation_donuts) - "donation_breakfast" -> getString(R.string.donation_breakfast) - "donation_lunch" -> getString(R.string.donation_lunch) - else -> "" - } - } - .text(R.id.product_price, item.price) - .clicked(R.id.item) { - viewModel.purchase(this, item) - } - } - .attachTo(binding.listView) - - viewModel.openConnection() - subscribeUi(viewModel) - - binding.actionBack.setOnClickListener { - onBackPressed() - } - - setContentView(binding.root) - } - - private fun subscribeUi(viewModel: SupportDevViewModel) { - viewModel.products.observe(this, Observer { - if (it.isNotEmpty()) { - binding.loader.isVisible = false - } - adapter.updateData(it.sortedWith(compareBy(SkuDetails::getPriceAmountMicros))) - }) - } - - override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List?) { - if (billingResult.responseCode == OK && purchases != null) { - for (purchase in purchases) { - if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) { - viewModel.handlePurchase(purchase) - toast(getString(R.string.thanks)) - } - } - } else if (billingResult.responseCode == USER_CANCELED) { - // DO nothing - } else { - toast(getString(R.string.error)) - } - } - - public override fun onDestroy() { - viewModel.closeConnection() - super.onDestroy() - } -} 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 23637b1..a0a68d6 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 @@ -8,13 +8,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatDelegate -import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.Navigation -import androidx.transition.TransitionInflater import com.google.android.material.transition.MaterialSharedAxis import com.karumi.dexter.Dexter import com.karumi.dexter.MultiplePermissionsReport @@ -32,13 +29,10 @@ import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper import com.tommasoberlose.anotherwidget.helpers.WeatherHelper import com.tommasoberlose.anotherwidget.ui.activities.settings.IntegrationsActivity import com.tommasoberlose.anotherwidget.ui.activities.MainActivity -import com.tommasoberlose.anotherwidget.ui.activities.settings.SupportDevActivity import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission -import com.tommasoberlose.anotherwidget.utils.ignoreExceptions import com.tommasoberlose.anotherwidget.utils.openURI import com.tommasoberlose.anotherwidget.utils.setOnSingleClickListener -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -197,10 +191,6 @@ class SettingsFragment : Fragment() { requireActivity().openURI("https://github.com/tommasoberlose/another-widget/blob/master/privacy-policy.md") } - binding.actionHelpDev.setOnClickListener { - startActivity(Intent(requireContext(), SupportDevActivity::class.java)) - } - binding.actionRefreshWidget.setOnClickListener { binding.actionRefreshIcon .animate() 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 fb26499..795b939 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 @@ -8,26 +8,20 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.graphics.Canvas -import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.animation.AnimationUtils -import android.view.animation.LayoutAnimationController import android.widget.ImageView import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat -import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.google.android.gms.auth.api.signin.GoogleSignIn -import com.google.android.gms.auth.api.signin.GoogleSignInAccount -import com.google.android.gms.common.api.ApiException import com.google.android.material.card.MaterialCardView import com.google.android.material.transition.MaterialSharedAxis import com.tommasoberlose.anotherwidget.R @@ -41,8 +35,6 @@ import com.tommasoberlose.anotherwidget.helpers.AlarmHelper import com.tommasoberlose.anotherwidget.helpers.GlanceProviderHelper import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper import com.tommasoberlose.anotherwidget.models.GlanceProvider -import com.tommasoberlose.anotherwidget.receivers.ActivityDetectionReceiver -import com.tommasoberlose.anotherwidget.receivers.ActivityDetectionReceiver.Companion.FITNESS_OPTIONS import com.tommasoberlose.anotherwidget.ui.activities.MainActivity import com.tommasoberlose.anotherwidget.ui.viewmodels.MainViewModel import com.tommasoberlose.anotherwidget.utils.* @@ -238,40 +230,6 @@ class GlanceTabFragment : Fragment() { injector.visibility(R.id.info_icon, View.VISIBLE) isVisible = Preferences.customNotes != "" } - Constants.GlanceProviderId.GOOGLE_FIT_STEPS -> { - val account: GoogleSignInAccount? = GoogleSignIn.getLastSignedInAccount( - context - ) - if (GoogleSignIn.hasPermissions( - account, - FITNESS_OPTIONS - ) && (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || requireActivity().checkGrantedPermission( - Manifest.permission.ACTIVITY_RECOGNITION - )) - ) { - injector.text( - R.id.label, - if (Preferences.showDailySteps) getString(R.string.settings_visible) else getString( - R.string.settings_not_visible - ) - ) - injector.visibility(R.id.error_icon, View.GONE) - injector.visibility(R.id.info_icon, View.VISIBLE) - isVisible = Preferences.showDailySteps - } else if (Preferences.showDailySteps) { - ActivityDetectionReceiver.unregisterFence(requireContext()) - injector.visibility(R.id.error_icon, View.VISIBLE) - injector.visibility(R.id.info_icon, View.GONE) - injector.text(R.id.label, getString(R.string.settings_not_visible)) - isVisible = false - } else { - ActivityDetectionReceiver.unregisterFence(requireContext()) - injector.text(R.id.label, getString(R.string.settings_not_visible)) - injector.visibility(R.id.error_icon, View.GONE) - injector.visibility(R.id.info_icon, View.VISIBLE) - isVisible = false - } - } Constants.GlanceProviderId.EVENTS -> { isVisible = Preferences.showEventsAsGlanceProvider @@ -491,30 +449,6 @@ class GlanceTabFragment : Fragment() { Preferences.showDailySteps = false } - if (dialog != null) { - dialog?.show() - } - } - 2 -> { - try { - val account: GoogleSignInAccount? = GoogleSignIn.getSignedInAccountFromIntent( - data - ).getResult(ApiException::class.java) - if (!GoogleSignIn.hasPermissions(account, FITNESS_OPTIONS)) { - GoogleSignIn.requestPermissions( - requireActivity(), - 1, - account, - FITNESS_OPTIONS - ) - } else { - adapter.notifyItemRangeChanged(0, adapter.data.size) - } - } catch (e: ApiException) { - e.printStackTrace() - Preferences.showDailySteps = false - } - if (dialog != null) { dialog?.show() } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/settings/SupportDevViewModel.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/settings/SupportDevViewModel.kt deleted file mode 100644 index dc2b492..0000000 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/settings/SupportDevViewModel.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.tommasoberlose.anotherwidget.ui.viewmodels.settings - -import android.app.Activity -import android.content.Context -import android.util.Log -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.android.billingclient.api.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext - -class SupportDevViewModel : ViewModel() { - - lateinit var billingClient: BillingClient - val products: MutableLiveData> = MutableLiveData(emptyList()) - - fun openConnection() { - - billingClient.startConnection(object : BillingClientStateListener { - override fun onBillingSetupFinished(billingResult: BillingResult) { - if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { - val params = SkuDetailsParams.newBuilder() - params.setSkusList(listOf("donation_coffee", "donation_donuts", "donation_breakfast", "donation_lunch", "donation_dinner")).setType(BillingClient.SkuType.INAPP) - viewModelScope.launch(Dispatchers.IO) { - val skuDetailsList = billingClient.querySkuDetails(params.build()).skuDetailsList - withContext(Dispatchers.Main) { - products.value = skuDetailsList - } - } - } - } - override fun onBillingServiceDisconnected() { - // Try to restart the connection on the next request to - // Google Play by calling the startConnection() method. - } - }) - } - - fun purchase(activity: Activity, product: SkuDetails) { - val flowParams = BillingFlowParams.newBuilder() - .setSkuDetails(product) - .build() - billingClient.launchBillingFlow(activity, flowParams) - } - - fun handlePurchase(purchase: Purchase) { - if (!purchase.isAcknowledged) { - viewModelScope.launch(Dispatchers.IO) { - val token = purchase.purchaseToken - val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() - .setPurchaseToken(token) - billingClient.acknowledgePurchase(acknowledgePurchaseParams.build()) - - val consumeParams = - ConsumeParams.newBuilder() - .setPurchaseToken(token) - .build() - billingClient.consumePurchase(consumeParams) - } - } - } - - fun closeConnection() { - billingClient.endConnection() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/tabs/CustomFontViewModel.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/tabs/CustomFontViewModel.kt index 30a7449..cc8caf7 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/tabs/CustomFontViewModel.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/viewmodels/tabs/CustomFontViewModel.kt @@ -9,10 +9,9 @@ import androidx.lifecycle.viewModelScope import com.koolio.library.DownloadableFontList import com.koolio.library.Font import com.koolio.library.FontList -import com.tommasoberlose.anotherwidget.BuildConfig +//import com.tommasoberlose.anotherwidget.BuildConfig import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext class CustomFontViewModel(application: Application) : AndroidViewModel(application) { @@ -34,7 +33,7 @@ class CustomFontViewModel(application: Application) : AndroidViewModel(applicati } } - DownloadableFontList.requestDownloadableFontList(fontListCallback, BuildConfig.GOOGLE_API_KEY) +// DownloadableFontList.requestDownloadableFontList(fontListCallback, BuildConfig.GOOGLE_API_KEY) } } } \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/AlignedWidget.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/AlignedWidget.kt index f19ccdb..3c7c45e 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/AlignedWidget.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/AlignedWidget.kt @@ -6,12 +6,10 @@ import android.content.Context import android.content.Intent import android.graphics.Color import android.graphics.Typeface -import android.text.format.DateUtils import android.util.TypedValue import android.view.Gravity import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.* import androidx.core.content.ContextCompat import androidx.core.view.isVisible diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/ClockWidget.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/ClockWidget.kt index ad0d975..f92f73f 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/ClockWidget.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/ClockWidget.kt @@ -11,7 +11,6 @@ import com.tommasoberlose.anotherwidget.global.Preferences import com.tommasoberlose.anotherwidget.helpers.ColorHelper import com.tommasoberlose.anotherwidget.helpers.IntentHelper import com.tommasoberlose.anotherwidget.utils.isDarkTheme -import com.tommasoberlose.anotherwidget.utils.toPixel class ClockWidget(val context: Context) { fun updateClockView(views: RemoteViews, widgetID: Int): RemoteViews { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/StandardWidget.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/StandardWidget.kt index 3130d9f..ae637fe 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/StandardWidget.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widgets/StandardWidget.kt @@ -6,12 +6,10 @@ import android.content.Context import android.content.Intent import android.graphics.Color import android.graphics.Typeface -import android.text.format.DateUtils import android.util.TypedValue import android.view.Gravity import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.ImageView import android.widget.RemoteViews import android.widget.TextView diff --git a/build.gradle b/build.gradle index 91ae85f..31d818c 100644 --- a/build.gradle +++ b/build.gradle @@ -11,10 +11,6 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.8' - - // Add the Crashlytics Gradle plugin. - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.6.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/privacy-policy.md b/privacy-policy.md index 9ca59d6..7c9ebc0 100644 --- a/privacy-policy.md +++ b/privacy-policy.md @@ -8,17 +8,6 @@ If you choose to use my Service, then you agree to the collection and use of inf The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Another Widget unless otherwise defined in this Privacy Policy. -**Information Collection and Use** - -For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information, including but not limited to Location data. The information that I request will be retained on your device and is not collected by me in any way. - -The app does use third party services that may collect information used to identify you. - -Link to privacy policy of third party service providers used by the app - -* [Google Play Services](https://www.google.com/policies/privacy/) -* [Firebase Crashlytics](https://firebase.google.com/support/privacy/) - **Log Data** I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics.