Compare commits

...

5 Commits

Author SHA1 Message Date
ce9f5a6e45 Update google fit integration 2020-05-11 00:00:31 +02:00
8f0f6bc868 Update beta release 2020-05-10 20:42:48 +02:00
34d8fa4b59 update gitignore 2020-05-10 20:32:48 +02:00
9401b89036 Clean project files 2020-05-10 20:31:50 +02:00
842c0d764f Add google fit connection 2020-05-10 20:29:35 +02:00
52 changed files with 285 additions and 619 deletions

3
.gitignore vendored
View File

@ -8,4 +8,5 @@
/captures
.externalNativeBuild
/tasksintegration/build
apikey.properties
apikey.properties
/app/google-services.json

Binary file not shown.

View File

@ -22,8 +22,8 @@ android {
applicationId "com.tommasoberlose.anotherwidget"
minSdkVersion 23
targetSdkVersion 29
versionCode 84
versionName "2.0.7"
versionCode 86
versionName "2.0.8"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@ -1,40 +0,0 @@
{
"project_info": {
"project_number": "791844924473",
"firebase_url": "https://anotherwidget-182008.firebaseio.com",
"project_id": "anotherwidget-182008",
"storage_bucket": "anotherwidget-182008.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:791844924473:android:0ad4f6e3890f1ad320b1e8",
"android_client_info": {
"package_name": "com.tommasoberlose.anotherwidget"
}
},
"oauth_client": [
{
"client_id": "791844924473-73dh46rorjq8vm97dgbn6can2dcpqlf0.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAeJRXstqnzebibxmm3FRM98nbwE_kC8tA"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "791844924473-73dh46rorjq8vm97dgbn6can2dcpqlf0.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

Binary file not shown.

View File

@ -86,44 +86,16 @@
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="com.tommasoberlose.anotherwidget.action.ACTION_WEATHER_UPDATE" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.TIME_SET" />
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
<action android:name="android.intent.action.LOCALE_CHANGED" />
</intent-filter>
</receiver>
<receiver
android:name=".receivers.PlayerReceiver"
android:enabled="true"
android:exported="true"
tools:ignore="ExportedReceiver">
<intent-filter>
<action android:name="com.android.music.metachanged" />
<action android:name="com.android.music.playstatechanged" />
<action android:name="com.android.music.playbackcomplete" />
<action android:name="com.android.music.queuechanged" />
<action android:name="com.htc.music.metachanged" />
<action android:name="fm.last.android.metachanged" />
<action android:name="com.sec.android.app.music.metachanged" />
<action android:name="com.nullsoft.winamp.metachanged" />
<action android:name="com.amazon.mp3.metachanged" />
<action android:name="com.miui.player.metachanged" />
<action android:name="com.real.IMP.metachanged" />
<action android:name="com.sonyericsson.music.metachanged" />
<action android:name="com.rdio.android.metachanged" />
<action android:name="com.samsung.sec.android.MusicPlayer.metachanged" />
<action android:name="com.andrew.apollo.metachanged" />
<action android:name="com.spotify.music.playbackstatechanged"/>
<action android:name="com.spotify.music.metadatachanged"/>
<action android:name="com.spotify.music.queuechanged"/>
</intent-filter>
</receiver>
<receiver
android:name=".receivers.WidgetClickListenerReceiver"
android:enabled="true"
@ -162,11 +134,13 @@
</intent-filter>
</receiver>
<receiver android:name=".receivers.FenceReceiver"
<receiver android:name=".receivers.ActivityDetectionReceiver"
android:exported="false"
android:permission="com.google.android.gms.permission.ACTIVITY_RECOGNITION">
<intent-filter>
<action android:name="com.mypackage.ACTION_PROCESS_ACTIVITY_TRANSITIONS" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

View File

@ -16,6 +16,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.card.MaterialCardView
import com.tommasoberlose.anotherwidget.R
import com.tommasoberlose.anotherwidget.global.Constants
import com.tommasoberlose.anotherwidget.helpers.ColorHelper.isColorDark
import com.tommasoberlose.anotherwidget.helpers.GlanceProviderHelper
import com.tommasoberlose.anotherwidget.models.GlanceProvider
@ -87,6 +88,7 @@ class GlanceProviderSortMenu(
adapter.updateData(
GlanceProviderHelper.getGlanceProviders()
.filter { it != Constants.GlanceProviderId.BATTERY_LEVEL_LOW }
.mapNotNull { GlanceProviderHelper.getGlanceProviderById(context, it) }
)

View File

@ -1,97 +0,0 @@
package com.tommasoberlose.anotherwidget.helpers
import android.Manifest
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import com.google.android.gms.location.ActivityRecognition
import com.google.android.gms.location.ActivityTransition
import com.google.android.gms.location.ActivityTransitionRequest
import com.google.android.gms.location.DetectedActivity
import com.tommasoberlose.anotherwidget.global.Preferences
import com.tommasoberlose.anotherwidget.receivers.FenceReceiver
import com.tommasoberlose.anotherwidget.utils.checkGrantedPermission
object DailyStepsHelper {
fun registerFence(context: Context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || context.checkGrantedPermission(Manifest.permission.ACTIVITY_RECOGNITION)) {
val transitions = mutableListOf<ActivityTransition>()
transitions +=
ActivityTransition.Builder()
.setActivityType(DetectedActivity.WALKING)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build()
transitions +=
ActivityTransition.Builder()
.setActivityType(DetectedActivity.WALKING)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build()
transitions +=
ActivityTransition.Builder()
.setActivityType(DetectedActivity.RUNNING)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build()
transitions +=
ActivityTransition.Builder()
.setActivityType(DetectedActivity.RUNNING)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build()
transitions +=
ActivityTransition.Builder()
.setActivityType(DetectedActivity.STILL)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.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, FenceReceiver::class.java),
0
)
)
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, FenceReceiver::class.java),
0
)
)
task.addOnCompleteListener {
if (it.isSuccessful) {
PendingIntent.getBroadcast(
context,
2,
Intent(context, FenceReceiver::class.java),
0
).cancel()
}
}
}
}

View File

@ -0,0 +1,171 @@
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.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 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)
setTimeout(context)
} else {
resetDailySteps()
}
} 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)) {
registerFence(context)
} else {
resetDailySteps()
}
}
}
private fun resetDailySteps() {
Preferences.googleFitSteps = -1
}
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) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || context.checkGrantedPermission(
Manifest.permission.ACTIVITY_RECOGNITION)) {
val transitions = mutableListOf<ActivityTransition>()
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),
0
)
)
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),
0
)
)
task.addOnCompleteListener {
if (it.isSuccessful) {
PendingIntent.getBroadcast(
context,
2,
Intent(context, ActivityDetectionReceiver::class.java),
0
).cancel()
}
}
}
fun requestDailySteps(context: 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,
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 {
it.getDataSet(DataType.AGGREGATE_STEP_COUNT_DELTA)?.dataPoints?.get(0)?.getValue(FIELD_STEPS)?.asInt() ?: 0
}.toLong()
MainWidget.updateWidget(context)
}
}
}
fun setTimeout(context: Context) {
with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) {
cancel(PendingIntent.getBroadcast(context, 0, Intent(context, ActivityDetectionReceiver::class.java), 0))
setExactAndAllowWhileIdle(
AlarmManager.RTC,
Calendar.getInstance().timeInMillis + 15 * 60 * 1000,
PendingIntent.getBroadcast(
context,
0,
Intent(context, ActivityDetectionReceiver::class.java),
0
)
)
}
}
}
}

View File

@ -1,83 +0,0 @@
package com.tommasoberlose.anotherwidget.receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
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.DataSource
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.ActivityTransitionResult
import com.google.android.gms.location.DetectedActivity
import com.tommasoberlose.anotherwidget.global.Preferences
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
import java.util.*
import java.util.concurrent.TimeUnit
class FenceReceiver : 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) {
requestDailySteps(context)
} else {
resetDailySteps()
}
}
}
private fun requestDailySteps(context: Context) {
val fitnessOptions = FitnessOptions.builder()
.addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
.build()
val account: GoogleSignInAccount? = GoogleSignIn.getLastSignedInAccount(context)
Log.d("ciao", "hasPermission: ${GoogleSignIn.hasPermissions(account, fitnessOptions)}")
if (GoogleSignIn.hasPermissions(account, fitnessOptions)) {
val cal: Calendar = Calendar.getInstance()
cal.time = Date()
val endTime: Long = cal.timeInMillis
cal.add(Calendar.YEAR, -1)
val startTime: Long = cal.timeInMillis
val readRequest = DataReadRequest.Builder()
.aggregate(
DataType.TYPE_STEP_COUNT_DELTA,
DataType.AGGREGATE_STEP_COUNT_DELTA
)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.bucketByTime(1, TimeUnit.DAYS)
.build()
if (account != null) {
Fitness.getHistoryClient(context, account)
.readData(readRequest)
.addOnSuccessListener { response ->
Preferences.googleFitSteps =
response.dataSets[0].dataPoints[0].getValue(FIELD_STEPS).asFloat()
.toLong()
Log.d("ciao",
"response: ${response.dataSets[0].dataPoints[0].getValue(FIELD_STEPS)
.asFloat().toLong()}"
)
MainWidget.updateWidget(context)
}
}
}
}
private fun resetDailySteps() {
Preferences.googleFitSteps = -1
}
}

View File

@ -1,22 +0,0 @@
package com.tommasoberlose.anotherwidget.receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
class PlayerReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d("ciao", "player ok")
// val cmd = intent.getStringExtra("command")
// Log.v("tag ", "$action / $cmd")
// val artist = intent.getStringExtra("artist")
// val album = intent.getStringExtra("album")
// val track = intent.getStringExtra("track")
// Log.v("tag", "$artist:$album:$track")
}
}

View File

@ -176,7 +176,7 @@ class GeneralTabFragment : Fragment() {
private fun setupListener() {
action_main_text_size.setOnClickListener {
val dialog = BottomSheetMenu<Float>(requireContext(), header = getString(R.string.title_main_text_size)).setSelectedValue(Preferences.textMainSize)
(32 downTo 10).filter { it % 2 == 0 }.forEach {
(40 downTo 10).filter { it % 2 == 0 }.forEach {
dialog.addItem("${it}sp", it.toFloat())
}
dialog.addOnSelectItemListener { value ->
@ -186,7 +186,7 @@ class GeneralTabFragment : Fragment() {
action_second_text_size.setOnClickListener {
val dialog = BottomSheetMenu<Float>(requireContext(), header = getString(R.string.title_second_text_size)).setSelectedValue(Preferences.textSecondSize)
(28 downTo 10).filter { it % 2 == 0 }.forEach {
(40 downTo 10).filter { it % 2 == 0 }.forEach {
dialog.addItem("${it}sp", it.toFloat())
}
dialog.addOnSelectItemListener { value ->

View File

@ -10,6 +10,7 @@ import android.content.IntentFilter
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -22,8 +23,8 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.fitness.FitnessOptions
import com.google.android.gms.fitness.data.DataType
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.api.ApiException
import com.karumi.dexter.Dexter
import com.karumi.dexter.MultiplePermissionsReport
import com.karumi.dexter.PermissionToken
@ -36,8 +37,9 @@ import com.tommasoberlose.anotherwidget.components.GlanceProviderSortMenu
import com.tommasoberlose.anotherwidget.databinding.FragmentGlanceSettingsBinding
import com.tommasoberlose.anotherwidget.global.Preferences
import com.tommasoberlose.anotherwidget.helpers.AlarmHelper
import com.tommasoberlose.anotherwidget.helpers.DailyStepsHelper
import com.tommasoberlose.anotherwidget.helpers.MediaPlayerHelper
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.checkGrantedPermission
@ -110,12 +112,12 @@ class GlanceTabFragment : Fragment() {
}
})
// viewModel.showDailySteps.observe(viewLifecycleOwner, Observer {
// maintainScrollPosition {
// show_steps_label?.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)
// }
// checkFitnessPermission()
// })
viewModel.showDailySteps.observe(viewLifecycleOwner, Observer {
maintainScrollPosition {
show_steps_label?.text = if (it) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)
}
checkFitnessPermission()
})
viewModel.customInfo.observe(viewLifecycleOwner, Observer {
maintainScrollPosition {
@ -191,7 +193,17 @@ class GlanceTabFragment : Fragment() {
.addItem(getString(R.string.settings_visible), true)
.addItem(getString(R.string.settings_not_visible), false)
.addOnSelectItemListener { value ->
Preferences.showDailySteps = value
if (value) {
val account: GoogleSignInAccount? = GoogleSignIn.getLastSignedInAccount(requireContext())
if (!GoogleSignIn.hasPermissions(account, FITNESS_OPTIONS)) {
val mGoogleSignInClient = GoogleSignIn.getClient(requireActivity(), GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).addExtension(FITNESS_OPTIONS).build())
startActivityForResult(mGoogleSignInClient.signInIntent, 2)
} else {
Preferences.showDailySteps = true
}
} else {
Preferences.showDailySteps = false
}
}.show()
}
}
@ -255,83 +267,87 @@ class GlanceTabFragment : Fragment() {
}
}
// private fun checkFitnessPermission() {
// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || activity?.checkGrantedPermission(Manifest.permission.ACTIVITY_RECOGNITION) == true) {
// fitness_permission_alert?.isVisible = false
// if (Preferences.showDailySteps) {
// val fitnessOptions = FitnessOptions.builder()
// .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
// .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
// .build()
//
// val account: GoogleSignInAccount = GoogleSignIn.getLastSignedInAccount(requireContext()) ?: GoogleSignIn.getAccountForExtension(requireContext(), fitnessOptions)
//
// if (!GoogleSignIn.hasPermissions(account, fitnessOptions)) {
// GoogleSignIn.requestPermissions(
// requireActivity(),
// 1,
// account,
// fitnessOptions)
// } else {
// DailyStepsHelper.registerFence(requireContext())
// }
// } else {
// DailyStepsHelper.unregisterFence(requireContext())
// }
// show_steps_label?.text = if (Preferences.showDailySteps) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)
// } else if (Preferences.showDailySteps) {
// DailyStepsHelper.unregisterFence(requireContext())
// fitness_permission_alert?.isVisible = true
// show_steps_label?.text = getString(R.string.settings_request_fitness_access)
// fitness_permission_alert?.setOnClickListener {
// requireFitnessPermission()
// }
// } else {
// DailyStepsHelper.unregisterFence(requireContext())
// show_steps_label?.text = getString(R.string.settings_not_visible)
// fitness_permission_alert?.isVisible = false
// }
// }
//
// override fun onActivityResult(
// requestCode: Int,
// resultCode: Int,
// data: Intent?
// ) {
// if (resultCode == Activity.RESULT_OK) {
// if (requestCode == 1) {
// DailyStepsHelper.registerFence(requireContext())
// } else {
// Preferences.showDailySteps = false
// }
// }
// }
private fun checkFitnessPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || activity?.checkGrantedPermission(Manifest.permission.ACTIVITY_RECOGNITION) == true) {
fitness_permission_alert?.isVisible = false
if (Preferences.showDailySteps) {
ActivityDetectionReceiver.registerFence(requireContext())
} else {
ActivityDetectionReceiver.unregisterFence(requireContext())
}
show_steps_label?.text = if (Preferences.showDailySteps) getString(R.string.settings_visible) else getString(R.string.settings_not_visible)
} else if (Preferences.showDailySteps) {
ActivityDetectionReceiver.unregisterFence(requireContext())
fitness_permission_alert?.isVisible = true
show_steps_label?.text = getString(R.string.settings_request_fitness_access)
fitness_permission_alert?.setOnClickListener {
requireFitnessPermission()
}
} else {
ActivityDetectionReceiver.unregisterFence(requireContext())
show_steps_label?.text = getString(R.string.settings_not_visible)
fitness_permission_alert?.isVisible = false
}
}
// private fun requireFitnessPermission() {
// Dexter.withContext(requireContext())
// .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?) {
// report?.let {
// if (report.areAllPermissionsGranted()){
// checkFitnessPermission()
// }
// }
// }
// override fun onPermissionRationaleShouldBeShown(
// permissions: MutableList<PermissionRequest>?,
// 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()
// }
override fun onActivityResult(
requestCode: Int,
resultCode: Int,
data: Intent?
) {
when (requestCode) {
1 -> {
if (resultCode == Activity.RESULT_OK) {
checkFitnessPermission()
} else {
Preferences.showDailySteps = false
}
}
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 {
checkFitnessPermission()
}
} catch (e: ApiException) {
e.printStackTrace()
Preferences.showDailySteps = false
}
}
}
}
private fun requireFitnessPermission() {
Dexter.withContext(requireContext())
.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?) {
report?.let {
if (report.areAllPermissionsGranted()){
checkFitnessPermission()
}
}
}
override fun onPermissionRationaleShouldBeShown(
permissions: MutableList<PermissionRequest>?,
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()
}
private fun maintainScrollPosition(callback: () -> Unit) {
val scrollPosition = scrollView.scrollY

View File

@ -194,7 +194,6 @@
android:paddingRight="8dp"
android:clickable="true"
android:focusable="true"
android:visibility="gone"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:id="@+id/action_show_steps"

View File

@ -1 +0,0 @@
/build

View File

@ -1,27 +0,0 @@
apply plugin: 'com.android.dynamic-feature'
android {
compileSdkVersion 29
defaultConfig {
minSdkVersion 23
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':app')
}

View File

@ -1,13 +0,0 @@
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.tommasoberlose.tasksintegration;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.tommasoberlose.tasksintegration";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}

View File

@ -1 +0,0 @@
[{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"tasksintegration-debug.apk","fullName":"debug","baseName":"debug","dirName":""}]

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
featureSplit="tasksintegration"
package="com.tommasoberlose.anotherwidget"
android:versionCode="83"
android:versionName="2.0.6" >
<uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="29" />
<dist:module
dist:instant="false"
dist:title="@string/title_tasksintegration" >
<dist:delivery>
<dist:on-demand />
</dist:delivery>
<dist:fusing dist:include="true" />
</dist:module>
</manifest>

View File

@ -1 +0,0 @@
[{"outputType":{"type":"BUNDLE_MANIFEST"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"tasksintegration-debug.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"AndroidManifest.xml","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"23"}}]

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/assets"/><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/intermediates/shader_assets/debug/out"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/debug/assets"/></dataSet></merger>

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/debug/jniLibs"/></dataSet></merger>

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/res"/><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/generated/res/rs/debug"/><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/res"/><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/generated/res/rs/debug"/><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/generated/res/resValues/debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/debug/res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/debug/res"/></dataSet><mergedItems/></merger>

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/debug/shaders"/></dataSet></merger>

View File

@ -1,4 +0,0 @@
#Sun May 10 11:42:33 CEST 2020
base.0=/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/build/intermediates/dex/debug/mergeProjectDexDebug/out/classes.dex
path.0=classes.dex
renamed.0=classes.dex

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
featureSplit="tasksintegration"
package="com.tommasoberlose.anotherwidget"
android:targetSandboxVersion="2"
android:versionCode="83"
android:versionName="2.0.6" >
<uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="29" />
<dist:module
dist:instant="false"
dist:title="@string/title_tasksintegration" >
<dist:delivery>
<dist:on-demand />
</dist:delivery>
<dist:fusing dist:include="true" />
</dist:module>
</manifest>

View File

@ -1 +0,0 @@
[{"outputType":{"type":"INSTANT_APP_MANIFEST"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"tasksintegration-debug.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"AndroidManifest.xml","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"23"}}]

View File

@ -1,32 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:dist="http://schemas.android.com/apk/distribution"
4 featureSplit="tasksintegration"
5 package="com.tommasoberlose.anotherwidget"
6 android:versionCode="83"
7 android:versionName="2.0.6" >
8
9 <uses-sdk
10 android:minSdkVersion="23"
10-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
11 android:targetSdkVersion="29" />
11-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
12
13 <dist:module
13-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:5:5-12:19
14 dist:instant="false"
14-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:6:9-29
15 dist:title="@string/title_tasksintegration" >
15-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:7:9-52
16 <dist:delivery>
16-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:8:9-10:25
17 <dist:on-demand />
17-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:9:13-31
18 </dist:delivery>
19
20 <dist:fusing dist:include="true" />
20-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:11:9-44
20-->/Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:11:22-41
21 </dist:module>
22
23</manifest>

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
featureSplit="tasksintegration"
package="com.tommasoberlose.anotherwidget"
android:versionCode="83"
android:versionName="2.0.6" >
<uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="29" />
<dist:module
dist:instant="false"
dist:title="@string/title_tasksintegration" >
<dist:delivery>
<dist:on-demand />
</dist:delivery>
<dist:fusing dist:include="true" />
</dist:module>
</manifest>

View File

@ -1 +0,0 @@
[{"outputType":{"type":"MERGED_MANIFESTS"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"tasksintegration-debug.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"AndroidManifest.xml","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"23"}}]

View File

@ -1 +0,0 @@
{"modulePath":":tasksintegration","applicationId":"com.tommasoberlose.tasksintegration"}

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
featureSplit="tasksintegration"
package="com.tommasoberlose.anotherwidget"
android:versionCode="83"
android:versionName="2.0.6" >
<uses-sdk android:targetSdkVersion="29" />
<dist:module
dist:instant="false"
dist:title="@string/title_tasksintegration" >
<dist:delivery>
<dist:on-demand />
</dist:delivery>
<dist:fusing dist:include="true" />
</dist:module>
</manifest>

View File

@ -1 +0,0 @@
[{"outputType":{"type":"METADATA_FEATURE_MANIFEST"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"tasksintegration-debug.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"AndroidManifest.xml","properties":{}}]

View File

@ -1 +0,0 @@
[{"outputType":{"type":"PROCESSED_RES"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"tasksintegration-debug.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"resources-debug.ap_","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"23"}}]

View File

@ -1 +0,0 @@
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"tasksintegration-debug.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"tasksintegration-debug.apk","properties":{}}]

View File

@ -1,53 +0,0 @@
-- Merging decision tree log ---
manifest
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
package
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:3:5-50
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
android:versionName
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
xmlns:dist
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:2:5-61
android:versionCode
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:1-13:12
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
xmlns:android
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:1:11-69
dist:module
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:5:5-12:19
dist:instant
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:6:9-29
dist:title
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:7:9-52
dist:delivery
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:8:9-10:25
dist:on-demand
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:9:13-31
dist:fusing
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:11:9-44
dist:include
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml:11:22-41
uses-sdk
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml reason: use-sdk injection requested
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
android:targetSdkVersion
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
android:minSdkVersion
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
ADDED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml
INJECTED from /Users/tommaso/Documents/MyCode/another-widget/tasksintegration/src/main/AndroidManifest.xml

View File

@ -1,14 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
package="com.tommasoberlose.tasksintegration">
<dist:module
dist:instant="false"
dist:title="@string/title_tasksintegration">
<dist:delivery>
<dist:on-demand />
</dist:delivery>
<dist:fusing dist:include="true" />
</dist:module>
</manifest>