Add layout for advanced BT detail header
If device supports metadata, then we display advanced UI in Bluetooth details header. This CL adds layout for this header. In advanced layout, it will show: 1. Device name 2. Left, right and case icon 3. Left, right and case battery level Once API is ready, following CL will get metadata from it and set it to UI. Bug: 122460277 Test: RunSettingsRoboTests Change-Id: Ide044cf9705f350b431b2cb3a9ad82cc4425a17e
This commit is contained in:
68
res/layout/advanced_bt_entity_header.xml
Normal file
68
res/layout/advanced_bt_entity_header.xml
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/entity_header"
|
||||
style="@style/EntityHeader"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/entity_header_title"
|
||||
style="@style/TextAppearance.EntityHeaderTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:singleLine="false"
|
||||
android:ellipsize="marquee"
|
||||
android:textDirection="locale"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/entity_header_summary"
|
||||
style="@style/TextAppearance.EntityHeaderSummary"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="2dp"
|
||||
android:singleLine="false"
|
||||
android:ellipsize="marquee"
|
||||
android:textDirection="locale"
|
||||
android:text="test_summary"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<include
|
||||
android:id="@+id/layout_left"
|
||||
layout="@layout/advanced_bt_entity_sub"/>
|
||||
|
||||
<include
|
||||
android:id="@+id/layout_middle"
|
||||
layout="@layout/advanced_bt_entity_sub"/>
|
||||
|
||||
<include
|
||||
android:id="@+id/layout_right"
|
||||
layout="@layout/advanced_bt_entity_sub"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
63
res/layout/advanced_bt_entity_sub.xml
Normal file
63
res/layout/advanced_bt_entity_sub.xml
Normal file
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/header_icon"
|
||||
android:layout_width="72dp"
|
||||
android:layout_height="72dp"
|
||||
android:scaleType="fitCenter"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:antialias="true"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/header_title"
|
||||
style="@style/TextAppearance.EntityHeaderTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:singleLine="false"
|
||||
android:ellipsize="marquee"
|
||||
android:textDirection="locale"
|
||||
android:layout_marginTop="24dp"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:orientation="horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/bt_battery_icon"
|
||||
android:layout_width="13dp"
|
||||
android:layout_height="20dp"/>
|
||||
<TextView
|
||||
android:id="@+id/bt_battery_summary"
|
||||
style="@style/TextAppearance.EntityHeaderSummary"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="4dp"
|
||||
android:layout_gravity="center_horizontal"/>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
@@ -10496,6 +10496,13 @@
|
||||
<!-- Title for no bluetooth devices in Bluetooth devices slice. [CHAR LIMIT=NONE] -->
|
||||
<string name="no_bluetooth_devices">No Bluetooth devices</string>
|
||||
|
||||
<!-- Title for left bluetooth device. [CHAR LIMIT=NONE] -->
|
||||
<string name="bluetooth_left_name">Left</string>
|
||||
<!-- Title for right bluetooth device. [CHAR LIMIT=NONE] -->
|
||||
<string name="bluetooth_right_name">Right</string>
|
||||
<!-- Title for middle bluetooth device. [CHAR LIMIT=NONE] -->
|
||||
<string name="bluetooth_middle_name">Case</string>
|
||||
|
||||
<!-- Default title for the settings panel [CHAR LIMIT=NONE] -->
|
||||
<string name="settings_panel_title">Settings Panel</string>
|
||||
|
||||
|
@@ -23,7 +23,16 @@
|
||||
android:key="bluetooth_device_header"
|
||||
android:layout="@layout/settings_entity_header"
|
||||
android:selectable="false"
|
||||
settings:allowDividerBelow="true"/>
|
||||
settings:allowDividerBelow="true"
|
||||
settings:searchable="false"/>
|
||||
|
||||
<com.android.settingslib.widget.LayoutPreference
|
||||
android:key="advanced_bluetooth_device_header"
|
||||
android:layout="@layout/advanced_bt_entity_header"
|
||||
android:selectable="false"
|
||||
settings:allowDividerBelow="true"
|
||||
settings:searchable="false"
|
||||
settings:controller="com.android.settings.bluetooth.AdvancedBluetoothDetailsHeaderController"/>
|
||||
|
||||
<com.android.settingslib.widget.ActionButtonsPreference
|
||||
android:key="action_buttons"
|
||||
|
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* 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.content.Context;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
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 {
|
||||
|
||||
private LayoutPreference mLayoutPreference;
|
||||
private CachedBluetoothDevice mCachedDevice;
|
||||
|
||||
public AdvancedBluetoothDetailsHeaderController(Context context, String prefKey) {
|
||||
super(context, prefKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
//TODO(b/122460277): decide whether it is available by {@code bluetoothDevice}
|
||||
return 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;
|
||||
}
|
||||
|
||||
private 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());
|
||||
}
|
||||
}
|
||||
|
||||
@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(
|
||||
Utils.getColorAttrDefaultColor(context, android.R.attr.colorControlNormal),
|
||||
PorterDuff.Mode.SRC_IN));
|
||||
|
||||
return drawable;
|
||||
}
|
||||
|
||||
}
|
@@ -90,4 +90,4 @@ public class BluetoothDetailsButtonsController extends BluetoothDetailsControlle
|
||||
return KEY_ACTION_BUTTONS;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -89,4 +89,4 @@ public abstract class BluetoothDetailsController extends AbstractPreferenceContr
|
||||
* should update the preferences it manages based on the new state.
|
||||
*/
|
||||
protected abstract void refresh();
|
||||
}
|
||||
}
|
@@ -62,7 +62,8 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
|
||||
protected void setHeaderProperties() {
|
||||
final Pair<Drawable, String> pair = BluetoothUtils
|
||||
.getBtClassDrawableWithDescription(mContext, mCachedDevice,
|
||||
mContext.getResources().getFraction(R.fraction.bt_battery_scale_fraction, 1, 1));
|
||||
mContext.getResources().getFraction(R.fraction.bt_battery_scale_fraction, 1,
|
||||
1));
|
||||
String summaryText = mCachedDevice.getConnectionSummary();
|
||||
// If both the hearing aids are connected, two device status should be shown.
|
||||
// If Second Summary is unavailable, to set it to null.
|
||||
@@ -84,4 +85,4 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
|
||||
public String getPreferenceKey() {
|
||||
return KEY_DEVICE_HEADER;
|
||||
}
|
||||
}
|
||||
}
|
@@ -62,4 +62,4 @@ public class BluetoothDetailsMacAddressController extends BluetoothDetailsContro
|
||||
}
|
||||
return mFooterPreference.getKey();
|
||||
}
|
||||
}
|
||||
}
|
@@ -264,4 +264,4 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
|
||||
public String getPreferenceKey() {
|
||||
return KEY_PROFILES_GROUP;
|
||||
}
|
||||
}
|
||||
}
|
@@ -108,6 +108,7 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment
|
||||
mManager = getLocalBluetoothManager(context);
|
||||
mCachedDevice = getCachedDevice(mDeviceAddress);
|
||||
super.onAttach(context);
|
||||
use(AdvancedBluetoothDetailsHeaderController.class).init(mCachedDevice);
|
||||
|
||||
final BluetoothFeatureProvider featureProvider = FeatureFactory.getFactory(
|
||||
context).getBluetoothFeatureProvider(context);
|
||||
|
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* 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 static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
|
||||
import com.android.settings.fuelgauge.BatteryMeterView;
|
||||
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = ShadowEntityHeaderController.class)
|
||||
public class AdvancedBluetoothDetailsHeaderControllerTest{
|
||||
private static final int BATTERY_LEVEL = 30;
|
||||
|
||||
private Context mContext;
|
||||
private AdvancedBluetoothDetailsHeaderController mController;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
|
||||
mController = new AdvancedBluetoothDetailsHeaderController(mContext, "pref_Key");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createBatteryIcon_hasCorrectInfo() {
|
||||
final Drawable drawable = mController.createBtBatteryIcon(mContext, BATTERY_LEVEL);
|
||||
assertThat(drawable).isInstanceOf(BatteryMeterView.BatteryMeterDrawable.class);
|
||||
|
||||
final BatteryMeterView.BatteryMeterDrawable iconDrawable =
|
||||
(BatteryMeterView.BatteryMeterDrawable) drawable;
|
||||
assertThat(iconDrawable.getBatteryLevel()).isEqualTo(BATTERY_LEVEL);
|
||||
}
|
||||
|
||||
}
|
@@ -50,7 +50,6 @@ import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
|
||||
@Config(shadows = ShadowEntityHeaderController.class)
|
||||
public class BluetoothDetailsHeaderControllerTest extends BluetoothDetailsControllerTestBase {
|
||||
|
||||
|
Reference in New Issue
Block a user