diff --git a/services/people/java/com/android/server/people/PeopleService.java b/services/people/java/com/android/server/people/PeopleService.java index 292320e498a32..885ed355011b0 100644 --- a/services/people/java/com/android/server/people/PeopleService.java +++ b/services/people/java/com/android/server/people/PeopleService.java @@ -63,9 +63,8 @@ public class PeopleService extends SystemService { private static final String TAG = "PeopleService"; - private DataManager mDataManager; - @VisibleForTesting - ConversationListenerHelper mConversationListenerHelper; + private DataManager mLazyDataManager; + private ConversationListenerHelper mLazyConversationListenerHelper; private PackageManagerInternal mPackageManagerInternal; @@ -76,17 +75,30 @@ public class PeopleService extends SystemService { */ public PeopleService(Context context) { super(context); - - mDataManager = new DataManager(context); - mConversationListenerHelper = new ConversationListenerHelper(); - mDataManager.addConversationsListener(mConversationListenerHelper); } - @Override - public void onBootPhase(int phase) { - if (phase == PHASE_SYSTEM_SERVICES_READY) { - mDataManager.initialize(); + @VisibleForTesting + ConversationListenerHelper getConversationListenerHelper() { + if (mLazyConversationListenerHelper == null) { + initLazyStuff(); } + return mLazyConversationListenerHelper; + } + + private synchronized void initLazyStuff() { + if (mLazyDataManager == null) { + mLazyDataManager = new DataManager(getContext()); + mLazyDataManager.initialize(); + mLazyConversationListenerHelper = new ConversationListenerHelper(); + mLazyDataManager.addConversationsListener(mLazyConversationListenerHelper); + } + } + + private DataManager getDataManager() { + if (mLazyDataManager == null) { + initLazyStuff(); + } + return mLazyDataManager; } @Override @@ -105,12 +117,12 @@ public class PeopleService extends SystemService { @Override public void onUserUnlocked(@NonNull TargetUser user) { - mDataManager.onUserUnlocked(user.getUserIdentifier()); + getDataManager().onUserUnlocked(user.getUserIdentifier()); } @Override public void onUserStopping(@NonNull TargetUser user) { - mDataManager.onUserStopping(user.getUserIdentifier()); + getDataManager().onUserStopping(user.getUserIdentifier()); } /** @@ -171,28 +183,28 @@ public class PeopleService extends SystemService { public ConversationChannel getConversation( String packageName, int userId, String shortcutId) { enforceSystemRootOrSystemUI(getContext(), "get conversation"); - return mDataManager.getConversation(packageName, userId, shortcutId); + return getDataManager().getConversation(packageName, userId, shortcutId); } @Override public ParceledListSlice getRecentConversations() { enforceSystemRootOrSystemUI(getContext(), "get recent conversations"); return new ParceledListSlice<>( - mDataManager.getRecentConversations( + getDataManager().getRecentConversations( Binder.getCallingUserHandle().getIdentifier())); } @Override public void removeRecentConversation(String packageName, int userId, String shortcutId) { enforceSystemOrRoot("remove a recent conversation"); - mDataManager.removeRecentConversation(packageName, userId, shortcutId, + getDataManager().removeRecentConversation(packageName, userId, shortcutId, Binder.getCallingUserHandle().getIdentifier()); } @Override public void removeAllRecentConversations() { enforceSystemOrRoot("remove all recent conversations"); - mDataManager.removeAllRecentConversations( + getDataManager().removeAllRecentConversations( Binder.getCallingUserHandle().getIdentifier()); } @@ -200,7 +212,7 @@ public class PeopleService extends SystemService { public boolean isConversation(String packageName, int userId, String shortcutId) { enforceHasReadPeopleDataPermission(); handleIncomingUser(userId); - return mDataManager.isConversation(packageName, userId, shortcutId); + return getDataManager().isConversation(packageName, userId, shortcutId); } private void enforceHasReadPeopleDataPermission() throws SecurityException { @@ -213,7 +225,7 @@ public class PeopleService extends SystemService { @Override public long getLastInteraction(String packageName, int userId, String shortcutId) { enforceSystemRootOrSystemUI(getContext(), "get last interaction"); - return mDataManager.getLastInteraction(packageName, userId, shortcutId); + return getDataManager().getLastInteraction(packageName, userId, shortcutId); } @Override @@ -224,7 +236,7 @@ public class PeopleService extends SystemService { if (status.getStartTimeMillis() > System.currentTimeMillis()) { throw new IllegalArgumentException("Start time must be in the past"); } - mDataManager.addOrUpdateStatus(packageName, userId, conversationId, status); + getDataManager().addOrUpdateStatus(packageName, userId, conversationId, status); } @Override @@ -232,14 +244,14 @@ public class PeopleService extends SystemService { String statusId) { handleIncomingUser(userId); checkCallerIsSameApp(packageName); - mDataManager.clearStatus(packageName, userId, conversationId, statusId); + getDataManager().clearStatus(packageName, userId, conversationId, statusId); } @Override public void clearStatuses(String packageName, int userId, String conversationId) { handleIncomingUser(userId); checkCallerIsSameApp(packageName); - mDataManager.clearStatuses(packageName, userId, conversationId); + getDataManager().clearStatuses(packageName, userId, conversationId); } @Override @@ -250,21 +262,21 @@ public class PeopleService extends SystemService { checkCallerIsSameApp(packageName); } return new ParceledListSlice<>( - mDataManager.getStatuses(packageName, userId, conversationId)); + getDataManager().getStatuses(packageName, userId, conversationId)); } @Override public void registerConversationListener( String packageName, int userId, String shortcutId, IConversationListener listener) { enforceSystemRootOrSystemUI(getContext(), "register conversation listener"); - mConversationListenerHelper.addConversationListener( + getConversationListenerHelper().addConversationListener( new ListenerKey(packageName, userId, shortcutId), listener); } @Override public void unregisterConversationListener(IConversationListener listener) { enforceSystemRootOrSystemUI(getContext(), "unregister conversation listener"); - mConversationListenerHelper.removeConversationListener(listener); + getConversationListenerHelper().removeConversationListener(listener); } }; @@ -393,7 +405,7 @@ public class PeopleService extends SystemService { public void onCreatePredictionSession(AppPredictionContext appPredictionContext, AppPredictionSessionId sessionId) { mSessions.put(sessionId, - new SessionInfo(appPredictionContext, mDataManager, sessionId.getUserId(), + new SessionInfo(appPredictionContext, getDataManager(), sessionId.getUserId(), getContext())); } @@ -448,18 +460,18 @@ public class PeopleService extends SystemService { @Override public void pruneDataForUser(@UserIdInt int userId, @NonNull CancellationSignal signal) { - mDataManager.pruneDataForUser(userId, signal); + getDataManager().pruneDataForUser(userId, signal); } @Nullable @Override public byte[] getBackupPayload(@UserIdInt int userId) { - return mDataManager.getBackupPayload(userId); + return getDataManager().getBackupPayload(userId); } @Override public void restore(@UserIdInt int userId, @NonNull byte[] payload) { - mDataManager.restore(userId, payload); + getDataManager().restore(userId, payload); } @VisibleForTesting diff --git a/services/tests/servicestests/src/com/android/server/people/PeopleServiceTest.java b/services/tests/servicestests/src/com/android/server/people/PeopleServiceTest.java index 5066240642656..aed8491fdcde4 100644 --- a/services/tests/servicestests/src/com/android/server/people/PeopleServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/people/PeopleServiceTest.java @@ -41,8 +41,10 @@ import android.app.prediction.AppPredictionSessionId; import android.app.prediction.AppTarget; import android.app.prediction.IPredictionCallback; import android.content.Context; +import android.content.pm.PackageManagerInternal; import android.content.pm.ParceledListSlice; import android.content.pm.ShortcutInfo; +import android.content.pm.ShortcutServiceInternal; import android.os.Binder; import android.os.Bundle; import android.os.RemoteException; @@ -56,6 +58,7 @@ import androidx.test.InstrumentationRegistry; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.server.LocalServices; +import com.android.server.notification.NotificationManagerInternal; import org.junit.After; import org.junit.Before; @@ -86,6 +89,13 @@ public final class PeopleServiceTest { private AppPredictionSessionId mSessionId; private AppPredictionContext mPredictionContext; + @Mock + ShortcutServiceInternal mShortcutServiceInternal; + @Mock + PackageManagerInternal mPackageManagerInternal; + @Mock + NotificationManagerInternal mNotificationManagerInternal; + @Mock private Context mMockContext; @@ -110,6 +120,10 @@ public final class PeopleServiceTest { public void setUp() { MockitoAnnotations.initMocks(this); + LocalServices.addService(ShortcutServiceInternal.class, mShortcutServiceInternal); + LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal); + LocalServices.addService(NotificationManagerInternal.class, mNotificationManagerInternal); + mPeopleService = new TestablePeopleService(mContext); mTestableLooper = TestableLooper.get(this); mIPeopleManager = ((IPeopleManager) mPeopleService.mService); @@ -137,6 +151,9 @@ public final class PeopleServiceTest { @After public void tearDown() { LocalServices.removeServiceForTest(PeopleServiceInternal.class); + LocalServices.removeServiceForTest(ShortcutServiceInternal.class); + LocalServices.removeServiceForTest(PackageManagerInternal.class); + LocalServices.removeServiceForTest(NotificationManagerInternal.class); } @Test @@ -167,25 +184,29 @@ public final class PeopleServiceTest { @Test public void testRegisterConversationListener() throws Exception { assertEquals(0, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); mIPeopleManager.registerConversationListener(TEST_PACKAGE_NAME, 0, CONVERSATION_ID_1, new TestableConversationListener()); mTestableLooper.processAllMessages(); assertEquals(1, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); mIPeopleManager.registerConversationListener(TEST_PACKAGE_NAME, 0, CONVERSATION_ID_1, new TestableConversationListener()); mTestableLooper.processAllMessages(); assertEquals(2, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); mIPeopleManager.registerConversationListener(TEST_PACKAGE_NAME, 0, CONVERSATION_ID_2, new TestableConversationListener()); mTestableLooper.processAllMessages(); assertEquals(3, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); } @Test @@ -201,20 +222,24 @@ public final class PeopleServiceTest { listener3); mTestableLooper.processAllMessages(); assertEquals(3, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); mIPeopleManager.unregisterConversationListener( listener2); assertEquals(2, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); mIPeopleManager.unregisterConversationListener( listener1); assertEquals(1, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); mIPeopleManager.unregisterConversationListener( listener3); assertEquals(0, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); } @Test @@ -229,12 +254,13 @@ public final class PeopleServiceTest { PeopleManager.ConversationListener.class); registerListener(CONVERSATION_ID_2, listenerForConversation2); assertEquals(3, - mPeopleService.mConversationListenerHelper.mListeners.getRegisteredCallbackCount()); + mPeopleService.getConversationListenerHelper() + .mListeners.getRegisteredCallbackCount()); // Update conversation with two listeners. ConversationStatus status = new ConversationStatus.Builder(CONVERSATION_ID_1, ACTIVITY_GAME).build(); - mPeopleService.mConversationListenerHelper.onConversationsUpdate( + mPeopleService.getConversationListenerHelper().onConversationsUpdate( Arrays.asList(getConversation(CONVERSATION_ID_1, status))); mTestLooper.dispatchAll();