diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2018-01-04 19:14:17 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-01-04 19:14:17 +0000 |
commit | 01629fea69be60b96f61409c9dd32b2d4cd02026 (patch) | |
tree | a6f78c2e892a8422c1a89b4cb79e70d5660860f1 | |
parent | cac002dd0e3575e8ceba00b368995060cc43bbc4 (diff) | |
parent | 6eeb040d86ba209bffbbb9a1c59d5ca0b659f343 (diff) | |
download | android_packages_apps_Trebuchet-01629fea69be60b96f61409c9dd32b2d4cd02026.tar.gz android_packages_apps_Trebuchet-01629fea69be60b96f61409c9dd32b2d4cd02026.tar.bz2 android_packages_apps_Trebuchet-01629fea69be60b96f61409c9dd32b2d4cd02026.zip |
Merge "Consume work mode API" into ub-launcher3-master
8 files changed, 188 insertions, 20 deletions
diff --git a/res/layout/work_tab_footer.xml b/res/layout/work_tab_footer.xml index 2606b87a1..e3416ac7f 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"/> - <Switch + <com.android.launcher3.allapps.WorkModeSwitch android:id="@+id/work_mode_toggle" android:layout_width="wrap_content" android:layout_height="wrap_content" diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index f8c6ee255..158c540ac 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -36,6 +36,7 @@ import android.os.Bundle; 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; @@ -79,6 +80,8 @@ public final class Utilities { 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 246f7be10..234eb81ed 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<AllAppsGridAdapter. 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 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter. // 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 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter. 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 02e731a89..eecd0091c 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 000000000..32c9ce3f8 --- /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 25808d21c..197f79836 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 bb425732c..e6cc3198d 100644 --- a/src/com/android/launcher3/compat/UserManagerCompatVL.java +++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java @@ -83,6 +83,11 @@ public class UserManagerCompatVL extends UserManagerCompat { } @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 000000000..a0bf0ab22 --- /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; + } +} |