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