• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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.audiostreams;
18 
19 import android.os.Handler;
20 import android.os.Looper;
21 import android.util.Log;
22 
23 import androidx.annotation.Nullable;
24 import androidx.annotation.StringRes;
25 import androidx.annotation.VisibleForTesting;
26 import androidx.preference.Preference;
27 
28 import com.android.settings.overlay.FeatureFactory;
29 import com.android.settingslib.bluetooth.BluetoothUtils;
30 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
31 import com.android.settingslib.utils.ThreadUtils;
32 
33 class AudioStreamStateHandler {
34     private static final String TAG = "AudioStreamStateHandler";
35     private static final boolean DEBUG = BluetoothUtils.D;
36     @VisibleForTesting static final int EMPTY_STRING_RES = 0;
37 
38     final AudioStreamsRepository mAudioStreamsRepository = AudioStreamsRepository.getInstance();
39     final Handler mHandler = new Handler(Looper.getMainLooper());
40     final MetricsFeatureProvider mMetricsFeatureProvider =
41             FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
42 
AudioStreamStateHandler()43     AudioStreamStateHandler() {}
44 
handleStateChange( AudioStreamPreference preference, AudioStreamsProgressCategoryController controller, AudioStreamsHelper helper)45     void handleStateChange(
46             AudioStreamPreference preference,
47             AudioStreamsProgressCategoryController controller,
48             AudioStreamsHelper helper) {
49         var newState = getStateEnum();
50         if (preference.getAudioStreamState() == newState) {
51             return;
52         }
53         if (DEBUG) {
54             Log.d(
55                     TAG,
56                     "moveToState() : moving preference : ["
57                             + preference.getAudioStreamBroadcastId()
58                             + ", "
59                             + preference.getAudioStreamBroadcastName()
60                             + "] from state : "
61                             + preference.getAudioStreamState()
62                             + " to state : "
63                             + newState);
64         }
65         preference.setAudioStreamState(newState);
66 
67         performAction(preference, controller, helper);
68 
69         // Update UI
70         ThreadUtils.postOnMainThread(
71                 () ->
72                         preference.setIsConnected(
73                                 newState
74                                         == AudioStreamsProgressCategoryController.AudioStreamState
75                                                 .SOURCE_ADDED,
76                                 getSummary() != EMPTY_STRING_RES
77                                         ? preference.getContext().getString(getSummary())
78                                         : "",
79                                 getOnClickListener(controller)));
80     }
81 
82     /**
83      * Perform action related to the audio stream state (e.g, addSource) This method is intended to
84      * be optionally overridden by subclasses to provide custom behavior based on the audio stream
85      * state change.
86      */
performAction( AudioStreamPreference preference, AudioStreamsProgressCategoryController controller, AudioStreamsHelper helper)87     void performAction(
88             AudioStreamPreference preference,
89             AudioStreamsProgressCategoryController controller,
90             AudioStreamsHelper helper) {}
91 
92     /**
93      * The preference summary for the audio stream state (e.g, Scanning...) This method is intended
94      * to be optionally overridden.
95      */
96     @StringRes
getSummary()97     int getSummary() {
98         return EMPTY_STRING_RES;
99     }
100 
101     /**
102      * The preference on click event for the audio stream state (e.g, open up a dialog) This method
103      * is intended to be optionally overridden.
104      */
105     @Nullable
getOnClickListener( AudioStreamsProgressCategoryController controller)106     Preference.OnPreferenceClickListener getOnClickListener(
107             AudioStreamsProgressCategoryController controller) {
108         return null;
109     }
110 
111     /** Subclasses should always override. */
getStateEnum()112     AudioStreamsProgressCategoryController.AudioStreamState getStateEnum() {
113         return AudioStreamsProgressCategoryController.AudioStreamState.UNKNOWN;
114     }
115 }
116