Loading services/core/java/com/android/server/notification/ManagedServices.java +6 −1 Original line number Diff line number Diff line Loading @@ -79,7 +79,6 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.function.Predicate; /** * Manages the lifecycle of application-provided services bound by system server. Loading Loading @@ -1163,6 +1162,7 @@ abstract public class ManagedServices { @Override public void onNullBinding(ComponentName name) { Slog.v(TAG, "onNullBinding() called with: name = [" + name + "]"); mServicesBound.remove(servicesBindingTag); } }; if (!mContext.bindServiceAsUser(intent, Loading @@ -1180,6 +1180,11 @@ abstract public class ManagedServices { } } boolean isBound(ComponentName cn, int userId) { final Pair<ComponentName, Integer> servicesBindingTag = Pair.create(cn, userId); return mServicesBound.contains(servicesBindingTag); } /** * Remove a service for the given user by ComponentName */ Loading services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java +60 −0 Original line number Diff line number Diff line Loading @@ -23,9 +23,11 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; Loading @@ -36,6 +38,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; Loading @@ -61,6 +64,7 @@ import com.google.android.collect.Lists; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; Loading Loading @@ -964,6 +968,62 @@ public class ManagedServicesTest extends UiServiceTestCase { assertTrue(componentsToBind.get(10).contains(ComponentName.unflattenFromString("c/c"))); } @Test public void testOnNullBinding() throws Exception { Context context = mock(Context.class); PackageManager pm = mock(PackageManager.class); ApplicationInfo ai = new ApplicationInfo(); ai.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT; when(context.getPackageName()).thenReturn(mContext.getPackageName()); when(context.getUserId()).thenReturn(mContext.getUserId()); when(context.getPackageManager()).thenReturn(pm); when(pm.getApplicationInfo(anyString(), anyInt())).thenReturn(ai); ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles, mIpm, APPROVAL_BY_COMPONENT); ComponentName cn = ComponentName.unflattenFromString("a/a"); service.registerSystemService(cn, 0); when(context.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); ServiceConnection sc = (ServiceConnection) args[1]; sc.onNullBinding(cn); return true; }); service.registerSystemService(cn, 0); assertFalse(service.isBound(cn, 0)); } @Test public void testOnServiceConnected() throws Exception { Context context = mock(Context.class); PackageManager pm = mock(PackageManager.class); ApplicationInfo ai = new ApplicationInfo(); ai.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT; when(context.getPackageName()).thenReturn(mContext.getPackageName()); when(context.getUserId()).thenReturn(mContext.getUserId()); when(context.getPackageManager()).thenReturn(pm); when(pm.getApplicationInfo(anyString(), anyInt())).thenReturn(ai); ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles, mIpm, APPROVAL_BY_COMPONENT); ComponentName cn = ComponentName.unflattenFromString("a/a"); service.registerSystemService(cn, 0); when(context.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); ServiceConnection sc = (ServiceConnection) args[1]; sc.onServiceConnected(cn, mock(IBinder.class)); return true; }); service.registerSystemService(cn, 0); assertTrue(service.isBound(cn, 0)); } @Test public void testOnPackagesChanged_nullValuesPassed_noNullPointers() { for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) { Loading Loading
services/core/java/com/android/server/notification/ManagedServices.java +6 −1 Original line number Diff line number Diff line Loading @@ -79,7 +79,6 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.function.Predicate; /** * Manages the lifecycle of application-provided services bound by system server. Loading Loading @@ -1163,6 +1162,7 @@ abstract public class ManagedServices { @Override public void onNullBinding(ComponentName name) { Slog.v(TAG, "onNullBinding() called with: name = [" + name + "]"); mServicesBound.remove(servicesBindingTag); } }; if (!mContext.bindServiceAsUser(intent, Loading @@ -1180,6 +1180,11 @@ abstract public class ManagedServices { } } boolean isBound(ComponentName cn, int userId) { final Pair<ComponentName, Integer> servicesBindingTag = Pair.create(cn, userId); return mServicesBound.contains(servicesBindingTag); } /** * Remove a service for the given user by ComponentName */ Loading
services/tests/uiservicestests/src/com/android/server/notification/ManagedServicesTest.java +60 −0 Original line number Diff line number Diff line Loading @@ -23,9 +23,11 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; Loading @@ -36,6 +38,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; Loading @@ -61,6 +64,7 @@ import com.google.android.collect.Lists; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; Loading Loading @@ -964,6 +968,62 @@ public class ManagedServicesTest extends UiServiceTestCase { assertTrue(componentsToBind.get(10).contains(ComponentName.unflattenFromString("c/c"))); } @Test public void testOnNullBinding() throws Exception { Context context = mock(Context.class); PackageManager pm = mock(PackageManager.class); ApplicationInfo ai = new ApplicationInfo(); ai.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT; when(context.getPackageName()).thenReturn(mContext.getPackageName()); when(context.getUserId()).thenReturn(mContext.getUserId()); when(context.getPackageManager()).thenReturn(pm); when(pm.getApplicationInfo(anyString(), anyInt())).thenReturn(ai); ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles, mIpm, APPROVAL_BY_COMPONENT); ComponentName cn = ComponentName.unflattenFromString("a/a"); service.registerSystemService(cn, 0); when(context.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); ServiceConnection sc = (ServiceConnection) args[1]; sc.onNullBinding(cn); return true; }); service.registerSystemService(cn, 0); assertFalse(service.isBound(cn, 0)); } @Test public void testOnServiceConnected() throws Exception { Context context = mock(Context.class); PackageManager pm = mock(PackageManager.class); ApplicationInfo ai = new ApplicationInfo(); ai.targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT; when(context.getPackageName()).thenReturn(mContext.getPackageName()); when(context.getUserId()).thenReturn(mContext.getUserId()); when(context.getPackageManager()).thenReturn(pm); when(pm.getApplicationInfo(anyString(), anyInt())).thenReturn(ai); ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles, mIpm, APPROVAL_BY_COMPONENT); ComponentName cn = ComponentName.unflattenFromString("a/a"); service.registerSystemService(cn, 0); when(context.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); ServiceConnection sc = (ServiceConnection) args[1]; sc.onServiceConnected(cn, mock(IBinder.class)); return true; }); service.registerSystemService(cn, 0); assertTrue(service.isBound(cn, 0)); } @Test public void testOnPackagesChanged_nullValuesPassed_noNullPointers() { for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) { Loading