Loading services/backup/java/com/android/server/backup/TransportManager.java +12 −11 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.content.pm.ResolveInfo; import android.os.RemoteException; import android.os.UserHandle; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.GuardedBy; Loading @@ -47,8 +48,6 @@ import java.util.Map; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; /** Handles in-memory bookkeeping of all BackupTransport objects. */ public class TransportManager { Loading Loading @@ -119,10 +118,10 @@ public class TransportManager { void onPackageChanged(String packageName, String... components) { // Unfortunately this can't be atomic because we risk a deadlock if // registerTransportsFromPackage() is put inside the synchronized block Set<ComponentName> transportComponents = Stream.of(components) .map(component -> new ComponentName(packageName, component)) .collect(Collectors.toSet()); Set<ComponentName> transportComponents = new ArraySet<>(components.length); for (String componentName : components) { transportComponents.add(new ComponentName(packageName, componentName)); } synchronized (mTransportLock) { mRegisteredTransportsDescriptionMap.keySet().removeIf(transportComponents::contains); } Loading Loading @@ -151,11 +150,13 @@ public class TransportManager { */ String[] getRegisteredTransportNames() { synchronized (mTransportLock) { return mRegisteredTransportsDescriptionMap .values() .stream() .map(transportDescription -> transportDescription.name) .toArray(String[]::new); String[] transportNames = new String[mRegisteredTransportsDescriptionMap.size()]; int i = 0; for (TransportDescription description : mRegisteredTransportsDescriptionMap.values()) { transportNames[i] = description.name; i++; } return transportNames; } } Loading services/robotests/src/com/android/server/backup/TransportManagerTest.java +40 −0 Original line number Diff line number Diff line Loading @@ -532,6 +532,46 @@ public class TransportManagerTest { () -> transportManager.getTransportDirName(mTransportA2.transportName)); } @Test public void testGetRegisteredTransportNames() throws Exception { setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); setUpPackage(PACKAGE_B, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); TransportData[] transportsData = {mTransportA1, mTransportA2, mTransportB1}; setUpTransports(transportsData); TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2, mTransportB1); transportManager.registerTransports(); String[] transportNames = transportManager.getRegisteredTransportNames(); assertThat(transportNames) .asList() .containsExactlyElementsIn( Stream.of(transportsData) .map(transportData -> transportData.transportName) .collect(toList())); } @Test public void testGetRegisteredTransportComponents() throws Exception { setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); setUpPackage(PACKAGE_B, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); TransportData[] transportsData = {mTransportA1, mTransportA2, mTransportB1}; setUpTransports(transportsData); TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2, mTransportB1); transportManager.registerTransports(); ComponentName[] transportNames = transportManager.getRegisteredTransportComponents(); assertThat(transportNames) .asList() .containsExactlyElementsIn( Stream.of(transportsData) .map(TransportData::getTransportComponent) .collect(toList())); } private List<TransportMock> setUpTransports(TransportData... transports) throws Exception { setUpTransportsForTransportManager(mShadowPackageManager, transports); List<TransportMock> transportMocks = new ArrayList<>(transports.length); Loading Loading
services/backup/java/com/android/server/backup/TransportManager.java +12 −11 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.content.pm.ResolveInfo; import android.os.RemoteException; import android.os.UserHandle; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.GuardedBy; Loading @@ -47,8 +48,6 @@ import java.util.Map; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; /** Handles in-memory bookkeeping of all BackupTransport objects. */ public class TransportManager { Loading Loading @@ -119,10 +118,10 @@ public class TransportManager { void onPackageChanged(String packageName, String... components) { // Unfortunately this can't be atomic because we risk a deadlock if // registerTransportsFromPackage() is put inside the synchronized block Set<ComponentName> transportComponents = Stream.of(components) .map(component -> new ComponentName(packageName, component)) .collect(Collectors.toSet()); Set<ComponentName> transportComponents = new ArraySet<>(components.length); for (String componentName : components) { transportComponents.add(new ComponentName(packageName, componentName)); } synchronized (mTransportLock) { mRegisteredTransportsDescriptionMap.keySet().removeIf(transportComponents::contains); } Loading Loading @@ -151,11 +150,13 @@ public class TransportManager { */ String[] getRegisteredTransportNames() { synchronized (mTransportLock) { return mRegisteredTransportsDescriptionMap .values() .stream() .map(transportDescription -> transportDescription.name) .toArray(String[]::new); String[] transportNames = new String[mRegisteredTransportsDescriptionMap.size()]; int i = 0; for (TransportDescription description : mRegisteredTransportsDescriptionMap.values()) { transportNames[i] = description.name; i++; } return transportNames; } } Loading
services/robotests/src/com/android/server/backup/TransportManagerTest.java +40 −0 Original line number Diff line number Diff line Loading @@ -532,6 +532,46 @@ public class TransportManagerTest { () -> transportManager.getTransportDirName(mTransportA2.transportName)); } @Test public void testGetRegisteredTransportNames() throws Exception { setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); setUpPackage(PACKAGE_B, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); TransportData[] transportsData = {mTransportA1, mTransportA2, mTransportB1}; setUpTransports(transportsData); TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2, mTransportB1); transportManager.registerTransports(); String[] transportNames = transportManager.getRegisteredTransportNames(); assertThat(transportNames) .asList() .containsExactlyElementsIn( Stream.of(transportsData) .map(transportData -> transportData.transportName) .collect(toList())); } @Test public void testGetRegisteredTransportComponents() throws Exception { setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); setUpPackage(PACKAGE_B, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); TransportData[] transportsData = {mTransportA1, mTransportA2, mTransportB1}; setUpTransports(transportsData); TransportManager transportManager = createTransportManager(mTransportA1, mTransportA2, mTransportB1); transportManager.registerTransports(); ComponentName[] transportNames = transportManager.getRegisteredTransportComponents(); assertThat(transportNames) .asList() .containsExactlyElementsIn( Stream.of(transportsData) .map(TransportData::getTransportComponent) .collect(toList())); } private List<TransportMock> setUpTransports(TransportData... transports) throws Exception { setUpTransportsForTransportManager(mShadowPackageManager, transports); List<TransportMock> transportMocks = new ArrayList<>(transports.length); Loading