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