1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 package com.android.settings.accounts; 15 16 import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_OFF_SUMMARY; 17 import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_ON_SUMMARY; 18 19 import android.app.admin.DevicePolicyManager; 20 import android.content.BroadcastReceiver; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.content.IntentFilter; 24 import android.os.UserHandle; 25 import android.os.UserManager; 26 import android.util.Log; 27 28 import androidx.annotation.VisibleForTesting; 29 import androidx.preference.Preference; 30 import androidx.preference.PreferenceScreen; 31 import androidx.preference.TwoStatePreference; 32 33 import com.android.settings.R; 34 import com.android.settings.core.BasePreferenceController; 35 import com.android.settings.slices.SliceData; 36 import com.android.settingslib.core.lifecycle.LifecycleObserver; 37 import com.android.settingslib.core.lifecycle.events.OnStart; 38 import com.android.settingslib.core.lifecycle.events.OnStop; 39 40 public class WorkModePreferenceController extends BasePreferenceController implements 41 Preference.OnPreferenceChangeListener, LifecycleObserver, OnStart, OnStop { 42 43 private static final String TAG = "WorkModeController"; 44 45 private UserManager mUserManager; 46 private UserHandle mManagedUser; 47 private DevicePolicyManager mDevicePolicyManager; 48 49 private Preference mPreference; 50 private IntentFilter mIntentFilter; 51 WorkModePreferenceController(Context context, String key)52 public WorkModePreferenceController(Context context, String key) { 53 super(context, key); 54 mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 55 mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); 56 mIntentFilter = new IntentFilter(); 57 mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); 58 mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); 59 } 60 setManagedUser(UserHandle managedUser)61 public void setManagedUser(UserHandle managedUser) { 62 mManagedUser = managedUser; 63 } 64 65 @Override onStart()66 public void onStart() { 67 mContext.registerReceiver(mReceiver, mIntentFilter, 68 Context.RECEIVER_EXPORTED_UNAUDITED); 69 } 70 71 @Override onStop()72 public void onStop() { 73 mContext.unregisterReceiver(mReceiver); 74 } 75 76 @Override getAvailabilityStatus()77 public int getAvailabilityStatus() { 78 return (mManagedUser != null) ? AVAILABLE : DISABLED_FOR_USER; 79 } 80 81 @Override displayPreference(PreferenceScreen screen)82 public void displayPreference(PreferenceScreen screen) { 83 super.displayPreference(screen); 84 mPreference = screen.findPreference(getPreferenceKey()); 85 } 86 87 @Override getSummary()88 public CharSequence getSummary() { 89 if (isChecked()) { 90 return mDevicePolicyManager.getResources().getString( 91 WORK_PROFILE_SETTING_ON_SUMMARY, 92 () -> mContext.getString(R.string.work_mode_on_summary)); 93 } 94 95 return mDevicePolicyManager.getResources().getString( 96 WORK_PROFILE_SETTING_OFF_SUMMARY, 97 () -> mContext.getString(R.string.work_mode_off_summary)); 98 } 99 isChecked()100 private boolean isChecked() { 101 boolean isWorkModeOn = false; 102 if (mUserManager != null && mManagedUser != null) { 103 isWorkModeOn = !mUserManager.isQuietModeEnabled(mManagedUser); 104 } 105 return isWorkModeOn; 106 } 107 setChecked(boolean isChecked)108 private boolean setChecked(boolean isChecked) { 109 if (mUserManager != null && mManagedUser != null) { 110 final boolean quietModeEnabled = !isChecked; 111 mUserManager.requestQuietModeEnabled(quietModeEnabled, mManagedUser); 112 } 113 return true; 114 } 115 116 @Override updateState(Preference preference)117 public void updateState(Preference preference) { 118 super.updateState(preference); 119 if (preference instanceof TwoStatePreference) { 120 ((TwoStatePreference) preference).setChecked(isChecked()); 121 } 122 } 123 124 @Override onPreferenceChange(Preference preference, Object newValue)125 public final boolean onPreferenceChange(Preference preference, Object newValue) { 126 return setChecked((boolean) newValue); 127 } 128 129 /** 130 * Receiver that listens to {@link Intent#ACTION_MANAGED_PROFILE_AVAILABLE} and 131 * {@link Intent#ACTION_MANAGED_PROFILE_UNAVAILABLE}, and updates the work mode 132 */ 133 @VisibleForTesting 134 final BroadcastReceiver mReceiver = new BroadcastReceiver() { 135 @Override 136 public void onReceive(Context context, Intent intent) { 137 if (intent == null) { 138 return; 139 } 140 final String action = intent.getAction(); 141 Log.v(TAG, "Received broadcast: " + action); 142 143 if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) 144 || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { 145 if (intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 146 UserHandle.USER_NULL) == mManagedUser.getIdentifier()) { 147 updateState(mPreference); 148 } 149 return; 150 } 151 Log.w(TAG, "Cannot handle received broadcast: " + intent.getAction()); 152 } 153 }; 154 155 @Override 156 @SliceData.SliceType getSliceType()157 public int getSliceType() { 158 return SliceData.SliceType.SWITCH; 159 } 160 }