Work profile edu

+ Move bottom sheet edu resources to launcher3

Bug: 140099753
Test: Manual
Change-Id: I933acea2b503c0f98362322d24a067c33a1bb2a7
diff --git a/quickstep/recents_ui_overrides/res/drawable/hotseat_edu_notification_icon.xml b/quickstep/recents_ui_overrides/res/drawable/hotseat_edu_notification_icon.xml
index f0e70a8..fa3a0f8 100644
--- a/quickstep/recents_ui_overrides/res/drawable/hotseat_edu_notification_icon.xml
+++ b/quickstep/recents_ui_overrides/res/drawable/hotseat_edu_notification_icon.xml
@@ -15,5 +15,5 @@
 -->
 <vector android:height="24dp" android:viewportHeight="24"
     android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="@color/hotseat_edu_background" android:pathData="M19 9l1.25-2.75L23 5l-2.75-1.25L19 1l-1.25 2.75L15 5l2.75 1.25L19 9zm-7.5.5L9 4 6.5 9.5 1 12l5.5 2.5L9 20l2.5-5.5L17 12l-5.5-2.5zM19 15l-1.25 2.75L15 19l2.75 1.25L19 23l1.25-2.75L23 19l-2.75-1.25L19 15z"/>
+    <path android:fillColor="@color/bottom_panel_background" android:pathData="M19 9l1.25-2.75L23 5l-2.75-1.25L19 1l-1.25 2.75L15 5l2.75 1.25L19 9zm-7.5.5L9 4 6.5 9.5 1 12l5.5 2.5L9 20l2.5-5.5L17 12l-5.5-2.5zM19 15l-1.25 2.75L15 19l2.75 1.25L19 23l1.25-2.75L23 19l-2.75-1.25L19 15z"/>
 </vector>
diff --git a/quickstep/recents_ui_overrides/res/layout/predicted_hotseat_edu.xml b/quickstep/recents_ui_overrides/res/layout/predicted_hotseat_edu.xml
index ee38e3b..a7cd167 100644
--- a/quickstep/recents_ui_overrides/res/layout/predicted_hotseat_edu.xml
+++ b/quickstep/recents_ui_overrides/res/layout/predicted_hotseat_edu.xml
@@ -24,12 +24,13 @@
     <View
         android:layout_width="match_parent"
         android:layout_height="32dp"
-        android:background="@drawable/hotseat_prediction_edu_top" />
+        android:backgroundTint="@color/bottom_panel_background"
+        android:background="@drawable/bottom_sheet_top_border" />
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:background="@color/hotseat_edu_background"
+        android:background="@color/bottom_panel_background"
         android:orientation="vertical">
 
         <TextView
@@ -37,8 +38,8 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="18dp"
             android:fontFamily="google-sans"
-            android:paddingLeft="@dimen/hotseat_edu_padding"
-            android:paddingRight="@dimen/hotseat_edu_padding"
+            android:paddingLeft="@dimen/bottom_sheet_edu_padding"
+            android:paddingRight="@dimen/bottom_sheet_edu_padding"
             android:text="@string/hotseat_migrate_title"
             android:textAlignment="center"
             android:textColor="@android:color/white"
@@ -50,8 +51,8 @@
             android:layout_marginTop="18dp"
             android:layout_marginBottom="18dp"
             android:fontFamily="roboto-medium"
-            android:paddingLeft="@dimen/hotseat_edu_padding"
-            android:paddingRight="@dimen/hotseat_edu_padding"
+            android:paddingLeft="@dimen/bottom_sheet_edu_padding"
+            android:paddingRight="@dimen/bottom_sheet_edu_padding"
             android:text="@string/hotseat_migrate_message"
             android:textAlignment="center"
             android:textColor="@android:color/white"
@@ -72,9 +73,9 @@
             <FrameLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:paddingLeft="@dimen/hotseat_edu_padding"
+                android:paddingLeft="@dimen/bottom_sheet_edu_padding"
                 android:paddingTop="8dp"
-                android:paddingRight="@dimen/hotseat_edu_padding">
+                android:paddingRight="@dimen/bottom_sheet_edu_padding">
 
                 <Button
                     android:id="@+id/turn_predictions_on"
diff --git a/quickstep/recents_ui_overrides/res/values/colors.xml b/quickstep/recents_ui_overrides/res/values/colors.xml
index 4fa5684..7426e30 100644
--- a/quickstep/recents_ui_overrides/res/values/colors.xml
+++ b/quickstep/recents_ui_overrides/res/values/colors.xml
@@ -6,6 +6,4 @@
     <color name="all_apps_label_text_dark">#61FFFFFF</color>
     <color name="all_apps_prediction_row_separator">#3c000000</color>
     <color name="all_apps_prediction_row_separator_dark">#3cffffff</color>
-
-    <color name="hotseat_edu_background">#f01A73E8</color>
 </resources>
\ No newline at end of file
diff --git a/quickstep/recents_ui_overrides/res/values/dimens.xml b/quickstep/recents_ui_overrides/res/values/dimens.xml
index c458ec7..de97d08 100644
--- a/quickstep/recents_ui_overrides/res/values/dimens.xml
+++ b/quickstep/recents_ui_overrides/res/values/dimens.xml
@@ -29,7 +29,4 @@
     <dimen name="swipe_up_y_overshoot">10dp</dimen>
     <dimen name="swipe_up_max_workspace_trans_y">-60dp</dimen>
 
-    <!-- Hybrid hotseat related -->
-    <dimen name="hotseat_edu_padding">24dp</dimen>
-
 </resources>
\ No newline at end of file
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduController.java
index 923e050..bfbd00e 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/hybridhotseat/HotseatEduController.java
@@ -109,7 +109,7 @@
                 NOTIFICATION_CHANNEL_ID)
                 .setContentTitle(name)
                 .setOngoing(true)
-                .setColor(mLauncher.getColor(R.color.hotseat_edu_background))
+                .setColor(mLauncher.getColor(R.color.bottom_panel_background))
                 .setContentIntent(PendingIntent.getActivity(mLauncher, 0, intent,
                         PendingIntent.FLAG_CANCEL_CURRENT))
                 .setSmallIcon(R.drawable.hotseat_edu_notification_icon)
diff --git a/res/drawable-hdpi/work_tab_user_education.png b/res/drawable-hdpi/work_tab_user_education.png
deleted file mode 100644
index 1879dfb..0000000
--- a/res/drawable-hdpi/work_tab_user_education.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/work_tab_user_education.png b/res/drawable-mdpi/work_tab_user_education.png
deleted file mode 100644
index 65c7e63..0000000
--- a/res/drawable-mdpi/work_tab_user_education.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/work_tab_user_education.png b/res/drawable-xhdpi/work_tab_user_education.png
deleted file mode 100644
index 59df7a8..0000000
--- a/res/drawable-xhdpi/work_tab_user_education.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/work_tab_user_education.png b/res/drawable-xxhdpi/work_tab_user_education.png
deleted file mode 100644
index 3c6aa20..0000000
--- a/res/drawable-xxhdpi/work_tab_user_education.png
+++ /dev/null
Binary files differ
diff --git a/quickstep/recents_ui_overrides/res/drawable/hotseat_prediction_edu_top.xml b/res/drawable/bottom_sheet_top_border.xml
similarity index 84%
rename from quickstep/recents_ui_overrides/res/drawable/hotseat_prediction_edu_top.xml
rename to res/drawable/bottom_sheet_top_border.xml
index e3cc549..23f4e51 100644
--- a/quickstep/recents_ui_overrides/res/drawable/hotseat_prediction_edu_top.xml
+++ b/res/drawable/bottom_sheet_top_border.xml
@@ -15,5 +15,5 @@
 -->
 <vector android:height="15.53398dp" android:viewportHeight="32"
     android:viewportWidth="412" android:width="200dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="@color/hotseat_edu_background" android:pathData="M412,32v-2.64C349.26,10.51 279.5,0 206,0S62.74,10.51 0,29.36V32H412z"/>
+    <path android:fillColor="@android:color/white" android:pathData="M412,32v-2.64C349.26,10.51 279.5,0 206,0S62.74,10.51 0,29.36V32H412z"/>
 </vector>
diff --git a/res/layout/work_profile_edu.xml b/res/layout/work_profile_edu.xml
new file mode 100644
index 0000000..a8e3d20
--- /dev/null
+++ b/res/layout/work_profile_edu.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2020 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.
+-->
+<com.android.launcher3.views.WorkEduView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_gravity="bottom"
+    android:gravity="bottom"
+    android:orientation="vertical">
+
+    <View
+        android:layout_width="match_parent"
+        android:backgroundTint="@color/bottom_panel_background"
+        android:layout_height="32dp"
+        android:background="@drawable/bottom_sheet_top_border" />
+
+    <LinearLayout
+        android:id="@+id/view_wrapper"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/bottom_panel_background"
+        android:orientation="vertical"
+        android:paddingLeft="@dimen/bottom_sheet_edu_padding"
+        android:paddingRight="@dimen/bottom_sheet_edu_padding">
+
+        <TextView
+            android:id="@+id/content_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="48dp"
+            android:layout_marginBottom="48dp"
+            android:fontFamily="google-sans"
+            android:text="@string/work_profile_edu_personal_apps"
+            android:textAlignment="center"
+            android:textColor="@android:color/white"
+            android:textSize="20sp" />
+
+        <Button
+            android:id="@+id/proceed"
+            android:layout_width="wrap_content"
+            android:layout_height="48dp"
+            android:layout_gravity="end"
+            android:background="?android:attr/selectableItemBackground"
+            android:gravity="center"
+            android:text="@string/work_profile_edu_next"
+            android:textAlignment="center"
+            android:textColor="@android:color/white" />
+    </LinearLayout>
+
+</com.android.launcher3.views.WorkEduView>
\ No newline at end of file
diff --git a/res/layout/work_tab_bottom_user_education_view.xml b/res/layout/work_tab_bottom_user_education_view.xml
deleted file mode 100644
index ac2deeb..0000000
--- a/res/layout/work_tab_bottom_user_education_view.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<com.android.launcher3.views.BottomUserEducationView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_gravity="bottom"
-    android:background="?android:attr/colorAccent"
-    android:elevation="2dp"
-    android:focusable="true"
-    android:orientation="horizontal">
-
-  <ImageView
-      android:layout_width="134dp"
-      android:layout_height="134dp"
-      android:layout_marginTop="28dp"
-      android:layout_marginLeft="20dp"
-      android:src="@drawable/work_tab_user_education"/>
-
-  <LinearLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:layout_marginStart="24dp"
-      android:orientation="vertical">
-
-    <ImageView
-        android:id="@+id/close_bottom_user_tip"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:layout_marginTop="12dp"
-        android:layout_marginEnd="12dp"
-        android:layout_gravity="right"
-        android:contentDescription="@string/bottom_work_tab_user_education_close_button"
-        android:src="@drawable/ic_remove_no_shadow"/>
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="4dp"
-        android:layout_marginEnd="24dp"
-        android:fontFamily="roboto-medium"
-        android:text="@string/bottom_work_tab_user_education_title"
-        android:textColor="@android:color/white"
-        android:textSize="20sp"/>
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="24dp"
-        android:text="@string/bottom_work_tab_user_education_body"
-        android:textColor="@android:color/white"
-        android:textSize="14sp"/>
-
-  </LinearLayout>
-
-</com.android.launcher3.views.BottomUserEducationView>
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 815ae21..36f8468 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -43,4 +43,7 @@
     <color name="back_gesture_tutorial_title_color">#FF000000</color>
     <color name="back_gesture_tutorial_action_button_label_color">#FFFFFFFF</color>
     <color name="back_gesture_tutorial_primary_color">#1A73E8</color> <!-- Blue -->
+
+
+    <color name="bottom_panel_background">#f01A73E8</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 4bcb8a7..0293573 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -235,4 +235,7 @@
 <!-- Theming related -->
     <dimen name="default_dialog_corner_radius">8dp</dimen>
 
+    <!-- Onboarding bottomsheet related -->
+    <dimen name="bottom_sheet_edu_padding">24dp</dimen>
+
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 218f6db..3f279f4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -327,17 +327,20 @@
 
     <!-- This string is in the work profile tab when a user has All Apps open on their phone. This is a label for a toggle to turn the work profile on and off. "Work profile" means a separate profile on a user's phone that's specifically for their work apps and managed by their company. "Work" is used as an adjective.-->
     <string name="work_profile_toggle_label">Work profile</string>
-    <!-- Title of an overlay in All Apps. This overlay is letting a user know about their work profile, which is managed by their employer. "Work apps" are apps in a user's work profile.-->
-    <string name="bottom_work_tab_user_education_title">Find work apps here</string>
-    <!-- Text in an overlay in All Apps. This overlay is letting a user know about their work profile, which is managed by their employer.-->
-    <string name="bottom_work_tab_user_education_body">Each work app has a badge and is kept secure by your organization. Move apps to your Home screen for easier access.</string>
+    <!--- User onboarding title for personal apps -->
+    <string name="work_profile_edu_personal_apps">Personal apps are private &amp; can\'t be seen by IT</string>
+    <!--- User onboarding title for work profile apps -->
+    <string name="work_profile_edu_work_apps">Work apps are badged and monitored by IT</string>
+    <!-- Action label to proceed to the next work profile edu section-->
+    <string name="work_profile_edu_next">Next</string>
+    <!-- Action label to finish work profile edu-->
+    <string name="work_profile_edu_accept">Got it</string>
+
     <!-- This string is in the work profile tab when a user has All Apps open on their phone. It describes the label of a toggle, "Work profile," as being managed by the user's employer.
     "Organization" is used to represent a variety of businesses, non-profits, and educational institutions).-->
     <string name="work_mode_on_label">Managed by your organization</string>
     <!-- This string appears under a the label of a toggle in the work profile tab on a user's phone. It describes the status of the toggle, "Work profile," when it's turned off. "Work profile" means a separate profile on a user's phone that's speficially for their work apps and is managed by their company.-->
     <string name="work_mode_off_label">Notifications and apps are off</string>
-    <string name="bottom_work_tab_user_education_close_button">Close</string>
-    <string name="bottom_work_tab_user_education_closed">Closed</string>
 
     <!-- Failed action error message: e.g. Failed: Pause -->
     <string name="remote_action_failed">Failed: <xliff:g id="what" example="Pause">%1$s</xliff:g></string>
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 13b7b54..27668eb 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -49,6 +49,7 @@
 import com.android.launcher3.ItemInfo;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherState;
+import com.android.launcher3.LauncherStateManager;
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.keyboard.FocusedItemDecorator;
@@ -58,9 +59,9 @@
 import com.android.launcher3.util.MultiValueAlpha;
 import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
 import com.android.launcher3.util.Themes;
-import com.android.launcher3.views.BottomUserEducationView;
 import com.android.launcher3.views.RecyclerViewFastScroller;
 import com.android.launcher3.views.SpringRelativeLayout;
+import com.android.launcher3.views.WorkEduView;
 
 /**
  * The all apps view container.
@@ -92,6 +93,8 @@
     private boolean mUsingTabs;
     private boolean mSearchModeWhileUsingTabs = false;
 
+    private LauncherStateManager.StateListener mWorkTabListener;
+
     private RecyclerViewFastScroller mTouchHandler;
     private final Point mFastScrollerOffset = new Point();
 
@@ -287,7 +290,8 @@
     }
 
     @Override
-    public void onDropCompleted(View target, DragObject d, boolean success) { }
+    public void onDropCompleted(View target, DragObject d, boolean success) {
+    }
 
     @Override
     public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) {
@@ -371,6 +375,7 @@
             mAH[AdapterHolder.MAIN].setup(mViewPager.getChildAt(0), mPersonalMatcher);
             mAH[AdapterHolder.WORK].setup(mViewPager.getChildAt(1), mWorkMatcher);
             onTabChanged(mViewPager.getNextPage());
+            mWorkTabListener = WorkEduView.showEduFlowIfNeeded(mLauncher, mWorkTabListener);
         } else {
             mAH[AdapterHolder.MAIN].setup(findViewById(R.id.apps_list_view), null);
             mAH[AdapterHolder.WORK].recyclerView = null;
@@ -416,10 +421,9 @@
                     .setOnClickListener((View view) -> mViewPager.snapToPage(AdapterHolder.MAIN));
             findViewById(R.id.tab_work)
                     .setOnClickListener((View view) -> mViewPager.snapToPage(AdapterHolder.WORK));
-
-        }
-        if (pos == AdapterHolder.WORK) {
-            BottomUserEducationView.showIfNeeded(mLauncher);
+            if (pos == AdapterHolder.WORK) {
+                WorkEduView.showWorkEduIfNeeded(mLauncher);
+            }
         }
     }
 
diff --git a/src/com/android/launcher3/views/BottomUserEducationView.java b/src/com/android/launcher3/views/BottomUserEducationView.java
deleted file mode 100644
index bdc69af..0000000
--- a/src/com/android/launcher3/views/BottomUserEducationView.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * 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.launcher3.views;
-
-import static com.android.launcher3.compat.AccessibilityManagerCompat.sendCustomAccessibilityEvent;
-
-import android.animation.PropertyValuesHolder;
-import android.content.Context;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.TouchDelegate;
-import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
-
-import com.android.launcher3.Insettable;
-import com.android.launcher3.Launcher;
-import com.android.launcher3.R;
-import com.android.launcher3.anim.Interpolators;
-import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
-
-public class BottomUserEducationView extends AbstractSlideInView implements Insettable {
-
-    private static final String KEY_SHOWED_BOTTOM_USER_EDUCATION = "showed_bottom_user_education";
-
-    private static final int DEFAULT_CLOSE_DURATION = 200;
-
-    private final Rect mInsets = new Rect();
-
-    private View mCloseButton;
-
-    public BottomUserEducationView(Context context, AttributeSet attr) {
-        this(context, attr, 0);
-    }
-
-    public BottomUserEducationView(Context context, AttributeSet attrs,
-            int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        mContent = this;
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-        mCloseButton = findViewById(R.id.close_bottom_user_tip);
-        mCloseButton.setOnClickListener(view -> handleClose(true));
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        super.onLayout(changed, l, t, r, b);
-        setTranslationShift(mTranslationShift);
-        expandTouchAreaOfCloseButton();
-    }
-
-    @Override
-    public void logActionCommand(int command) {
-        // Since this is on-boarding popup, it is not a user controlled action.
-    }
-
-    @Override
-    public int getLogContainerType() {
-        return ContainerType.TIP;
-    }
-
-    @Override
-    protected boolean isOfType(int type) {
-        return (type & TYPE_ON_BOARD_POPUP) != 0;
-    }
-
-    @Override
-    public void setInsets(Rect insets) {
-        // Extend behind left, right, and bottom insets.
-        int leftInset = insets.left - mInsets.left;
-        int rightInset = insets.right - mInsets.right;
-        int bottomInset = insets.bottom - mInsets.bottom;
-        mInsets.set(insets);
-        setPadding(getPaddingLeft() + leftInset, getPaddingTop(),
-                getPaddingRight() + rightInset, getPaddingBottom() + bottomInset);
-    }
-
-    @Override
-    protected void handleClose(boolean animate) {
-        handleClose(animate, DEFAULT_CLOSE_DURATION);
-        if (animate) {
-            // We animate only when the user is visible, which is a proxy for an explicit
-            // close action.
-            mLauncher.getSharedPrefs().edit()
-                    .putBoolean(KEY_SHOWED_BOTTOM_USER_EDUCATION, true).apply();
-            sendCustomAccessibilityEvent(
-                    BottomUserEducationView.this,
-                    AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,
-                    getContext().getString(R.string.bottom_work_tab_user_education_closed));
-        }
-    }
-
-    private void open(boolean animate) {
-        if (mIsOpen || mOpenCloseAnimator.isRunning()) {
-            return;
-        }
-        mIsOpen = true;
-        if (animate) {
-            mOpenCloseAnimator.setValues(
-                    PropertyValuesHolder.ofFloat(TRANSLATION_SHIFT, TRANSLATION_SHIFT_OPENED));
-            mOpenCloseAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
-            mOpenCloseAnimator.start();
-        } else {
-            setTranslationShift(TRANSLATION_SHIFT_OPENED);
-        }
-    }
-
-    public static void showIfNeeded(Launcher launcher) {
-        if (launcher.getSharedPrefs().getBoolean(KEY_SHOWED_BOTTOM_USER_EDUCATION, false)) {
-            return;
-        }
-
-        LayoutInflater layoutInflater = LayoutInflater.from(launcher);
-        BottomUserEducationView bottomUserEducationView =
-                (BottomUserEducationView) layoutInflater.inflate(
-                        R.layout.work_tab_bottom_user_education_view, launcher.getDragLayer(),
-                        false);
-        launcher.getDragLayer().addView(bottomUserEducationView);
-        bottomUserEducationView.open(true);
-    }
-
-    private void expandTouchAreaOfCloseButton() {
-        Rect hitRect = new Rect();
-        mCloseButton.getHitRect(hitRect);
-        hitRect.left -= mCloseButton.getWidth();
-        hitRect.top -= mCloseButton.getHeight();
-        hitRect.right += mCloseButton.getWidth();
-        hitRect.bottom += mCloseButton.getHeight();
-        View parent = (View) mCloseButton.getParent();
-        parent.setTouchDelegate(new TouchDelegate(hitRect, mCloseButton));
-    }
-}
diff --git a/src/com/android/launcher3/views/WorkEduView.java b/src/com/android/launcher3/views/WorkEduView.java
new file mode 100644
index 0000000..c3186f6
--- /dev/null
+++ b/src/com/android/launcher3/views/WorkEduView.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2020 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.views;
+
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.android.launcher3.Insettable;
+import com.android.launcher3.Launcher;
+import com.android.launcher3.LauncherState;
+import com.android.launcher3.LauncherStateManager;
+import com.android.launcher3.R;
+import com.android.launcher3.allapps.AllAppsContainerView;
+import com.android.launcher3.allapps.AllAppsPagedView;
+import com.android.launcher3.anim.AnimationSuccessListener;
+import com.android.launcher3.anim.Interpolators;
+import com.android.launcher3.userevent.nano.LauncherLogProto;
+
+/**
+ * On boarding flow for users right after setting up work profile
+ */
+public class WorkEduView extends AbstractSlideInView implements Insettable {
+
+    private static final int DEFAULT_CLOSE_DURATION = 200;
+    private static final String KEY_WORK_EDU_STEP = "showed_work_profile_edu";
+
+    private static final int WORK_EDU_NOT_STARTED = 0;
+    private static final int WORK_EDU_PERSONAL_APPS = 1;
+    private static final int WORK_EDU_WORK_APPS = 2;
+
+    private static LauncherStateManager.StateListener sStateListener;
+
+    private Rect mInsets = new Rect();
+    private View mViewWrapper;
+    private Button mProceedButton;
+    private TextView mContentText;
+    private AllAppsPagedView mAllAppsPagedView;
+    private int mNextWorkEduStep = WORK_EDU_PERSONAL_APPS;
+
+
+    public WorkEduView(Context context, AttributeSet attr) {
+        this(context, attr, 0);
+    }
+
+    public WorkEduView(Context context, AttributeSet attrs,
+            int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        mContent = this;
+    }
+
+    @Override
+    protected void handleClose(boolean animate) {
+        mLauncher.getSharedPrefs().edit().putInt(KEY_WORK_EDU_STEP, mNextWorkEduStep).apply();
+        handleClose(true, DEFAULT_CLOSE_DURATION);
+    }
+
+    @Override
+    public void logActionCommand(int command) {
+        // Since this is on-boarding popup, it is not a user controlled action.
+    }
+
+    @Override
+    public int getLogContainerType() {
+        return LauncherLogProto.ContainerType.TIP;
+    }
+
+    @Override
+    protected boolean isOfType(int type) {
+        return (type & TYPE_ON_BOARD_POPUP) != 0;
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mViewWrapper = findViewById(R.id.view_wrapper);
+        mProceedButton = findViewById(R.id.proceed);
+        mContentText = findViewById(R.id.content_text);
+
+        if (mLauncher.getAppsView().getContentView() instanceof AllAppsPagedView) {
+            mAllAppsPagedView = (AllAppsPagedView) mLauncher.getAppsView().getContentView();
+        }
+
+        mProceedButton.setOnClickListener(view -> {
+            if (mAllAppsPagedView != null) {
+                mAllAppsPagedView.snapToPage(AllAppsContainerView.AdapterHolder.WORK);
+            }
+            goToWorkTab(true);
+        });
+    }
+
+    private void goToWorkTab(boolean animate) {
+        mProceedButton.setText(R.string.work_profile_edu_accept);
+        if (animate) {
+            ObjectAnimator animator = ObjectAnimator.ofFloat(mContentText, ALPHA, 0);
+            animator.addListener(new AnimationSuccessListener() {
+                @Override
+                public void onAnimationSuccess(Animator animator) {
+                    mContentText.setText(mLauncher.getString(R.string.work_profile_edu_work_apps));
+                    ObjectAnimator.ofFloat(mContentText, ALPHA, 1).start();
+                }
+            });
+            animator.start();
+        } else {
+            mContentText.setText(mLauncher.getString(R.string.work_profile_edu_work_apps));
+        }
+        mNextWorkEduStep = WORK_EDU_WORK_APPS;
+        mProceedButton.setOnClickListener(v -> handleClose(true));
+    }
+
+    @Override
+    public void setInsets(Rect insets) {
+        int leftInset = insets.left - mInsets.left;
+        int rightInset = insets.right - mInsets.right;
+        int bottomInset = insets.bottom - mInsets.bottom;
+        mInsets.set(insets);
+        setPadding(leftInset, getPaddingTop(), rightInset, 0);
+        mViewWrapper.setPaddingRelative(mViewWrapper.getPaddingStart(),
+                mViewWrapper.getPaddingTop(), mViewWrapper.getPaddingEnd(), bottomInset);
+    }
+
+    private void show() {
+        mLauncher.getDragLayer().addView(this);
+        animateOpen();
+    }
+
+    private void goToFirstPage() {
+        if (mAllAppsPagedView != null) {
+            mAllAppsPagedView.snapToPageImmediately(AllAppsContainerView.AdapterHolder.MAIN);
+        }
+    }
+
+    private void animateOpen() {
+        if (mIsOpen || mOpenCloseAnimator.isRunning()) {
+            return;
+        }
+        mIsOpen = true;
+        mOpenCloseAnimator.setValues(
+                PropertyValuesHolder.ofFloat(TRANSLATION_SHIFT, TRANSLATION_SHIFT_OPENED));
+        mOpenCloseAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
+        mOpenCloseAnimator.start();
+    }
+
+    /**
+     * Checks if user has not seen onboarding UI yet and shows it when user navigates to all apps
+     */
+    public static LauncherStateManager.StateListener showEduFlowIfNeeded(Launcher launcher,
+            @Nullable LauncherStateManager.StateListener oldListener) {
+        if (oldListener != null) {
+            launcher.getStateManager().removeStateListener(oldListener);
+        }
+        if (launcher.getSharedPrefs().getInt(KEY_WORK_EDU_STEP, WORK_EDU_NOT_STARTED)
+                != WORK_EDU_NOT_STARTED) {
+            return null;
+        }
+
+        LauncherStateManager.StateListener listener = new LauncherStateManager.StateListener() {
+            @Override
+            public void onStateTransitionStart(LauncherState toState) {
+
+            }
+
+            @Override
+            public void onStateTransitionComplete(LauncherState finalState) {
+                if (finalState != LauncherState.ALL_APPS) return;
+                LayoutInflater layoutInflater = LayoutInflater.from(launcher);
+                WorkEduView v = (WorkEduView) layoutInflater.inflate(
+                        R.layout.work_profile_edu, launcher.getDragLayer(),
+                        false);
+                v.show();
+                v.goToFirstPage();
+                launcher.getStateManager().removeStateListener(this);
+            }
+        };
+        launcher.getStateManager().addStateListener(listener);
+        return listener;
+    }
+
+    /**
+     * Shows work apps edu if user had dismissed full edu flow
+     */
+    public static void showWorkEduIfNeeded(Launcher launcher) {
+        if (launcher.getSharedPrefs().getInt(KEY_WORK_EDU_STEP, WORK_EDU_NOT_STARTED)
+                != WORK_EDU_PERSONAL_APPS) {
+            return;
+        }
+        LayoutInflater layoutInflater = LayoutInflater.from(launcher);
+        WorkEduView v = (WorkEduView) layoutInflater.inflate(
+                R.layout.work_profile_edu, launcher.getDragLayer(), false);
+        v.show();
+        v.goToWorkTab(false);
+    }
+}