diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9dd8b1dbf..d450e3866 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,9 @@ You should have received a copy of the GNU General Public License along with Sim + + + + + + + + + + + + + = Build.VERSION_CODES.O) { + val channel = NotificationChannel( + "simpletask_launcher_service", + "SimpleTask Launcher Service", + NotificationManager.IMPORTANCE_LOW + ) + val notificationManager = getSystemService(NotificationManager::class.java) + notificationManager.createNotificationChannel(channel) + } + + // Create a notification for the foreground service using NotificationCompat.Builder() + val notification = NotificationCompat.Builder(this, "simpletask_launcher_service") + .setContentTitle("SimpleTask Habit Mode") + .setContentText("Waiting for Screen Unlock") + .setSmallIcon(R.drawable.ic_done_white_24dp) + .build() + + // Start the foreground service with the notification + startForeground(1, notification) + + // Register the BroadcastReceiver for the ACTION_USER_PRESENT broadcast + val intentFilter = IntentFilter(Intent.ACTION_USER_PRESENT) + registerReceiver(appLauncherReceiver, intentFilter) + } + + override fun onDestroy() { + // Unregister the BroadcastReceiver when the service is destroyed + unregisterReceiver(appLauncherReceiver) + + super.onDestroy() + } +} diff --git a/app/src/main/java/nl/mpcjanssen/simpletask/Preferences.kt b/app/src/main/java/nl/mpcjanssen/simpletask/Preferences.kt index 72ee7af92..63c610180 100644 --- a/app/src/main/java/nl/mpcjanssen/simpletask/Preferences.kt +++ b/app/src/main/java/nl/mpcjanssen/simpletask/Preferences.kt @@ -30,9 +30,11 @@ package nl.mpcjanssen.simpletask import android.Manifest import android.content.* import android.content.pm.PackageManager +import android.net.Uri import android.os.Build import android.os.Bundle import android.preference.* +import android.provider.Settings import android.text.TextUtils import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat @@ -89,6 +91,7 @@ class Preferences : ThemedPreferenceActivity(), SharedPreferences.OnSharedPrefer val broadcastIntent = Intent(Constants.BROADCAST_MAIN_FONTSIZE_CHANGED) localBroadcastManager.sendBroadcast(broadcastIntent) } + getString(R.string.habit_mode_pref_key) -> requestDrawOverlaysPermissionAndStartService() } } @@ -111,6 +114,24 @@ class Preferences : ThemedPreferenceActivity(), SharedPreferences.OnSharedPrefer } } + private fun requestDrawOverlaysPermissionAndStartService() { + Log.i(TAG, "requestDrawOverlaysPermissionAndStartService") + if (TodoApplication.config.enableHabitMode) { + // test to see if we already have permission + val canDrawOverlays = Settings.canDrawOverlays(this) + if (!canDrawOverlays) { + + val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) + intent.data = Uri.parse("package:${packageName}") + startActivityForResult(intent, 0) + } + + startService(Intent(this, AppLauncherService::class.java)) + } else { + stopService(Intent(this, AppLauncherService::class.java)) + } + } + override fun onResume() { super.onResume() // Set up a listener whenever a key changes diff --git a/app/src/main/java/nl/mpcjanssen/simpletask/Simpletask.kt b/app/src/main/java/nl/mpcjanssen/simpletask/Simpletask.kt index 83b0b4338..af30f1368 100644 --- a/app/src/main/java/nl/mpcjanssen/simpletask/Simpletask.kt +++ b/app/src/main/java/nl/mpcjanssen/simpletask/Simpletask.kt @@ -11,7 +11,7 @@ package nl.mpcjanssen.simpletask -import android.annotation.SuppressLint + import android.annotation.SuppressLint import android.app.DatePickerDialog import android.app.PendingIntent import android.app.SearchManager @@ -42,6 +42,7 @@ import androidx.annotation.RequiresApi import androidx.core.content.FileProvider import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat +import android.provider.Settings import hirondelle.date4j.DateTime import nl.mpcjanssen.simpletask.adapters.DrawerAdapter @@ -80,9 +81,18 @@ class Simpletask : ThemedNoActionBarActivity() { private val uiHandler = UiHandler() + + public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.i(TAG, "onCreate") + + // If Habit Mode is enabled, we start the foreground service that + // catches the screen unlock events reliably. + if(TodoApplication.config.enableHabitMode) { + startService(Intent(this, AppLauncherService::class.java)) + } + m_savedInstanceState = savedInstanceState val intentFilter = IntentFilter() intentFilter.addAction(Constants.BROADCAST_ACTION_LOGOUT) diff --git a/app/src/main/java/nl/mpcjanssen/simpletask/util/Config.kt b/app/src/main/java/nl/mpcjanssen/simpletask/util/Config.kt index daa9f81a4..9cfe1f107 100644 --- a/app/src/main/java/nl/mpcjanssen/simpletask/util/Config.kt +++ b/app/src/main/java/nl/mpcjanssen/simpletask/util/Config.kt @@ -177,6 +177,8 @@ class Config(app: TodoApplication) : Preferences(app) { val showConfirmationDialogs by BooleanPreference(R.string.ui_show_confirmation_dialogs, true) + val enableHabitMode by BooleanPreference(R.string.habit_mode_pref_key, false) + val defaultSorts: Array get() = TodoApplication.app.resources.getStringArray(R.array.sortKeys) diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 8ba16e9be..3e4142c60 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -184,4 +184,5 @@ You should have received a copy of the GNU General Public License along with Tod query_store force_english idle_before_save + habit_mode_enable diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7b931917c..053c57259 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -405,6 +405,8 @@ You should have received a copy of the GNU General Public License along with Tod Share Lua config Assign a UUID to each task + Enable Habit Mode (BETA) + Habit Mode brings this app to the foreground every time the device is unlocked. Drag tasks to reorder (BETA) Save the current filter\n using the save button diff --git a/app/src/main/res/xml/interface_preferences.xml b/app/src/main/res/xml/interface_preferences.xml index 1d49191dc..52505dd8c 100644 --- a/app/src/main/res/xml/interface_preferences.xml +++ b/app/src/main/res/xml/interface_preferences.xml @@ -63,4 +63,10 @@ android:key="@string/task_drag" android:title="@string/task_drag_title" /> +