• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.connecteddevice.audiosharing;
18 
19 
20 import static com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast.EXTRA_BT_DEVICE_TO_AUTO_ADD_SOURCE;
21 
22 import android.app.Activity;
23 import android.app.settings.SettingsEnums;
24 import android.bluetooth.BluetoothDevice;
25 import android.content.Context;
26 import android.content.Intent;
27 import android.os.Bundle;
28 import android.provider.Settings;
29 import android.util.Log;
30 
31 import androidx.annotation.Nullable;
32 import androidx.annotation.VisibleForTesting;
33 
34 import com.android.settings.R;
35 import com.android.settings.SettingsActivity;
36 import com.android.settings.connecteddevice.audiosharing.audiostreams.AudioStreamsCategoryController;
37 import com.android.settings.dashboard.DashboardFragment;
38 import com.android.settings.widget.SettingsMainSwitchBar;
39 import com.android.settingslib.bluetooth.BluetoothUtils;
40 import com.android.settingslib.utils.ThreadUtils;
41 
42 public class AudioSharingDashboardFragment extends DashboardFragment
43         implements AudioSharingSwitchBarController.OnAudioSharingStateChangedListener {
44     private static final String TAG = "AudioSharingDashboardFrag";
45 
46     public static final int SHARE_THEN_PAIR_REQUEST_CODE = 1002;
47 
48     public static final String IS_SHOWING_AUDIO_SHARING_DASHBOARD_KEY =
49             "is_showing_audio_sharing_dashboard";
50     public static final int SHOWING_AUDIO_SHARING_DASHBOARD = 1;
51     public static final int NOT_SHOWING_AUDIO_SHARING_DASHBOARD = 0;
52 
53     SettingsMainSwitchBar mMainSwitchBar;
54     private Context mContext;
55     private AudioSharingDeviceVolumeGroupController mAudioSharingDeviceVolumeGroupController;
56     private AudioSharingCallAudioPreferenceController mAudioSharingCallAudioPreferenceController;
57     private AudioSharingPlaySoundPreferenceController mAudioSharingPlaySoundPreferenceController;
58     private AudioStreamsCategoryController mAudioStreamsCategoryController;
59     private AudioSharingSwitchBarController mAudioSharingSwitchBarController;
60 
AudioSharingDashboardFragment()61     public AudioSharingDashboardFragment() {
62         super();
63     }
64 
65     @Override
getMetricsCategory()66     public int getMetricsCategory() {
67         return SettingsEnums.AUDIO_SHARING_SETTINGS;
68     }
69 
70     @Override
getLogTag()71     protected String getLogTag() {
72         return TAG;
73     }
74 
75     @Override
getHelpResource()76     public int getHelpResource() {
77         return R.string.help_url_audio_sharing;
78     }
79 
80     @Override
getPreferenceScreenResId()81     protected int getPreferenceScreenResId() {
82         return R.xml.bluetooth_le_audio_sharing;
83     }
84 
85     @Override
onAttach(Context context)86     public void onAttach(Context context) {
87         super.onAttach(context);
88         mContext = context;
89         mAudioSharingDeviceVolumeGroupController =
90                 use(AudioSharingDeviceVolumeGroupController.class);
91         mAudioSharingDeviceVolumeGroupController.init(this);
92         mAudioSharingCallAudioPreferenceController =
93                 use(AudioSharingCallAudioPreferenceController.class);
94         mAudioSharingCallAudioPreferenceController.init(this);
95         mAudioSharingPlaySoundPreferenceController =
96                 use(AudioSharingPlaySoundPreferenceController.class);
97         mAudioStreamsCategoryController = use(AudioStreamsCategoryController.class);
98     }
99 
100     @Override
onActivityCreated(Bundle savedInstanceState)101     public void onActivityCreated(Bundle savedInstanceState) {
102         super.onActivityCreated(savedInstanceState);
103         // Assume we are in a SettingsActivity. This is only safe because we currently use
104         // SettingsActivity as base for all preference fragments.
105         final SettingsActivity activity = (SettingsActivity) getActivity();
106         mMainSwitchBar = activity.getSwitchBar();
107         mMainSwitchBar.setTitle(getText(R.string.audio_sharing_switch_title));
108         mAudioSharingSwitchBarController =
109                 new AudioSharingSwitchBarController(activity, mMainSwitchBar, this);
110         mAudioSharingSwitchBarController.init(this);
111         getSettingsLifecycle().addObserver(mAudioSharingSwitchBarController);
112         mMainSwitchBar.show();
113     }
114 
115     @Override
onResume()116     public void onResume() {
117         super.onResume();
118         // TODO(b/395058868): Remove this if it's decided this is not needed.
119         setAudioSharingDashboardSettingsGlobal(true);
120     }
121 
122     @Override
onPause()123     public void onPause() {
124         super.onPause();
125         // TODO(b/395058868): Remove this if it's decided this is not needed.
126         setAudioSharingDashboardSettingsGlobal(false);
127     }
128 
setAudioSharingDashboardSettingsGlobal(Boolean isShowingAudioSharingDashboard)129     private void setAudioSharingDashboardSettingsGlobal(Boolean isShowingAudioSharingDashboard) {
130         var unused =
131                 ThreadUtils.postOnBackgroundThread(
132                         () -> {
133                             int value =
134                                     isShowingAudioSharingDashboard
135                                             ? SHOWING_AUDIO_SHARING_DASHBOARD
136                                             : NOT_SHOWING_AUDIO_SHARING_DASHBOARD;
137                             Settings.Global.putInt(
138                                     mContext.getContentResolver(),
139                                     IS_SHOWING_AUDIO_SHARING_DASHBOARD_KEY,
140                                     value);
141                         });
142     }
143 
144     @Override
onActivityResult(int requestCode, int resultCode, @Nullable Intent data)145     public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
146         super.onActivityResult(requestCode, resultCode, data);
147         if (BluetoothUtils.isAudioSharingUIAvailable(mContext)) {
148             // In share then pair flow, after users be routed to pair new device page and
149             // successfully pair and connect an LEA headset, the pair fragment will be finished with
150             // RESULT_OK and EXTRA_BT_DEVICE_TO_AUTO_ADD_SOURCE, pass the BT device to switch bar
151             // controller, which is responsible for adding source to the device with loading
152             // indicator.
153             if (requestCode == SHARE_THEN_PAIR_REQUEST_CODE) {
154                 if (resultCode == Activity.RESULT_OK) {
155                     BluetoothDevice btDevice =
156                             data != null
157                                     ? data.getParcelableExtra(EXTRA_BT_DEVICE_TO_AUTO_ADD_SOURCE,
158                                     BluetoothDevice.class)
159                                     : null;
160                     Log.d(TAG, "onActivityResult: RESULT_OK with device = " + btDevice);
161                     if (btDevice != null) {
162                         var unused = ThreadUtils.postOnBackgroundThread(
163                                 () -> mAudioSharingSwitchBarController.handleAutoAddSourceAfterPair(
164                                         btDevice));
165                     }
166                 }
167             }
168         }
169     }
170 
171     @Override
onAudioSharingStateChanged()172     public void onAudioSharingStateChanged() {
173         updateVisibilityForAttachedPreferences();
174     }
175 
176     @Override
onAudioSharingProfilesConnected()177     public void onAudioSharingProfilesConnected() {
178         onProfilesConnectedForAttachedPreferences();
179     }
180 
181     /** Test only: set mock controllers for the {@link AudioSharingDashboardFragment} */
182     @VisibleForTesting
setControllers( AudioSharingDeviceVolumeGroupController volumeGroupController, AudioSharingCallAudioPreferenceController callAudioController, AudioSharingPlaySoundPreferenceController playSoundController, AudioStreamsCategoryController streamsCategoryController, AudioSharingSwitchBarController switchBarController)183     void setControllers(
184             AudioSharingDeviceVolumeGroupController volumeGroupController,
185             AudioSharingCallAudioPreferenceController callAudioController,
186             AudioSharingPlaySoundPreferenceController playSoundController,
187             AudioStreamsCategoryController streamsCategoryController,
188             AudioSharingSwitchBarController switchBarController) {
189         mAudioSharingDeviceVolumeGroupController = volumeGroupController;
190         mAudioSharingCallAudioPreferenceController = callAudioController;
191         mAudioSharingPlaySoundPreferenceController = playSoundController;
192         mAudioStreamsCategoryController = streamsCategoryController;
193         mAudioSharingSwitchBarController = switchBarController;
194     }
195 
updateVisibilityForAttachedPreferences()196     private void updateVisibilityForAttachedPreferences() {
197         mAudioSharingDeviceVolumeGroupController.updateVisibility();
198         mAudioSharingCallAudioPreferenceController.updateVisibility();
199         mAudioSharingPlaySoundPreferenceController.updateVisibility();
200         mAudioStreamsCategoryController.updateVisibility();
201     }
202 
onProfilesConnectedForAttachedPreferences()203     private void onProfilesConnectedForAttachedPreferences() {
204         mAudioSharingDeviceVolumeGroupController.onAudioSharingProfilesConnected();
205     }
206 }
207