Merge "[Sound Settings] Act on managed user added/removed"
This commit is contained in:
committed by
Android (Google) Code Review
commit
2f2d982f67
@@ -20,8 +20,11 @@ import android.annotation.UserIdInt;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.app.FragmentManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.media.AudioSystem;
|
||||
import android.media.Ringtone;
|
||||
import android.media.RingtoneManager;
|
||||
@@ -46,11 +49,11 @@ import com.android.settings.core.PreferenceController;
|
||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||
import com.android.settings.core.lifecycle.Lifecycle;
|
||||
import com.android.settings.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settings.core.lifecycle.events.OnPause;
|
||||
import com.android.settings.core.lifecycle.events.OnResume;
|
||||
|
||||
|
||||
public class WorkSoundPreferenceController extends PreferenceController implements
|
||||
OnPreferenceChangeListener, LifecycleObserver, OnResume {
|
||||
OnPreferenceChangeListener, LifecycleObserver, OnResume, OnPause {
|
||||
|
||||
private static final String TAG = "WorkSoundPrefController";
|
||||
private static final String KEY_WORK_CATEGORY = "sound_work_settings_section";
|
||||
@@ -97,18 +100,18 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
if (isAvailable()) {
|
||||
if ((mWorkPreferenceCategory == null)) {
|
||||
// Work preferences not yet set
|
||||
mParent.addPreferencesFromResource(R.xml.sound_work_settings);
|
||||
initWorkPreferences();
|
||||
}
|
||||
if (!mWorkUsePersonalSounds.isChecked()) {
|
||||
updateWorkRingtoneSummaries();
|
||||
}
|
||||
} else {
|
||||
maybeRemoveWorkPreferences();
|
||||
}
|
||||
IntentFilter managedProfileFilter = new IntentFilter();
|
||||
managedProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
|
||||
managedProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
|
||||
mContext.registerReceiver(mManagedProfileReceiver, managedProfileFilter);
|
||||
|
||||
mManagedProfileId = mHelper.getManagedProfileId(mUserManager);
|
||||
initWorkPreferences();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
mContext.unregisterReceiver(mManagedProfileReceiver);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -118,8 +121,8 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
mManagedProfileId = mHelper.getManagedProfileId(mUserManager);
|
||||
return mManagedProfileId != UserHandle.USER_NULL && shouldShowRingtoneSettings();
|
||||
return mHelper.getManagedProfileId(mUserManager) != UserHandle.USER_NULL
|
||||
&& shouldShowRingtoneSettings();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -184,17 +187,37 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
||||
}
|
||||
|
||||
private void initWorkPreferences() {
|
||||
mWorkPreferenceCategory = (PreferenceGroup) mParent.getPreferenceScreen()
|
||||
.findPreference(KEY_WORK_CATEGORY);
|
||||
mWorkUsePersonalSounds = (TwoStatePreference) mParent.getPreferenceScreen()
|
||||
.findPreference(KEY_WORK_USE_PERSONAL_SOUNDS);
|
||||
mWorkPhoneRingtonePreference = initWorkPreference(KEY_WORK_PHONE_RINGTONE);
|
||||
mWorkNotificationRingtonePreference = initWorkPreference(KEY_WORK_NOTIFICATION_RINGTONE);
|
||||
mWorkAlarmRingtonePreference = initWorkPreference(KEY_WORK_ALARM_RINGTONE);
|
||||
if (mManagedProfileId == UserHandle.USER_NULL || !isAvailable()) {
|
||||
maybeRemoveWorkPreferences();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mVoiceCapable) {
|
||||
mWorkPreferenceCategory.removePreference(mWorkPhoneRingtonePreference);
|
||||
mWorkPhoneRingtonePreference = null;
|
||||
if (mWorkPreferenceCategory == null) {
|
||||
mParent.addPreferencesFromResource(R.xml.sound_work_settings);
|
||||
final PreferenceScreen screen = mParent.getPreferenceScreen();
|
||||
|
||||
mWorkPreferenceCategory = (PreferenceGroup) screen.findPreference(KEY_WORK_CATEGORY);
|
||||
mWorkUsePersonalSounds = (TwoStatePreference)
|
||||
screen.findPreference(KEY_WORK_USE_PERSONAL_SOUNDS);
|
||||
mWorkPhoneRingtonePreference = initWorkPreference(KEY_WORK_PHONE_RINGTONE);
|
||||
mWorkNotificationRingtonePreference = initWorkPreference(
|
||||
KEY_WORK_NOTIFICATION_RINGTONE);
|
||||
mWorkAlarmRingtonePreference = initWorkPreference(KEY_WORK_ALARM_RINGTONE);
|
||||
|
||||
mWorkUsePersonalSounds.setOnPreferenceChangeListener((Preference p, Object value) -> {
|
||||
if ((boolean) value) {
|
||||
UnifyWorkDialogFragment.show(mParent);
|
||||
return false;
|
||||
} else {
|
||||
disableWorkSync();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
if (!mVoiceCapable) {
|
||||
mWorkPreferenceCategory.removePreference(mWorkPhoneRingtonePreference);
|
||||
mWorkPhoneRingtonePreference = null;
|
||||
}
|
||||
}
|
||||
|
||||
Context managedProfileContext = getManagedProfileContext();
|
||||
@@ -204,19 +227,6 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
||||
} else {
|
||||
disableWorkSyncSettings();
|
||||
}
|
||||
|
||||
mWorkUsePersonalSounds.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
if ((boolean) newValue) {
|
||||
UnifyWorkDialogFragment.show(mParent);
|
||||
return false;
|
||||
} else {
|
||||
disableWorkSync();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void enableWorkSync() {
|
||||
@@ -267,7 +277,6 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
||||
|
||||
private void maybeRemoveWorkPreferences() {
|
||||
if (mWorkPreferenceCategory == null) {
|
||||
// No work preferences to remove
|
||||
return;
|
||||
}
|
||||
mParent.getPreferenceScreen().removePreference(mWorkPreferenceCategory);
|
||||
@@ -277,6 +286,37 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
||||
mWorkAlarmRingtonePreference = null;
|
||||
}
|
||||
|
||||
public void onManagedProfileAdded(@UserIdInt int profileId) {
|
||||
if (mManagedProfileId == UserHandle.USER_NULL) {
|
||||
mManagedProfileId = profileId;
|
||||
initWorkPreferences();
|
||||
}
|
||||
}
|
||||
|
||||
public void onManagedProfileRemoved(@UserIdInt int profileId) {
|
||||
if (mManagedProfileId == profileId) {
|
||||
mManagedProfileId = mHelper.getManagedProfileId(mUserManager);
|
||||
initWorkPreferences();
|
||||
}
|
||||
}
|
||||
|
||||
private final BroadcastReceiver mManagedProfileReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final int userId = ((UserHandle) intent.getExtra(Intent.EXTRA_USER)).getIdentifier();
|
||||
switch (intent.getAction()) {
|
||||
case Intent.ACTION_MANAGED_PROFILE_ADDED: {
|
||||
onManagedProfileAdded(userId);
|
||||
return;
|
||||
}
|
||||
case Intent.ACTION_MANAGED_PROFILE_REMOVED: {
|
||||
onManagedProfileRemoved(userId);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public static class UnifyWorkDialogFragment extends InstrumentedDialogFragment
|
||||
implements DialogInterface.OnClickListener {
|
||||
private static final String TAG = "UnifyWorkDialogFragment";
|
||||
|
@@ -114,23 +114,58 @@ public class WorkSoundPreferenceControllerTest {
|
||||
.thenReturn(UserHandle.myUserId());
|
||||
when(mAudioHelper.isSingleVolume()).thenReturn(false);
|
||||
when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
|
||||
when(mScreen.findPreference(KEY_WORK_CATEGORY))
|
||||
.thenReturn(mock(PreferenceGroup.class));
|
||||
when(mScreen.findPreference(KEY_WORK_USE_PERSONAL_SOUNDS))
|
||||
.thenReturn(mock(TwoStatePreference.class));
|
||||
when(mScreen.findPreference(KEY_WORK_PHONE_RINGTONE))
|
||||
.thenReturn(mock(DefaultRingtonePreference.class));
|
||||
when(mScreen.findPreference(KEY_WORK_NOTIFICATION_RINGTONE))
|
||||
.thenReturn(mock(DefaultRingtonePreference.class));
|
||||
when(mScreen.findPreference(KEY_WORK_ALARM_RINGTONE))
|
||||
.thenReturn(mock(DefaultRingtonePreference.class));
|
||||
when(mAudioHelper.createPackageContextAsUser(anyInt())).thenReturn(mContext);
|
||||
mockWorkCategory();
|
||||
|
||||
mController.onResume();
|
||||
|
||||
verify(mFragment).addPreferencesFromResource(R.xml.sound_work_settings);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onManagedProfileAdded_shouldAddPreferenceCategory() {
|
||||
// Given a device without any managed profiles:
|
||||
when(mAudioHelper.isSingleVolume()).thenReturn(false);
|
||||
when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
|
||||
when(mAudioHelper.createPackageContextAsUser(anyInt())).thenReturn(mContext);
|
||||
when(mAudioHelper.getManagedProfileId(any(UserManager.class)))
|
||||
.thenReturn(UserHandle.USER_NULL);
|
||||
mockWorkCategory();
|
||||
|
||||
// When the fragment first resumes, the category should not appear.
|
||||
mController.onResume();
|
||||
|
||||
verify(mFragment, never()).addPreferencesFromResource(R.xml.sound_work_settings);
|
||||
|
||||
// However, when a managed profile is added after resuming, the category should appear.
|
||||
when(mAudioHelper.getManagedProfileId(any(UserManager.class)))
|
||||
.thenReturn(UserHandle.myUserId());
|
||||
mController.onManagedProfileAdded(UserHandle.myUserId());
|
||||
|
||||
verify(mFragment).addPreferencesFromResource(R.xml.sound_work_settings);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onManagedProfileRemoved_shouldRemovePreferenceCategory() {
|
||||
// Given a device with a managed profile:
|
||||
when(mAudioHelper.isSingleVolume()).thenReturn(false);
|
||||
when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
|
||||
when(mAudioHelper.createPackageContextAsUser(anyInt())).thenReturn(mContext);
|
||||
when(mAudioHelper.getManagedProfileId(any(UserManager.class)))
|
||||
.thenReturn(UserHandle.myUserId());
|
||||
mockWorkCategory();
|
||||
|
||||
// Which is in resumed state:
|
||||
mController.onResume();
|
||||
|
||||
// When a managed profile is removed, the category should be removed.
|
||||
when(mAudioHelper.getManagedProfileId(any(UserManager.class)))
|
||||
.thenReturn(UserHandle.USER_NULL);
|
||||
mController.onManagedProfileRemoved(UserHandle.myUserId());
|
||||
|
||||
verify(mScreen).removePreference(mScreen.findPreference(KEY_WORK_CATEGORY));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onResume_notAvailable_shouldNotAddPreferenceCategory() {
|
||||
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
|
||||
@@ -154,4 +189,16 @@ public class WorkSoundPreferenceControllerTest {
|
||||
verify(preference).setSummary(anyString());
|
||||
}
|
||||
|
||||
private void mockWorkCategory() {
|
||||
when(mScreen.findPreference(KEY_WORK_CATEGORY))
|
||||
.thenReturn(mock(PreferenceGroup.class));
|
||||
when(mScreen.findPreference(KEY_WORK_USE_PERSONAL_SOUNDS))
|
||||
.thenReturn(mock(TwoStatePreference.class));
|
||||
when(mScreen.findPreference(KEY_WORK_PHONE_RINGTONE))
|
||||
.thenReturn(mock(DefaultRingtonePreference.class));
|
||||
when(mScreen.findPreference(KEY_WORK_NOTIFICATION_RINGTONE))
|
||||
.thenReturn(mock(DefaultRingtonePreference.class));
|
||||
when(mScreen.findPreference(KEY_WORK_ALARM_RINGTONE))
|
||||
.thenReturn(mock(DefaultRingtonePreference.class));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user