diff --git a/res/layout/work_tab_footer.xml b/res/layout/work_tab_footer.xml index 2606b87a10..e3416ac7fe 100644 --- a/res/layout/work_tab_footer.xml +++ b/res/layout/work_tab_footer.xml @@ -33,7 +33,7 @@ android:scaleType="fitXY" android:src="@drawable/all_apps_divider"/> - = Build.VERSION_CODES.O_MR1; diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index 246f7be10e..234eb81ed3 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -18,7 +18,6 @@ package com.android.launcher3.allapps; 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.View.OnFocusChangeListener; 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.R; 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 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter 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 02e731a893..eecd0091c6 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 android.util.Log; 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 @@ public class AlphabeticalAppsList { } // 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 0000000000..32c9ce3f8e --- /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 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() { + + @Override + protected void onPreExecute() { + super.onPreExecute(); + setEnabled(false); + } + + @Override + protected Boolean doInBackground(Void... voids) { + UserManagerCompat userManager = UserManagerCompat.getInstance(getContext()); + List 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 25808d21c0..197f79836e 100644 --- a/src/com/android/launcher3/compat/UserManagerCompat.java +++ b/src/com/android/launcher3/compat/UserManagerCompat.java @@ -33,7 +33,9 @@ public abstract class UserManagerCompat { 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 class UserManagerCompat { 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 bb425732c0..e6cc3198de 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -82,6 +82,11 @@ public class UserManagerCompatVL extends UserManagerCompat { return false; } + @Override + public boolean trySetQuietModeEnabled(boolean enableQuietMode, UserHandle user) { + return false; + } + @Override public void enableAndResetCache() { synchronized (this) { diff --git a/src/com/android/launcher3/compat/UserManagerCompatVP.java b/src/com/android/launcher3/compat/UserManagerCompatVP.java new file mode 100644 index 0000000000..a0bf0ab220 --- /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; + } +}