diff --git a/app/build.gradle b/app/build.gradle index e2d2e75a..50df0ceb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -128,6 +128,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.preference:preference:1.2.1' + implementation 'androidx.work:work-runtime:2.9.0' } configurations.configureEach { diff --git a/app/src/main/java/deltazero/amarok/AmarokApplication.java b/app/src/main/java/deltazero/amarok/AmarokApplication.java index ea2c7daf..70c21564 100644 --- a/app/src/main/java/deltazero/amarok/AmarokApplication.java +++ b/app/src/main/java/deltazero/amarok/AmarokApplication.java @@ -7,7 +7,7 @@ import com.google.android.material.color.DynamicColors; import com.rosan.dhizuku.api.Dhizuku; -import deltazero.amarok.receivers.ScreenLockReceiver; +import deltazero.amarok.receivers.ScreenStatusReceiver; import deltazero.amarok.utils.AppCenterUtil; import jonathanfinerty.once.Once; @@ -25,7 +25,11 @@ public void onCreate() { if (PrefMgr.getEnableDynamicColor()) DynamicColors.applyToActivitiesIfAvailable(this); - registerReceiver(new ScreenLockReceiver(), new IntentFilter(Intent.ACTION_SCREEN_OFF)); + // Register ScreenStatusReceiver + var screenStatusIntentFilter = new IntentFilter(); + screenStatusIntentFilter.addAction(Intent.ACTION_SCREEN_ON); + screenStatusIntentFilter.addAction(Intent.ACTION_SCREEN_OFF); + registerReceiver(new ScreenStatusReceiver(), screenStatusIntentFilter); // Start PanicButton service QuickHideService.startService(this); diff --git a/app/src/main/java/deltazero/amarok/receivers/ScreenLockReceiver.java b/app/src/main/java/deltazero/amarok/receivers/ScreenLockReceiver.java deleted file mode 100644 index ab3f581a..00000000 --- a/app/src/main/java/deltazero/amarok/receivers/ScreenLockReceiver.java +++ /dev/null @@ -1,16 +0,0 @@ -package deltazero.amarok.receivers; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.util.Log; - -import deltazero.amarok.utils.SecurityUtil; - -public class ScreenLockReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - Log.i("ScreenLockReceiver", "Screen locked"); - SecurityUtil.lockAndDisguise(); - } -} \ No newline at end of file diff --git a/app/src/main/java/deltazero/amarok/receivers/ScreenStatusReceiver.java b/app/src/main/java/deltazero/amarok/receivers/ScreenStatusReceiver.java new file mode 100644 index 00000000..2d972593 --- /dev/null +++ b/app/src/main/java/deltazero/amarok/receivers/ScreenStatusReceiver.java @@ -0,0 +1,27 @@ +package deltazero.amarok.receivers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import deltazero.amarok.utils.AutoHideUtil; +import deltazero.amarok.utils.SecurityUtil; + +public class ScreenStatusReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + assert intent.getAction() != null; + switch (intent.getAction()) { + case Intent.ACTION_SCREEN_ON -> { + Log.i("ScreenStatusReceiver", "Screen unlocked."); + AutoHideUtil.cancelAutoHide(context); + } + case Intent.ACTION_SCREEN_OFF -> { + Log.i("ScreenStatusReceiver", "Screen locked."); + SecurityUtil.lockAndDisguise(); + AutoHideUtil.setAutoHide(context); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/deltazero/amarok/utils/AutoHideUtil.java b/app/src/main/java/deltazero/amarok/utils/AutoHideUtil.java new file mode 100644 index 00000000..e996664e --- /dev/null +++ b/app/src/main/java/deltazero/amarok/utils/AutoHideUtil.java @@ -0,0 +1,69 @@ +package deltazero.amarok.utils; + +import android.content.Context; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.work.ExistingWorkPolicy; +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkInfo; +import androidx.work.WorkManager; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import deltazero.amarok.Hider; +import deltazero.amarok.PrefMgr; + +public class AutoHideUtil { + + private static final String AUTO_HIDE_WORK_NAME = "deltazero.amarok.AUTO_HIDE_WORK"; + private static final String TAG = "AutoHideUtil"; + + public static class AutoHideWorker extends Worker { + public AutoHideWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { + super(context, workerParams); + } + + @NonNull + @Override + public Result doWork() { + Log.i(TAG, "Auto hide triggered. Start hiding."); + Hider.hide(getApplicationContext()); + return Result.success(); + } + } + + public static void setAutoHide(Context context) { + if (!PrefMgr.getEnableAutoHide() || Hider.getState() == Hider.State.HIDDEN) return; + Log.i(TAG, "Auto hide set. Delay: " + PrefMgr.getAutoHideDelay() + " minutes."); + WorkManager.getInstance(context).enqueueUniqueWork( + AUTO_HIDE_WORK_NAME, + ExistingWorkPolicy.REPLACE, + new OneTimeWorkRequest.Builder(AutoHideWorker.class) + .setInitialDelay(PrefMgr.getAutoHideDelay(), TimeUnit.MINUTES) + .build() + ); + } + + public static void cancelAutoHide(Context context) { + var workManager = WorkManager.getInstance(context); + + var future = workManager.getWorkInfosForUniqueWork(AUTO_HIDE_WORK_NAME); + List workInfos; + try { + workInfos = future.get(); + } catch (ExecutionException | InterruptedException e) { + throw new RuntimeException("Should not happen.", e); + } + + if (workInfos.size() == 0) return; + if (workInfos.get(0).getState() != WorkInfo.State.RUNNING) { + workManager.cancelUniqueWork(AUTO_HIDE_WORK_NAME); + Log.i(TAG, "Auto hide cancelled."); + } + } +}