Skip to content

Commit

Permalink
Updated ActivityHandler.kt for managing correctly activities (issue #12
Browse files Browse the repository at this point in the history
…) - this may be working now
  • Loading branch information
Javinator9889 committed Jun 27, 2020
1 parent 8415134 commit e30df0c
Show file tree
Hide file tree
Showing 10 changed files with 40 additions and 170 deletions.
2 changes: 0 additions & 2 deletions app/build.gradle
Expand Up @@ -193,8 +193,6 @@ dependencies {
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
// https://square.github.io/okio/#releases
implementation 'com.squareup.okio:okio:2.5.0'
// https://github.com/google/conscrypt/
// implementation 'org.conscrypt:conscrypt-android:2.4.0'
// https://github.com/deano2390/MaterialShowcaseView
implementation 'com.github.deano2390:MaterialShowcaseView:1.3.4'
// https://github.com/PhilJay/MPAndroidChart
Expand Down
2 changes: 0 additions & 2 deletions app/src/main/AndroidManifest.xml
Expand Up @@ -39,8 +39,6 @@
android:name=".activities.PrivacyTermsActivity" />
<activity
android:name=".activities.DynamicFeatureProgress" />
<activity
android:name=".activities.views.fragments.washinghands.WashingHandsFragment" />
<activity
android:name=".activities.views.fragments.diseases.DiseaseExpandedView" />

Expand Down
Expand Up @@ -33,6 +33,7 @@ import com.javinator9889.handwashingreminder.utils.isAtLeast
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.ionicons.Ionicons
import com.mikepenz.iconics.utils.sizeDp
import timber.log.Timber

class ActivityCheckbox : CheckBoxPreference {
constructor(context: Context) : super(context)
Expand Down Expand Up @@ -91,8 +92,10 @@ class ActivityCheckbox : CheckBoxPreference {
}
with(HandwashingApplication.instance) {
if (checked) {
Timber.d("Activity is checked so starting tracking")
activityHandler.startTrackingActivity()
} else {
Timber.d("Activity is not checked so disable tracking")
activityHandler.disableActivityTracker()
}
}
Expand Down

This file was deleted.

Expand Up @@ -22,49 +22,57 @@ import android.app.PendingIntent
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.preference.PreferenceManager
import com.google.android.gms.location.ActivityRecognition
import com.google.android.gms.location.ActivityTransition
import com.google.android.gms.location.ActivityTransition.ACTIVITY_TRANSITION_EXIT
import com.google.android.gms.location.ActivityTransitionRequest
import com.google.android.gms.location.DetectedActivity
import com.google.android.gms.tasks.Task
import com.javinator9889.handwashingreminder.BuildConfig
import com.javinator9889.handwashingreminder.utils.Preferences
import timber.log.Timber

internal const val ACTIVITY_REQUEST_CODE = 64
internal const val TRANSITIONS_RECEIVER_ACTION =
"${BuildConfig.APPLICATION_ID}/TRANSITIONS_RECEIVER_ACTION"
internal val TRANSITIONS = listOf<ActivityTransition>(
ActivityTransition.Builder()
.setActivityType(DetectedActivity.IN_VEHICLE)
.setActivityTransition(ACTIVITY_TRANSITION_EXIT)
.build(),
ActivityTransition.Builder()
.setActivityType(DetectedActivity.ON_BICYCLE)
.setActivityTransition(ACTIVITY_TRANSITION_EXIT)
.build(),
ActivityTransition.Builder()
.setActivityType(DetectedActivity.RUNNING)
.setActivityTransition(ACTIVITY_TRANSITION_EXIT)
.build(),
ActivityTransition.Builder()
.setActivityType(DetectedActivity.WALKING)
.setActivityTransition(ACTIVITY_TRANSITION_EXIT)
.build()
)

class ActivityHandler private constructor(private val context: Context) {
private val transitions: MutableList<ActivityTransition> = mutableListOf()
private var pendingIntent: PendingIntent
private var pendingIntent: PendingIntent = createPendingIntent()
private var activityRegistered = false
private val transitionsReceiver = ActivityReceiver()

init {
val activitiesSet = createSetOfTransitions()
addTransitions(activitiesSet, transitions)
registerActivityReceiver()
pendingIntent = createPendingIntent()
}

companion object {
private var instance: ActivityHandler? = null

fun getInstance(context: Context): ActivityHandler {
instance?.let { return it }
instance = ActivityHandler(context)
return instance!!
synchronized(this) {
val instance = ActivityHandler(context.applicationContext)
this.instance = instance
return instance
}
}
}

fun startTrackingActivity() {
if (transitions.size == 0)
return
Timber.d("Starting activity recognition")
with(ActivityTransitionRequest(transitions)) {
with(ActivityTransitionRequest(TRANSITIONS)) {
ActivityRecognition.getClient(context)
.requestActivityTransitionUpdates(this, pendingIntent).apply {
addOnSuccessListener { activityRegistered = true }
Expand All @@ -86,56 +94,14 @@ class ActivityHandler private constructor(private val context: Context) {
}
}

fun reload() = with(createSetOfTransitions()) {
transitions.clear()
addTransitions(this, transitions)
Timber.d("Reloading activity recognition - transitions: $transitions")
disableActivityTracker()?.let {
it.addOnCompleteListener {
pendingIntent = createPendingIntent()
startTrackingActivity()
}
}
}

private fun createSetOfTransitions(): Set<Int> {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
with(mutableSetOf<Int>()) {
preferences.getStringSet(
Preferences.ACTIVITIES_ENABLED,
Preferences.DEFAULT_ACTIVITY_SET
)!!.run {
forEach { this@with += Integer.parseInt(it) }
}
return this
}
}

private fun addTransitions(
activitiesSet: Set<Int>,
transitions: MutableList<ActivityTransition>,
activityTransition: Int = ActivityTransition.ACTIVITY_TRANSITION_EXIT
) {
for (activity in activitiesSet) {
transitions += ActivityTransition.Builder()
.setActivityType(activity)
.setActivityTransition(activityTransition)
.build()
}
}

private fun createPendingIntent(): PendingIntent =
with(Intent(TRANSITIONS_RECEIVER_ACTION)) {
setClass(context, ActivityReceiver::class.java)
PendingIntent.getBroadcast(
context,
ACTIVITY_REQUEST_CODE,
this,
FLAG_UPDATE_CURRENT
)
}

private fun registerActivityReceiver() =
LocalBroadcastManager.getInstance(context).registerReceiver(
transitionsReceiver, IntentFilter(TRANSITIONS_RECEIVER_ACTION)
)
}
Expand Up @@ -111,8 +111,7 @@ class ActivityReceiver : BroadcastReceiver() {
val emojiCompat = emojiLoader.await()
title = emojiCompat.process(title)
content = emojiCompat.process(content)
} catch (_: IllegalStateException) {
}
} catch (_: IllegalStateException) { }
withContext(Dispatchers.Main) {
notificationsHandler.createNotification(
iconDrawable = R.drawable.ic_stat_handwashing,
Expand Down
Expand Up @@ -36,10 +36,13 @@ class BootCompletedJob : BroadcastReceiver() {
Preferences.ACTIVITY_TRACKING_ENABLED,
false
)
)
) {
Timber.d("Device rebooted so starting activity as it's enabled")
activityHandler.startTrackingActivity()
else
} else {
Timber.d("Device rebooted but not starting activity as it isn't enabled")
activityHandler.disableActivityTracker()
}
Timber.d("Enqueuing notifications as the device has rebooted")
with(AlarmHandler(context)) {
scheduleAllAlarms()
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-es/strings.xml
Expand Up @@ -154,7 +154,7 @@
<string name="activity_disabled">No recibirás notificaciones de ninguna
actividad</string>
<string name="activity_enabled">Recibirás notificaciones de las
actividades seleccionadas debajo</string>
actividades después de pasear, ir en bici, bajarte de un vehículo o correr</string>
<string name="activity_recognition">Habilitar reconocimiento de la
actividad</string>
<string name="activities_to_enable">¿Cuándo recibirás notificaciones?</string>
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/values/strings.xml
Expand Up @@ -156,8 +156,8 @@
the access to your activity. Enable it from settings</string>
<string name="activity_disabled">You will not receive any activity
notifications</string>
<string name="activity_enabled">You will receive notifications for
the activities selected below</string>
<string name="activity_enabled">You will receive notifications after having
a walk, going cycling, leaving a vehicle or running</string>
<string name="activity_recognition">Enable activity recognition</string>
<string name="activities_to_enable">When you will receive
notifications?</string>
Expand Down
8 changes: 0 additions & 8 deletions app/src/main/res/xml/preferences.xml
Expand Up @@ -57,14 +57,6 @@
android:key="activity:gms:tracking"
android:title="@string/activity_recognition"
app:summary="For enabling the activity recognition, you need both Google Play Services and permissions" />

<com.javinator9889.handwashingreminder.activities.views.fragments.settings.ActivityMultiSelectList
android:defaultValue="@array/empty_array"
android:dependency="activity:gms:tracking"
android:entries="@array/activities"
android:entryValues="@array/activity_values"
android:key="activity:gms:activities:enabled"
android:title="@string/activities_to_enable" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/data_sharing_category">

Expand Down

0 comments on commit e30df0c

Please sign in to comment.