| /* |
| * 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.allapps; |
| |
| import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_HAS_SHORTCUT_PERMISSION; |
| import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_QUIET_MODE_CHANGE_PERMISSION; |
| import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_QUIET_MODE_ENABLED; |
| import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; |
| |
| import android.content.SharedPreferences; |
| import android.os.Build; |
| import android.os.Process; |
| import android.os.UserHandle; |
| import android.os.UserManager; |
| import android.util.Log; |
| |
| import androidx.annotation.IntDef; |
| import androidx.annotation.Nullable; |
| import androidx.annotation.RequiresApi; |
| |
| import com.android.launcher3.R; |
| import com.android.launcher3.util.ItemInfoMatcher; |
| import com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip; |
| |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| |
| /** |
| * Companion class for {@link AllAppsContainerView} to manage work tab and personal tab related |
| * logic based on {@link WorkProfileState}? |
| */ |
| public class WorkProfileManager implements PersonalWorkSlidingTabStrip.OnActivePageChangedListener { |
| private static final String TAG = "WorkProfileManager"; |
| |
| |
| public static final int STATE_ENABLED = 1; |
| public static final int STATE_DISABLED = 2; |
| public static final int STATE_TRANSITION = 3; |
| |
| |
| private final UserManager mUserManager; |
| |
| /** |
| * Work profile manager states |
| */ |
| @IntDef(value = { |
| STATE_ENABLED, |
| STATE_DISABLED, |
| STATE_TRANSITION |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| public @interface WorkProfileState { |
| } |
| |
| private final AllAppsContainerView mAllApps; |
| private final WorkAdapterProvider mAdapterProvider; |
| private final ItemInfoMatcher mMatcher; |
| |
| private WorkModeSwitch mWorkModeSwitch; |
| |
| @WorkProfileState |
| private int mCurrentState; |
| |
| |
| public WorkProfileManager(UserManager userManager, AllAppsContainerView allApps, |
| SharedPreferences preferences) { |
| mUserManager = userManager; |
| mAllApps = allApps; |
| mAdapterProvider = new WorkAdapterProvider(preferences); |
| mMatcher = mAllApps.mPersonalMatcher.negate(); |
| } |
| |
| /** |
| * Posts quite mode enable/disable call for work profile user |
| */ |
| @RequiresApi(Build.VERSION_CODES.P) |
| public void setWorkProfileEnabled(boolean enabled) { |
| updateCurrentState(STATE_TRANSITION); |
| UI_HELPER_EXECUTOR.post(() -> { |
| for (UserHandle userProfile : mUserManager.getUserProfiles()) { |
| if (Process.myUserHandle().equals(userProfile)) { |
| continue; |
| } |
| mUserManager.requestQuietModeEnabled(!enabled, userProfile); |
| } |
| }); |
| } |
| |
| @Override |
| public void onActivePageChanged(int page) { |
| if (mWorkModeSwitch != null) { |
| mWorkModeSwitch.onActivePageChanged(page); |
| } |
| } |
| |
| /** |
| * Requests work profile state from {@link AllAppsStore} and updates work profile related views |
| */ |
| public void reset() { |
| boolean isEnabled = !mAllApps.getAppsStore().hasModelFlag(FLAG_QUIET_MODE_ENABLED); |
| updateCurrentState(isEnabled ? STATE_ENABLED : STATE_DISABLED); |
| } |
| |
| private void updateCurrentState(@WorkProfileState int currentState) { |
| mCurrentState = currentState; |
| mAdapterProvider.updateCurrentState(currentState); |
| if (getAH() != null) { |
| getAH().appsList.updateAdapterItems(); |
| } |
| if (mWorkModeSwitch != null) { |
| mWorkModeSwitch.updateCurrentState(currentState == STATE_ENABLED); |
| } |
| } |
| |
| /** |
| * Creates and attaches for profile toggle button to {@link AllAppsContainerView} |
| */ |
| public boolean attachWorkModeSwitch() { |
| if (!mAllApps.getAppsStore().hasModelFlag( |
| FLAG_HAS_SHORTCUT_PERMISSION | FLAG_QUIET_MODE_CHANGE_PERMISSION)) { |
| Log.e(TAG, "unable to attach work mode switch; Missing required permissions"); |
| return false; |
| } |
| if (mWorkModeSwitch == null) { |
| mWorkModeSwitch = (WorkModeSwitch) mAllApps.getLayoutInflater().inflate( |
| R.layout.work_mode_fab, mAllApps, false); |
| } |
| if (mWorkModeSwitch.getParent() != mAllApps) { |
| mAllApps.addView(mWorkModeSwitch); |
| } |
| if (getAH() != null) { |
| getAH().applyPadding(); |
| } |
| mWorkModeSwitch.updateCurrentState(mCurrentState == STATE_ENABLED); |
| return true; |
| } |
| |
| /** |
| * Removes work profile toggle button from {@link AllAppsContainerView} |
| */ |
| public void detachWorkModeSwitch() { |
| if (mWorkModeSwitch != null && mWorkModeSwitch.getParent() == mAllApps) { |
| mAllApps.removeView(mWorkModeSwitch); |
| } |
| mWorkModeSwitch = null; |
| } |
| |
| |
| public WorkAdapterProvider getAdapterProvider() { |
| return mAdapterProvider; |
| } |
| |
| public ItemInfoMatcher getMatcher() { |
| return mMatcher; |
| } |
| |
| @Nullable |
| public WorkModeSwitch getWorkModeSwitch() { |
| return mWorkModeSwitch; |
| } |
| |
| private AllAppsContainerView.AdapterHolder getAH() { |
| return mAllApps.mAH[AllAppsContainerView.AdapterHolder.WORK]; |
| } |
| |
| public int getCurrentState() { |
| return mCurrentState; |
| } |
| } |