diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 59e7d0d1eb5..a974a091e16 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3559,6 +3559,17 @@ android:value="true" /> + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 1676dae30af..cd62c8cf2ae 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12158,4 +12158,19 @@ Allow screen overlays on Settings Allow apps that can display over other apps to overlay Settings screens + + + Media + + Hide player when the media session has ended + + The player allows you to resume a session from the expanded Quick Settings panel. + + Hide player + + Show player + + No players available + + media diff --git a/res/xml/media_controls_settings.xml b/res/xml/media_controls_settings.xml new file mode 100644 index 00000000000..3f0483f028e --- /dev/null +++ b/res/xml/media_controls_settings.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml index eca5f1ea09e..fc5c3e222a2 100644 --- a/res/xml/sound_settings.xml +++ b/res/xml/sound_settings.xml @@ -110,6 +110,14 @@ settings:allowDividerAbove="true" settings:controller="com.android.settings.notification.zen.ZenModePreferenceController"/> + + 0; + } +} diff --git a/src/com/android/settings/sound/MediaControlsSettings.java b/src/com/android/settings/sound/MediaControlsSettings.java new file mode 100644 index 00000000000..f914b5d6241 --- /dev/null +++ b/src/com/android/settings/sound/MediaControlsSettings.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.sound; + +import android.app.settings.SettingsEnums; + +import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; + +/** + * Media control settings located in the sound menu + */ +@SearchIndexable +public class MediaControlsSettings extends DashboardFragment { + + private static final String TAG = "MediaControlsSettings"; + + @Override + protected int getPreferenceScreenResId() { + return R.xml.media_controls_settings; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + public int getMetricsCategory() { + return SettingsEnums.MEDIA_CONTROLS_SETTINGS; + } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.media_controls_settings); +} diff --git a/tests/robotests/src/com/android/settings/sound/MediaControlsParentPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/MediaControlsParentPreferenceControllerTest.java new file mode 100644 index 00000000000..a1a3f127d8f --- /dev/null +++ b/tests/robotests/src/com/android/settings/sound/MediaControlsParentPreferenceControllerTest.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.sound; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.spy; + +import android.content.ContentResolver; +import android.content.Context; +import android.provider.Settings; + +import com.android.settings.R; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class MediaControlsParentPreferenceControllerTest { + + private static final String KEY = "media_controls_summary"; + + private Context mContext; + private int mOriginalQs; + private int mOriginalResume; + private ContentResolver mContentResolver; + private MediaControlsParentPreferenceController mController; + + @Before + public void setUp() { + mContext = spy(RuntimeEnvironment.application); + mContentResolver = mContext.getContentResolver(); + mOriginalQs = Settings.Global.getInt(mContentResolver, + Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); + mOriginalResume = Settings.Secure.getInt(mContentResolver, + Settings.Secure.MEDIA_CONTROLS_RESUME, 1); + mController = new MediaControlsParentPreferenceController(mContext, KEY); + } + + @After + public void tearDown() { + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, + mOriginalQs); + Settings.Secure.putInt(mContentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, + mOriginalResume); + } + + @Test + public void getAvailability_flagNotEnabled_returnUnsupportedOnDevice() { + // When the qs_media flag is not enabled + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 0); + + // Then the media resume option should not appear + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailability_flagEnabled_returnAvailable() { + // When the qs_media flag is enabled + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); + + // Then the media resume option should appear + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void getSummary_isOn_showPlayer() { + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); + Settings.Secure.putInt(mContentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, 1); + + assertThat(mController.getSummary()) + .isEqualTo(mContext.getString(R.string.media_controls_show_player)); + } + + @Test + public void getSummary_isOff_hidePlayer() { + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); + Settings.Secure.putInt(mContentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, 0); + + assertThat(mController.getSummary()) + .isEqualTo(mContext.getString(R.string.media_controls_hide_player)); + } +} diff --git a/tests/robotests/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java new file mode 100644 index 00000000000..ff35ebf341c --- /dev/null +++ b/tests/robotests/src/com/android/settings/sound/MediaControlsPreferenceControllerTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.sound; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.spy; + +import android.content.ContentResolver; +import android.content.Context; +import android.provider.Settings; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class MediaControlsPreferenceControllerTest { + + private static final String KEY = "media_controls_resume_switch"; + + private Context mContext; + private int mOriginalQs; + private int mOriginalResume; + private ContentResolver mContentResolver; + private MediaControlsPreferenceController mController; + + @Before + public void setUp() { + mContext = spy(RuntimeEnvironment.application); + mContentResolver = mContext.getContentResolver(); + mOriginalQs = Settings.Global.getInt(mContentResolver, + Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); + mOriginalResume = Settings.Secure.getInt(mContentResolver, + Settings.Secure.MEDIA_CONTROLS_RESUME, 1); + mController = new MediaControlsPreferenceController(mContext, KEY); + } + + @After + public void tearDown() { + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, + mOriginalQs); + Settings.Secure.putInt(mContentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, + mOriginalResume); + } + + @Test + public void getAvailability_flagNotEnabled_returnUnsupportedOnDevice() { + // When the qs_media flag is not enabled + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 0); + + // Then the media resume option should not appear + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailability_flagEnabled_returnAvailable() { + // When the qs_media flag is enabled + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); + + // Then the media resume option should appear + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void setChecked_enable_shouldTurnOff() { + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); + Settings.Secure.putInt(mContentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, 1); + + assertThat(mController.isChecked()).isFalse(); + + mController.setChecked(true); + + assertThat(Settings.Secure.getInt(mContentResolver, + Settings.Secure.MEDIA_CONTROLS_RESUME, -1)).isEqualTo(0); + } + + @Test + public void setChecked_disable_shouldTurnOn() { + Settings.Global.putInt(mContentResolver, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, 1); + Settings.Secure.putInt(mContentResolver, Settings.Secure.MEDIA_CONTROLS_RESUME, 0); + + assertThat(mController.isChecked()).isTrue(); + + mController.setChecked(false); + + assertThat(Settings.Secure.getInt(mContentResolver, + Settings.Secure.MEDIA_CONTROLS_RESUME, -1)).isEqualTo(1); + } +} diff --git a/tests/robotests/src/com/android/settings/sound/MediaControlsSettingsTest.java b/tests/robotests/src/com/android/settings/sound/MediaControlsSettingsTest.java new file mode 100644 index 00000000000..a27cbaf36f5 --- /dev/null +++ b/tests/robotests/src/com/android/settings/sound/MediaControlsSettingsTest.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.sound; + +import static com.google.common.truth.Truth.assertThat; + +import android.provider.SearchIndexableResource; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public class MediaControlsSettingsTest { + + private MediaControlsSettings mSettings; + + @Before + public void setUp() { + mSettings = new MediaControlsSettings(); + } + + @Test + public void testSearchIndexProvider_shouldIndexResource() { + final List indexRes = + MediaControlsSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex( + RuntimeEnvironment.application, true /* enabled */); + + assertThat(indexRes).isNotNull(); + assertThat(indexRes.get(0).xmlResId).isEqualTo(mSettings.getPreferenceScreenResId()); + } +}