Merge "[Sound Settings] Act on managed user added/removed"

This commit is contained in:
TreeHugger Robot
2017-01-20 18:31:40 +00:00
committed by Android (Google) Code Review
2 changed files with 137 additions and 50 deletions

View File

@@ -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";

View File

@@ -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));
}
}