diff options
author | Suprabh Shukla <suprabh@google.com> | 2021-04-13 23:57:38 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-04-13 23:57:38 +0000 |
commit | 9da117df72d89b54ce1ede6f9ac36c9b2cad1761 (patch) | |
tree | 33acb371c0e053648e71450fcd878cfc34220687 | |
parent | 522de6d8df18cc2a9fd773e38c8e4deb29600990 (diff) | |
parent | 346118543b1fdbb9b662a36d22fec68efffb9b05 (diff) |
Merge "Suspend dialog improvememts" into sc-dev
4 files changed, 61 insertions, 0 deletions
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl index 2a50e0de2145..eb4c624be0b2 100644 --- a/core/java/android/app/usage/IUsageStatsManager.aidl +++ b/core/java/android/app/usage/IUsageStatsManager.aidl @@ -65,6 +65,7 @@ interface IUsageStatsManager { void reportPastUsageStart(in IBinder activity, String token, long timeAgoMs, String callingPackage); void reportUsageStop(in IBinder activity, String token, String callingPackage); + void reportUserInteraction(String packageName, int userId); int getUsageSource(); void forceUsageSourceSettingRead(); long getLastTimeAnyComponentUsed(String packageName); diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index 542473a3d2a9..e8175c709d85 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -982,6 +982,20 @@ public final class UsageStatsManager { } /** + * Reports user interaction with a given package in the given user. + * + * <p><em>This method is only for use by the system</em> + * @hide + */ + public void reportUserInteraction(@NonNull String packageName, int userId) { + try { + mService.reportUserInteraction(packageName, userId); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** * Report usage associated with a particular {@code token} has started. Tokens are app defined * strings used to represent usage of in-app features. Apps with the {@link * android.Manifest.permission#OBSERVE_APP_USAGE} permission can register time limit observers diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java index 86f29a8f07ef..84354d90b5f3 100644 --- a/core/java/com/android/internal/app/SuspendedAppActivity.java +++ b/core/java/com/android/internal/app/SuspendedAppActivity.java @@ -27,8 +27,12 @@ import android.annotation.Nullable; import android.app.AlertDialog; import android.app.AppGlobals; import android.app.KeyguardManager; +import android.app.usage.UsageStatsManager; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.IntentFilter; import android.content.IntentSender; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; @@ -64,9 +68,26 @@ public class SuspendedAppActivity extends AlertActivity private int mNeutralButtonAction; private int mUserId; private PackageManager mPm; + private UsageStatsManager mUsm; private Resources mSuspendingAppResources; private SuspendDialogInfo mSuppliedDialogInfo; private Bundle mOptions; + private BroadcastReceiver mUnsuspendReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_PACKAGES_UNSUSPENDED.equals(intent.getAction())) { + final String[] unsuspended = intent.getStringArrayExtra( + Intent.EXTRA_CHANGED_PACKAGE_LIST); + if (ArrayUtils.contains(unsuspended, mSuspendedPackage)) { + if (!isFinishing()) { + Slog.w(TAG, "Package " + mSuspendedPackage + + " got unsuspended while the dialog was visible. Finishing."); + SuspendedAppActivity.this.finish(); + } + } + } + } + }; private CharSequence getAppLabel(String packageName) { try { @@ -183,6 +204,7 @@ public class SuspendedAppActivity extends AlertActivity public void onCreate(Bundle icicle) { super.onCreate(icicle); mPm = getPackageManager(); + mUsm = getSystemService(UsageStatsManager.class); getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); final Intent intent = getIntent(); @@ -222,6 +244,16 @@ public class SuspendedAppActivity extends AlertActivity requestDismissKeyguardIfNeeded(ap.mMessage); setupAlert(); + + final IntentFilter unsuspendFilter = new IntentFilter(Intent.ACTION_PACKAGES_UNSUSPENDED); + registerReceiverAsUser(mUnsuspendReceiver, UserHandle.of(mUserId), unsuspendFilter, null, + null); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterReceiver(mUnsuspendReceiver); } private void requestDismissKeyguardIfNeeded(CharSequence dismissMessage) { @@ -292,6 +324,7 @@ public class SuspendedAppActivity extends AlertActivity } break; } + mUsm.reportUserInteraction(mSuspendingPackage, mUserId); finish(); } diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index a6b68e1e2ab2..309673d72dd4 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -24,6 +24,7 @@ import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK; import static android.app.usage.UsageEvents.Event.LOCUS_ID_SET; import static android.app.usage.UsageEvents.Event.NOTIFICATION_INTERRUPTION; import static android.app.usage.UsageEvents.Event.SHORTCUT_INVOCATION; +import static android.app.usage.UsageEvents.Event.USER_INTERACTION; import static android.app.usage.UsageEvents.Event.USER_STOPPED; import static android.app.usage.UsageEvents.Event.USER_UNLOCKED; import static android.app.usage.UsageStatsManager.USAGE_SOURCE_CURRENT_ACTIVITY; @@ -112,6 +113,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.TimeUnit; @@ -1988,6 +1990,17 @@ public class UsageStatsService extends SystemService implements } @Override + public void reportUserInteraction(String packageName, int userId) { + Objects.requireNonNull(packageName); + if (!isCallingUidSystem()) { + throw new SecurityException("Only system is allowed to call reportUserInteraction"); + } + final Event event = new Event(USER_INTERACTION, SystemClock.elapsedRealtime()); + event.mPackage = packageName; + reportEventOrAddToQueue(userId, event); + } + + @Override public void registerAppUsageObserver(int observerId, String[] packages, long timeLimitMs, PendingIntent callbackIntent, String callingPackage) { |