summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
diff options
context:
space:
mode:
authorjackqdyulei <jackqdyulei@google.com>2017-04-25 13:32:02 -0700
committerjackqdyulei <jackqdyulei@google.com>2017-05-11 11:12:25 -0700
commitae86781edd7dc508f6cc2a9470b97fb4e3ee1398 (patch)
tree7fc56567aa22fd40badfa26cee9bd7f1cb2ffebf /src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
parent41aa446c7f761d2bfbc09a1ae9654020cd1dcf92 (diff)
downloadpackages_apps_Settings-ae86781edd7dc508f6cc2a9470b97fb4e3ee1398.tar.gz
packages_apps_Settings-ae86781edd7dc508f6cc2a9470b97fb4e3ee1398.tar.bz2
packages_apps_Settings-ae86781edd7dc508f6cc2a9470b97fb4e3ee1398.zip
Add bluetooth visible item
Show "Visible as [Device name]". Also remove the menuitem for changing device name. This cl creates a preference controller to handle the logic for device name preference. Bug: 35876447 Test: RunSettingsRoboTests Change-Id: I9ab6c9d2df5b053d15b8ff887073ef82616243a4
Diffstat (limited to 'src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java')
-rw-r--r--src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java b/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
new file mode 100644
index 0000000000..ba05c3a0fe
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2017 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.app.Fragment;
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.style.ForegroundColorSpan;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.core.lifecycle.LifecycleObserver;
+import com.android.settings.core.lifecycle.events.OnResume;
+import com.android.settings.core.lifecycle.events.OnStart;
+import com.android.settings.core.lifecycle.events.OnStop;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/**
+ * Controller that shows and updates the bluetooth device name
+ */
+public class BluetoothDeviceNamePreferenceController extends PreferenceController implements
+ LifecycleObserver, OnStart, OnStop {
+ private static final String TAG = "BluetoothNamePrefCtrl";
+
+ public static final String KEY_DEVICE_NAME = "device_name";
+ private int mAccentColor;
+ private Fragment mFragment;
+ private LocalBluetoothManager mLocalManager;
+ private LocalBluetoothAdapter mLocalAdapter;
+ private Preference mPreference;
+
+ public BluetoothDeviceNamePreferenceController(Context context, Fragment fragment,
+ Lifecycle lifecycle) {
+ this(context, fragment, (LocalBluetoothAdapter) null);
+
+ mLocalManager = Utils.getLocalBtManager(context);
+ if (mLocalManager == null) {
+ Log.e(TAG, "Bluetooth is not supported on this device");
+ return;
+ }
+ mLocalAdapter = mLocalManager.getBluetoothAdapter();
+ lifecycle.addObserver(this);
+ }
+
+ @VisibleForTesting
+ BluetoothDeviceNamePreferenceController(Context context, Fragment fragment,
+ LocalBluetoothAdapter localAdapter) {
+ super(context);
+ mAccentColor = com.android.settingslib.Utils.getColorAccent(context);
+ mFragment = fragment;
+ mLocalAdapter = localAdapter;
+ }
+
+ @Override
+ public void onStart() {
+ mContext.registerReceiver(mReceiver,
+ new IntentFilter(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED));
+ }
+
+ @Override
+ public void onStop() {
+ mContext.unregisterReceiver(mReceiver);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mLocalAdapter != null;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_DEVICE_NAME;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ updateDeviceName(preference, mLocalAdapter.getName());
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (KEY_DEVICE_NAME.equals(preference.getKey())) {
+ new BluetoothNameDialogFragment().show(mFragment.getFragmentManager(), "rename device");
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Create preference to show bluetooth device name
+ *
+ * @param screen to add the preference in
+ * @param order to decide position of the preference
+ * @return bluetooth preference that created in this method
+ */
+ public Preference createBluetoothDeviceNamePreference(PreferenceScreen screen, int order) {
+ mPreference = new Preference(screen.getContext());
+ mPreference.setOrder(order);
+ mPreference.setKey(KEY_DEVICE_NAME);
+ screen.addPreference(mPreference);
+
+ return mPreference;
+ }
+
+ /**
+ * Update device summary with {@code deviceName}, where {@code deviceName} has accent color
+ *
+ * @param preference to set the summary for
+ * @param deviceName bluetooth device name to show in the summary
+ */
+ public void updateDeviceName(final Preference preference, final String deviceName) {
+ if (deviceName == null) {
+ // TODO: show error message in preference subtitle
+ return;
+ }
+ final Spannable spannableName = new SpannableString(deviceName);
+ spannableName.setSpan(new ForegroundColorSpan(mAccentColor), 0,
+ spannableName.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ final CharSequence summary = TextUtils.expandTemplate(
+ mContext.getText(R.string.bluetooth_device_name_summary), spannableName);
+
+ preference.setSummary(summary);
+ }
+
+ /**
+ * Receiver that listens to {@link BluetoothAdapter#ACTION_LOCAL_NAME_CHANGED} and updates the
+ * device name if possible
+ */
+ @VisibleForTesting
+ final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+
+ if (TextUtils.equals(action, BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED)) {
+ if (mPreference != null && mLocalAdapter != null && mLocalAdapter.isEnabled()) {
+ updateDeviceName(mPreference, mLocalAdapter.getName());
+ }
+ }
+ }
+ };
+}