1 /*
2  * Copyright 2018 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 package com.android.settingslib.media;
17 
18 import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER;
19 import static android.media.MediaRoute2Info.TYPE_DOCK;
20 import static android.media.MediaRoute2Info.TYPE_HDMI;
21 import static android.media.MediaRoute2Info.TYPE_USB_ACCESSORY;
22 import static android.media.MediaRoute2Info.TYPE_USB_DEVICE;
23 import static android.media.MediaRoute2Info.TYPE_USB_HEADSET;
24 import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
25 import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
26 
27 import static com.android.settingslib.media.MediaDevice.SelectionBehavior.SELECTION_BEHAVIOR_TRANSFER;
28 
29 import android.content.Context;
30 import android.graphics.drawable.Drawable;
31 import android.media.MediaRoute2Info;
32 import android.media.MediaRouter2Manager;
33 import android.media.RouteListingPreference;
34 
35 import androidx.annotation.VisibleForTesting;
36 
37 import com.android.settingslib.R;
38 
39 /**
40  * PhoneMediaDevice extends MediaDevice to represents Phone device.
41  */
42 public class PhoneMediaDevice extends MediaDevice {
43 
44     private static final String TAG = "PhoneMediaDevice";
45 
46     public static final String PHONE_ID = "phone_media_device_id";
47     // For 3.5 mm wired headset
48     public static final String WIRED_HEADSET_ID = "wired_headset_media_device_id";
49     public static final String USB_HEADSET_ID = "usb_headset_media_device_id";
50 
51     private String mSummary = "";
52 
53     private final DeviceIconUtil mDeviceIconUtil;
54 
PhoneMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info, String packageName)55     PhoneMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
56             String packageName) {
57         this(context, routerManager, info, packageName, null);
58     }
59 
PhoneMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info, String packageName, RouteListingPreference.Item item)60     PhoneMediaDevice(Context context, MediaRouter2Manager routerManager, MediaRoute2Info info,
61             String packageName, RouteListingPreference.Item item) {
62         super(context, routerManager, info, packageName, item);
63         mDeviceIconUtil = new DeviceIconUtil();
64         initDeviceRecord();
65     }
66 
67     // MediaRoute2Info.getType was made public on API 34, but exists since API 30.
68     @SuppressWarnings("NewApi")
69     @Override
getName()70     public String getName() {
71         CharSequence name;
72         switch (mRouteInfo.getType()) {
73             case TYPE_WIRED_HEADSET:
74             case TYPE_WIRED_HEADPHONES:
75             case TYPE_USB_DEVICE:
76             case TYPE_USB_HEADSET:
77             case TYPE_USB_ACCESSORY:
78                 name = mContext.getString(R.string.media_transfer_wired_usb_device_name);
79                 break;
80             case TYPE_DOCK:
81                 name = mContext.getString(R.string.media_transfer_dock_speaker_device_name);
82                 break;
83             case TYPE_BUILTIN_SPEAKER:
84                 name = mContext.getString(R.string.media_transfer_this_device_name);
85                 break;
86             case TYPE_HDMI:
87                 name = mContext.getString(R.string.media_transfer_external_device_name);
88                 break;
89             default:
90                 name = mContext.getString(R.string.media_transfer_default_device_name);
91                 break;
92         }
93         return name.toString();
94     }
95 
96     @Override
getSelectionBehavior()97     public int getSelectionBehavior() {
98         // We don't allow apps to override the selection behavior of system routes.
99         return SELECTION_BEHAVIOR_TRANSFER;
100     }
101 
102     @Override
getSummary()103     public String getSummary() {
104         return mSummary;
105     }
106 
107     @Override
getIcon()108     public Drawable getIcon() {
109         return getIconWithoutBackground();
110     }
111 
112     @Override
getIconWithoutBackground()113     public Drawable getIconWithoutBackground() {
114         return mContext.getDrawable(getDrawableResId());
115     }
116 
117     // MediaRoute2Info.getType was made public on API 34, but exists since API 30.
118     @SuppressWarnings("NewApi")
119     @VisibleForTesting
getDrawableResId()120     int getDrawableResId() {
121         return mDeviceIconUtil.getIconResIdFromMediaRouteType(mRouteInfo.getType());
122     }
123 
124     // MediaRoute2Info.getType was made public on API 34, but exists since API 30.
125     @SuppressWarnings("NewApi")
126     @Override
getId()127     public String getId() {
128         String id;
129         switch (mRouteInfo.getType()) {
130             case TYPE_WIRED_HEADSET:
131             case TYPE_WIRED_HEADPHONES:
132                 id = WIRED_HEADSET_ID;
133                 break;
134             case TYPE_USB_DEVICE:
135             case TYPE_USB_HEADSET:
136             case TYPE_USB_ACCESSORY:
137             case TYPE_DOCK:
138             case TYPE_HDMI:
139                 id = USB_HEADSET_ID;
140                 break;
141             case TYPE_BUILTIN_SPEAKER:
142             default:
143                 id = PHONE_ID;
144                 break;
145         }
146         return id;
147     }
148 
149     @Override
isConnected()150     public boolean isConnected() {
151         return true;
152     }
153 
154     /**
155      * According current active device is {@link PhoneMediaDevice} or not to update summary.
156      */
updateSummary(boolean isActive)157     public void updateSummary(boolean isActive) {
158         mSummary = isActive
159                 ? mContext.getString(R.string.bluetooth_active_no_battery_level)
160                 : "";
161     }
162 }
163