/* * 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.launcher3.ui; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.allapps.AllAppsStore.DEFER_UPDATES_TEST; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import android.util.Log; import android.view.View; import com.android.launcher3.R; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsPagedView; import com.android.launcher3.allapps.WorkAdapterProvider; import com.android.launcher3.allapps.WorkEduCard; import com.android.launcher3.allapps.WorkProfileManager; import com.android.launcher3.tapl.LauncherInstrumentation; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.Objects; public class WorkProfileTest extends AbstractLauncherUiTest { private static final int WORK_PAGE = AllAppsContainerView.AdapterHolder.WORK; private int mProfileUserId; @Before @Override public void setUp() throws Exception { super.setUp(); String output = mDevice.executeShellCommand( "pm create-user --profileOf 0 --managed TestProfile"); Log.d("b/203817455", "pm create-user; output: " + output); assertTrue("Failed to create work profile", output.startsWith("Success")); String[] tokens = output.split("\\s+"); mProfileUserId = Integer.parseInt(tokens[tokens.length - 1]); mDevice.executeShellCommand("am start-user " + mProfileUserId); mDevice.pressHome(); waitForLauncherCondition("Launcher didn't start", Objects::nonNull); waitForStateTransitionToEnd("Launcher internal state didn't switch to Normal", () -> NORMAL); waitForResumed("Launcher internal state is still Background"); executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); waitForStateTransitionToEnd("Launcher internal state didn't switch to All Apps", () -> ALL_APPS); } @After public void removeWorkProfile() throws Exception { mDevice.executeShellCommand("pm remove-user " + mProfileUserId); } @After public void resumeAppStoreUpdate() { executeOnLauncher(launcher -> { if (launcher == null || launcher.getAppsView() == null) { return; } launcher.getAppsView().getAppsStore().disableDeferUpdates(DEFER_UPDATES_TEST); }); } private void waitForWorkTabSetup() { waitForLauncherCondition("Work tab not setup", launcher -> { if (launcher.getAppsView().getContentView() instanceof AllAppsPagedView) { launcher.getAppsView().getAppsStore().enableDeferUpdates(DEFER_UPDATES_TEST); return true; } return false; }, LauncherInstrumentation.WAIT_TIME_MS); } @Test public void workTabExists() { waitForLauncherCondition("Personal tab is missing", launcher -> launcher.getAppsView().isPersonalTabVisible(), LauncherInstrumentation.WAIT_TIME_MS); waitForLauncherCondition("Work tab is missing", launcher -> launcher.getAppsView().isWorkTabVisible(), LauncherInstrumentation.WAIT_TIME_MS); } @Test public void toggleWorks() { waitForWorkTabSetup(); executeOnLauncher(launcher -> { AllAppsPagedView pagedView = (AllAppsPagedView) launcher.getAppsView().getContentView(); pagedView.setCurrentPage(WORK_PAGE); }); WorkProfileManager manager = getFromLauncher(l -> l.getAppsView().getWorkManager()); waitForLauncherCondition("work profile initial state check failed", launcher -> manager.getWorkModeSwitch() != null && manager.getCurrentState() == WorkProfileManager.STATE_ENABLED && manager.getWorkModeSwitch().isEnabled(), LauncherInstrumentation.WAIT_TIME_MS); //start work profile toggle OFF test executeOnLauncher(l -> l.getAppsView().getWorkManager().getWorkModeSwitch().performClick()); waitForLauncherCondition("Work profile toggle OFF failed", launcher -> { manager.reset(); // pulls current state from system return manager.getCurrentState() == WorkProfileManager.STATE_DISABLED; }, LauncherInstrumentation.WAIT_TIME_MS); // start work profile toggle ON test executeOnLauncher(l -> { AllAppsContainerView allApps = l.getAppsView(); assertEquals("Work tab is not focused", allApps.getCurrentPage(), WORK_PAGE); View workPausedCard = allApps.getActiveRecyclerView().findViewHolderForAdapterPosition( 0).itemView; workPausedCard.findViewById(R.id.enable_work_apps).performClick(); }); waitForLauncherCondition("Work profile toggle ON failed", launcher -> { manager.reset(); // pulls current state from system return manager.getCurrentState() == WorkProfileManager.STATE_ENABLED; }, LauncherInstrumentation.WAIT_TIME_MS); } @Test public void testEdu() { waitForWorkTabSetup(); executeOnLauncher(l -> { l.getSharedPrefs().edit().putInt(WorkAdapterProvider.KEY_WORK_EDU_STEP, 0).commit(); ((AllAppsPagedView) l.getAppsView().getContentView()).setCurrentPage(WORK_PAGE); l.getAppsView().getWorkManager().reset(); }); waitForLauncherCondition("Work profile education not shown", l -> l.getAppsView().getActiveRecyclerView() .findViewHolderForAdapterPosition(0).itemView instanceof WorkEduCard, LauncherInstrumentation.WAIT_TIME_MS); } }