blob: 875f058dab532d81be56fa53dfce84f736f73cfe [file] [log] [blame]
/*
* Copyright (C) 2021 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.managedprovisioning;
import static com.android.managedprovisioning.ManagedProvisioningScreens.ADMIN_INTEGRATED_PREPARE;
import static com.android.managedprovisioning.ManagedProvisioningScreens.ENCRYPT;
import static com.android.managedprovisioning.ManagedProvisioningScreens.FINALIZATION_INSIDE_SUW;
import static com.android.managedprovisioning.ManagedProvisioningScreens.FINANCED_DEVICE_LANDING;
import static com.android.managedprovisioning.ManagedProvisioningScreens.LANDING;
import static com.android.managedprovisioning.ManagedProvisioningScreens.POST_ENCRYPT;
import static com.android.managedprovisioning.ManagedProvisioningScreens.PRE_PROVISIONING;
import static com.android.managedprovisioning.ManagedProvisioningScreens.PRE_PROVISIONING_VIA_NFC;
import static com.android.managedprovisioning.ManagedProvisioningScreens.PROVISIONING;
import static com.android.managedprovisioning.ManagedProvisioningScreens.RESET_AND_RETURN_DEVICE;
import static com.android.managedprovisioning.ManagedProvisioningScreens.RETRY_LAUNCH;
import static com.android.managedprovisioning.ManagedProvisioningScreens.TERMS;
import static com.android.managedprovisioning.ManagedProvisioningScreens.WEB;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import com.android.managedprovisioning.common.RetryLaunchActivity;
import com.android.managedprovisioning.finalization.FinalizationForwarderActivity;
import com.android.managedprovisioning.finalization.FinalizationInsideSuwActivity;
import com.android.managedprovisioning.preprovisioning.EncryptDeviceActivity;
import com.android.managedprovisioning.preprovisioning.PostEncryptionActivity;
import com.android.managedprovisioning.preprovisioning.PreProvisioningActivity;
import com.android.managedprovisioning.preprovisioning.PreProvisioningActivityViaNfc;
import com.android.managedprovisioning.preprovisioning.WebActivity;
import com.android.managedprovisioning.preprovisioning.terms.TermsActivity;
import com.android.managedprovisioning.provisioning.AdminIntegratedFlowPrepareActivity;
import com.android.managedprovisioning.provisioning.FinancedDeviceLandingActivity;
import com.android.managedprovisioning.provisioning.LandingActivity;
import com.android.managedprovisioning.provisioning.ProvisioningActivity;
import com.android.managedprovisioning.provisioning.ResetAndReturnDeviceActivity;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@SmallTest
public final class ScreenManagerTest {
private static final int EXPECTED_NUMBER_OF_SCREENS = 13;
private static final Map<ManagedProvisioningScreens, Class<? extends Activity>>
TEST_SCREEN_TO_ACTIVITY_MAP = createTestScreenToActivityMap();
private static final Map<ManagedProvisioningScreens, Class<? extends Activity>>
TEST_INVALID_SCREEN_TO_ACTIVITY_MAP = createInvalidTestScreenToActivityMap();
private static final Set<String> NON_OVERRIDABLE_ACTIVITIES = new HashSet<>(Arrays.asList(
// The following activity aliases target PreProvisioningActivity
"com.android.managedprovisioning.PreProvisioningActivityAfterEncryption",
"com.android.managedprovisioning.PreProvisioningActivityViaTrustedApp",
"com.android.managedprovisioning.PreProvisioningActivityViaNfc",
FinalizationForwarderActivity.class.getName(),
TrampolineActivity.class.getName()
));
private final Context mContext = InstrumentationRegistry.getTargetContext();
@Test
public void getActivityClassForScreen_withDefaultMap_success() {
ScreenManager screenManager =
new ScreenManager(ScreenManager.DEFAULT_SCREEN_TO_ACTIVITY_MAP);
assertThat(screenManager.getActivityClassForScreen(LANDING))
.isEqualTo(LandingActivity.class);
assertThat(screenManager.getActivityClassForScreen(PRE_PROVISIONING))
.isEqualTo(PreProvisioningActivity.class);
assertThat(screenManager.getActivityClassForScreen(PRE_PROVISIONING_VIA_NFC))
.isEqualTo(PreProvisioningActivityViaNfc.class);
assertThat(screenManager.getActivityClassForScreen(PROVISIONING))
.isEqualTo(ProvisioningActivity.class);
assertThat(screenManager.getActivityClassForScreen(ADMIN_INTEGRATED_PREPARE))
.isEqualTo(AdminIntegratedFlowPrepareActivity.class);
assertThat(screenManager.getActivityClassForScreen(RESET_AND_RETURN_DEVICE))
.isEqualTo(ResetAndReturnDeviceActivity.class);
assertThat(screenManager.getActivityClassForScreen(WEB))
.isEqualTo(WebActivity.class);
assertThat(screenManager.getActivityClassForScreen(ENCRYPT))
.isEqualTo(EncryptDeviceActivity.class);
assertThat(screenManager.getActivityClassForScreen(POST_ENCRYPT))
.isEqualTo(PostEncryptionActivity.class);
assertThat(screenManager.getActivityClassForScreen(FINALIZATION_INSIDE_SUW))
.isEqualTo(FinalizationInsideSuwActivity.class);
assertThat(screenManager.getActivityClassForScreen(TERMS))
.isEqualTo(TermsActivity.class);
assertThat(screenManager.getActivityClassForScreen(FINANCED_DEVICE_LANDING))
.isEqualTo(FinancedDeviceLandingActivity.class);
assertThat(screenManager.getActivityClassForScreen(RETRY_LAUNCH))
.isEqualTo(RetryLaunchActivity.class);
}
@Test
public void defaultScreenToActivityMap_hasExpectedSize() {
assertThat(ScreenManager.DEFAULT_SCREEN_TO_ACTIVITY_MAP.size())
.isEqualTo(EXPECTED_NUMBER_OF_SCREENS);
}
@Test
public void getActivityClassForScreen_withCustomMap_success() {
ScreenManager screenManager = new ScreenManager(TEST_SCREEN_TO_ACTIVITY_MAP);
assertThat(screenManager.getActivityClassForScreen(LANDING)).isEqualTo(Activity.class);
}
@Test
public void setOverrideActivity_success() {
ScreenManager screenManager =
new ScreenManager(ScreenManager.DEFAULT_SCREEN_TO_ACTIVITY_MAP);
screenManager.setOverrideActivity(
ManagedProvisioningScreens.LANDING,
Activity.class);
assertThat(screenManager.getActivityClassForScreen(LANDING)).isEqualTo(Activity.class);
}
@Test
public void constructObject_withInvalidMap_throwsException() {
assertThrows(IllegalStateException.class,
() -> new ScreenManager(TEST_INVALID_SCREEN_TO_ACTIVITY_MAP));
}
@Test
public void verifyEveryActivityIsMapped() throws PackageManager.NameNotFoundException {
List<String> activities = getManagedProvisioningActivityNames();
List<String> unmappedActivities = getUnmappedOverridableActivities(activities);
assertThat(unmappedActivities).isEmpty();
}
private List<String> getUnmappedOverridableActivities(List<String> activities) {
return activities
.stream()
.filter(activityName -> !isActivityMapped(activityName))
.filter(this::isActivityOverridable)
.collect(Collectors.toList());
}
private boolean isActivityOverridable(String activityName) {
return !NON_OVERRIDABLE_ACTIVITIES.contains(activityName);
}
private boolean isActivityMapped(String activityName) {
Collection<Class<? extends Activity>> mappedActivities =
ScreenManager.DEFAULT_SCREEN_TO_ACTIVITY_MAP.values();
return mappedActivities
.stream()
.anyMatch(activityClass -> activityClass.getName().equals(activityName));
}
private List<String> getManagedProvisioningActivityNames()
throws PackageManager.NameNotFoundException {
PackageManager packageManager = mContext.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(
mContext.getPackageName(),
PackageManager.GET_ACTIVITIES);
return Arrays.stream(packageInfo.activities)
.map(activityInfo -> activityInfo.name)
.collect(Collectors.toList());
}
private static Map<ManagedProvisioningScreens, Class<? extends Activity>>
createTestScreenToActivityMap() {
Map<ManagedProvisioningScreens, Class<? extends Activity>> map = new HashMap<>();
map.put(LANDING, Activity.class);
map.put(PRE_PROVISIONING, Activity.class);
map.put(PRE_PROVISIONING_VIA_NFC, Activity.class);
map.put(PROVISIONING, Activity.class);
map.put(ADMIN_INTEGRATED_PREPARE, Activity.class);
map.put(RESET_AND_RETURN_DEVICE, Activity.class);
map.put(WEB, Activity.class);
map.put(ENCRYPT, Activity.class);
map.put(POST_ENCRYPT, Activity.class);
map.put(FINALIZATION_INSIDE_SUW, Activity.class);
map.put(TERMS, Activity.class);
map.put(FINANCED_DEVICE_LANDING, Activity.class);
map.put(RETRY_LAUNCH, Activity.class);
return map;
}
private static Map<ManagedProvisioningScreens, Class<? extends Activity>>
createInvalidTestScreenToActivityMap() {
return Map.of(LANDING, LandingActivity.class);
}
}