summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java1
-rw-r--r--src/com/android/settings/development/QuickSettingsMediaPlayerPreferenceController.java73
-rw-r--r--src/com/android/settings/media/MediaDeviceUpdateWorker.java22
-rw-r--r--src/com/android/settings/media/RemoteMediaSlice.java32
-rw-r--r--src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java53
-rw-r--r--src/com/android/settings/network/telephony/MobileNetworkSettings.java57
-rw-r--r--src/com/android/settings/network/telephony/TelephonyAvailabilityHandler.java8
-rw-r--r--src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java10
-rw-r--r--src/com/android/settings/network/telephony/TelephonyStatusControlSession.java117
-rw-r--r--src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java11
-rw-r--r--src/com/android/settings/notification/RemoteVolumeGroupController.java66
11 files changed, 333 insertions, 117 deletions
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 878d442c16..0594ef5aaf 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -491,6 +491,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
controllers.add(new DebugNonRectClipOperationsPreferenceController(context));
controllers.add(new ForceDarkPreferenceController(context));
controllers.add(new EnableBlursPreferenceController(context));
+ controllers.add(new QuickSettingsMediaPlayerPreferenceController(context));
controllers.add(new ForceMSAAPreferenceController(context));
controllers.add(new HardwareOverlaysPreferenceController(context));
controllers.add(new SimulateColorSpacePreferenceController(context));
diff --git a/src/com/android/settings/development/QuickSettingsMediaPlayerPreferenceController.java b/src/com/android/settings/development/QuickSettingsMediaPlayerPreferenceController.java
new file mode 100644
index 0000000000..47f3adc83e
--- /dev/null
+++ b/src/com/android/settings/development/QuickSettingsMediaPlayerPreferenceController.java
@@ -0,0 +1,73 @@
+/*
+ * 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.development;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+/**
+ * Controls whether the media player should be visible in quick settings.
+ */
+public class QuickSettingsMediaPlayerPreferenceController extends
+ DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
+ PreferenceControllerMixin {
+ private static final String PREFERENCE_KEY = "quick_settings_media_player";
+ @VisibleForTesting
+ static final String SETTING_NAME = Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS;
+ @VisibleForTesting
+ static final int SETTING_VALUE_ON = 1;
+ @VisibleForTesting
+ static final int SETTING_VALUE_OFF = 0;
+
+ public QuickSettingsMediaPlayerPreferenceController(Context context) {
+ super(context);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return PREFERENCE_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final boolean isEnabled = (Boolean) newValue;
+ Settings.Global.putInt(mContext.getContentResolver(), SETTING_NAME,
+ isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final int mode = Settings.Global.getInt(mContext.getContentResolver(), SETTING_NAME,
+ SETTING_VALUE_OFF);
+ ((SwitchPreference) mPreference).setChecked(mode != SETTING_VALUE_OFF);
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ Settings.Global.putInt(mContext.getContentResolver(), SETTING_NAME, SETTING_VALUE_OFF);
+ ((SwitchPreference) mPreference).setChecked(false);
+ }
+}
diff --git a/src/com/android/settings/media/MediaDeviceUpdateWorker.java b/src/com/android/settings/media/MediaDeviceUpdateWorker.java
index c768257706..52249ffdba 100644
--- a/src/com/android/settings/media/MediaDeviceUpdateWorker.java
+++ b/src/com/android/settings/media/MediaDeviceUpdateWorker.java
@@ -25,6 +25,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
+import android.media.RoutingSessionInfo;
import android.net.Uri;
import android.os.UserHandle;
import android.os.UserManager;
@@ -173,6 +174,10 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
return mLocalMediaManager.getSelectedMediaDevice();
}
+ void adjustSessionVolume(String sessionId, int volume) {
+ mLocalMediaManager.adjustSessionVolume(sessionId, volume);
+ }
+
void adjustSessionVolume(int volume) {
mLocalMediaManager.adjustSessionVolume(volume);
}
@@ -189,15 +194,14 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
return mLocalMediaManager.getSessionName();
}
- /**
- * Find the active MediaDevice.
- *
- * @param type the media device type.
- * @return MediaDevice list
- *
- */
- public List<MediaDevice> getActiveMediaDevice(@MediaDevice.MediaDeviceType int type) {
- return mLocalMediaManager.getActiveMediaDevice(type);
+ List<RoutingSessionInfo> getActiveRemoteMediaDevice() {
+ final List<RoutingSessionInfo> sessionInfos = new ArrayList<>();
+ for (RoutingSessionInfo info : mLocalMediaManager.getActiveMediaSession()) {
+ if (!info.isSystemSession()) {
+ sessionInfos.add(info);
+ }
+ }
+ return sessionInfos;
}
/**
diff --git a/src/com/android/settings/media/RemoteMediaSlice.java b/src/com/android/settings/media/RemoteMediaSlice.java
index 4e442b77a6..71a41b3696 100644
--- a/src/com/android/settings/media/RemoteMediaSlice.java
+++ b/src/com/android/settings/media/RemoteMediaSlice.java
@@ -24,6 +24,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
+import android.media.RoutingSessionInfo;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
@@ -41,7 +42,6 @@ import com.android.settings.slices.CustomSliceable;
import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settings.slices.SliceBroadcastReceiver;
import com.android.settings.slices.SliceBuilderUtils;
-import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.media.MediaOutputSliceConstants;
import java.util.List;
@@ -67,7 +67,7 @@ public class RemoteMediaSlice implements CustomSliceable {
final int newPosition = intent.getIntExtra(EXTRA_RANGE_VALUE, -1);
final String id = intent.getStringExtra(MEDIA_ID);
if (!TextUtils.isEmpty(id)) {
- getWorker().adjustVolume(getWorker().getMediaDeviceById(id), newPosition);
+ getWorker().adjustSessionVolume(id, newPosition);
}
}
@@ -80,9 +80,8 @@ public class RemoteMediaSlice implements CustomSliceable {
return listBuilder.build();
}
// Only displaying remote devices
- final List<MediaDevice> mediaDevices = getWorker().getActiveMediaDevice(
- MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
- if (mediaDevices.isEmpty()) {
+ final List<RoutingSessionInfo> infos = getWorker().getActiveRemoteMediaDevice();
+ if (infos.isEmpty()) {
Log.d(TAG, "No active remote media device");
return listBuilder.build();
}
@@ -93,27 +92,25 @@ public class RemoteMediaSlice implements CustomSliceable {
// To create an empty icon to indent the row
final IconCompat emptyIcon = createEmptyIcon();
int requestCode = 0;
- for (MediaDevice mediaDevice : mediaDevices) {
- final int maxVolume = mediaDevice.getMaxVolume();
+ for (RoutingSessionInfo info : infos) {
+ final int maxVolume = info.getVolumeMax();
if (maxVolume <= 0) {
- Log.d(TAG, "Unable to add Slice. " + mediaDevice.getName() + ": max volume is "
+ Log.d(TAG, "Unable to add Slice. " + info.getName() + ": max volume is "
+ maxVolume);
continue;
}
- final String title = castVolume + " (" + mediaDevice.getClientAppLabel() + ")";
listBuilder.addInputRange(new InputRangeBuilder()
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
- .setTitle(title)
- .setInputAction(getSliderInputAction(requestCode++, mediaDevice.getId()))
- .setPrimaryAction(getSoundSettingAction(title, icon, mediaDevice.getId()))
+ .setTitle(castVolume)
+ .setInputAction(getSliderInputAction(requestCode++, info.getId()))
+ .setPrimaryAction(getSoundSettingAction(castVolume, icon, info.getId()))
.setMax(maxVolume)
- .setValue(mediaDevice.getCurrentVolume()));
+ .setValue(info.getVolume()));
listBuilder.addRow(new ListBuilder.RowBuilder()
.setTitle(outputTitle)
- .setSubtitle(mediaDevice.getName())
+ .setSubtitle(info.getName())
.setTitleItem(emptyIcon, ListBuilder.ICON_IMAGE)
- .setPrimaryAction(getMediaOutputSliceAction(
- mediaDevice.getClientPackageName())));
+ .setPrimaryAction(getMediaOutputSliceAction(info.getClientPackageName())));
}
return listBuilder.build();
}
@@ -131,7 +128,8 @@ public class RemoteMediaSlice implements CustomSliceable {
return PendingIntent.getBroadcast(mContext, requestCode, intent, 0);
}
- private SliceAction getSoundSettingAction(String actionTitle, IconCompat icon, String id) {
+ private SliceAction getSoundSettingAction(CharSequence actionTitle, IconCompat icon,
+ String id) {
final Uri contentUri = new Uri.Builder().appendPath(id).build();
final Intent intent = SliceBuilderUtils.buildSearchResultPageIntent(mContext,
SoundSettings.class.getName(),
diff --git a/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java b/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java
new file mode 100644
index 0000000000..889fbaec4e
--- /dev/null
+++ b/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java
@@ -0,0 +1,53 @@
+/*
+ * 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.network.telephony;
+
+import com.android.settings.dashboard.RestrictedDashboardFragment;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+abstract class AbstractMobileNetworkSettings extends RestrictedDashboardFragment {
+
+ private static final String LOG_TAG = "AbsNetworkSettings";
+
+ /**
+ * @param restrictionKey The restriction key to check before pin protecting
+ * this settings page. Pass in {@link RESTRICT_IF_OVERRIDABLE} if it should
+ * be protected whenever a restrictions provider is set. Pass in
+ * null if it should never be protected.
+ */
+ AbstractMobileNetworkSettings(String restrictionKey) {
+ super(restrictionKey);
+ }
+
+ List<AbstractPreferenceController> getPreferenceControllersAsList() {
+ final List<AbstractPreferenceController> result =
+ new ArrayList<AbstractPreferenceController>();
+ getPreferenceControllers().forEach(controllers -> result.addAll(controllers));
+ return result;
+ }
+
+ TelephonyStatusControlSession setTelephonyAvailabilityStatus(
+ Collection<AbstractPreferenceController> listOfPrefControllers) {
+ return (new TelephonyStatusControlSession.Builder(listOfPrefControllers))
+ .build();
+ }
+
+}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 54fe2c16ee..754dd058c7 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -36,8 +36,6 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
-import com.android.settings.dashboard.RestrictedDashboardFragment;
import com.android.settings.datausage.BillingCyclePreferenceController;
import com.android.settings.datausage.DataUsageSummaryPreferenceController;
import com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController;
@@ -47,17 +45,14 @@ import com.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenc
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
-import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
-public class MobileNetworkSettings extends RestrictedDashboardFragment {
+public class MobileNetworkSettings extends AbstractMobileNetworkSettings {
private static final String LOG_TAG = "NetworkSettings";
public static final int REQUEST_CODE_EXIT_ECM = 17;
@@ -133,7 +128,11 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment {
public void onAttach(Context context) {
super.onAttach(context);
- use(DataUsageSummaryPreferenceController.class).init(mSubId);
+ final DataUsageSummaryPreferenceController dataUsageSummaryPreferenceController =
+ use(DataUsageSummaryPreferenceController.class);
+ if (dataUsageSummaryPreferenceController != null) {
+ dataUsageSummaryPreferenceController.init(mSubId);
+ }
use(CallsDefaultSubscriptionController.class).init(getLifecycle());
use(SmsDefaultSubscriptionController.class).init(getLifecycle());
use(MobileNetworkSwitchController.class).init(getLifecycle(), mSubId);
@@ -189,11 +188,8 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment {
public void onCreate(Bundle icicle) {
Log.i(LOG_TAG, "onCreate:+");
- final Collection<List<AbstractPreferenceController>> controllerLists =
- getPreferenceControllers();
- final Future<Boolean> result = ThreadUtils.postOnBackgroundThread(() ->
- setupAvailabilityStatus(controllerLists)
- );
+ final TelephonyStatusControlSession session =
+ setTelephonyAvailabilityStatus(getPreferenceControllersAsList());
super.onCreate(icicle);
final Context context = getContext();
@@ -201,46 +197,11 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment {
mTelephonyManager = context.getSystemService(TelephonyManager.class)
.createForSubscriptionId(mSubId);
- //check the background thread is finished then unset the status of availability.
- try {
- result.get();
- } catch (ExecutionException | InterruptedException exception) {
- Log.e(LOG_TAG, "onCreate, setup availability status failed!", exception);
- }
- unsetAvailabilityStatus(controllerLists);
+ session.close();
onRestoreInstance(icicle);
}
- private Boolean setupAvailabilityStatus(
- Collection<List<AbstractPreferenceController>> controllerLists) {
- try {
- controllerLists.stream().flatMap(Collection::stream)
- .filter(controller -> controller instanceof TelephonyAvailabilityHandler)
- .map(TelephonyAvailabilityHandler.class::cast)
- .forEach(controller -> {
- int status = ((BasePreferenceController) controller)
- .getAvailabilityStatus();
- controller.unsetAvailabilityStatus(true);
- controller.setAvailabilityStatus(status);
- });
- return true;
- } catch (Exception exception) {
- Log.e(LOG_TAG, "Setup availability status failed!", exception);
- return false;
- }
- }
-
- private void unsetAvailabilityStatus(
- Collection<List<AbstractPreferenceController>> controllerLists) {
- controllerLists.stream().flatMap(Collection::stream)
- .filter(controller -> controller instanceof TelephonyAvailabilityHandler)
- .map(TelephonyAvailabilityHandler.class::cast)
- .forEach(controller -> {
- controller.unsetAvailabilityStatus(false);
- });
- }
-
@Override
public void onExpandButtonClick() {
final PreferenceScreen screen = getPreferenceScreen();
diff --git a/src/com/android/settings/network/telephony/TelephonyAvailabilityHandler.java b/src/com/android/settings/network/telephony/TelephonyAvailabilityHandler.java
index 50dd26bc1b..c1acd91667 100644
--- a/src/com/android/settings/network/telephony/TelephonyAvailabilityHandler.java
+++ b/src/com/android/settings/network/telephony/TelephonyAvailabilityHandler.java
@@ -25,14 +25,16 @@ import android.content.Context;
public interface TelephonyAvailabilityHandler {
/**
- * Set availability to preference controller.
+ * Set availability status of preference controller to a fixed value.
+ * @param status is the given status. Which will be reported from
+ * {@link BasePreferenceController#getAvailabilityStatus()}
*/
- public void setAvailabilityStatus(int status);
+ void setAvailabilityStatus(int status);
/**
* Do not set availability, use
* {@link MobileNetworkUtils#getAvailability(Context, int, TelephonyAvailabilityCallback)}
* to get the availability.
*/
- public void unsetAvailabilityStatus(boolean enable);
+ void unsetAvailabilityStatus();
}
diff --git a/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java b/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java
index 678209d935..2bd7de9d50 100644
--- a/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/TelephonyBasePreferenceController.java
@@ -23,7 +23,6 @@ import android.telephony.SubscriptionManager;
import com.android.settings.core.BasePreferenceController;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -33,7 +32,7 @@ public abstract class TelephonyBasePreferenceController extends BasePreferenceCo
implements TelephonyAvailabilityCallback, TelephonyAvailabilityHandler {
protected int mSubId;
private AtomicInteger mAvailabilityStatus = new AtomicInteger(0);
- private AtomicBoolean mUnsetAvailabilityStatus = new AtomicBoolean(false);
+ private AtomicInteger mSetSessionCount = new AtomicInteger(0);
public TelephonyBasePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
@@ -42,7 +41,7 @@ public abstract class TelephonyBasePreferenceController extends BasePreferenceCo
@Override
public int getAvailabilityStatus() {
- if (!mUnsetAvailabilityStatus.get()) {
+ if (mSetSessionCount.get() <= 0) {
mAvailabilityStatus.set(MobileNetworkUtils
.getAvailability(mContext, mSubId, this::getAvailabilityStatus));
}
@@ -52,11 +51,12 @@ public abstract class TelephonyBasePreferenceController extends BasePreferenceCo
@Override
public void setAvailabilityStatus(int status) {
mAvailabilityStatus.set(status);
+ mSetSessionCount.getAndIncrement();
}
@Override
- public void unsetAvailabilityStatus(boolean enable) {
- mUnsetAvailabilityStatus.set(enable);
+ public void unsetAvailabilityStatus() {
+ mSetSessionCount.getAndDecrement();
}
/**
diff --git a/src/com/android/settings/network/telephony/TelephonyStatusControlSession.java b/src/com/android/settings/network/telephony/TelephonyStatusControlSession.java
new file mode 100644
index 0000000000..12c9beeef6
--- /dev/null
+++ b/src/com/android/settings/network/telephony/TelephonyStatusControlSession.java
@@ -0,0 +1,117 @@
+/*
+ * 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.network.telephony;
+
+import android.util.Log;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.Collection;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+/**
+ * Session for controlling the status of TelephonyPreferenceController(s).
+ *
+ * Within this session, result of {@link BasePreferenceController#availabilityStatus()}
+ * would be under control.
+ */
+public class TelephonyStatusControlSession implements AutoCloseable {
+
+ private static final String LOG_TAG = "TelephonyStatusControlSS";
+
+ private Collection<AbstractPreferenceController> mControllers;
+ private Future<Boolean> mResult;
+
+ /**
+ * Buider of session
+ */
+ public static class Builder {
+ private Collection<AbstractPreferenceController> mControllers;
+
+ /**
+ * Constructor
+ *
+ * @param controllers is a collection of {@link AbstractPreferenceController}
+ * which would have {@link BasePreferenceController#availabilityStatus()}
+ * under control within this session.
+ */
+ public Builder(Collection<AbstractPreferenceController> controllers) {
+ mControllers = controllers;
+ }
+
+ /**
+ * Method to build this session.
+ * @return {@link TelephonyStatusControlSession} session been setup.
+ */
+ public TelephonyStatusControlSession build() {
+ return new TelephonyStatusControlSession(mControllers);
+ }
+ }
+
+ private TelephonyStatusControlSession(Collection<AbstractPreferenceController> controllers) {
+ mControllers = controllers;
+ mResult = ThreadUtils.postOnBackgroundThread(() ->
+ setupAvailabilityStatus(controllers)
+ );
+ }
+
+ /**
+ * Close the session.
+ *
+ * No longer control the status.
+ */
+ public void close() {
+ //check the background thread is finished then unset the status of availability.
+ try {
+ mResult.get();
+ } catch (ExecutionException | InterruptedException exception) {
+ Log.e(LOG_TAG, "setup availability status failed!", exception);
+ }
+ unsetAvailabilityStatus(mControllers);
+ }
+
+ private Boolean setupAvailabilityStatus(
+ Collection<AbstractPreferenceController> controllerLists) {
+ try {
+ controllerLists.stream()
+ .filter(controller -> controller instanceof TelephonyAvailabilityHandler)
+ .map(TelephonyAvailabilityHandler.class::cast)
+ .forEach(controller -> {
+ int status = ((BasePreferenceController) controller)
+ .getAvailabilityStatus();
+ controller.setAvailabilityStatus(status);
+ });
+ return true;
+ } catch (Exception exception) {
+ Log.e(LOG_TAG, "Setup availability status failed!", exception);
+ return false;
+ }
+ }
+
+ private void unsetAvailabilityStatus(
+ Collection<AbstractPreferenceController> controllerLists) {
+ controllerLists.stream()
+ .filter(controller -> controller instanceof TelephonyAvailabilityHandler)
+ .map(TelephonyAvailabilityHandler.class::cast)
+ .forEach(controller -> {
+ controller.unsetAvailabilityStatus();
+ });
+ }
+}
diff --git a/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java b/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
index 56d51eb380..84aa0cb065 100644
--- a/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
+++ b/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
@@ -23,7 +23,6 @@ import android.telephony.SubscriptionManager;
import com.android.settings.core.TogglePreferenceController;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -33,8 +32,7 @@ public abstract class TelephonyTogglePreferenceController extends TogglePreferen
implements TelephonyAvailabilityCallback, TelephonyAvailabilityHandler {
protected int mSubId;
private AtomicInteger mAvailabilityStatus = new AtomicInteger(0);
- private AtomicBoolean mUnsetAvailabilityStatus = new AtomicBoolean(false);
-
+ private AtomicInteger mSetSessionCount = new AtomicInteger(0);
public TelephonyTogglePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
@@ -43,7 +41,7 @@ public abstract class TelephonyTogglePreferenceController extends TogglePreferen
@Override
public int getAvailabilityStatus() {
- if (!mUnsetAvailabilityStatus.get()) {
+ if (mSetSessionCount.get() <= 0) {
mAvailabilityStatus.set(MobileNetworkUtils
.getAvailability(mContext, mSubId, this::getAvailabilityStatus));
}
@@ -53,11 +51,12 @@ public abstract class TelephonyTogglePreferenceController extends TogglePreferen
@Override
public void setAvailabilityStatus(int status) {
mAvailabilityStatus.set(status);
+ mSetSessionCount.getAndIncrement();
}
@Override
- public void unsetAvailabilityStatus(boolean enable) {
- mUnsetAvailabilityStatus.set(enable);
+ public void unsetAvailabilityStatus() {
+ mSetSessionCount.getAndDecrement();
}
/**
diff --git a/src/com/android/settings/notification/RemoteVolumeGroupController.java b/src/com/android/settings/notification/RemoteVolumeGroupController.java
index c36035aa20..137f7803d8 100644
--- a/src/com/android/settings/notification/RemoteVolumeGroupController.java
+++ b/src/com/android/settings/notification/RemoteVolumeGroupController.java
@@ -18,6 +18,8 @@ package com.android.settings.notification;
import android.content.Context;
import android.content.Intent;
+import android.media.RoutingSessionInfo;
+import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -51,7 +53,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
static final String SWITCHER_PREFIX = "OUTPUT_SWITCHER";
private PreferenceCategory mPreferenceCategory;
- private List<MediaDevice> mActiveRemoteMediaDevices = new ArrayList<>();
+ private List<RoutingSessionInfo> mRoutingSessionInfos = new ArrayList<>();
@VisibleForTesting
LocalMediaManager mLocalMediaManager;
@@ -67,7 +69,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
@Override
public int getAvailabilityStatus() {
- if (mActiveRemoteMediaDevices.isEmpty()) {
+ if (mRoutingSessionInfos.isEmpty()) {
return CONDITIONALLY_UNAVAILABLE;
}
return AVAILABLE_UNSEARCHABLE;
@@ -77,12 +79,19 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreferenceCategory = screen.findPreference(getPreferenceKey());
- mActiveRemoteMediaDevices.clear();
- mActiveRemoteMediaDevices.addAll(mLocalMediaManager.getActiveMediaDevice(
- MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE));
+ initRemoteMediaSession();
refreshPreference();
}
+ private void initRemoteMediaSession() {
+ mRoutingSessionInfos.clear();
+ for (RoutingSessionInfo info : mLocalMediaManager.getActiveMediaSession()) {
+ if (!info.isSystemSession()) {
+ mRoutingSessionInfos.add(info);
+ }
+ }
+ }
+
/**
* onDestroy()
* {@link androidx.lifecycle.OnLifecycleEvent}
@@ -102,27 +111,27 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
final CharSequence outputTitle = mContext.getText(R.string.media_output_title);
final CharSequence castVolume = mContext.getText(R.string.remote_media_volume_option_title);
mPreferenceCategory.setVisible(true);
- int i = 0;
- for (MediaDevice device : mActiveRemoteMediaDevices) {
- if (mPreferenceCategory.findPreference(device.getId()) != null) {
+
+ for (RoutingSessionInfo info : mRoutingSessionInfos) {
+ if (mPreferenceCategory.findPreference(info.getId()) != null) {
continue;
}
// Add slider
final RemoteVolumeSeekBarPreference seekBarPreference =
new RemoteVolumeSeekBarPreference(mContext);
- seekBarPreference.setKey(device.getId());
- seekBarPreference.setTitle(castVolume + " (" + device.getClientAppLabel() + ")");
- seekBarPreference.setMax(device.getMaxVolume());
- seekBarPreference.setProgress(device.getCurrentVolume());
+ seekBarPreference.setKey(info.getId());
+ seekBarPreference.setTitle(castVolume);
+ seekBarPreference.setMax(info.getVolumeMax());
+ seekBarPreference.setProgress(info.getVolume());
seekBarPreference.setMin(0);
seekBarPreference.setOnPreferenceChangeListener(this);
seekBarPreference.setIcon(R.drawable.ic_volume_remote);
mPreferenceCategory.addPreference(seekBarPreference);
// Add output indicator
final Preference preference = new Preference(mContext);
- preference.setKey(SWITCHER_PREFIX + device.getId());
+ preference.setKey(SWITCHER_PREFIX + info.getId());
preference.setTitle(outputTitle);
- preference.setSummary(device.getName());
+ preference.setSummary(info.getName());
mPreferenceCategory.addPreference(preference);
}
}
@@ -135,7 +144,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
return false;
}
ThreadUtils.postOnBackgroundThread(() -> {
- device.requestSetVolume((int) newValue);
+ mLocalMediaManager.adjustSessionVolume(preference.getKey(), (int) newValue);
});
return true;
}
@@ -145,18 +154,19 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
if (!preference.getKey().startsWith(SWITCHER_PREFIX)) {
return false;
}
- final String key = preference.getKey().substring(SWITCHER_PREFIX.length());
- final MediaDevice device = mLocalMediaManager.getMediaDeviceById(key);
- if (device == null) {
- return false;
+ for (RoutingSessionInfo info : mRoutingSessionInfos) {
+ if (TextUtils.equals(info.getId(),
+ preference.getKey().substring(SWITCHER_PREFIX.length()))) {
+ final Intent intent = new Intent()
+ .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
+ info.getClientPackageName());
+ mContext.startActivity(intent);
+ return true;
+ }
}
- final Intent intent = new Intent()
- .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
- device.getClientPackageName());
- mContext.startActivity(intent);
- return true;
+ return false;
}
@Override
@@ -170,9 +180,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
// Preference group is not ready.
return;
}
- mActiveRemoteMediaDevices.clear();
- mActiveRemoteMediaDevices.addAll(mLocalMediaManager.getActiveMediaDevice(
- MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE));
+ initRemoteMediaSession();
refreshPreference();
}