From 2cf09dd500dbe8d2b0fd6ebb6aedc098cdd82a53 Mon Sep 17 00:00:00 2001 From: vadimt Date: Thu, 17 Jan 2019 15:00:37 -0800 Subject: [PATCH] Using "remaining time" API Given the execution schedule restrictions, this will first use reflection, and afterwards will switch to a "solid" API. Bug: 118319143 Change-Id: I3410a043e81b09212cda256252d85ccf37381d6e Tests: Manual --- .../views/DigitalWellBeingToast.java | 53 +++++++++++++++---- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java b/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java index 0dc98aa201..aafd725cb2 100644 --- a/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java +++ b/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java @@ -20,11 +20,13 @@ import android.app.ActivityOptions; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; +import android.content.pm.LauncherApps; import android.content.res.Resources; import android.icu.text.MeasureFormat; import android.icu.text.MeasureFormat.FormatWidth; import android.icu.util.Measure; import android.icu.util.MeasureUnit; +import android.os.UserHandle; import android.util.AttributeSet; import android.util.Log; import android.view.View; @@ -40,6 +42,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.systemui.shared.recents.model.Task; +import java.lang.reflect.Method; import java.time.Duration; import java.util.Locale; @@ -72,23 +75,53 @@ public final class DigitalWellBeingToast extends LinearLayout { public void initialize(Task task, InitializeCallback callback) { mTask = task; Utilities.THREAD_POOL_EXECUTOR.execute(() -> { - final long appUsageLimitTimeMs = -1; - final long appRemainingTimeMs = -1; - final boolean isGroupLimit = true; + long appUsageLimitTimeMs = -1; + long appRemainingTimeMs = -1; + boolean isGroupLimit = true; + + try { + final Method getAppUsageLimit = LauncherApps.class.getMethod( + "getAppUsageLimit", + String.class, + UserHandle.class); + final Object usageLimit = getAppUsageLimit.invoke( + getContext().getSystemService(LauncherApps.class), + task.getTopComponent().getPackageName(), + UserHandle.of(task.key.userId)); + + if (usageLimit != null) { + final Class appUsageLimitClass = usageLimit.getClass(); + appUsageLimitTimeMs = (long) appUsageLimitClass.getMethod("getTotalUsageLimit"). + invoke(usageLimit); + appRemainingTimeMs = (long) appUsageLimitClass.getMethod("getUsageRemaining"). + invoke(usageLimit); + isGroupLimit = (boolean) appUsageLimitClass.getMethod("isGroupLimit"). + invoke(usageLimit); + } + } catch (Exception e) { + // Do nothing + } + + final long appUsageLimitTimeMsFinal = appUsageLimitTimeMs; + final long appRemainingTimeMsFinal = appRemainingTimeMs; + final boolean isGroupLimitFinal = isGroupLimit; + post(() -> { - if (appUsageLimitTimeMs < 0) { + if (appUsageLimitTimeMsFinal < 0) { setVisibility(GONE); } else { setVisibility(VISIBLE); - mText.setText(getText(appRemainingTimeMs, isGroupLimit)); - mImage.setImageResource(appRemainingTimeMs > 0 ? + mText.setText(getText(appRemainingTimeMsFinal, isGroupLimitFinal)); + mImage.setImageResource(appRemainingTimeMsFinal > 0 ? R.drawable.hourglass_top : R.drawable.hourglass_bottom); } callback.call( - appUsageLimitTimeMs >= 0 && appRemainingTimeMs < 0 ? 0 : 1, + appUsageLimitTimeMsFinal >= 0 && appRemainingTimeMsFinal <= 0 ? 0 : 1, getContentDescriptionForTask( - task, appUsageLimitTimeMs, appRemainingTimeMs, isGroupLimit)); + task, appUsageLimitTimeMsFinal, + appRemainingTimeMsFinal, + isGroupLimitFinal)); }); }); } @@ -154,7 +187,7 @@ public final class DigitalWellBeingToast extends LinearLayout { private String getText(long remainingTime, boolean isGroupLimit) { final Resources resources = getResources(); - return (remainingTime < 0) ? + return (remainingTime <= 0) ? resources.getString(R.string.app_in_grayscale) : resources.getString( isGroupLimit ? R.string.time_left_for_group : R.string.time_left_for_app, @@ -182,7 +215,7 @@ public final class DigitalWellBeingToast extends LinearLayout { private String getContentDescriptionForTask( Task task, long appUsageLimitTimeMs, long appRemainingTimeMs, boolean isGroupLimit) { - return appUsageLimitTimeMs > 0 ? + return appUsageLimitTimeMs >= 0 ? getResources().getString( R.string.task_contents_description_with_remaining_time, task.titleDescription,