Loading services/backup/java/com/android/server/backup/BackupManagerService.java +2 −26 Original line number Diff line number Diff line Loading @@ -49,13 +49,11 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DumpUtils; import com.android.server.SystemConfig; import com.android.server.SystemService; import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Collections; import java.util.Set; /** Loading @@ -80,8 +78,6 @@ public class BackupManagerService { // Keeps track of all unlocked users registered with this service. Indexed by user id. private final SparseArray<UserBackupManagerService> mServiceUsers = new SparseArray<>(); private Set<ComponentName> mTransportWhitelist; private final BroadcastReceiver mUserRemovedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading @@ -99,13 +95,6 @@ public class BackupManagerService { mContext = checkNotNull(context); mTrampoline = checkNotNull(trampoline); // Set up our transport options. SystemConfig systemConfig = SystemConfig.getInstance(); mTransportWhitelist = systemConfig.getBackupTransportWhitelist(); if (mTransportWhitelist == null) { mTransportWhitelist = Collections.emptySet(); } mContext.registerReceiver(mUserRemovedReceiver, new IntentFilter(Intent.ACTION_USER_REMOVED)); } Loading Loading @@ -147,7 +136,7 @@ public class BackupManagerService { * UserBackupManagerService} and registering it with this service. */ @VisibleForTesting protected void startServiceForUser(int userId) { protected void startServiceForUser(int userId, Set<ComponentName> transportWhitelist) { if (mServiceUsers.get(userId) != null) { Slog.i(TAG, "userId " + userId + " already started, so not starting again"); return; Loading @@ -155,7 +144,7 @@ public class BackupManagerService { UserBackupManagerService userBackupManagerService = UserBackupManagerService.createAndInitializeService( userId, mContext, mTrampoline, mTransportWhitelist); userId, mContext, mTrampoline, transportWhitelist); startServiceForUser(userId, userBackupManagerService); } Loading Loading @@ -364,19 +353,6 @@ public class BackupManagerService { : userBackupManagerService.listAllTransportComponents(); } /** Report all system whitelisted transports. */ @Nullable public String[] getTransportWhitelist() { // No permission check, intentionally. String[] whitelistedTransports = new String[mTransportWhitelist.size()]; int i = 0; for (ComponentName component : mTransportWhitelist) { whitelistedTransports[i] = component.flattenToShortString(); i++; } return whitelistedTransports; } /** * Update the attributes of the transport identified by {@code transportComponent}. If the * specified transport has not been bound at least once (for registration), this call will be Loading services/backup/java/com/android/server/backup/Trampoline.java +20 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.backup; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.server.backup.BackupManagerService.TAG; import static java.util.Collections.emptySet; import android.Manifest; import android.annotation.Nullable; import android.annotation.UserIdInt; Loading Loading @@ -48,12 +50,14 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DumpUtils; import com.android.server.SystemConfig; import com.android.server.backup.utils.RandomAccessFileUtils; import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.Set; /** * A proxy to the {@link BackupManagerService} implementation. Loading Loading @@ -118,6 +122,7 @@ public class Trampoline extends IBackupManager.Stub { @VisibleForTesting protected volatile BackupManagerService mService; private final Handler mHandler; private final Set<ComponentName> mTransportWhitelist; public Trampoline(Context context) { mContext = context; Loading @@ -128,6 +133,9 @@ public class Trampoline extends IBackupManager.Stub { mHandler = new Handler(handlerThread.getLooper()); mUserManager = UserManager.get(context); mService = new BackupManagerService(mContext, this); Set<ComponentName> transportWhitelist = SystemConfig.getInstance().getBackupTransportWhitelist(); mTransportWhitelist = (transportWhitelist == null) ? emptySet() : transportWhitelist; } // TODO: Remove this when we implement DI by injecting in the construtor. Loading Loading @@ -270,7 +278,7 @@ public class Trampoline extends IBackupManager.Stub { return; } Slog.i(TAG, "Starting service for user: " + userId); mService.startServiceForUser(userId); mService.startServiceForUser(userId, mTransportWhitelist); } /** Loading Loading @@ -618,7 +626,17 @@ public class Trampoline extends IBackupManager.Stub { @Override public String[] getTransportWhitelist() { int userId = binderGetCallingUserId(); return (isUserReadyForBackup(userId)) ? mService.getTransportWhitelist() : null; if (!isUserReadyForBackup(userId)) { return null; } // No permission check, intentionally. String[] whitelistedTransports = new String[mTransportWhitelist.size()]; int i = 0; for (ComponentName component : mTransportWhitelist) { whitelistedTransports[i] = component.flattenToShortString(); i++; } return whitelistedTransports; } @Override Loading services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ import static org.mockito.Mockito.verify; import static org.robolectric.Shadows.shadowOf; import static org.testng.Assert.expectThrows; import static java.util.Collections.emptySet; import android.annotation.UserIdInt; import android.app.Application; import android.app.backup.IBackupManagerMonitor; Loading Loading @@ -160,7 +162,7 @@ public class BackupManagerServiceTest { public void testStartServiceForUser_registersUser() throws Exception { BackupManagerService backupManagerService = createService(); backupManagerService.startServiceForUser(mUserOneId); backupManagerService.startServiceForUser(mUserOneId, emptySet()); SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices(); assertThat(serviceUsers.size()).isEqualTo(1); Loading services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java +5 −11 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; Loading Loading @@ -70,6 +71,7 @@ import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; Loading Loading @@ -227,7 +229,9 @@ public class TrampolineTest { trampoline.getBackupHandler().post(unlocked::open); unlocked.block(); assertNull(trampoline.getUserService(NON_USER_SYSTEM)); verify(mBackupManagerServiceMock, never()).startServiceForUser(NON_USER_SYSTEM); //noinspection unchecked verify(mBackupManagerServiceMock, never()).startServiceForUser( eq(NON_USER_SYSTEM), any(Set.class)); } @Test Loading Loading @@ -751,18 +755,8 @@ public class TrampolineTest { verify(mBackupManagerServiceMock).listAllTransportComponents(mUserId); } @Test public void getTransportWhitelist_forwarded() { when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS); assertEquals(TRANSPORTS, mTrampoline.getTransportWhitelist()); verify(mBackupManagerServiceMock).getTransportWhitelist(); } @Test public void updateTransportAttributesForUser_forwarded() { when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS); mTrampoline.updateTransportAttributesForUser( mUserId, TRANSPORT_COMPONENT_NAME, Loading Loading
services/backup/java/com/android/server/backup/BackupManagerService.java +2 −26 Original line number Diff line number Diff line Loading @@ -49,13 +49,11 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DumpUtils; import com.android.server.SystemConfig; import com.android.server.SystemService; import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Collections; import java.util.Set; /** Loading @@ -80,8 +78,6 @@ public class BackupManagerService { // Keeps track of all unlocked users registered with this service. Indexed by user id. private final SparseArray<UserBackupManagerService> mServiceUsers = new SparseArray<>(); private Set<ComponentName> mTransportWhitelist; private final BroadcastReceiver mUserRemovedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading @@ -99,13 +95,6 @@ public class BackupManagerService { mContext = checkNotNull(context); mTrampoline = checkNotNull(trampoline); // Set up our transport options. SystemConfig systemConfig = SystemConfig.getInstance(); mTransportWhitelist = systemConfig.getBackupTransportWhitelist(); if (mTransportWhitelist == null) { mTransportWhitelist = Collections.emptySet(); } mContext.registerReceiver(mUserRemovedReceiver, new IntentFilter(Intent.ACTION_USER_REMOVED)); } Loading Loading @@ -147,7 +136,7 @@ public class BackupManagerService { * UserBackupManagerService} and registering it with this service. */ @VisibleForTesting protected void startServiceForUser(int userId) { protected void startServiceForUser(int userId, Set<ComponentName> transportWhitelist) { if (mServiceUsers.get(userId) != null) { Slog.i(TAG, "userId " + userId + " already started, so not starting again"); return; Loading @@ -155,7 +144,7 @@ public class BackupManagerService { UserBackupManagerService userBackupManagerService = UserBackupManagerService.createAndInitializeService( userId, mContext, mTrampoline, mTransportWhitelist); userId, mContext, mTrampoline, transportWhitelist); startServiceForUser(userId, userBackupManagerService); } Loading Loading @@ -364,19 +353,6 @@ public class BackupManagerService { : userBackupManagerService.listAllTransportComponents(); } /** Report all system whitelisted transports. */ @Nullable public String[] getTransportWhitelist() { // No permission check, intentionally. String[] whitelistedTransports = new String[mTransportWhitelist.size()]; int i = 0; for (ComponentName component : mTransportWhitelist) { whitelistedTransports[i] = component.flattenToShortString(); i++; } return whitelistedTransports; } /** * Update the attributes of the transport identified by {@code transportComponent}. If the * specified transport has not been bound at least once (for registration), this call will be Loading
services/backup/java/com/android/server/backup/Trampoline.java +20 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.backup; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.server.backup.BackupManagerService.TAG; import static java.util.Collections.emptySet; import android.Manifest; import android.annotation.Nullable; import android.annotation.UserIdInt; Loading Loading @@ -48,12 +50,14 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DumpUtils; import com.android.server.SystemConfig; import com.android.server.backup.utils.RandomAccessFileUtils; import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.Set; /** * A proxy to the {@link BackupManagerService} implementation. Loading Loading @@ -118,6 +122,7 @@ public class Trampoline extends IBackupManager.Stub { @VisibleForTesting protected volatile BackupManagerService mService; private final Handler mHandler; private final Set<ComponentName> mTransportWhitelist; public Trampoline(Context context) { mContext = context; Loading @@ -128,6 +133,9 @@ public class Trampoline extends IBackupManager.Stub { mHandler = new Handler(handlerThread.getLooper()); mUserManager = UserManager.get(context); mService = new BackupManagerService(mContext, this); Set<ComponentName> transportWhitelist = SystemConfig.getInstance().getBackupTransportWhitelist(); mTransportWhitelist = (transportWhitelist == null) ? emptySet() : transportWhitelist; } // TODO: Remove this when we implement DI by injecting in the construtor. Loading Loading @@ -270,7 +278,7 @@ public class Trampoline extends IBackupManager.Stub { return; } Slog.i(TAG, "Starting service for user: " + userId); mService.startServiceForUser(userId); mService.startServiceForUser(userId, mTransportWhitelist); } /** Loading Loading @@ -618,7 +626,17 @@ public class Trampoline extends IBackupManager.Stub { @Override public String[] getTransportWhitelist() { int userId = binderGetCallingUserId(); return (isUserReadyForBackup(userId)) ? mService.getTransportWhitelist() : null; if (!isUserReadyForBackup(userId)) { return null; } // No permission check, intentionally. String[] whitelistedTransports = new String[mTransportWhitelist.size()]; int i = 0; for (ComponentName component : mTransportWhitelist) { whitelistedTransports[i] = component.flattenToShortString(); i++; } return whitelistedTransports; } @Override Loading
services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ import static org.mockito.Mockito.verify; import static org.robolectric.Shadows.shadowOf; import static org.testng.Assert.expectThrows; import static java.util.Collections.emptySet; import android.annotation.UserIdInt; import android.app.Application; import android.app.backup.IBackupManagerMonitor; Loading Loading @@ -160,7 +162,7 @@ public class BackupManagerServiceTest { public void testStartServiceForUser_registersUser() throws Exception { BackupManagerService backupManagerService = createService(); backupManagerService.startServiceForUser(mUserOneId); backupManagerService.startServiceForUser(mUserOneId, emptySet()); SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices(); assertThat(serviceUsers.size()).isEqualTo(1); Loading
services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java +5 −11 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; Loading Loading @@ -70,6 +71,7 @@ import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; Loading Loading @@ -227,7 +229,9 @@ public class TrampolineTest { trampoline.getBackupHandler().post(unlocked::open); unlocked.block(); assertNull(trampoline.getUserService(NON_USER_SYSTEM)); verify(mBackupManagerServiceMock, never()).startServiceForUser(NON_USER_SYSTEM); //noinspection unchecked verify(mBackupManagerServiceMock, never()).startServiceForUser( eq(NON_USER_SYSTEM), any(Set.class)); } @Test Loading Loading @@ -751,18 +755,8 @@ public class TrampolineTest { verify(mBackupManagerServiceMock).listAllTransportComponents(mUserId); } @Test public void getTransportWhitelist_forwarded() { when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS); assertEquals(TRANSPORTS, mTrampoline.getTransportWhitelist()); verify(mBackupManagerServiceMock).getTransportWhitelist(); } @Test public void updateTransportAttributesForUser_forwarded() { when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS); mTrampoline.updateTransportAttributesForUser( mUserId, TRANSPORT_COMPONENT_NAME, Loading