summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuprabh Shukla <suprabh@google.com>2021-04-13 23:57:38 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-04-13 23:57:38 +0000
commit9da117df72d89b54ce1ede6f9ac36c9b2cad1761 (patch)
tree33acb371c0e053648e71450fcd878cfc34220687
parent522de6d8df18cc2a9fd773e38c8e4deb29600990 (diff)
parent346118543b1fdbb9b662a36d22fec68efffb9b05 (diff)
Merge "Suspend dialog improvememts" into sc-dev
-rw-r--r--core/java/android/app/usage/IUsageStatsManager.aidl1
-rw-r--r--core/java/android/app/usage/UsageStatsManager.java14
-rw-r--r--core/java/com/android/internal/app/SuspendedAppActivity.java33
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsService.java13
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) {