| /* |
| * Copyright (C) 2019 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.bluetooth; |
| |
| import android.bluetooth.BluetoothDevice; |
| import android.content.Context; |
| import android.graphics.PorterDuff; |
| import android.graphics.PorterDuffColorFilter; |
| import android.graphics.drawable.Drawable; |
| import android.widget.ImageView; |
| import android.widget.LinearLayout; |
| import android.widget.TextView; |
| |
| import androidx.annotation.VisibleForTesting; |
| import androidx.core.graphics.drawable.IconCompat; |
| import androidx.preference.PreferenceScreen; |
| |
| import com.android.settings.R; |
| import com.android.settings.core.BasePreferenceController; |
| import com.android.settings.fuelgauge.BatteryMeterView; |
| import com.android.settingslib.bluetooth.CachedBluetoothDevice; |
| import com.android.settingslib.widget.LayoutPreference; |
| |
| /** |
| * This class adds a header with device name and status (connected/disconnected, etc.). |
| */ |
| public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceController { |
| |
| @VisibleForTesting |
| LayoutPreference mLayoutPreference; |
| private CachedBluetoothDevice mCachedDevice; |
| |
| public AdvancedBluetoothDetailsHeaderController(Context context, String prefKey) { |
| super(context, prefKey); |
| } |
| |
| @Override |
| public int getAvailabilityStatus() { |
| final boolean unthetheredHeadset = Utils.getBooleanMetaData(mCachedDevice.getDevice(), |
| BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET); |
| return unthetheredHeadset ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; |
| } |
| |
| @Override |
| public void displayPreference(PreferenceScreen screen) { |
| super.displayPreference(screen); |
| mLayoutPreference = screen.findPreference(getPreferenceKey()); |
| mLayoutPreference.setVisible(isAvailable()); |
| refresh(); |
| } |
| |
| public void init(CachedBluetoothDevice cachedBluetoothDevice) { |
| mCachedDevice = cachedBluetoothDevice; |
| } |
| |
| @VisibleForTesting |
| void refresh() { |
| if (mLayoutPreference != null && mCachedDevice != null) { |
| final TextView title = mLayoutPreference.findViewById(R.id.entity_header_title); |
| title.setText(mCachedDevice.getName()); |
| final TextView summary = mLayoutPreference.findViewById(R.id.entity_header_summary); |
| summary.setText(mCachedDevice.getConnectionSummary()); |
| |
| updateSubLayout(mLayoutPreference.findViewById(R.id.layout_left), |
| BluetoothDevice.METADATA_UNTHETHERED_LEFT_ICON, |
| BluetoothDevice.METADATA_UNTHETHERED_LEFT_BATTERY, |
| R.string.bluetooth_left_name); |
| |
| updateSubLayout(mLayoutPreference.findViewById(R.id.layout_middle), |
| BluetoothDevice.METADATA_UNTHETHERED_CASE_ICON, |
| BluetoothDevice.METADATA_UNTHETHERED_CASE_BATTERY, |
| R.string.bluetooth_middle_name); |
| |
| updateSubLayout(mLayoutPreference.findViewById(R.id.layout_right), |
| BluetoothDevice.METADATA_UNTHETHERED_RIGHT_ICON, |
| BluetoothDevice.METADATA_UNTHETHERED_RIGHT_BATTERY, |
| R.string.bluetooth_right_name); |
| } |
| } |
| |
| @VisibleForTesting |
| Drawable createBtBatteryIcon(Context context, int level) { |
| final BatteryMeterView.BatteryMeterDrawable drawable = |
| new BatteryMeterView.BatteryMeterDrawable(context, |
| context.getColor(R.color.meter_background_color)); |
| drawable.setBatteryLevel(level); |
| drawable.setShowPercent(false); |
| drawable.setBatteryColorFilter(new PorterDuffColorFilter( |
| com.android.settings.Utils.getColorAttrDefaultColor(context, |
| android.R.attr.colorControlNormal), |
| PorterDuff.Mode.SRC_IN)); |
| |
| return drawable; |
| } |
| |
| private void updateSubLayout(LinearLayout linearLayout, int iconMetaKey, int batteryMetaKey, |
| int titleResId) { |
| if (linearLayout == null) { |
| return; |
| } |
| final BluetoothDevice bluetoothDevice = mCachedDevice.getDevice(); |
| final String iconUri = Utils.getStringMetaData(bluetoothDevice, iconMetaKey); |
| if (iconUri != null) { |
| final ImageView imageView = linearLayout.findViewById(R.id.header_icon); |
| final IconCompat iconCompat = IconCompat.createWithContentUri(iconUri); |
| imageView.setImageBitmap(iconCompat.getBitmap()); |
| } |
| |
| final int batteryLevel = Utils.getIntMetaData(bluetoothDevice, batteryMetaKey); |
| if (batteryLevel != Utils.META_INT_ERROR) { |
| final ImageView imageView = linearLayout.findViewById(R.id.bt_battery_icon); |
| imageView.setImageDrawable(createBtBatteryIcon(mContext, batteryLevel)); |
| final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary); |
| textView.setText(com.android.settings.Utils.formatPercentage(batteryLevel)); |
| } |
| |
| final TextView textView = linearLayout.findViewById(R.id.header_title); |
| textView.setText(titleResId); |
| } |
| } |