Merge "Rename OnProjectionStateChangeListener -> OnProjectionStateChangedListener" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-05-06 18:36:32 +00:00
committed by Android (Google) Code Review
8 changed files with 78 additions and 77 deletions

View File

@@ -56,7 +56,7 @@ public final class DeviceIdlenessTracker extends BroadcastReceiver implements Id
private boolean mDockIdle;
private boolean mProjectionActive;
private IdlenessListener mIdleListener;
private final UiModeManager.OnProjectionStateChangeListener mOnProjectionStateChangeListener =
private final UiModeManager.OnProjectionStateChangedListener mOnProjectionStateChangedListener =
this::onProjectionStateChanged;
private AlarmManager.OnAlarmListener mIdleAlarmListener = () -> {
@@ -105,9 +105,9 @@ public final class DeviceIdlenessTracker extends BroadcastReceiver implements Id
// TODO(b/172579710): Move the callbacks off the main executor and on to
// JobSchedulerBackgroundThread.getExecutor() once synchronization is fixed in this class.
context.getSystemService(UiModeManager.class).addOnProjectionStateChangeListener(
context.getSystemService(UiModeManager.class).addOnProjectionStateChangedListener(
UiModeManager.PROJECTION_TYPE_ALL, context.getMainExecutor(),
mOnProjectionStateChangeListener);
mOnProjectionStateChangedListener);
}
private void onProjectionStateChanged(@UiModeManager.ProjectionType int activeProjectionTypes,

View File

@@ -838,12 +838,12 @@ package android.app {
}
public class UiModeManager {
method @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public void addOnProjectionStateChangeListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.app.UiModeManager.OnProjectionStateChangeListener);
method @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public void addOnProjectionStateChangedListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.app.UiModeManager.OnProjectionStateChangedListener);
method @RequiresPermission(android.Manifest.permission.ENTER_CAR_MODE_PRIORITIZED) public void enableCarMode(@IntRange(from=0) int, int);
method @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public int getActiveProjectionTypes();
method @NonNull @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public java.util.Set<java.lang.String> getProjectingPackages(int);
method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean releaseProjection(int);
method @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public void removeOnProjectionStateChangeListener(@NonNull android.app.UiModeManager.OnProjectionStateChangeListener);
method @RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE) public void removeOnProjectionStateChangedListener(@NonNull android.app.UiModeManager.OnProjectionStateChangedListener);
method @RequiresPermission(value=android.Manifest.permission.TOGGLE_AUTOMOTIVE_PROJECTION, conditional=true) public boolean requestProjection(int);
field public static final String ACTION_ENTER_CAR_MODE_PRIORITIZED = "android.app.action.ENTER_CAR_MODE_PRIORITIZED";
field public static final String ACTION_EXIT_CAR_MODE_PRIORITIZED = "android.app.action.EXIT_CAR_MODE_PRIORITIZED";
@@ -855,7 +855,7 @@ package android.app {
field public static final int PROJECTION_TYPE_NONE = 0; // 0x0
}
public static interface UiModeManager.OnProjectionStateChangeListener {
public static interface UiModeManager.OnProjectionStateChangedListener {
method public void onProjectionStateChanged(int, @NonNull java.util.Set<java.lang.String>);
}

View File

@@ -17,6 +17,6 @@
package android.app;
/** {@hide} */
oneway interface IOnProjectionStateChangeListener {
oneway interface IOnProjectionStateChangedListener {
void onProjectionStateChanged(int activeProjectionTypes, in List<String> projectingPackages);
}

View File

@@ -16,7 +16,7 @@
package android.app;
import android.app.IOnProjectionStateChangeListener;
import android.app.IOnProjectionStateChangedListener;
/**
* Interface used to control special UI modes.
@@ -119,12 +119,12 @@ interface IUiModeManager {
/**
* Registers a listener for changes to projection state.
*/
void addOnProjectionStateChangeListener(in IOnProjectionStateChangeListener listener, int projectionType);
void addOnProjectionStateChangedListener(in IOnProjectionStateChangedListener listener, int projectionType);
/**
* Unregisters a listener for changes to projection state.
*/
void removeOnProjectionStateChangeListener(in IOnProjectionStateChangeListener listener);
void removeOnProjectionStateChangedListener(in IOnProjectionStateChangedListener listener);
/**
* Returns packages that have currently set the given projection type.

View File

@@ -79,7 +79,7 @@ public class UiModeManager {
* @hide
*/
@SystemApi
public interface OnProjectionStateChangeListener {
public interface OnProjectionStateChangedListener {
/**
* Callback invoked when projection state changes for a {@link ProjectionType} for which
* this listener was added.
@@ -254,10 +254,10 @@ public class UiModeManager {
private final Object mLock = new Object();
/**
* Map that stores internally created {@link InnerListener} objects keyed by their corresponding
* externally provided {@link OnProjectionStateChangeListener} objects.
* externally provided callback objects.
*/
@GuardedBy("mLock")
private final Map<OnProjectionStateChangeListener, InnerListener>
private final Map<OnProjectionStateChangedListener, InnerListener>
mProjectionStateListenerMap = new ArrayMap<>();
/**
@@ -265,9 +265,9 @@ public class UiModeManager {
* fail to remove listeners.
*/
@GuardedBy("mLock")
private final OnProjectionStateChangeListenerResourceManager
mOnProjectionStateChangeListenerResourceManager =
new OnProjectionStateChangeListenerResourceManager();
private final OnProjectionStateChangedListenerResourceManager
mOnProjectionStateChangedListenerResourceManager =
new OnProjectionStateChangedListenerResourceManager();
@UnsupportedAppUsage
/*package*/ UiModeManager() throws ServiceNotFoundException {
@@ -687,7 +687,7 @@ public class UiModeManager {
/**
* Indicates no projection type. Can be used to compare with the {@link ProjectionType} in
* {@link OnProjectionStateChangeListener#onProjectionStateChanged(int, Set)}.
* {@link OnProjectionStateChangedListener#onProjectionStateChanged(int, Set)}.
*
* @hide
*/
@@ -706,7 +706,7 @@ public class UiModeManager {
public static final int PROJECTION_TYPE_AUTOMOTIVE = 0x0001;
/**
* Indicates all projection types. For use with
* {@link #addOnProjectionStateChangeListener(int, Executor, OnProjectionStateChangeListener)}
* {@link #addOnProjectionStateChangedListener(int, Executor, OnProjectionStateChangedListener)}
* and {@link #getProjectingPackages(int)}.
*
* @hide
@@ -829,15 +829,15 @@ public class UiModeManager {
*
* @param projectionType one or more {@link ProjectionType}s to listen for changes regarding
* @param executor an {@link Executor} on which to invoke the callbacks
* @param listener the {@link OnProjectionStateChangeListener} to add
* @param listener the {@link OnProjectionStateChangedListener} to add
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE)
public void addOnProjectionStateChangeListener(@ProjectionType int projectionType,
public void addOnProjectionStateChangedListener(@ProjectionType int projectionType,
@NonNull @CallbackExecutor Executor executor,
@NonNull OnProjectionStateChangeListener listener) {
@NonNull OnProjectionStateChangedListener listener) {
synchronized (mLock) {
if (mProjectionStateListenerMap.containsKey(listener)) {
Slog.i(TAG, "Attempted to add listener that was already added.");
@@ -845,12 +845,12 @@ public class UiModeManager {
}
if (mService != null) {
InnerListener innerListener = new InnerListener(executor, listener,
mOnProjectionStateChangeListenerResourceManager);
mOnProjectionStateChangedListenerResourceManager);
try {
mService.addOnProjectionStateChangeListener(innerListener, projectionType);
mService.addOnProjectionStateChangedListener(innerListener, projectionType);
mProjectionStateListenerMap.put(listener, innerListener);
} catch (RemoteException e) {
mOnProjectionStateChangeListenerResourceManager.remove(innerListener);
mOnProjectionStateChangedListenerResourceManager.remove(innerListener);
throw e.rethrowFromSystemServer();
}
}
@@ -860,14 +860,14 @@ public class UiModeManager {
/**
* Removes the listener so it stops receiving updates for all {@link ProjectionType}s.
*
* @param listener the {@link OnProjectionStateChangeListener} to remove
* @param listener the {@link OnProjectionStateChangedListener} to remove
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.READ_PROJECTION_STATE)
public void removeOnProjectionStateChangeListener(
@NonNull OnProjectionStateChangeListener listener) {
public void removeOnProjectionStateChangedListener(
@NonNull OnProjectionStateChangedListener listener) {
synchronized (mLock) {
InnerListener innerListener = mProjectionStateListenerMap.get(listener);
if (innerListener == null) {
@@ -876,23 +876,23 @@ public class UiModeManager {
}
if (mService != null) {
try {
mService.removeOnProjectionStateChangeListener(innerListener);
mService.removeOnProjectionStateChangedListener(innerListener);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
mProjectionStateListenerMap.remove(listener);
mOnProjectionStateChangeListenerResourceManager.remove(innerListener);
mOnProjectionStateChangedListenerResourceManager.remove(innerListener);
}
}
private static class InnerListener extends IOnProjectionStateChangeListener.Stub {
private final WeakReference<OnProjectionStateChangeListenerResourceManager>
private static class InnerListener extends IOnProjectionStateChangedListener.Stub {
private final WeakReference<OnProjectionStateChangedListenerResourceManager>
mResourceManager;
private InnerListener(@NonNull Executor executor,
@NonNull OnProjectionStateChangeListener outerListener,
@NonNull OnProjectionStateChangeListenerResourceManager resourceManager) {
@NonNull OnProjectionStateChangedListener outerListener,
@NonNull OnProjectionStateChangedListenerResourceManager resourceManager) {
resourceManager.put(this, executor, outerListener);
mResourceManager = new WeakReference<>(resourceManager);
}
@@ -900,13 +900,14 @@ public class UiModeManager {
@Override
public void onProjectionStateChanged(int activeProjectionTypes,
List<String> projectingPackages) {
OnProjectionStateChangeListenerResourceManager resourceManager = mResourceManager.get();
OnProjectionStateChangedListenerResourceManager resourceManager =
mResourceManager.get();
if (resourceManager == null) {
Slog.w(TAG, "Can't execute onProjectionStateChanged, resource manager is gone.");
return;
}
OnProjectionStateChangeListener outerListener = resourceManager.getOuterListener(this);
OnProjectionStateChangedListener outerListener = resourceManager.getOuterListener(this);
Executor executor = resourceManager.getExecutor(this);
if (outerListener == null || executor == null) {
Slog.w(TAG, "Can't execute onProjectionStatechanged, references are null.");
@@ -914,7 +915,7 @@ public class UiModeManager {
}
executor.execute(PooledLambda.obtainRunnable(
OnProjectionStateChangeListener::onProjectionStateChanged,
OnProjectionStateChangedListener::onProjectionStateChanged,
outerListener,
activeProjectionTypes,
new ArraySet<>(projectingPackages)).recycleOnUse());
@@ -924,15 +925,15 @@ public class UiModeManager {
/**
* Wrapper class that ensures we don't leak {@link Activity} or other large {@link Context} in
* which this {@link UiModeManager} resides if/when it ends without unregistering associated
* {@link OnProjectionStateChangeListener}s.
* callback objects.
*/
private static class OnProjectionStateChangeListenerResourceManager {
private final Map<InnerListener, OnProjectionStateChangeListener> mOuterListenerMap =
private static class OnProjectionStateChangedListenerResourceManager {
private final Map<InnerListener, OnProjectionStateChangedListener> mOuterListenerMap =
new ArrayMap<>(1);
private final Map<InnerListener, Executor> mExecutorMap = new ArrayMap<>(1);
void put(@NonNull InnerListener innerListener, @NonNull Executor executor,
OnProjectionStateChangeListener outerListener) {
OnProjectionStateChangedListener outerListener) {
mOuterListenerMap.put(innerListener, outerListener);
mExecutorMap.put(innerListener, executor);
}
@@ -942,7 +943,7 @@ public class UiModeManager {
mExecutorMap.remove(innerListener);
}
OnProjectionStateChangeListener getOuterListener(@NonNull InnerListener innerListener) {
OnProjectionStateChangedListener getOuterListener(@NonNull InnerListener innerListener) {
return mOuterListenerMap.get(innerListener);
}

View File

@@ -33,7 +33,7 @@ import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.app.AlarmManager;
import android.app.IOnProjectionStateChangeListener;
import android.app.IOnProjectionStateChangedListener;
import android.app.IUiModeManager;
import android.app.Notification;
import android.app.NotificationManager;
@@ -181,7 +181,7 @@ final class UiModeManagerService extends SystemService {
private SparseArray<List<ProjectionHolder>> mProjectionHolders;
@GuardedBy("mLock")
@Nullable
private SparseArray<RemoteCallbackList<IOnProjectionStateChangeListener>> mProjectionListeners;
private SparseArray<RemoteCallbackList<IOnProjectionStateChangedListener>> mProjectionListeners;
public UiModeManagerService(Context context) {
this(context, /* setupWizardComplete= */ false, /* tm= */ null, new Injector());
@@ -993,11 +993,11 @@ final class UiModeManagerService extends SystemService {
}
}
public void addOnProjectionStateChangeListener(IOnProjectionStateChangeListener listener,
public void addOnProjectionStateChangedListener(IOnProjectionStateChangedListener listener,
@UiModeManager.ProjectionType int projectionType) {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.READ_PROJECTION_STATE,
"registerProjectionStateListener");
"addOnProjectionStateChangedListener");
if (projectionType == PROJECTION_TYPE_NONE) {
return;
}
@@ -1027,11 +1027,11 @@ final class UiModeManagerService extends SystemService {
}
public void removeOnProjectionStateChangeListener(
IOnProjectionStateChangeListener listener) {
public void removeOnProjectionStateChangedListener(
IOnProjectionStateChangedListener listener) {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.READ_PROJECTION_STATE,
"unregisterProjectionStateListener");
"removeOnProjectionStateChangedListener");
synchronized (mLock) {
if (mProjectionListeners != null) {
for (int i = 0; i < mProjectionListeners.size(); ++i) {
@@ -1191,7 +1191,7 @@ final class UiModeManagerService extends SystemService {
// Every listener that is affected must be called back with all the state they are
// listening for.
if ((changedProjectionType & listenerProjectionType) != 0) {
RemoteCallbackList<IOnProjectionStateChangeListener> listeners =
RemoteCallbackList<IOnProjectionStateChangedListener> listeners =
mProjectionListeners.valueAt(i);
List<String> packageNames = new ArrayList<>();
@UiModeManager.ProjectionType int activeProjectionTypes =

View File

@@ -256,7 +256,7 @@ public class BatterySaverPolicy extends ContentObserver implements
private final ContentResolver mContentResolver;
private final BatterySavingStats mBatterySavingStats;
private final UiModeManager.OnProjectionStateChangeListener mOnProjectionStateChangeListener =
private final UiModeManager.OnProjectionStateChangedListener mOnProjectionStateChangedListener =
(t, pkgs) -> mAutomotiveProjectionActive.update(!pkgs.isEmpty());
@GuardedBy("mLock")
@@ -292,8 +292,8 @@ public class BatterySaverPolicy extends ContentObserver implements
mAccessibilityEnabled.initialize(acm.isEnabled());
UiModeManager uiModeManager = mContext.getSystemService(UiModeManager.class);
uiModeManager.addOnProjectionStateChangeListener(UiModeManager.PROJECTION_TYPE_AUTOMOTIVE,
mContext.getMainExecutor(), mOnProjectionStateChangeListener);
uiModeManager.addOnProjectionStateChangedListener(UiModeManager.PROJECTION_TYPE_AUTOMOTIVE,
mContext.getMainExecutor(), mOnProjectionStateChangedListener);
mAutomotiveProjectionActive.initialize(
uiModeManager.getActiveProjectionTypes() != UiModeManager.PROJECTION_TYPE_NONE);

View File

@@ -55,7 +55,7 @@ import static org.testng.Assert.assertThrows;
import android.Manifest;
import android.app.AlarmManager;
import android.app.IOnProjectionStateChangeListener;
import android.app.IOnProjectionStateChangedListener;
import android.app.IUiModeManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
@@ -669,46 +669,46 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
}
@Test
public void addOnProjectionStateChangeListener_enforcesReadProjStatePermission() {
public void addOnProjectionStateChangedListener_enforcesReadProjStatePermission() {
doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
eq(android.Manifest.permission.READ_PROJECTION_STATE), any());
IOnProjectionStateChangeListener listener = mock(IOnProjectionStateChangeListener.class);
IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);
assertThrows(SecurityException.class, () -> mService.addOnProjectionStateChangeListener(
assertThrows(SecurityException.class, () -> mService.addOnProjectionStateChangedListener(
listener, PROJECTION_TYPE_ALL));
}
@Test
public void addOnProjectionStateChangeListener_callsListenerIfProjectionActive()
public void addOnProjectionStateChangedListener_callsListenerIfProjectionActive()
throws Exception {
when(mPackageManager.getPackageUid(PACKAGE_NAME, 0)).thenReturn(TestInjector.CALLING_UID);
mService.requestProjection(mBinder, PROJECTION_TYPE_AUTOMOTIVE, PACKAGE_NAME);
assertEquals(PROJECTION_TYPE_AUTOMOTIVE, mService.getActiveProjectionTypes());
IOnProjectionStateChangeListener listener = mock(IOnProjectionStateChangeListener.class);
IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);
when(listener.asBinder()).thenReturn(mBinder); // Any binder will do
mService.addOnProjectionStateChangeListener(listener, PROJECTION_TYPE_ALL);
mService.addOnProjectionStateChangedListener(listener, PROJECTION_TYPE_ALL);
verify(listener).onProjectionStateChanged(eq(PROJECTION_TYPE_AUTOMOTIVE),
eq(List.of(PACKAGE_NAME)));
}
@Test
public void removeOnProjectionStateChangeListener_enforcesReadProjStatePermission() {
public void removeOnProjectionStateChangedListener_enforcesReadProjStatePermission() {
doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
eq(android.Manifest.permission.READ_PROJECTION_STATE), any());
IOnProjectionStateChangeListener listener = mock(IOnProjectionStateChangeListener.class);
IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);
assertThrows(SecurityException.class, () -> mService.removeOnProjectionStateChangeListener(
assertThrows(SecurityException.class, () -> mService.removeOnProjectionStateChangedListener(
listener));
}
@Test
public void removeOnProjectionStateChangeListener() throws Exception {
IOnProjectionStateChangeListener listener = mock(IOnProjectionStateChangeListener.class);
public void removeOnProjectionStateChangedListener() throws Exception {
IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);
when(listener.asBinder()).thenReturn(mBinder); // Any binder will do.
mService.addOnProjectionStateChangeListener(listener, PROJECTION_TYPE_ALL);
mService.addOnProjectionStateChangedListener(listener, PROJECTION_TYPE_ALL);
mService.removeOnProjectionStateChangeListener(listener);
mService.removeOnProjectionStateChangedListener(listener);
// Now set automotive projection, should not call back.
when(mPackageManager.getPackageUid(PACKAGE_NAME, 0)).thenReturn(TestInjector.CALLING_UID);
mService.requestProjection(mBinder, PROJECTION_TYPE_AUTOMOTIVE, PACKAGE_NAME);
@@ -716,10 +716,10 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
}
@Test
public void projectionStateChangeListener_calledWhenStateChanges() throws Exception {
IOnProjectionStateChangeListener listener = mock(IOnProjectionStateChangeListener.class);
public void projectionStateChangedListener_calledWhenStateChanges() throws Exception {
IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);
when(listener.asBinder()).thenReturn(mBinder); // Any binder will do.
mService.addOnProjectionStateChangeListener(listener, PROJECTION_TYPE_ALL);
mService.addOnProjectionStateChangedListener(listener, PROJECTION_TYPE_ALL);
verify(listener, atLeastOnce()).asBinder(); // Called twice during register.
// No calls initially, no projection state set.
@@ -748,19 +748,19 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
}
@Test
public void projectionStateChangeListener_calledForAnyRelevantStateChange() throws Exception {
public void projectionStateChangedListener_calledForAnyRelevantStateChange() throws Exception {
int fakeProjectionType = 0x0002;
int otherFakeProjectionType = 0x0004;
String otherPackageName = "Internet Arms";
when(mPackageManager.getPackageUid(PACKAGE_NAME, 0)).thenReturn(TestInjector.CALLING_UID);
when(mPackageManager.getPackageUid(otherPackageName, 0))
.thenReturn(TestInjector.CALLING_UID);
IOnProjectionStateChangeListener listener = mock(IOnProjectionStateChangeListener.class);
IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);
when(listener.asBinder()).thenReturn(mBinder); // Any binder will do.
IOnProjectionStateChangeListener listener2 = mock(IOnProjectionStateChangeListener.class);
IOnProjectionStateChangedListener listener2 = mock(IOnProjectionStateChangedListener.class);
when(listener2.asBinder()).thenReturn(mBinder); // Any binder will do.
mService.addOnProjectionStateChangeListener(listener, fakeProjectionType);
mService.addOnProjectionStateChangeListener(listener2,
mService.addOnProjectionStateChangedListener(listener, fakeProjectionType);
mService.addOnProjectionStateChangedListener(listener2,
fakeProjectionType | otherFakeProjectionType);
verify(listener, atLeastOnce()).asBinder(); // Called twice during register.
verify(listener2, atLeastOnce()).asBinder(); // Called twice during register.
@@ -795,11 +795,11 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
}
@Test
public void projectionStateChangeListener_unregisteredOnDeath() throws Exception {
IOnProjectionStateChangeListener listener = mock(IOnProjectionStateChangeListener.class);
public void projectionStateChangedListener_unregisteredOnDeath() throws Exception {
IOnProjectionStateChangedListener listener = mock(IOnProjectionStateChangedListener.class);
IBinder listenerBinder = mock(IBinder.class);
when(listener.asBinder()).thenReturn(listenerBinder);
mService.addOnProjectionStateChangeListener(listener, PROJECTION_TYPE_ALL);
mService.addOnProjectionStateChangedListener(listener, PROJECTION_TYPE_ALL);
ArgumentCaptor<IBinder.DeathRecipient> listenerDeathRecipient = ArgumentCaptor.forClass(
IBinder.DeathRecipient.class);
verify(listenerBinder).linkToDeath(listenerDeathRecipient.capture(), anyInt());