Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f2d982f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

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

parents 589bb08f e474bd5f
Loading
Loading
Loading
Loading
+81 −41
Original line number Diff line number Diff line
@@ -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);
        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();
    }
            if (!mWorkUsePersonalSounds.isChecked()) {
                updateWorkRingtoneSummaries();
            }
        } else {
            maybeRemoveWorkPreferences();
        }

    @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,18 +187,38 @@ 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);
        if (mManagedProfileId == UserHandle.USER_NULL || !isAvailable()) {
            maybeRemoveWorkPreferences();
            return;
        }

        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);
            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();
        if (Settings.Secure.getIntForUser(managedProfileContext.getContentResolver(),
@@ -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";
+57 −10
Original line number Diff line number Diff line
@@ -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));
    }
}