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