Loading core/java/com/android/internal/app/IntentForwarderActivity.java +52 −27 Original line number Original line Diff line number Diff line Loading @@ -50,6 +50,9 @@ import java.util.Arrays; import java.util.HashSet; import java.util.HashSet; import java.util.List; import java.util.List; import java.util.Set; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** /** * This is used in conjunction with * This is used in conjunction with Loading @@ -74,11 +77,13 @@ public class IntentForwarderActivity extends Activity { private Injector mInjector; private Injector mInjector; private MetricsLogger mMetricsLogger; private MetricsLogger mMetricsLogger; protected ExecutorService mExecutorService; @Override @Override protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.onCreate(savedInstanceState); mInjector = createInjector(); mInjector = createInjector(); mExecutorService = Executors.newSingleThreadExecutor(); Intent intentReceived = getIntent(); Intent intentReceived = getIntent(); String className = intentReceived.getComponent().getClassName(); String className = intentReceived.getComponent().getClassName(); Loading Loading @@ -118,35 +123,52 @@ public class IntentForwarderActivity extends Activity { mInjector.getIPackageManager(), getContentResolver()); mInjector.getIPackageManager(), getContentResolver()); if (newIntent != null) { if (newIntent != null) { newIntent.prepareToLeaveUser(callingUserId); newIntent.prepareToLeaveUser(callingUserId); maybeShowDisclosureAsync(intentReceived, newIntent, targetUserId, userMessageId); CompletableFuture.runAsync(() -> startActivityAsCaller( newIntent, targetUserId), mExecutorService); } else { Slog.wtf(TAG, "the intent: " + intentReceived + " cannot be forwarded from user " + callingUserId + " to user " + targetUserId); } finish(); } private void maybeShowDisclosureAsync( Intent intentReceived, Intent newIntent, int userId, int messageId) { final CompletableFuture<ResolveInfo> resolveInfoFuture = mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, userId); resolveInfoFuture.thenAcceptAsync(ri -> { if (shouldShowDisclosure(ri, intentReceived)) { mInjector.showToast(messageId, Toast.LENGTH_LONG); } }, getApplicationContext().getMainExecutor()); } final ResolveInfo ri = mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, private void startActivityAsCaller(Intent newIntent, int userId) { targetUserId); try { try { startActivityAsCaller(newIntent, null, null, false, targetUserId); startActivityAsCaller( newIntent, /* options= */ null, /* permissionToken= */ null, /* ignoreTargetSecurity= */ false, userId); } catch (RuntimeException e) { } catch (RuntimeException e) { int launchedFromUid = -1; int launchedFromUid = -1; String launchedFromPackage = "?"; String launchedFromPackage = "?"; try { try { launchedFromUid = ActivityTaskManager.getService().getLaunchedFromUid( launchedFromUid = ActivityTaskManager.getService().getLaunchedFromUid( getActivityToken()); getActivityToken()); launchedFromPackage = ActivityTaskManager.getService().getLaunchedFromPackage( launchedFromPackage = ActivityTaskManager.getService() getActivityToken()); .getLaunchedFromPackage(getActivityToken()); } catch (RemoteException ignored) { } catch (RemoteException ignored) { } } Slog.wtf(TAG, "Unable to launch as UID " + launchedFromUid + " package " Slog.wtf(TAG, "Unable to launch as UID " + launchedFromUid + " package " + launchedFromPackage + ", while running in " + launchedFromPackage + ", while running in " + ActivityThread.currentProcessName(), e); + ActivityThread.currentProcessName(), e); } finally { mExecutorService.shutdown(); } } if (shouldShowDisclosure(ri, intentReceived)) { mInjector.showToast(userMessageId, Toast.LENGTH_LONG); } } else { Slog.wtf(TAG, "the intent: " + intentReceived + " cannot be forwarded from user " + callingUserId + " to user " + targetUserId); } finish(); } } private void launchChooserActivityWithCorrectTab(Intent intentReceived, String className) { private void launchChooserActivityWithCorrectTab(Intent intentReceived, String className) { Loading Loading @@ -322,8 +344,11 @@ public class IntentForwarderActivity extends Activity { } } @Override @Override public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) { @Nullable return getPackageManager().resolveActivityAsUser(intent, flags, userId); public CompletableFuture<ResolveInfo> resolveActivityAsUser( Intent intent, int flags, int userId) { return CompletableFuture.supplyAsync( () -> getPackageManager().resolveActivityAsUser(intent, flags, userId)); } } @Override @Override Loading @@ -339,7 +364,7 @@ public class IntentForwarderActivity extends Activity { PackageManager getPackageManager(); PackageManager getPackageManager(); ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId); CompletableFuture<ResolveInfo> resolveActivityAsUser(Intent intent, int flags, int userId); void showToast(@StringRes int messageId, int duration); void showToast(@StringRes int messageId, int duration); } } Loading core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java +10 −2 Original line number Original line Diff line number Diff line Loading @@ -68,6 +68,8 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class) public class IntentForwarderActivityTest { public class IntentForwarderActivityTest { Loading Loading @@ -633,6 +635,11 @@ public class IntentForwarderActivityTest { public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) { getIntent().setComponent(sComponentName); getIntent().setComponent(sComponentName); super.onCreate(savedInstanceState); super.onCreate(savedInstanceState); try { mExecutorService.awaitTermination(/* timeout= */ 30, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override @Override Loading Loading @@ -671,7 +678,8 @@ public class IntentForwarderActivityTest { } } @Override @Override public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) { public CompletableFuture<ResolveInfo> resolveActivityAsUser( Intent intent, int flags, int userId) { ActivityInfo activityInfo = new ActivityInfo(); ActivityInfo activityInfo = new ActivityInfo(); activityInfo.packageName = sPackageName; activityInfo.packageName = sPackageName; activityInfo.name = sActivityName; activityInfo.name = sActivityName; Loading @@ -680,7 +688,7 @@ public class IntentForwarderActivityTest { ResolveInfo resolveInfo = new ResolveInfo(); ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.activityInfo = activityInfo; resolveInfo.activityInfo = activityInfo; return resolveInfo; return CompletableFuture.completedFuture(resolveInfo); } } @Override @Override Loading Loading
core/java/com/android/internal/app/IntentForwarderActivity.java +52 −27 Original line number Original line Diff line number Diff line Loading @@ -50,6 +50,9 @@ import java.util.Arrays; import java.util.HashSet; import java.util.HashSet; import java.util.List; import java.util.List; import java.util.Set; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** /** * This is used in conjunction with * This is used in conjunction with Loading @@ -74,11 +77,13 @@ public class IntentForwarderActivity extends Activity { private Injector mInjector; private Injector mInjector; private MetricsLogger mMetricsLogger; private MetricsLogger mMetricsLogger; protected ExecutorService mExecutorService; @Override @Override protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.onCreate(savedInstanceState); mInjector = createInjector(); mInjector = createInjector(); mExecutorService = Executors.newSingleThreadExecutor(); Intent intentReceived = getIntent(); Intent intentReceived = getIntent(); String className = intentReceived.getComponent().getClassName(); String className = intentReceived.getComponent().getClassName(); Loading Loading @@ -118,35 +123,52 @@ public class IntentForwarderActivity extends Activity { mInjector.getIPackageManager(), getContentResolver()); mInjector.getIPackageManager(), getContentResolver()); if (newIntent != null) { if (newIntent != null) { newIntent.prepareToLeaveUser(callingUserId); newIntent.prepareToLeaveUser(callingUserId); maybeShowDisclosureAsync(intentReceived, newIntent, targetUserId, userMessageId); CompletableFuture.runAsync(() -> startActivityAsCaller( newIntent, targetUserId), mExecutorService); } else { Slog.wtf(TAG, "the intent: " + intentReceived + " cannot be forwarded from user " + callingUserId + " to user " + targetUserId); } finish(); } private void maybeShowDisclosureAsync( Intent intentReceived, Intent newIntent, int userId, int messageId) { final CompletableFuture<ResolveInfo> resolveInfoFuture = mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, userId); resolveInfoFuture.thenAcceptAsync(ri -> { if (shouldShowDisclosure(ri, intentReceived)) { mInjector.showToast(messageId, Toast.LENGTH_LONG); } }, getApplicationContext().getMainExecutor()); } final ResolveInfo ri = mInjector.resolveActivityAsUser(newIntent, MATCH_DEFAULT_ONLY, private void startActivityAsCaller(Intent newIntent, int userId) { targetUserId); try { try { startActivityAsCaller(newIntent, null, null, false, targetUserId); startActivityAsCaller( newIntent, /* options= */ null, /* permissionToken= */ null, /* ignoreTargetSecurity= */ false, userId); } catch (RuntimeException e) { } catch (RuntimeException e) { int launchedFromUid = -1; int launchedFromUid = -1; String launchedFromPackage = "?"; String launchedFromPackage = "?"; try { try { launchedFromUid = ActivityTaskManager.getService().getLaunchedFromUid( launchedFromUid = ActivityTaskManager.getService().getLaunchedFromUid( getActivityToken()); getActivityToken()); launchedFromPackage = ActivityTaskManager.getService().getLaunchedFromPackage( launchedFromPackage = ActivityTaskManager.getService() getActivityToken()); .getLaunchedFromPackage(getActivityToken()); } catch (RemoteException ignored) { } catch (RemoteException ignored) { } } Slog.wtf(TAG, "Unable to launch as UID " + launchedFromUid + " package " Slog.wtf(TAG, "Unable to launch as UID " + launchedFromUid + " package " + launchedFromPackage + ", while running in " + launchedFromPackage + ", while running in " + ActivityThread.currentProcessName(), e); + ActivityThread.currentProcessName(), e); } finally { mExecutorService.shutdown(); } } if (shouldShowDisclosure(ri, intentReceived)) { mInjector.showToast(userMessageId, Toast.LENGTH_LONG); } } else { Slog.wtf(TAG, "the intent: " + intentReceived + " cannot be forwarded from user " + callingUserId + " to user " + targetUserId); } finish(); } } private void launchChooserActivityWithCorrectTab(Intent intentReceived, String className) { private void launchChooserActivityWithCorrectTab(Intent intentReceived, String className) { Loading Loading @@ -322,8 +344,11 @@ public class IntentForwarderActivity extends Activity { } } @Override @Override public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) { @Nullable return getPackageManager().resolveActivityAsUser(intent, flags, userId); public CompletableFuture<ResolveInfo> resolveActivityAsUser( Intent intent, int flags, int userId) { return CompletableFuture.supplyAsync( () -> getPackageManager().resolveActivityAsUser(intent, flags, userId)); } } @Override @Override Loading @@ -339,7 +364,7 @@ public class IntentForwarderActivity extends Activity { PackageManager getPackageManager(); PackageManager getPackageManager(); ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId); CompletableFuture<ResolveInfo> resolveActivityAsUser(Intent intent, int flags, int userId); void showToast(@StringRes int messageId, int duration); void showToast(@StringRes int messageId, int duration); } } Loading
core/tests/coretests/src/com/android/internal/app/IntentForwarderActivityTest.java +10 −2 Original line number Original line Diff line number Diff line Loading @@ -68,6 +68,8 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class) public class IntentForwarderActivityTest { public class IntentForwarderActivityTest { Loading Loading @@ -633,6 +635,11 @@ public class IntentForwarderActivityTest { public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) { getIntent().setComponent(sComponentName); getIntent().setComponent(sComponentName); super.onCreate(savedInstanceState); super.onCreate(savedInstanceState); try { mExecutorService.awaitTermination(/* timeout= */ 30, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override @Override Loading Loading @@ -671,7 +678,8 @@ public class IntentForwarderActivityTest { } } @Override @Override public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) { public CompletableFuture<ResolveInfo> resolveActivityAsUser( Intent intent, int flags, int userId) { ActivityInfo activityInfo = new ActivityInfo(); ActivityInfo activityInfo = new ActivityInfo(); activityInfo.packageName = sPackageName; activityInfo.packageName = sPackageName; activityInfo.name = sActivityName; activityInfo.name = sActivityName; Loading @@ -680,7 +688,7 @@ public class IntentForwarderActivityTest { ResolveInfo resolveInfo = new ResolveInfo(); ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.activityInfo = activityInfo; resolveInfo.activityInfo = activityInfo; return resolveInfo; return CompletableFuture.completedFuture(resolveInfo); } } @Override @Override Loading