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.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.FragmentManager;
|
import android.app.FragmentManager;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
import android.media.AudioSystem;
|
import android.media.AudioSystem;
|
||||||
import android.media.Ringtone;
|
import android.media.Ringtone;
|
||||||
import android.media.RingtoneManager;
|
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.instrumentation.InstrumentedDialogFragment;
|
||||||
import com.android.settings.core.lifecycle.Lifecycle;
|
import com.android.settings.core.lifecycle.Lifecycle;
|
||||||
import com.android.settings.core.lifecycle.LifecycleObserver;
|
import com.android.settings.core.lifecycle.LifecycleObserver;
|
||||||
|
import com.android.settings.core.lifecycle.events.OnPause;
|
||||||
import com.android.settings.core.lifecycle.events.OnResume;
|
import com.android.settings.core.lifecycle.events.OnResume;
|
||||||
|
|
||||||
|
|
||||||
public class WorkSoundPreferenceController extends PreferenceController implements
|
public class WorkSoundPreferenceController extends PreferenceController implements
|
||||||
OnPreferenceChangeListener, LifecycleObserver, OnResume {
|
OnPreferenceChangeListener, LifecycleObserver, OnResume, OnPause {
|
||||||
|
|
||||||
private static final String TAG = "WorkSoundPrefController";
|
private static final String TAG = "WorkSoundPrefController";
|
||||||
private static final String KEY_WORK_CATEGORY = "sound_work_settings_section";
|
private static final String KEY_WORK_CATEGORY = "sound_work_settings_section";
|
||||||
@@ -97,18 +100,18 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
if (isAvailable()) {
|
IntentFilter managedProfileFilter = new IntentFilter();
|
||||||
if ((mWorkPreferenceCategory == null)) {
|
managedProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
|
||||||
// Work preferences not yet set
|
managedProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
|
||||||
mParent.addPreferencesFromResource(R.xml.sound_work_settings);
|
mContext.registerReceiver(mManagedProfileReceiver, managedProfileFilter);
|
||||||
|
|
||||||
|
mManagedProfileId = mHelper.getManagedProfileId(mUserManager);
|
||||||
initWorkPreferences();
|
initWorkPreferences();
|
||||||
}
|
}
|
||||||
if (!mWorkUsePersonalSounds.isChecked()) {
|
|
||||||
updateWorkRingtoneSummaries();
|
@Override
|
||||||
}
|
public void onPause() {
|
||||||
} else {
|
mContext.unregisterReceiver(mManagedProfileReceiver);
|
||||||
maybeRemoveWorkPreferences();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -118,8 +121,8 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAvailable() {
|
public boolean isAvailable() {
|
||||||
mManagedProfileId = mHelper.getManagedProfileId(mUserManager);
|
return mHelper.getManagedProfileId(mUserManager) != UserHandle.USER_NULL
|
||||||
return mManagedProfileId != UserHandle.USER_NULL && shouldShowRingtoneSettings();
|
&& shouldShowRingtoneSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -184,18 +187,38 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initWorkPreferences() {
|
private void initWorkPreferences() {
|
||||||
mWorkPreferenceCategory = (PreferenceGroup) mParent.getPreferenceScreen()
|
if (mManagedProfileId == UserHandle.USER_NULL || !isAvailable()) {
|
||||||
.findPreference(KEY_WORK_CATEGORY);
|
maybeRemoveWorkPreferences();
|
||||||
mWorkUsePersonalSounds = (TwoStatePreference) mParent.getPreferenceScreen()
|
return;
|
||||||
.findPreference(KEY_WORK_USE_PERSONAL_SOUNDS);
|
}
|
||||||
|
|
||||||
|
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);
|
mWorkPhoneRingtonePreference = initWorkPreference(KEY_WORK_PHONE_RINGTONE);
|
||||||
mWorkNotificationRingtonePreference = initWorkPreference(KEY_WORK_NOTIFICATION_RINGTONE);
|
mWorkNotificationRingtonePreference = initWorkPreference(
|
||||||
|
KEY_WORK_NOTIFICATION_RINGTONE);
|
||||||
mWorkAlarmRingtonePreference = initWorkPreference(KEY_WORK_ALARM_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) {
|
if (!mVoiceCapable) {
|
||||||
mWorkPreferenceCategory.removePreference(mWorkPhoneRingtonePreference);
|
mWorkPreferenceCategory.removePreference(mWorkPhoneRingtonePreference);
|
||||||
mWorkPhoneRingtonePreference = null;
|
mWorkPhoneRingtonePreference = null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Context managedProfileContext = getManagedProfileContext();
|
Context managedProfileContext = getManagedProfileContext();
|
||||||
if (Settings.Secure.getIntForUser(managedProfileContext.getContentResolver(),
|
if (Settings.Secure.getIntForUser(managedProfileContext.getContentResolver(),
|
||||||
@@ -204,19 +227,6 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
|||||||
} else {
|
} else {
|
||||||
disableWorkSyncSettings();
|
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() {
|
void enableWorkSync() {
|
||||||
@@ -267,7 +277,6 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
|||||||
|
|
||||||
private void maybeRemoveWorkPreferences() {
|
private void maybeRemoveWorkPreferences() {
|
||||||
if (mWorkPreferenceCategory == null) {
|
if (mWorkPreferenceCategory == null) {
|
||||||
// No work preferences to remove
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mParent.getPreferenceScreen().removePreference(mWorkPreferenceCategory);
|
mParent.getPreferenceScreen().removePreference(mWorkPreferenceCategory);
|
||||||
@@ -277,6 +286,37 @@ public class WorkSoundPreferenceController extends PreferenceController implemen
|
|||||||
mWorkAlarmRingtonePreference = null;
|
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
|
public static class UnifyWorkDialogFragment extends InstrumentedDialogFragment
|
||||||
implements DialogInterface.OnClickListener {
|
implements DialogInterface.OnClickListener {
|
||||||
private static final String TAG = "UnifyWorkDialogFragment";
|
private static final String TAG = "UnifyWorkDialogFragment";
|
||||||
|
@@ -114,23 +114,58 @@ public class WorkSoundPreferenceControllerTest {
|
|||||||
.thenReturn(UserHandle.myUserId());
|
.thenReturn(UserHandle.myUserId());
|
||||||
when(mAudioHelper.isSingleVolume()).thenReturn(false);
|
when(mAudioHelper.isSingleVolume()).thenReturn(false);
|
||||||
when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
|
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);
|
when(mAudioHelper.createPackageContextAsUser(anyInt())).thenReturn(mContext);
|
||||||
|
mockWorkCategory();
|
||||||
|
|
||||||
mController.onResume();
|
mController.onResume();
|
||||||
|
|
||||||
verify(mFragment).addPreferencesFromResource(R.xml.sound_work_settings);
|
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
|
@Test
|
||||||
public void onResume_notAvailable_shouldNotAddPreferenceCategory() {
|
public void onResume_notAvailable_shouldNotAddPreferenceCategory() {
|
||||||
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
|
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
|
||||||
@@ -154,4 +189,16 @@ public class WorkSoundPreferenceControllerTest {
|
|||||||
verify(preference).setSummary(anyString());
|
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