126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen/*
226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * Copyright (C) 2013 The Android Open Source Project
326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen *
426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License");
526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * you may not use this file except in compliance with the License.
626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * You may obtain a copy of the License at
726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen *
826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen *      http://www.apache.org/licenses/LICENSE-2.0
926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen *
1026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * Unless required by applicable law or agreed to in writing, software
1126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS,
1226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * See the License for the specific language governing permissions and
1426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen * limitations under the License.
1526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen */
1626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
1726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenpackage com.android.settings.nfc;
1826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
199d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport android.app.Activity;
209d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport android.content.Context;
21cbcc76e8d32f95690d08258a91d58136cd9fb056Martijn Coenenimport android.content.Intent;
224d03c5b48980faba7eff60267696da346f595714Andre Eisenbachimport android.content.pm.PackageManager;
234302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoiimport android.content.res.Resources;
2477d57d07a97b60633d2fe76acc11a845c0850674Jason Monkimport android.nfc.NfcAdapter;
2526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.os.Bundle;
2639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceManager;
2739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen;
280e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.view.Menu;
290e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.view.MenuInflater;
300e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.view.MenuItem;
3126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.view.View;
32da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenenimport android.view.ViewGroup;
339d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
34265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
3526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.settings.R;
364302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoiimport com.android.settings.search.BaseSearchIndexProvider;
374302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoiimport com.android.settings.search.Indexable;
384302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoiimport com.android.settings.search.SearchIndexableRaw;
3926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.settings.SettingsPreferenceFragment;
409d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport com.android.settings.dashboard.SummaryLoader;
419d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport com.android.settings.nfc.PaymentBackend.PaymentAppInfo;
4226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
434302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoiimport java.util.Arrays;
444302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoiimport java.util.ArrayList;
4526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport java.util.List;
4626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
474302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoipublic class PaymentSettings extends SettingsPreferenceFragment implements Indexable {
4826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public static final String TAG = "PaymentSettings";
494d03c5b48980faba7eff60267696da346f595714Andre Eisenbach
504d03c5b48980faba7eff60267696da346f595714Andre Eisenbach    static final String PAYMENT_KEY = "payment";
514d03c5b48980faba7eff60267696da346f595714Andre Eisenbach
5226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    private PaymentBackend mPaymentBackend;
53da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen
5426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    @Override
556507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang    public int getMetricsCategory() {
569d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.NFC_PAYMENT;
578a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
588a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
598a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
6026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public void onCreate(Bundle icicle) {
6126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        super.onCreate(icicle);
6226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
6326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        mPaymentBackend = new PaymentBackend(getActivity());
640e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        setHasOptionsMenu(true);
65fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen
6626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        PreferenceManager manager = getPreferenceManager();
6726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        PreferenceScreen screen = manager.createPreferenceScreen(getActivity());
6800dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen
692fe90293a16352c119acd6014ad0b9583896cd5eJason Monk        List<PaymentBackend.PaymentAppInfo> appInfos = mPaymentBackend.getPaymentAppInfos();
7026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        if (appInfos != null && appInfos.size() > 0) {
71fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen            NfcPaymentPreference preference =
7239b467482d1bf256a111c757e9b7621c6f523271Jason Monk                    new NfcPaymentPreference(getPrefContext(), mPaymentBackend);
734d03c5b48980faba7eff60267696da346f595714Andre Eisenbach            preference.setKey(PAYMENT_KEY);
74fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen            screen.addPreference(preference);
7539b467482d1bf256a111c757e9b7621c6f523271Jason Monk            NfcForegroundPreference foreground = new NfcForegroundPreference(getPrefContext(),
76fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen                    mPaymentBackend);
7700dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            screen.addPreference(foreground);
78da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        }
790e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        setPreferenceScreen(screen);
80da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen    }
81da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen
82da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen    @Override
832fe90293a16352c119acd6014ad0b9583896cd5eJason Monk    public void onViewCreated(View view, Bundle savedInstanceState) {
842fe90293a16352c119acd6014ad0b9583896cd5eJason Monk        super.onViewCreated(view, savedInstanceState);
852fe90293a16352c119acd6014ad0b9583896cd5eJason Monk        ViewGroup contentRoot = (ViewGroup) getListView().getParent();
862fe90293a16352c119acd6014ad0b9583896cd5eJason Monk        View emptyView = getActivity().getLayoutInflater().inflate(
872fe90293a16352c119acd6014ad0b9583896cd5eJason Monk                R.layout.nfc_payment_empty, contentRoot, false);
882fe90293a16352c119acd6014ad0b9583896cd5eJason Monk        contentRoot.addView(emptyView);
892fe90293a16352c119acd6014ad0b9583896cd5eJason Monk        setEmptyView(emptyView);
902fe90293a16352c119acd6014ad0b9583896cd5eJason Monk    }
912fe90293a16352c119acd6014ad0b9583896cd5eJason Monk
922fe90293a16352c119acd6014ad0b9583896cd5eJason Monk    @Override
9326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public void onResume() {
9426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        super.onResume();
95fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen        mPaymentBackend.onResume();
9626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    }
9726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
980e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    @Override
990e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    public void onPause() {
1000e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        super.onPause();
101fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen        mPaymentBackend.onPause();
1020e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    }
1030e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
1040e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    @Override
1050e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1060e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        super.onCreateOptionsMenu(menu, inflater);
107fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen        MenuItem menuItem = menu.add(R.string.nfc_payment_how_it_works);
108cbcc76e8d32f95690d08258a91d58136cd9fb056Martijn Coenen        Intent howItWorksIntent = new Intent(getActivity(), HowItWorks.class);
109cbcc76e8d32f95690d08258a91d58136cd9fb056Martijn Coenen        menuItem.setIntent(howItWorksIntent);
110cbcc76e8d32f95690d08258a91d58136cd9fb056Martijn Coenen        menuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_NEVER);
11126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    }
1129d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
1139d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
1149d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
1159d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        private final Context mContext;
1169d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        private final SummaryLoader mSummaryLoader;
1179d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
1189d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
1199d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            mContext = context;
1209d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            mSummaryLoader = summaryLoader;
1219d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
1229d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
1239d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        @Override
1249d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public void setListening(boolean listening) {
12577d57d07a97b60633d2fe76acc11a845c0850674Jason Monk            if (listening && NfcAdapter.getDefaultAdapter(mContext) != null) {
1269d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                PaymentBackend paymentBackend = new PaymentBackend(mContext);
1279d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                paymentBackend.refresh();
1289d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                PaymentAppInfo app = paymentBackend.getDefaultApp();
12991487434c03591896de97f3c9e281cda336689ccJason Monk                if (app != null) {
13091487434c03591896de97f3c9e281cda336689ccJason Monk                    mSummaryLoader.setSummary(this, mContext.getString(R.string.payment_summary,
13191487434c03591896de97f3c9e281cda336689ccJason Monk                            app.label));
13291487434c03591896de97f3c9e281cda336689ccJason Monk                }
1339d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            }
1349d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
1359d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    }
1369d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk
1379d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
1389d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            = new SummaryLoader.SummaryProviderFactory() {
1399d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        @Override
1409d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
1419d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk                                                                   SummaryLoader summaryLoader) {
1429d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk            return new SummaryProvider(activity, summaryLoader);
1439d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk        }
1449d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk    };
1454302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi
1464302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
1474302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi        new BaseSearchIndexProvider() {
1484302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi            @Override
1494302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi            public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
1504302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
1514302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                final Resources res = context.getResources();
1524302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi
1534302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                // Add fragment title
1544302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                SearchIndexableRaw data = new SearchIndexableRaw(context);
1557e0df1e48c6a6555a791d32073062357ac0007d9Andre Eisenbach                data.key = PAYMENT_KEY;
1564302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                data.title = res.getString(R.string.nfc_payment_settings_title);
1574302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                data.screenTitle = res.getString(R.string.nfc_payment_settings_title);
1584302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                data.keywords = res.getString(R.string.keywords_payment_settings);
1594302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                result.add(data);
1604302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi                return result;
1614302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi            }
1624d03c5b48980faba7eff60267696da346f595714Andre Eisenbach
1634d03c5b48980faba7eff60267696da346f595714Andre Eisenbach            @Override
1644d03c5b48980faba7eff60267696da346f595714Andre Eisenbach            public List<String> getNonIndexableKeys(Context context) {
1654d03c5b48980faba7eff60267696da346f595714Andre Eisenbach                final PackageManager pm = context.getPackageManager();
1664d03c5b48980faba7eff60267696da346f595714Andre Eisenbach                if (pm.hasSystemFeature(PackageManager.FEATURE_NFC)) return null;
1674d03c5b48980faba7eff60267696da346f595714Andre Eisenbach                final List<String> nonVisibleKeys = new ArrayList<String>();
1684d03c5b48980faba7eff60267696da346f595714Andre Eisenbach                nonVisibleKeys.add(PAYMENT_KEY);
1694d03c5b48980faba7eff60267696da346f595714Andre Eisenbach                return nonVisibleKeys;
1704d03c5b48980faba7eff60267696da346f595714Andre Eisenbach            }
1714302dfa853a962c3bb4898c568a62a2834998056Ruchi Kandoi    };
172b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen}
173