diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index 9bb4b25fdc..f154dd49ac 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -63,7 +63,6 @@ import com.android.launcher3.allapps.search.SearchAdapterProvider; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.keyboard.FocusedItemDecorator; import com.android.launcher3.model.data.AppInfo; -import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.Themes; import com.android.launcher3.views.RecyclerViewFastScroller; @@ -482,10 +481,6 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo int layout = showTabs ? R.layout.all_apps_tabs : R.layout.all_apps_rv_layout; View newView = getLayoutInflater().inflate(layout, this, false); addView(newView, index); - if (TestProtocol.sDebugTracing) { - Log.d(TestProtocol.WORK_PROFILE_REMOVED, "should show tabs:" + showTabs, - new Exception()); - } if (showTabs) { mViewPager = (AllAppsPagedView) newView; mViewPager.initParentViews(this); diff --git a/src/com/android/launcher3/allapps/WorkProfileManager.java b/src/com/android/launcher3/allapps/WorkProfileManager.java index c53360a204..54a5c516b7 100644 --- a/src/com/android/launcher3/allapps/WorkProfileManager.java +++ b/src/com/android/launcher3/allapps/WorkProfileManager.java @@ -172,4 +172,8 @@ public class WorkProfileManager implements PersonalWorkSlidingTabStrip.OnActiveP private AllAppsContainerView.AdapterHolder getAH() { return mAllApps.mAH[AllAppsContainerView.AdapterHolder.WORK]; } + + public int getCurrentState() { + return mCurrentState; + } } diff --git a/src/com/android/launcher3/pm/UserCache.java b/src/com/android/launcher3/pm/UserCache.java index 5ade22be5e..5aab41a8a2 100644 --- a/src/com/android/launcher3/pm/UserCache.java +++ b/src/com/android/launcher3/pm/UserCache.java @@ -21,10 +21,8 @@ import android.content.Intent; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; -import android.util.Log; import android.util.LongSparseArray; -import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.SafeCloseable; import com.android.launcher3.util.SimpleBroadcastReceiver; @@ -60,9 +58,6 @@ public class UserCache { private void onUsersChanged(Intent intent) { enableAndResetCache(); mUserChangeListeners.forEach(Runnable::run); - if (TestProtocol.sDebugTracing) { - Log.d(TestProtocol.WORK_PROFILE_REMOVED, "profile changed", new Exception()); - } } /** diff --git a/src/com/android/launcher3/testing/TestProtocol.java b/src/com/android/launcher3/testing/TestProtocol.java index f67bac6be5..893a215ba7 100644 --- a/src/com/android/launcher3/testing/TestProtocol.java +++ b/src/com/android/launcher3/testing/TestProtocol.java @@ -117,7 +117,6 @@ public final class TestProtocol { public static final String REQUEST_MOCK_SENSOR_ROTATION = "mock-sensor-rotation"; public static final String PERMANENT_DIAG_TAG = "TaplTarget"; - public static final String WORK_PROFILE_REMOVED = "b/159671700"; public static final String TASK_VIEW_ID_CRASH = "b/195430732"; public static final String NO_DROP_TARGET = "b/195031154"; public static final String NULL_INT_SET = "b/200572078"; diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index b6b6cdd5b7..0ffbeeb95e 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -262,8 +262,6 @@ public abstract class AbstractLauncherUiTest { if (userManager != null) { for (UserHandle userHandle : userManager.getUserProfiles()) { if (!userHandle.isSystem()) { - Log.d(TestProtocol.WORK_PROFILE_REMOVED, - "removing user " + userHandle.getIdentifier()); mDevice.executeShellCommand("pm remove-user " + userHandle.getIdentifier()); } } diff --git a/tests/src/com/android/launcher3/ui/WorkProfileTest.java b/tests/src/com/android/launcher3/ui/WorkProfileTest.java new file mode 100644 index 0000000000..fcb0b7fec4 --- /dev/null +++ b/tests/src/com/android/launcher3/ui/WorkProfileTest.java @@ -0,0 +1,167 @@ +/* + * 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.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"); + 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); + } + + @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() { + mDevice.pressHome(); + waitForLauncherCondition("Launcher didn't start", Objects::nonNull); + waitForState("Launcher internal state didn't switch to Normal", () -> NORMAL); + executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); + waitForState("Launcher internal state didn't switch to All Apps", () -> ALL_APPS); + 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() { + mDevice.pressHome(); + waitForLauncherCondition("Launcher didn't start", Objects::nonNull); + waitForState("Launcher internal state didn't switch to Normal", () -> NORMAL); + executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); + waitForState("Launcher internal state didn't switch to All Apps", () -> ALL_APPS); + + 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() { + mDevice.pressHome(); + waitForLauncherCondition("Launcher didn't start", Objects::nonNull); + waitForState("Launcher internal state didn't switch to Normal", () -> NORMAL); + executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); + waitForState("Launcher internal state didn't switch to All Apps", () -> ALL_APPS); + 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); + } +} diff --git a/tests/src_disabled/WorkTabTest.java b/tests/src_disabled/WorkTabTest.java deleted file mode 100644 index bfacc74220..0000000000 --- a/tests/src_disabled/WorkTabTest.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2018, 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.os.Process; -import android.os.UserHandle; -import android.os.UserManager; -import android.util.Log; -import android.widget.TextView; - -import androidx.test.filters.LargeTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.launcher3.R; -import com.android.launcher3.allapps.AllAppsContainerView; -import com.android.launcher3.allapps.AllAppsPagedView; -import com.android.launcher3.allapps.WorkModeSwitch; -import com.android.launcher3.dragndrop.DragLayer; -import com.android.launcher3.tapl.LauncherInstrumentation; -import com.android.launcher3.testing.TestProtocol; -import com.android.launcher3.views.WorkEduView; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.List; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicInteger; - -@LargeTest -@RunWith(AndroidJUnit4.class) -public class WorkTabTest extends AbstractLauncherUiTest { - - private int mProfileUserId; - - private static final int WORK_PAGE = AllAppsContainerView.AdapterHolder.WORK; - - @Before - @Override - public void setUp() throws Exception { - super.setUp(); - String output = - mDevice.executeShellCommand( - "pm create-user --profileOf 0 --managed TestProfile"); - assertTrue("Failed to create work profile", output.startsWith("Success")); - - String[] tokens = output.split("\\s+"); - mProfileUserId = Integer.parseInt(tokens[tokens.length - 1]); - Log.d(TestProtocol.WORK_PROFILE_REMOVED, "Created new user uid" + mProfileUserId); - mDevice.executeShellCommand("am start-user " + mProfileUserId); - } - - @After - public void removeWorkProfile() throws Exception { - Log.d(TestProtocol.WORK_PROFILE_REMOVED, "(teardown) removing uid" + mProfileUserId, - new 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); - Log.d(TestProtocol.WORK_PROFILE_REMOVED, "resuming AppStore updates"); - }); - } - - @Ignore("b/182844465") - @Test - public void workTabExists() { - mDevice.pressHome(); - waitForLauncherCondition("Launcher didn't start", Objects::nonNull); - executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); - waitForState("Launcher internal state didn't switch to All Apps", () -> ALL_APPS); - waitForLauncherCondition("Personal tab is missing", - launcher -> launcher.getAppsView().isPersonalTabVisible(), 60000); - waitForLauncherCondition("Work tab is missing", - launcher -> launcher.getAppsView().isWorkTabVisible(), 60000); - } - - @Ignore("b/182844465") - @Test - public void toggleWorks() { - mDevice.pressHome(); - waitForLauncherCondition("Launcher didn't start", Objects::nonNull); - executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); - waitForState("Launcher internal state didn't switch to All Apps", () -> ALL_APPS); - getOnceNotNull("Apps view did not bind", - launcher -> launcher.getAppsView().getWorkModeSwitch(), 60000); - - UserManager userManager = getFromLauncher(l -> l.getSystemService(UserManager.class)); - assertEquals(2, userManager.getUserProfiles().size()); - UserHandle workProfile = getFromLauncher(l -> { - UserHandle myHandle = Process.myUserHandle(); - List userProfiles = userManager.getUserProfiles(); - return userProfiles.get(0) == myHandle ? userProfiles.get(1) : userProfiles.get(0); - }); - - waitForLauncherCondition("work profile can't be turned off", - l -> userManager.requestQuietModeEnabled(true, workProfile)); - - assertTrue(userManager.isQuietModeEnabled(workProfile)); - executeOnLauncher(launcher -> { - WorkModeSwitch wf = launcher.getAppsView().getWorkModeSwitch(); - ((AllAppsPagedView) launcher.getAppsView().getContentView()).snapToPageImmediately( - AllAppsContainerView.AdapterHolder.WORK); - wf.toggle(); - }); - waitForLauncherCondition("Work toggle did not work", - l -> l.getSystemService(UserManager.class).isQuietModeEnabled(workProfile)); - } - - @Ignore("b/182844465") - @Test - public void testWorkEduFlow() { - mDevice.pressHome(); - waitForLauncherCondition("Launcher didn't start", Objects::nonNull); - executeOnLauncher(launcher -> launcher.getSharedPrefs().edit().remove( - WorkEduView.KEY_WORK_EDU_STEP).remove( - WorkEduView.KEY_LEGACY_WORK_EDU_SEEN).commit()); - - 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); - - executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); - WorkEduView workEduView = getEduView(); - // verify personal app edu is seen first and click "next" - executeOnLauncher(l -> { - assertEquals(((TextView) workEduView.findViewById(R.id.content_text)).getText(), - l.getResources().getString(R.string.work_profile_edu_personal_apps)); - workEduView.findViewById(R.id.proceed).callOnClick(); - }); - - AtomicInteger attempt = new AtomicInteger(0); - // verify work edu is seen next - waitForLauncherCondition("Launcher did not show the next edu screen", l -> { - Log.d(TestProtocol.WORK_PROFILE_REMOVED, - "running test attempt" + attempt.getAndIncrement()); - if (!(l.getAppsView().getContentView() instanceof AllAppsPagedView)) { - Log.d(TestProtocol.WORK_PROFILE_REMOVED, "Work tab not setup. Skipping test"); - return false; - } - if (((AllAppsPagedView) l.getAppsView().getContentView()).getCurrentPage() - != WORK_PAGE) { - Log.d(TestProtocol.WORK_PROFILE_REMOVED, "Work page not highlighted"); - } - return ((TextView) workEduView.findViewById(R.id.content_text)).getText().equals( - l.getResources().getString(R.string.work_profile_edu_work_apps)); - }); - } - - @Ignore("b/182844465") - @Test - public void testWorkEduIntermittent() { - mDevice.pressHome(); - waitForLauncherCondition("Launcher didn't start", Objects::nonNull); - executeOnLauncher(launcher -> launcher.getSharedPrefs().edit().remove( - WorkEduView.KEY_WORK_EDU_STEP).remove( - WorkEduView.KEY_LEGACY_WORK_EDU_SEEN).commit()); - - - waitForLauncherCondition("Work tab not setup", - launcher -> launcher.getAppsView().getContentView() instanceof AllAppsPagedView, - 60000); - executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); - - // verify personal app edu is seen - getEduView(); - - // dismiss personal edu - mDevice.pressHome(); - waitForState("Launcher did not go home", () -> NORMAL); - - // open work tab - executeOnLauncher(launcher -> launcher.getStateManager().goToState(ALL_APPS)); - waitForState("Launcher did not switch to all apps", () -> ALL_APPS); - waitForLauncherCondition("Work tab not setup", - launcher -> launcher.getAppsView().getContentView() instanceof AllAppsPagedView, - 60000); - - executeOnLauncher(launcher -> { - AllAppsPagedView pagedView = (AllAppsPagedView) launcher.getAppsView().getContentView(); - pagedView.setCurrentPage(WORK_PAGE); - }); - - WorkEduView workEduView = getEduView(); - - // verify work tab edu is shown - waitForLauncherCondition("Launcher did not show the next edu screen", - l -> ((TextView) workEduView.findViewById(R.id.content_text)).getText().equals( - l.getResources().getString(R.string.work_profile_edu_work_apps))); - } - - - private WorkEduView getEduView() { - waitForLauncherCondition("Edu did not show", l -> { - DragLayer dragLayer = l.getDragLayer(); - return dragLayer.getChildCount() > 0 && dragLayer.getChildAt( - dragLayer.getChildCount() - 1) instanceof WorkEduView; - }, 6000); - return getFromLauncher(launcher -> (WorkEduView) launcher.getDragLayer().getChildAt( - launcher.getDragLayer().getChildCount() - 1)); - } - -} \ No newline at end of file