Consume work mode API

Fix: 69905244

Change-Id: I5958b3a2ebba2fa0e0f69448d5526dc72ed6a97b
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index ca235eb..40f8378 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -37,6 +37,7 @@
 import android.os.DeadObjectException;
 import android.os.PowerManager;
 import android.os.TransactionTooLargeException;
+import android.support.v4.os.BuildCompat;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.TextUtils;
@@ -81,6 +82,8 @@
     private static final Matrix sMatrix = new Matrix();
     private static final Matrix sInverseMatrix = new Matrix();
 
+    public static final boolean ATLEAST_P = BuildCompat.isAtLeastP();
+
     public static final boolean ATLEAST_OREO_MR1 =
             Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1;
 
diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
index 246f7be..234eb81 100644
--- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
+++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
@@ -18,7 +18,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
-import android.os.UserHandle;
 import android.support.animation.DynamicAnimation;
 import android.support.animation.SpringAnimation;
 import android.support.v4.view.accessibility.AccessibilityEventCompat;
@@ -33,7 +32,6 @@
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
-import android.widget.Switch;
 import android.widget.TextView;
 
 import com.android.launcher3.AppInfo;
@@ -43,7 +41,6 @@
 import com.android.launcher3.Utilities;
 import com.android.launcher3.allapps.AlphabeticalAppsList.AdapterItem;
 import com.android.launcher3.anim.SpringAnimationHandler;
-import com.android.launcher3.compat.UserManagerCompat;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.discovery.AppDiscoveryAppInfo;
 import com.android.launcher3.discovery.AppDiscoveryItemView;
@@ -332,7 +329,6 @@
                         R.layout.all_apps_divider, parent, false));
             case VIEW_TYPE_WORK_TAB_FOOTER:
                 View footer = mLayoutInflater.inflate(R.layout.work_tab_footer, parent, false);
-                // TODO: Implement the work mode toggle logic here.
                 return new ViewHolder(footer);
             default:
                 throw new RuntimeException("Unexpected view type");
@@ -379,8 +375,8 @@
                 // nothing to do
                 break;
             case VIEW_TYPE_WORK_TAB_FOOTER:
-                Switch workModeToggle = holder.itemView.findViewById(R.id.work_mode_toggle);
-                workModeToggle.setChecked(!isAnyProfileQuietModeEnabled());
+                WorkModeSwitch workModeToggle = holder.itemView.findViewById(R.id.work_mode_toggle);
+                workModeToggle.refresh();
                 break;
         }
         if (mBindViewCallback != null) {
@@ -549,15 +545,4 @@
             return factor;
         }
     }
-
-    private boolean isAnyProfileQuietModeEnabled() {
-        UserManagerCompat userManager = UserManagerCompat.getInstance(mLauncher);
-        List<UserHandle> userProfiles = userManager.getUserProfiles();
-        for (UserHandle userProfile : userProfiles) {
-            if (userManager.isQuietModeEnabled(userProfile)) {
-                return true;
-            }
-        }
-        return false;
-    }
 }
diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
index 02e731a..eecd009 100644
--- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
+++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
@@ -16,6 +16,7 @@
 package com.android.launcher3.allapps;
 
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.Process;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -23,11 +24,13 @@
 
 import com.android.launcher3.AppInfo;
 import com.android.launcher3.Launcher;
+import com.android.launcher3.Utilities;
 import com.android.launcher3.compat.AlphabeticIndexCompat;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.discovery.AppDiscoveryAppInfo;
 import com.android.launcher3.discovery.AppDiscoveryItem;
 import com.android.launcher3.discovery.AppDiscoveryUpdateState;
+import com.android.launcher3.shortcuts.DeepShortcutManager;
 import com.android.launcher3.util.ComponentKey;
 import com.android.launcher3.util.ComponentKeyMapper;
 import com.android.launcher3.util.ItemInfoMatcher;
@@ -620,11 +623,18 @@
         }
 
         // Add the work profile footer if required.
-        if (mIsWork) {
+        if (shouldShowWorkFooter()) {
             mAdapterItems.add(AdapterItem.asWorkTabFooter(position++));
         }
     }
 
+    private boolean shouldShowWorkFooter() {
+        return mIsWork && Utilities.ATLEAST_P &&
+                (DeepShortcutManager.getInstance(mLauncher).hasHostPermission()
+                        || mLauncher.checkSelfPermission("android.permission.MODIFY_QUIET_MODE")
+                        == PackageManager.PERMISSION_GRANTED);
+    }
+
     public boolean isAppDiscoveryRunning() {
         return mAppDiscoveryUpdateState == AppDiscoveryUpdateState.START
                 || mAppDiscoveryUpdateState == AppDiscoveryUpdateState.UPDATE;
diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java
new file mode 100644
index 0000000..32c9ce3
--- /dev/null
+++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 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.allapps;
+
+import android.content.Context;
+import android.os.AsyncTask;
+import android.os.Process;
+import android.os.UserHandle;
+import android.util.AttributeSet;
+import android.widget.Switch;
+
+import com.android.launcher3.compat.UserManagerCompat;
+
+import java.util.List;
+
+public class WorkModeSwitch extends Switch {
+
+    public WorkModeSwitch(Context context) {
+        super(context);
+    }
+
+    public WorkModeSwitch(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public WorkModeSwitch(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    @Override
+    public void setChecked(boolean checked) {
+        // No-op, do not change the checked state until broadcast is received.
+    }
+
+    @Override
+    public void toggle() {
+        trySetQuietModeEnabledToAllProfilesAsync(isChecked());
+    }
+
+    private void setCheckedInternal(boolean checked) {
+        super.setChecked(checked);
+    }
+
+    public void refresh() {
+        setCheckedInternal(!isAnyProfileQuietModeEnabled());
+        setEnabled(true);
+    }
+
+    private boolean isAnyProfileQuietModeEnabled() {
+        UserManagerCompat userManager = UserManagerCompat.getInstance(getContext());
+        List<UserHandle> userProfiles = userManager.getUserProfiles();
+        for (UserHandle userProfile : userProfiles) {
+            if (Process.myUserHandle().equals(userProfile)) {
+                continue;
+            }
+            if (userManager.isQuietModeEnabled(userProfile)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void trySetQuietModeEnabledToAllProfilesAsync(boolean enabled) {
+        new AsyncTask<Void, Void, Boolean>() {
+
+            @Override
+            protected void onPreExecute() {
+                super.onPreExecute();
+                setEnabled(false);
+            }
+
+            @Override
+            protected Boolean doInBackground(Void... voids) {
+                UserManagerCompat userManager = UserManagerCompat.getInstance(getContext());
+                List<UserHandle> userProfiles = userManager.getUserProfiles();
+                boolean showConfirm = false;
+                for (UserHandle userProfile : userProfiles) {
+                    if (Process.myUserHandle().equals(userProfile)) {
+                        continue;
+                    }
+                    showConfirm |= !userManager.trySetQuietModeEnabled(enabled, userProfile);
+                }
+                return showConfirm;
+            }
+
+            @Override
+            protected void onPostExecute(Boolean showConfirm) {
+                if (showConfirm) {
+                    setEnabled(true);
+                }
+            }
+        }.execute();
+    }
+}
diff --git a/src/com/android/launcher3/compat/UserManagerCompat.java b/src/com/android/launcher3/compat/UserManagerCompat.java
index 25808d2..197f798 100644
--- a/src/com/android/launcher3/compat/UserManagerCompat.java
+++ b/src/com/android/launcher3/compat/UserManagerCompat.java
@@ -33,7 +33,9 @@
     public static UserManagerCompat getInstance(Context context) {
         synchronized (sInstanceLock) {
             if (sInstance == null) {
-                if (Utilities.ATLEAST_NOUGAT_MR1) {
+                if (Utilities.ATLEAST_P) {
+                    sInstance = new UserManagerCompatVP(context.getApplicationContext());
+                } else if (Utilities.ATLEAST_NOUGAT_MR1) {
                     sInstance = new UserManagerCompatVNMr1(context.getApplicationContext());
                 } else if (Utilities.ATLEAST_NOUGAT) {
                     sInstance = new UserManagerCompatVN(context.getApplicationContext());
@@ -61,4 +63,5 @@
     public abstract boolean isUserUnlocked(UserHandle user);
 
     public abstract boolean isDemoUser();
+    public abstract boolean trySetQuietModeEnabled(boolean enableQuietMode, UserHandle user);
 }
diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java
index bb42573..e6cc319 100644
--- a/src/com/android/launcher3/compat/UserManagerCompatVL.java
+++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java
@@ -83,6 +83,11 @@
     }
 
     @Override
+    public boolean trySetQuietModeEnabled(boolean enableQuietMode, UserHandle user) {
+        return false;
+    }
+
+    @Override
     public void enableAndResetCache() {
         synchronized (this) {
             mUsers = new LongArrayMap<>();
diff --git a/src/com/android/launcher3/compat/UserManagerCompatVP.java b/src/com/android/launcher3/compat/UserManagerCompatVP.java
new file mode 100644
index 0000000..a0bf0ab
--- /dev/null
+++ b/src/com/android/launcher3/compat/UserManagerCompatVP.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 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.compat;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class UserManagerCompatVP extends UserManagerCompatVNMr1 {
+    private static final String TAG = "UserManagerCompatVP";
+
+    private Method mTrySetQuietModeEnabledMethod;
+
+    UserManagerCompatVP(Context context) {
+        super(context);
+        // TODO: Replace it with proper API call once SDK is ready.
+        try {
+            mTrySetQuietModeEnabledMethod = UserManager.class.getDeclaredMethod(
+                    "trySetQuietModeEnabled", boolean.class, UserHandle.class);
+        } catch (NoSuchMethodException e) {
+            Log.e(TAG, "trySetQuietModeEnabled is not available", e);
+        }
+    }
+
+    @Override
+    public boolean trySetQuietModeEnabled(boolean enableQuietMode, UserHandle user) {
+        if (mTrySetQuietModeEnabledMethod == null) {
+            return false;
+        }
+        try {
+            return (boolean)
+                    mTrySetQuietModeEnabledMethod.invoke(mUserManager, enableQuietMode, user);
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            Log.e(TAG, "Failed to invoke mTrySetQuietModeEnabledMethod", e);
+        }
+        return false;
+    }
+}