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"
/>
+