| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.internal.app; |
| |
| import android.annotation.Nullable; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.pm.IPackageManager; |
| import android.content.pm.PackageManager; |
| import android.content.pm.UserInfo; |
| import android.os.Bundle; |
| import android.os.UserHandle; |
| import android.os.UserManager; |
| import android.support.test.InstrumentationRegistry; |
| import android.support.test.rule.ActivityTestRule; |
| import android.support.test.runner.AndroidJUnit4; |
| import android.util.Log; |
| |
| import org.junit.Before; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.mockito.ArgumentCaptor; |
| import org.mockito.Mock; |
| import org.mockito.Mockito; |
| import org.mockito.MockitoAnnotations; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import static junit.framework.Assert.assertEquals; |
| import static junit.framework.Assert.assertNotNull; |
| import static junit.framework.Assert.assertNull; |
| import static org.mockito.ArgumentMatchers.any; |
| import static org.mockito.ArgumentMatchers.anyInt; |
| import static org.mockito.ArgumentMatchers.anyString; |
| import static org.mockito.ArgumentMatchers.eq; |
| import static org.mockito.ArgumentMatchers.nullable; |
| import static org.mockito.Mockito.verify; |
| import static org.mockito.Mockito.when; |
| |
| @RunWith(AndroidJUnit4.class) |
| public class IntentForwarderActivityTest { |
| private static final ComponentName FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME = |
| new ComponentName( |
| "android", |
| IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE |
| ); |
| private static final String TYPE_PLAIN_TEXT = "text/plain"; |
| |
| private static UserInfo MANAGED_PROFILE_INFO = new UserInfo(); |
| static { |
| MANAGED_PROFILE_INFO.id = 10; |
| MANAGED_PROFILE_INFO.flags = UserInfo.FLAG_MANAGED_PROFILE; |
| } |
| |
| private static UserInfo CURRENT_USER_INFO = new UserInfo(); |
| static { |
| CURRENT_USER_INFO.id = UserHandle.myUserId(); |
| CURRENT_USER_INFO.flags = 0; |
| } |
| |
| private static IntentForwarderActivity.Injector sInjector; |
| private static ComponentName sComponentName; |
| |
| @Mock private IPackageManager mIPm; |
| @Mock private PackageManager mPm; |
| @Mock private UserManager mUserManager; |
| |
| @Rule |
| public ActivityTestRule<IntentForwarderWrapperActivity> mActivityRule = |
| new ActivityTestRule<>(IntentForwarderWrapperActivity.class, true, false); |
| |
| private Context mContext; |
| |
| @Before |
| public void setup() { |
| MockitoAnnotations.initMocks(this); |
| mContext = InstrumentationRegistry.getTargetContext(); |
| sInjector = new TestInjector(); |
| } |
| |
| @Test |
| public void forwardToManagedProfile_canForward_sendIntent() throws Exception { |
| sComponentName = FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME; |
| |
| // Intent can be forwarded. |
| when(mIPm.canForwardTo( |
| any(Intent.class), nullable(String.class), anyInt(), anyInt())).thenReturn(true); |
| |
| // Managed profile exists. |
| List<UserInfo> profiles = new ArrayList<>(); |
| profiles.add(CURRENT_USER_INFO); |
| profiles.add(MANAGED_PROFILE_INFO); |
| when(mUserManager.getProfiles(anyInt())).thenReturn(profiles); |
| |
| Intent intent = new Intent(mContext, IntentForwarderWrapperActivity.class); |
| intent.setAction(Intent.ACTION_SEND); |
| intent.setType(TYPE_PLAIN_TEXT); |
| IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent); |
| |
| ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); |
| verify(mIPm).canForwardTo(intentCaptor.capture(), eq(TYPE_PLAIN_TEXT), anyInt(), anyInt()); |
| assertEquals(Intent.ACTION_SEND, intentCaptor.getValue().getAction()); |
| |
| assertEquals(Intent.ACTION_SEND, intentCaptor.getValue().getAction()); |
| assertNotNull(activity.mStartActivityIntent); |
| assertEquals(Intent.ACTION_SEND, activity.mStartActivityIntent.getAction()); |
| assertNull(activity.mStartActivityIntent.getPackage()); |
| assertNull(activity.mStartActivityIntent.getComponent()); |
| assertEquals(CURRENT_USER_INFO.id, activity.mStartActivityIntent.getContentUserHint()); |
| |
| assertEquals(MANAGED_PROFILE_INFO.id, activity.mUserIdActivityLaunchedIn); |
| } |
| |
| @Test |
| public void forwardToManagedProfile_cannotForward_sendIntent() throws Exception { |
| sComponentName = FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME; |
| |
| // Intent cannot be forwarded. |
| when(mIPm.canForwardTo( |
| any(Intent.class), nullable(String.class), anyInt(), anyInt())).thenReturn(false); |
| |
| // Managed profile exists. |
| List<UserInfo> profiles = new ArrayList<>(); |
| profiles.add(CURRENT_USER_INFO); |
| profiles.add(MANAGED_PROFILE_INFO); |
| when(mUserManager.getProfiles(anyInt())).thenReturn(profiles); |
| |
| // Create ACTION_SEND intent. |
| Intent intent = new Intent(mContext, IntentForwarderWrapperActivity.class); |
| intent.setAction(Intent.ACTION_SEND); |
| IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent); |
| |
| assertNull(activity.mStartActivityIntent); |
| } |
| |
| @Test |
| public void forwardToManagedProfile_noManagedProfile_sendIntent() throws Exception { |
| sComponentName = FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME; |
| |
| // Intent can be forwarded. |
| when(mIPm.canForwardTo( |
| any(Intent.class), anyString(), anyInt(), anyInt())).thenReturn(true); |
| |
| // Managed profile does not exist. |
| List<UserInfo> profiles = new ArrayList<>(); |
| profiles.add(CURRENT_USER_INFO); |
| when(mUserManager.getProfiles(anyInt())).thenReturn(profiles); |
| |
| // Create ACTION_SEND intent. |
| Intent intent = new Intent(mContext, IntentForwarderWrapperActivity.class); |
| intent.setAction(Intent.ACTION_SEND); |
| IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent); |
| |
| assertNull(activity.mStartActivityIntent); |
| } |
| |
| @Test |
| public void forwardToManagedProfile_canForward_chooserIntent() throws Exception { |
| sComponentName = FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME; |
| |
| // Intent can be forwarded. |
| when(mIPm.canForwardTo( |
| any(Intent.class), nullable(String.class), anyInt(), anyInt())).thenReturn(true); |
| |
| // Manage profile exists. |
| List<UserInfo> profiles = new ArrayList<>(); |
| profiles.add(CURRENT_USER_INFO); |
| profiles.add(MANAGED_PROFILE_INFO); |
| when(mUserManager.getProfiles(anyInt())).thenReturn(profiles); |
| |
| // Create chooser Intent |
| Intent intent = new Intent(mContext, IntentForwarderWrapperActivity.class); |
| intent.setAction(Intent.ACTION_CHOOSER); |
| Intent sendIntent = new Intent(Intent.ACTION_SEND); |
| sendIntent.setComponent(new ComponentName("xx", "yyy")); |
| sendIntent.setType(TYPE_PLAIN_TEXT); |
| intent.putExtra(Intent.EXTRA_INTENT, sendIntent); |
| IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent); |
| |
| ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); |
| verify(mIPm).canForwardTo(intentCaptor.capture(), eq(TYPE_PLAIN_TEXT), anyInt(), anyInt()); |
| assertEquals(Intent.ACTION_SEND, intentCaptor.getValue().getAction()); |
| |
| assertNotNull(activity.mStartActivityIntent); |
| assertEquals(Intent.ACTION_CHOOSER, activity.mStartActivityIntent.getAction()); |
| assertNull(activity.mStartActivityIntent.getPackage()); |
| assertNull(activity.mStartActivityIntent.getComponent()); |
| |
| Intent innerIntent = activity.mStartActivityIntent.getParcelableExtra(Intent.EXTRA_INTENT); |
| assertNotNull(innerIntent); |
| assertEquals(Intent.ACTION_SEND, innerIntent.getAction()); |
| assertNull(innerIntent.getComponent()); |
| assertNull(innerIntent.getPackage()); |
| assertEquals(CURRENT_USER_INFO.id, innerIntent.getContentUserHint()); |
| |
| assertEquals(MANAGED_PROFILE_INFO.id, activity.mUserIdActivityLaunchedIn); |
| } |
| |
| @Test |
| public void forwardToManagedProfile_canForward_selectorIntent() throws Exception { |
| sComponentName = FORWARD_TO_MANAGED_PROFILE_COMPONENT_NAME; |
| |
| // Intent can be forwarded. |
| when(mIPm.canForwardTo( |
| any(Intent.class), nullable(String.class), anyInt(), anyInt())).thenReturn(true); |
| |
| // Manage profile exists. |
| List<UserInfo> profiles = new ArrayList<>(); |
| profiles.add(CURRENT_USER_INFO); |
| profiles.add(MANAGED_PROFILE_INFO); |
| when(mUserManager.getProfiles(anyInt())).thenReturn(profiles); |
| |
| // Create selector intent. |
| Intent intent = Intent.makeMainSelectorActivity( |
| Intent.ACTION_VIEW, Intent.CATEGORY_BROWSABLE); |
| IntentForwarderWrapperActivity activity = mActivityRule.launchActivity(intent); |
| |
| ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); |
| verify(mIPm).canForwardTo( |
| intentCaptor.capture(), nullable(String.class), anyInt(), anyInt()); |
| assertEquals(Intent.ACTION_VIEW, intentCaptor.getValue().getAction()); |
| |
| assertNotNull(activity.mStartActivityIntent); |
| assertEquals(Intent.ACTION_MAIN, activity.mStartActivityIntent.getAction()); |
| assertNull(activity.mStartActivityIntent.getPackage()); |
| assertNull(activity.mStartActivityIntent.getComponent()); |
| assertEquals(CURRENT_USER_INFO.id, activity.mStartActivityIntent.getContentUserHint()); |
| |
| Intent innerIntent = activity.mStartActivityIntent.getSelector(); |
| assertNotNull(innerIntent); |
| assertEquals(Intent.ACTION_VIEW, innerIntent.getAction()); |
| assertNull(innerIntent.getComponent()); |
| assertNull(innerIntent.getPackage()); |
| |
| assertEquals(MANAGED_PROFILE_INFO.id, activity.mUserIdActivityLaunchedIn); |
| } |
| |
| |
| public static class IntentForwarderWrapperActivity extends IntentForwarderActivity { |
| private Intent mStartActivityIntent; |
| private int mUserIdActivityLaunchedIn; |
| |
| @Override |
| public void onCreate(@Nullable Bundle savedInstanceState) { |
| getIntent().setComponent(sComponentName); |
| super.onCreate(savedInstanceState); |
| } |
| |
| @Override |
| protected Injector createInjector() { |
| return sInjector; |
| } |
| |
| @Override |
| public void startActivityAsCaller(Intent intent, @Nullable Bundle options, boolean |
| ignoreTargetSecurity, int userId) { |
| mStartActivityIntent = intent; |
| mUserIdActivityLaunchedIn = userId; |
| } |
| } |
| |
| class TestInjector implements IntentForwarderActivity.Injector { |
| |
| @Override |
| public IPackageManager getIPackageManager() { |
| return mIPm; |
| } |
| |
| @Override |
| public UserManager getUserManager() { |
| return mUserManager; |
| } |
| |
| @Override |
| public PackageManager getPackageManager() { |
| return mPm; |
| } |
| } |
| } |