Move UsageStatsManagerInternal to services.jar

UsageStatsManagerInternal is also no longer an API surface for
registration of app idle state change listeners.  AppStandbyInternal has
become a proper LocalService and interested clients can just use that
directly.

Bug: 140833849
Test: boot & run normally
Test: verify system package backup
Change-Id: Ie63f438f129cd8f41169778a3045d131ca7322fb
This commit is contained in:
Christopher Tate
2019-10-21 12:50:37 -07:00
committed by Chris Tate
parent b9e31e10a4
commit b909c4d55a
13 changed files with 69 additions and 73 deletions

View File

@@ -1,9 +1,9 @@
package com.android.server.usage;
import android.annotation.UserIdInt;
import android.app.usage.AppStandbyInfo;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManager.StandbyBuckets;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
import android.content.Context;
import android.os.Looper;
@@ -33,6 +33,24 @@ public interface AppStandbyInternal {
}
}
/**
* Listener interface for notifications that an app's idle state changed.
*/
abstract static class AppIdleStateChangeListener {
/** Callback to inform listeners that the idle state has changed to a new bucket. */
public abstract void onAppIdleStateChanged(String packageName, @UserIdInt int userId,
boolean idle, int bucket, int reason);
/**
* Optional callback to inform the listener that the app has transitioned into
* an active state due to user interaction.
*/
public void onUserInteractionStarted(String packageName, @UserIdInt int userId) {
// No-op by default
}
}
void onBootPhase(int phase);
void postCheckIdleStates(int userId);

View File

@@ -37,7 +37,6 @@ import android.app.job.JobSnapshot;
import android.app.job.JobWorkItem;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -103,6 +102,8 @@ import com.android.server.job.controllers.StorageController;
import com.android.server.job.controllers.TimeController;
import com.android.server.job.restrictions.JobRestriction;
import com.android.server.job.restrictions.ThermalStatusRestriction;
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import libcore.util.EmptyArray;
@@ -1295,7 +1296,9 @@ public class JobSchedulerService extends com.android.server.SystemService
// Set up the app standby bucketing tracker
mStandbyTracker = new StandbyTracker();
mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
mUsageStats.addAppIdleStateChangeListener(mStandbyTracker);
AppStandbyInternal appStandby = LocalServices.getService(AppStandbyInternal.class);
appStandby.addListener(mStandbyTracker);
// The job store needs to call back
publishLocalService(JobSchedulerInternal.class, new LocalService());

View File

@@ -35,8 +35,6 @@ import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.IUidObserver;
import android.app.usage.UsageStatsManagerInternal;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -70,6 +68,8 @@ import com.android.server.job.ConstantsProto;
import com.android.server.job.JobSchedulerService;
import com.android.server.job.JobServiceContext;
import com.android.server.job.StateControllerProto;
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import java.util.ArrayList;
import java.util.List;
@@ -574,9 +574,8 @@ public final class QuotaController extends StateController {
mContext.registerReceiverAsUser(mPackageAddedReceiver, UserHandle.ALL, filter, null, null);
// Set up the app standby bucketing tracker
UsageStatsManagerInternal usageStats = LocalServices.getService(
UsageStatsManagerInternal.class);
usageStats.addAppIdleStateChangeListener(new StandbyTracker());
AppStandbyInternal appStandby = LocalServices.getService(AppStandbyInternal.class);
appStandby.addListener(new StandbyTracker());
try {
ActivityManager.getService().registerUidObserver(mUidObserver,

View File

@@ -53,7 +53,6 @@ import android.app.AppGlobals;
import android.app.usage.AppStandbyInfo;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManager.StandbyBuckets;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
@@ -102,6 +101,7 @@ import com.android.internal.util.ConcurrentUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.usage.AppIdleHistory.AppUsageHistory;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import java.io.File;
import java.io.PrintWriter;

View File

@@ -23,6 +23,8 @@ import android.content.res.Configuration;
import android.os.UserHandle;
import android.os.UserManager;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import java.util.List;
import java.util.Set;
@@ -153,35 +155,6 @@ public abstract class UsageStatsManagerInternal {
*/
public abstract int[] getIdleUidsForUser(@UserIdInt int userId);
/**
* Sets up a listener for changes to packages being accessed.
* @param listener A listener within the system process.
*/
public abstract void addAppIdleStateChangeListener(
AppIdleStateChangeListener listener);
/**
* Removes a listener that was previously added for package usage state changes.
* @param listener The listener within the system process to remove.
*/
public abstract void removeAppIdleStateChangeListener(
AppIdleStateChangeListener listener);
public static abstract class AppIdleStateChangeListener {
/** Callback to inform listeners that the idle state has changed to a new bucket. */
public abstract void onAppIdleStateChanged(String packageName, @UserIdInt int userId,
boolean idle, int bucket, int reason);
/**
* Optional callback to inform the listener that the app has transitioned into
* an active state due to user interaction.
*/
public void onUserInteractionStarted(String packageName, @UserIdInt int userId) {
// No-op by default
}
}
/** Backup/Restore API */
public abstract byte[] getBackupPayload(@UserIdInt int userId, String key);

View File

@@ -99,6 +99,8 @@ import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.LocalLog;
import com.android.internal.util.StatLogger;
import com.android.server.AppStateTracker.Listener;
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
@@ -1599,7 +1601,9 @@ class AlarmManagerService extends SystemService {
LocalServices.getService(DeviceIdleInternal.class);
mUsageStatsManagerInternal =
LocalServices.getService(UsageStatsManagerInternal.class);
mUsageStatsManagerInternal.addAppIdleStateChangeListener(new AppStandbyTracker());
AppStandbyInternal appStandbyInternal =
LocalServices.getService(AppStandbyInternal.class);
appStandbyInternal.addListener(new AppStandbyTracker());
mAppStateTracker = LocalServices.getService(AppStateTracker.class);
mAppStateTracker.addListener(mForceAppStandbyListener);
@@ -4468,7 +4472,7 @@ class AlarmManagerService extends SystemService {
* Tracking of app assignments to standby buckets
*/
private final class AppStandbyTracker extends
UsageStatsManagerInternal.AppIdleStateChangeListener {
AppIdleStateChangeListener {
@Override
public void onAppIdleStateChanged(final String packageName, final @UserIdInt int userId,
boolean idle, int bucket, int reason) {

View File

@@ -24,7 +24,6 @@ import android.app.IActivityManager;
import android.app.IUidObserver;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -58,6 +57,8 @@ import com.android.internal.util.Preconditions;
import com.android.internal.util.StatLogger;
import com.android.server.AppStateTrackerProto.ExemptedPackage;
import com.android.server.AppStateTrackerProto.RunAnyInBackgroundRestrictedPackages;
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import java.io.PrintWriter;
import java.util.Arrays;
@@ -89,7 +90,7 @@ public class AppStateTracker {
IAppOpsService mAppOpsService;
PowerManagerInternal mPowerManagerInternal;
StandbyTracker mStandbyTracker;
UsageStatsManagerInternal mUsageStatsManagerInternal;
AppStandbyInternal mAppStandbyInternal;
private final MyHandler mHandler;
@@ -420,8 +421,7 @@ public class AppStateTracker {
mAppOpsManager = Preconditions.checkNotNull(injectAppOpsManager());
mAppOpsService = Preconditions.checkNotNull(injectIAppOpsService());
mPowerManagerInternal = Preconditions.checkNotNull(injectPowerManagerInternal());
mUsageStatsManagerInternal = Preconditions.checkNotNull(
injectUsageStatsManagerInternal());
mAppStandbyInternal = Preconditions.checkNotNull(injectAppStandbyInternal());
mFlagsObserver = new FeatureFlagsObserver();
mFlagsObserver.register();
@@ -429,7 +429,7 @@ public class AppStateTracker {
mForceAllAppStandbyForSmallBattery =
mFlagsObserver.isForcedAppStandbyForSmallBatteryEnabled();
mStandbyTracker = new StandbyTracker();
mUsageStatsManagerInternal.addAppIdleStateChangeListener(mStandbyTracker);
mAppStandbyInternal.addListener(mStandbyTracker);
try {
mIActivityManager.registerUidObserver(new UidObserver(),
@@ -494,8 +494,8 @@ public class AppStateTracker {
}
@VisibleForTesting
UsageStatsManagerInternal injectUsageStatsManagerInternal() {
return LocalServices.getService(UsageStatsManagerInternal.class);
AppStandbyInternal injectAppStandbyInternal() {
return LocalServices.getService(AppStandbyInternal.class);
}
@VisibleForTesting

View File

@@ -229,6 +229,8 @@ import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.SystemConfig;
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import libcore.io.IoUtils;
@@ -396,6 +398,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
private NetworkStatsManagerInternal mNetworkStats;
private final INetworkManagementService mNetworkManager;
private UsageStatsManagerInternal mUsageStats;
private AppStandbyInternal mAppStandby;
private final Clock mClock;
private final UserManager mUserManager;
private final CarrierConfigManager mCarrierConfigManager;
@@ -734,6 +737,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
mAppStandby = LocalServices.getService(AppStandbyInternal.class);
mNetworkStats = LocalServices.getService(NetworkStatsManagerInternal.class);
synchronized (mUidRulesFirstLock) {
@@ -868,7 +872,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mContext.getSystemService(ConnectivityManager.class).registerNetworkCallback(
new NetworkRequest.Builder().build(), mNetworkCallback);
mUsageStats.addAppIdleStateChangeListener(new AppIdleStateChangeListener());
mAppStandby.addListener(new NetPolicyAppIdleStateChangeListener());
// Listen for subscriber changes
mContext.getSystemService(SubscriptionManager.class).addOnSubscriptionsChangedListener(
@@ -4375,9 +4379,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return newUidRules;
}
private class AppIdleStateChangeListener
extends UsageStatsManagerInternal.AppIdleStateChangeListener {
private class NetPolicyAppIdleStateChangeListener extends AppIdleStateChangeListener {
@Override
public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket,
int reason) {

View File

@@ -85,6 +85,7 @@ import androidx.test.filters.FlakyTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.annotations.GuardedBy;
import com.android.server.usage.AppStandbyInternal;
import org.junit.After;
import org.junit.Before;
@@ -108,7 +109,7 @@ public class AlarmManagerServiceTest {
private long mAppStandbyWindow;
private AlarmManagerService mService;
private UsageStatsManagerInternal.AppIdleStateChangeListener mAppStandbyListener;
private AppStandbyInternal.AppIdleStateChangeListener mAppStandbyListener;
private AlarmManagerService.ChargingReceiver mChargingReceiver;
@Mock
private ContentResolver mMockResolver;
@@ -119,6 +120,8 @@ public class AlarmManagerServiceTest {
@Mock
private UsageStatsManagerInternal mUsageStatsManagerInternal;
@Mock
private AppStandbyInternal mAppStandbyInternal;
@Mock
private AppStateTracker mAppStateTracker;
@Mock
private AlarmManagerService.ClockReceiver mClockReceiver;
@@ -257,6 +260,8 @@ public class AlarmManagerServiceTest {
doReturn(mAppStateTracker).when(() -> LocalServices.getService(AppStateTracker.class));
doReturn(null)
.when(() -> LocalServices.getService(DeviceIdleInternal.class));
doReturn(mAppStandbyInternal).when(
() -> LocalServices.getService(AppStandbyInternal.class));
doReturn(mUsageStatsManagerInternal).when(
() -> LocalServices.getService(UsageStatsManagerInternal.class));
when(mUsageStatsManagerInternal.getAppStandbyBucket(eq(TEST_CALLING_PACKAGE),
@@ -289,9 +294,9 @@ public class AlarmManagerServiceTest {
assertEquals(0, mService.mConstants.MIN_FUTURITY);
assertEquals(0, mService.mConstants.MIN_INTERVAL);
mAppStandbyWindow = mService.mConstants.APP_STANDBY_WINDOW;
ArgumentCaptor<UsageStatsManagerInternal.AppIdleStateChangeListener> captor =
ArgumentCaptor.forClass(UsageStatsManagerInternal.AppIdleStateChangeListener.class);
verify(mUsageStatsManagerInternal).addAppIdleStateChangeListener(captor.capture());
ArgumentCaptor<AppStandbyInternal.AppIdleStateChangeListener> captor =
ArgumentCaptor.forClass(AppStandbyInternal.AppIdleStateChangeListener.class);
verify(mAppStandbyInternal).addListener(captor.capture());
mAppStandbyListener = captor.getValue();
ArgumentCaptor<AlarmManagerService.ChargingReceiver> chargingReceiverCaptor =

View File

@@ -45,7 +45,6 @@ import android.app.IActivityManager;
import android.app.IUidObserver;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -70,6 +69,8 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.server.AppStateTracker.Listener;
import com.android.server.usage.AppStandbyInternal;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import org.junit.Before;
import org.junit.Test;
@@ -128,8 +129,8 @@ public class AppStateTrackerTest {
}
@Override
UsageStatsManagerInternal injectUsageStatsManagerInternal() {
return mMockUsageStatsManagerInternal;
AppStandbyInternal injectAppStandbyInternal() {
return mMockAppStandbyInternal;
}
@Override
@@ -175,7 +176,7 @@ public class AppStateTrackerTest {
private PowerManagerInternal mMockPowerManagerInternal;
@Mock
private UsageStatsManagerInternal mMockUsageStatsManagerInternal;
private AppStandbyInternal mMockAppStandbyInternal;
private MockContentResolver mMockContentResolver;
@@ -271,7 +272,7 @@ public class AppStateTrackerTest {
verify(mMockContext).registerReceiver(
receiverCaptor.capture(), any(IntentFilter.class));
verify(mMockUsageStatsManagerInternal).addAppIdleStateChangeListener(
verify(mMockAppStandbyInternal).addListener(
appIdleStateChangeListenerCaptor.capture());
mIUidObserver = uidObserverArgumentCaptor.getValue();

View File

@@ -86,6 +86,7 @@ import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -180,8 +181,8 @@ public class UsageStatsService extends SystemService implements
}
}
private UsageStatsManagerInternal.AppIdleStateChangeListener mStandbyChangeListener =
new UsageStatsManagerInternal.AppIdleStateChangeListener() {
private AppIdleStateChangeListener mStandbyChangeListener =
new AppIdleStateChangeListener() {
@Override
public void onAppIdleStateChanged(String packageName, int userId, boolean idle,
int bucket, int reason) {
@@ -253,6 +254,7 @@ public class UsageStatsService extends SystemService implements
null, mHandler);
publishLocalService(UsageStatsManagerInternal.class, new LocalService());
publishLocalService(AppStandbyInternal.class, mAppStandby);
publishBinderService(Context.USAGE_STATS_SERVICE, new BinderService());
}
@@ -2028,17 +2030,6 @@ public class UsageStatsService extends SystemService implements
UsageStatsService.this.prepareForPossibleShutdown();
}
@Override
public void addAppIdleStateChangeListener(AppIdleStateChangeListener listener) {
mAppStandby.addListener(listener);
}
@Override
public void removeAppIdleStateChangeListener(
AppIdleStateChangeListener listener) {
mAppStandby.removeListener(listener);
}
@Override
public byte[] getBackupPayload(int user, String key) {
synchronized (mLock) {