Loading core/java/android/app/usage/IUsageStatsManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading core/java/android/app/usage/UsageStatsManager.java +14 −0 Original line number Diff line number Diff line Loading @@ -981,6 +981,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 Loading core/java/com/android/internal/app/SuspendedAppActivity.java +33 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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(); Loading Loading @@ -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) { Loading Loading @@ -292,6 +324,7 @@ public class SuspendedAppActivity extends AlertActivity } break; } mUsm.reportUserInteraction(mSuspendingPackage, mUserId); finish(); } Loading services/usage/java/com/android/server/usage/UsageStatsService.java +13 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -1987,6 +1989,17 @@ public class UsageStatsService extends SystemService implements reportEventOrAddToQueue(userId, event); } @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 Loading Loading
core/java/android/app/usage/IUsageStatsManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
core/java/android/app/usage/UsageStatsManager.java +14 −0 Original line number Diff line number Diff line Loading @@ -981,6 +981,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 Loading
core/java/com/android/internal/app/SuspendedAppActivity.java +33 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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(); Loading Loading @@ -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) { Loading Loading @@ -292,6 +324,7 @@ public class SuspendedAppActivity extends AlertActivity } break; } mUsm.reportUserInteraction(mSuspendingPackage, mUserId); finish(); } Loading
services/usage/java/com/android/server/usage/UsageStatsService.java +13 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -1987,6 +1989,17 @@ public class UsageStatsService extends SystemService implements reportEventOrAddToQueue(userId, event); } @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 Loading