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.