diff options
| -rw-r--r-- | core/java/com/android/internal/widget/LockSettingsInternal.java | 4 | ||||
| -rw-r--r-- | core/java/com/android/internal/widget/LockSettingsStateListener.java (renamed from core/java/com/android/internal/widget/ILockSettingsStateListener.aidl) | 6 | ||||
| -rw-r--r-- | services/core/java/com/android/server/locksettings/LockSettingsService.java | 41 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java | 17 |
4 files changed, 23 insertions, 45 deletions
diff --git a/core/java/com/android/internal/widget/LockSettingsInternal.java b/core/java/com/android/internal/widget/LockSettingsInternal.java index 627e8779f9d0..e59132780c56 100644 --- a/core/java/com/android/internal/widget/LockSettingsInternal.java +++ b/core/java/com/android/internal/widget/LockSettingsInternal.java @@ -171,11 +171,11 @@ public abstract class LockSettingsInternal { * Register a LockSettingsStateListener * @param listener The listener to be registered */ - public abstract void registerLockSettingsStateListener(ILockSettingsStateListener listener); + public abstract void registerLockSettingsStateListener(LockSettingsStateListener listener); /** * Unregister a LockSettingsStateListener * @param listener The listener to be unregistered */ - public abstract void unregisterLockSettingsStateListener(ILockSettingsStateListener listener); + public abstract void unregisterLockSettingsStateListener(LockSettingsStateListener listener); } diff --git a/core/java/com/android/internal/widget/ILockSettingsStateListener.aidl b/core/java/com/android/internal/widget/LockSettingsStateListener.java index 25e30034fe8f..869e676f4a42 100644 --- a/core/java/com/android/internal/widget/ILockSettingsStateListener.aidl +++ b/core/java/com/android/internal/widget/LockSettingsStateListener.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -21,7 +21,7 @@ package com.android.internal.widget; * state of primary authentication (i.e. PIN/pattern/password). * @hide */ -oneway interface ILockSettingsStateListener { +public interface LockSettingsStateListener { /** * Defines behavior in response to a successful authentication * @param userId The user Id for the requested authentication @@ -33,4 +33,4 @@ oneway interface ILockSettingsStateListener { * @param userId The user Id for the requested authentication */ void onAuthenticationFailed(int userId); -}
\ No newline at end of file +} diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index a06607b68fa9..7fb3e001c4c3 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -93,7 +93,6 @@ import android.os.Handler; import android.os.IBinder; import android.os.IProgressListener; import android.os.Process; -import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; @@ -139,11 +138,11 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.internal.widget.ICheckCredentialProgressCallback; import com.android.internal.widget.ILockSettings; -import com.android.internal.widget.ILockSettingsStateListener; import com.android.internal.widget.IWeakEscrowTokenActivatedListener; import com.android.internal.widget.IWeakEscrowTokenRemovedListener; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockSettingsInternal; +import com.android.internal.widget.LockSettingsStateListener; import com.android.internal.widget.LockscreenCredential; import com.android.internal.widget.RebootEscrowListener; import com.android.internal.widget.VerifyCredentialResponse; @@ -185,6 +184,7 @@ import java.util.NoSuchElementException; import java.util.Objects; import java.util.Set; import java.util.StringJoiner; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -332,8 +332,8 @@ public class LockSettingsService extends ILockSettings.Stub { private HashMap<UserHandle, UserManager> mUserManagerCache = new HashMap<>(); - private final RemoteCallbackList<ILockSettingsStateListener> mLockSettingsStateListeners = - new RemoteCallbackList<>(); + private final CopyOnWriteArrayList<LockSettingsStateListener> mLockSettingsStateListeners = + new CopyOnWriteArrayList<>(); // This class manages life cycle events for encrypted users on File Based Encryption (FBE) // devices. The most basic of these is to show/hide notifications about missing features until @@ -2379,25 +2379,12 @@ public class LockSettingsService extends ILockSettings.Stub { } private void notifyLockSettingsStateListeners(boolean success, int userId) { - int i = mLockSettingsStateListeners.beginBroadcast(); - try { - while (i > 0) { - i--; - try { - if (success) { - mLockSettingsStateListeners.getBroadcastItem(i) - .onAuthenticationSucceeded(userId); - } else { - mLockSettingsStateListeners.getBroadcastItem(i) - .onAuthenticationFailed(userId); - } - } catch (RemoteException e) { - Slog.e(TAG, "Exception while notifying LockSettingsStateListener:" - + " success = " + success + ", userId = " + userId, e); - } + for (LockSettingsStateListener listener : mLockSettingsStateListeners) { + if (success) { + listener.onAuthenticationSucceeded(userId); + } else { + listener.onAuthenticationFailed(userId); } - } finally { - mLockSettingsStateListeners.finishBroadcast(); } } @@ -3720,15 +3707,15 @@ public class LockSettingsService extends ILockSettings.Stub { } @Override - public void registerLockSettingsStateListener( - @NonNull ILockSettingsStateListener listener) { - mLockSettingsStateListeners.register(listener); + public void registerLockSettingsStateListener(@NonNull LockSettingsStateListener listener) { + Objects.requireNonNull(listener, "listener cannot be null"); + mLockSettingsStateListeners.add(listener); } @Override public void unregisterLockSettingsStateListener( - @NonNull ILockSettingsStateListener listener) { - mLockSettingsStateListeners.unregister(listener); + @NonNull LockSettingsStateListener listener) { + mLockSettingsStateListeners.remove(listener); } } diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java index 5081198f0058..705359708bc7 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTests.java @@ -39,7 +39,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.PropertyInvalidatedCache; -import android.os.IBinder; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.platform.test.flag.junit.SetFlagsRule; @@ -49,8 +48,8 @@ import android.text.TextUtils; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.internal.widget.ILockSettingsStateListener; import com.android.internal.widget.LockPatternUtils; +import com.android.internal.widget.LockSettingsStateListener; import com.android.internal.widget.LockscreenCredential; import com.android.internal.widget.VerifyCredentialResponse; @@ -412,7 +411,7 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests { mSetFlagsRule.enableFlags(FLAG_REPORT_PRIMARY_AUTH_ATTEMPTS); final LockscreenCredential password = newPassword("password"); setCredential(PRIMARY_USER_ID, password); - final ILockSettingsStateListener listener = mockLockSettingsStateListener(); + final LockSettingsStateListener listener = mock(LockSettingsStateListener.class); mLocalService.registerLockSettingsStateListener(listener); assertEquals(VerifyCredentialResponse.RESPONSE_OK, @@ -429,7 +428,7 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests { final LockscreenCredential password = newPassword("password"); setCredential(PRIMARY_USER_ID, password); final LockscreenCredential badPassword = newPassword("badPassword"); - final ILockSettingsStateListener listener = mockLockSettingsStateListener(); + final LockSettingsStateListener listener = mock(LockSettingsStateListener.class); mLocalService.registerLockSettingsStateListener(listener); assertEquals(VerifyCredentialResponse.RESPONSE_ERROR, @@ -445,7 +444,7 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests { final LockscreenCredential password = newPassword("password"); setCredential(PRIMARY_USER_ID, password); final LockscreenCredential badPassword = newPassword("badPassword"); - final ILockSettingsStateListener listener = mockLockSettingsStateListener(); + final LockSettingsStateListener listener = mock(LockSettingsStateListener.class); mLocalService.registerLockSettingsStateListener(listener); assertEquals(VerifyCredentialResponse.RESPONSE_OK, @@ -599,12 +598,4 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests { assertNotEquals(0, mGateKeeperService.getSecureUserId(userId)); } } - - private ILockSettingsStateListener mockLockSettingsStateListener() { - ILockSettingsStateListener listener = mock(ILockSettingsStateListener.Stub.class); - IBinder binder = mock(IBinder.class); - when(binder.isBinderAlive()).thenReturn(true); - when(listener.asBinder()).thenReturn(binder); - return listener; - } } |