From f7648f44838cbc2c002191dd69ae3386dc78beee Mon Sep 17 00:00:00 2001 From: Anas Karbila Date: Sun, 11 Dec 2016 00:55:02 +0100 Subject: [PATCH] SystemUI: Add NFC tile This patch adds a tile for QuickSettings which controls the setting of NFC. The drawable is from material.io. Test: Enable and disable NFC using tile Change-Id: I7dfaf3a4dca0c01d24be397e43ab131eb9885f62 Signed-off-by: Anas Karbila Signed-off-by: Alex Naidis --- .../res/drawable/ic_qs_nfc_disabled.xml | 31 ++++ .../res/drawable/ic_qs_nfc_enabled.xml | 31 ++++ packages/SystemUI/res/values/strings.xml | 6 + .../android/systemui/qs/tiles/NfcTile.java | 136 ++++++++++++++++++ .../systemui/statusbar/phone/QSTileHost.java | 2 + proto/src/metrics_constants.proto | 5 + 6 files changed, 211 insertions(+) create mode 100644 packages/SystemUI/res/drawable/ic_qs_nfc_disabled.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_nfc_enabled.xml create mode 100644 packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java diff --git a/packages/SystemUI/res/drawable/ic_qs_nfc_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_nfc_disabled.xml new file mode 100644 index 0000000000000..558f3d083f429 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_nfc_disabled.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_qs_nfc_enabled.xml b/packages/SystemUI/res/drawable/ic_qs_nfc_enabled.xml new file mode 100644 index 0000000000000..becb18ad8ba22 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_nfc_enabled.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 2ea475a1166b2..b8e634ac3f40d 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -761,6 +761,12 @@ Night Light on, tap to turn off Night Light off, tap to turn on + + NFC + + NFC is disabled + + NFC is enabled No recent items diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java new file mode 100644 index 0000000000000..9904c6ee438ed --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2016, The Android Open Source Project + * Contributed by the Paranoid Android 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.systemui.qs.tiles; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.nfc.NfcAdapter; +import android.provider.Settings; +import android.widget.Switch; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; +import com.android.systemui.R; +import com.android.systemui.qs.QSTile; + +/** Quick settings tile: Enable/Disable NFC **/ +public class NfcTile extends QSTile { + + private NfcAdapter mAdapter; + + private boolean mListening; + + public NfcTile(Host host) { + super(host); + } + + @Override + public BooleanState newTileState() { + return new BooleanState(); + } + + @Override + public void setListening(boolean listening) { + mListening = listening; + if (mListening) { + mContext.registerReceiver(mNfcReceiver, + new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)); + if (mAdapter == null) { + try { + mAdapter = NfcAdapter.getNfcAdapter(mContext); + } catch (UnsupportedOperationException e) { + mAdapter = null; + } + } + } else { + mContext.unregisterReceiver(mNfcReceiver); + } + } + + @Override + public boolean isAvailable() { + return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC); + } + + @Override + protected void handleUserSwitch(int newUserId) { + } + + @Override + public Intent getLongClickIntent() { + return new Intent(Settings.ACTION_NFC_SETTINGS); + } + + @Override + protected void handleClick() { + if (mAdapter == null) return; + MetricsLogger.action(mContext, getMetricsCategory(), !mState.value); + if (!mAdapter.isEnabled()) { + mAdapter.enable(); + } else { + mAdapter.disable(); + } + } + + @Override + protected void handleSecondaryClick() { + handleClick(); + } + + @Override + public CharSequence getTileLabel() { + return mContext.getString(R.string.quick_settings_nfc_label); + } + + @Override + protected void handleUpdateState(BooleanState state, Object arg) { + final Drawable mEnable = mContext.getDrawable(R.drawable.ic_qs_nfc_enabled); + final Drawable mDisable = mContext.getDrawable(R.drawable.ic_qs_nfc_disabled); + state.value = mAdapter == null ? false : mAdapter.isEnabled(); + state.label = mContext.getString(R.string.quick_settings_nfc_label); + state.icon = new DrawableIcon(state.value ? mEnable : mDisable); + state.minimalAccessibilityClassName = state.expandedAccessibilityClassName + = Switch.class.getName(); + state.contentDescription = state.label; + } + + @Override + public int getMetricsCategory() { + return MetricsEvent.QS_NFC; + } + + @Override + protected String composeChangeAnnouncement() { + if (mState.value) { + return mContext.getString(R.string.quick_settings_nfc_on); + } else { + return mContext.getString(R.string.quick_settings_nfc_off); + } + } + + private BroadcastReceiver mNfcReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + refreshState(); + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index 51992c828f061..9a39ed51a6ea1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -52,6 +52,7 @@ import com.android.systemui.qs.tiles.FlashlightTile; import com.android.systemui.qs.tiles.HotspotTile; import com.android.systemui.qs.tiles.IntentTile; import com.android.systemui.qs.tiles.LocationTile; +import com.android.systemui.qs.tiles.NfcTile; import com.android.systemui.qs.tiles.NightDisplayTile; import com.android.systemui.qs.tiles.RotationLockTile; import com.android.systemui.qs.tiles.UserTile; @@ -441,6 +442,7 @@ public class QSTileHost implements QSTile.Host, Tunable { else if (tileSpec.equals("battery")) return new BatteryTile(this); else if (tileSpec.equals("saver")) return new DataSaverTile(this); else if (tileSpec.equals("night")) return new NightDisplayTile(this); + else if (tileSpec.equals("nfc")) return new NfcTile(this); // Intent tiles. else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec); else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(this,tileSpec); diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 8a0dfe51189fd..735afce21cdb7 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -2213,6 +2213,11 @@ message MetricsEvent { // ---- End N-MR1 Constants, all N-MR1 constants go above this line ---- + // OPEN: QS NFC tile shown + // ACTION: QS NFC tile tapped + // CATEGORY: QUICK_SETTINGS + QS_NFC = 497; + // Add new aosp constants above this line. // END OF AOSP CONSTANTS }