1f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila/* 2f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * Copyright (c) 2016, The Android Open Source Project 3f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * Contributed by the Paranoid Android Project 4f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * 5f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * Licensed under the Apache License, Version 2.0 (the "License"); 6f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * you may not use this file except in compliance with the License. 7f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * You may obtain a copy of the License at 8f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * 9f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * http://www.apache.org/licenses/LICENSE-2.0 10f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * 11f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * Unless required by applicable law or agreed to in writing, software 12f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * distributed under the License is distributed on an "AS IS" BASIS, 13f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * See the License for the specific language governing permissions and 15f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila * limitations under the License. 16f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila */ 17f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 18f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilapackage com.android.systemui.qs.tiles; 19f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 20f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.content.BroadcastReceiver; 21f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.content.Context; 22f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.content.Intent; 23f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.content.IntentFilter; 24f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.content.pm.PackageManager; 25f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.graphics.drawable.Drawable; 26f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.nfc.NfcAdapter; 27f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.provider.Settings; 28f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport android.widget.Switch; 29f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 30f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport com.android.internal.logging.MetricsLogger; 3197705ce11664e9bbe6ab1c2eca8aa7cf01bcc84cJason Monkimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 32f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbilaimport com.android.systemui.R; 33702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkimport com.android.systemui.qs.QSHost; 34702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkimport com.android.systemui.plugins.qs.QSTile.BooleanState; 35702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkimport com.android.systemui.qs.tileimpl.QSTileImpl; 36f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 37f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila/** Quick settings tile: Enable/Disable NFC **/ 38702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monkpublic class NfcTile extends QSTileImpl<BooleanState> { 39f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 40f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila private NfcAdapter mAdapter; 41f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 42f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila private boolean mListening; 43f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 44702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk public NfcTile(QSHost host) { 45f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila super(host); 46f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 47f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 48f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 49f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila public BooleanState newTileState() { 50f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila return new BooleanState(); 51f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 52f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 53f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 541c6116cbbb0c8000b576443e4b13026b1d8529d9Jason Monk public void handleSetListening(boolean listening) { 55f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila mListening = listening; 56f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila if (mListening) { 57f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila mContext.registerReceiver(mNfcReceiver, 58f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)); 59f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } else { 60f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila mContext.unregisterReceiver(mNfcReceiver); 61f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 62f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 63f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 64f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 65f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila public boolean isAvailable() { 66f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC); 67f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 68f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 69f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 70f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila protected void handleUserSwitch(int newUserId) { 71f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 72f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 73f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 74f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila public Intent getLongClickIntent() { 75f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila return new Intent(Settings.ACTION_NFC_SETTINGS); 76f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 77f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 78f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 79f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila protected void handleClick() { 808f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila if (!getAdapter().isEnabled()) { 818f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila getAdapter().enable(); 82f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } else { 838f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila getAdapter().disable(); 84f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 85f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 86f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 87f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 88f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila protected void handleSecondaryClick() { 89f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila handleClick(); 90f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 91f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 92f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 93f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila public CharSequence getTileLabel() { 94f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila return mContext.getString(R.string.quick_settings_nfc_label); 95f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 96f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 97f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 98f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila protected void handleUpdateState(BooleanState state, Object arg) { 99f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila final Drawable mEnable = mContext.getDrawable(R.drawable.ic_qs_nfc_enabled); 100f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila final Drawable mDisable = mContext.getDrawable(R.drawable.ic_qs_nfc_disabled); 10153159324bb0140c923b82bbff690d1654341e245Bruno Martins 10253159324bb0140c923b82bbff690d1654341e245Bruno Martins if (getAdapter() == null) return; 1038f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila state.value = getAdapter().isEnabled(); 104f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila state.label = mContext.getString(R.string.quick_settings_nfc_label); 105f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila state.icon = new DrawableIcon(state.value ? mEnable : mDisable); 106702e2ebf9fbfb715c1d9b716683c9e4d182b575eJason Monk state.expandedAccessibilityClassName = Switch.class.getName(); 107f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila state.contentDescription = state.label; 108f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 109f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 110f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 111f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila public int getMetricsCategory() { 112f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila return MetricsEvent.QS_NFC; 113f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 114f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 115f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 116f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila protected String composeChangeAnnouncement() { 117f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila if (mState.value) { 118f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila return mContext.getString(R.string.quick_settings_nfc_on); 119f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } else { 120f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila return mContext.getString(R.string.quick_settings_nfc_off); 121f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 122f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 123f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila 1248f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila private NfcAdapter getAdapter() { 1258f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila if (mAdapter == null) { 1268f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila try { 1278f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila mAdapter = NfcAdapter.getNfcAdapter(mContext); 1288f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila } catch (UnsupportedOperationException e) { 1298f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila mAdapter = null; 1308f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila } 1318f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila } 1328f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila return mAdapter; 1338f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila } 1348f7c40c83430edd3b72aafaf6f71b2f084fe7f27Anas Karbila 135f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila private BroadcastReceiver mNfcReceiver = new BroadcastReceiver() { 136f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila @Override 137f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila public void onReceive(Context context, Intent intent) { 138f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila refreshState(); 139f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila } 140f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila }; 141f7648f44838cbc2c002191dd69ae3386dc78beeeAnas Karbila} 142