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
1926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.content.Context;
200e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.content.Intent;
210e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.net.Uri;
2226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.os.Bundle;
230e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.os.Handler;
240e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.os.Message;
2500dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenenimport android.preference.CheckBoxPreference;
2626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.preference.Preference;
2700dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenenimport android.preference.Preference.OnPreferenceChangeListener;
2826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.preference.PreferenceManager;
2926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.preference.PreferenceScreen;
305c3052936883038d25b2afe52c2dd023e9aa6812Svetoslavimport android.provider.Settings;
31b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenenimport android.text.TextUtils;
32da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenenimport android.util.Log;
33da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenenimport android.view.LayoutInflater;
340e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.view.Menu;
350e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.view.MenuInflater;
360e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport android.view.MenuItem;
3726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.view.View;
3826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.view.View.OnClickListener;
39da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenenimport android.view.ViewGroup;
40da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenenimport android.widget.ImageView;
4126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.widget.RadioButton;
42da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenenimport android.widget.TextView;
4326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
440e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenenimport com.android.internal.content.PackageMonitor;
45b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenenimport com.android.settings.HelpUtils;
4626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.settings.R;
4726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.settings.SettingsPreferenceFragment;
4826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.settings.nfc.PaymentBackend.PaymentAppInfo;
4926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
5026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport java.util.List;
5126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
5226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenpublic class PaymentSettings extends SettingsPreferenceFragment implements
5300dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen        OnClickListener, OnPreferenceChangeListener {
5426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public static final String TAG = "PaymentSettings";
55da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen    private LayoutInflater mInflater;
5626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    private PaymentBackend mPaymentBackend;
570e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    private final PackageMonitor mSettingsPackageMonitor = new SettingsPackageMonitor();
580e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
59da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen
6026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    @Override
6126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public void onCreate(Bundle icicle) {
6226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        super.onCreate(icicle);
6326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
6426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        mPaymentBackend = new PaymentBackend(getActivity());
65da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
660e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        setHasOptionsMenu(true);
6726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    }
6826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
6926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public void refresh() {
7026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        PreferenceManager manager = getPreferenceManager();
7126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        PreferenceScreen screen = manager.createPreferenceScreen(getActivity());
7200dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen
7326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        // Get all payment services
7426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        List<PaymentAppInfo> appInfos = mPaymentBackend.getPaymentAppInfos();
7526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        if (appInfos != null && appInfos.size() > 0) {
7626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            // Add all payment apps
7726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            for (PaymentAppInfo appInfo : appInfos) {
7826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen                PaymentAppPreference preference =
7926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen                        new PaymentAppPreference(getActivity(), appInfo, this);
8026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen                preference.setTitle(appInfo.caption);
81da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen                if (appInfo.banner != null) {
82da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen                    screen.addPreference(preference);
83da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen                } else {
84da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen                    // Ignore, no banner
85da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen                    Log.e(TAG, "Couldn't load banner drawable of service " + appInfo.componentName);
86da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen                }
8726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            }
8826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        }
89da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        TextView emptyText = (TextView) getView().findViewById(R.id.nfc_payment_empty_text);
90b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen        TextView learnMore = (TextView) getView().findViewById(R.id.nfc_payment_learn_more);
91da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        ImageView emptyImage = (ImageView) getView().findViewById(R.id.nfc_payment_tap_image);
92da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        if (screen.getPreferenceCount() == 0) {
93da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen            emptyText.setVisibility(View.VISIBLE);
94b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen            learnMore.setVisibility(View.VISIBLE);
95da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen            emptyImage.setVisibility(View.VISIBLE);
96b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen            getListView().setVisibility(View.GONE);
97da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        } else {
9800dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            CheckBoxPreference foreground = new CheckBoxPreference(getActivity());
9900dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            boolean foregroundMode = mPaymentBackend.isForegroundMode();
10000dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            foreground.setPersistent(false);
10100dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            foreground.setTitle(getString(R.string.nfc_payment_favor_foreground));
10200dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            foreground.setChecked(foregroundMode);
10300dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            foreground.setOnPreferenceChangeListener(this);
10400dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            screen.addPreference(foreground);
105da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen            emptyText.setVisibility(View.GONE);
106b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen            learnMore.setVisibility(View.GONE);
107da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen            emptyImage.setVisibility(View.GONE);
108b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen            getListView().setVisibility(View.VISIBLE);
109da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        }
1100e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        setPreferenceScreen(screen);
111da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen    }
112da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen
113da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen    @Override
114da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen    public View onCreateView(LayoutInflater inflater, ViewGroup container,
115da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen            Bundle savedInstanceState) {
116da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        super.onCreateView(inflater, container, savedInstanceState);
117da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        View v = mInflater.inflate(R.layout.nfc_payment, container, false);
118b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen        TextView learnMore = (TextView) v.findViewById(R.id.nfc_payment_learn_more);
119b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen        learnMore.setOnClickListener(new OnClickListener() {
120b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen            @Override
121b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen            public void onClick(View v) {
122b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                String helpUrl;
123b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                if (!TextUtils.isEmpty(helpUrl = getResources().getString(
124b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                        R.string.help_url_nfc_payment))) {
125b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                    final Uri fullUri = HelpUtils.uriWithAddedParameters(
126b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                            PaymentSettings.this.getActivity(), Uri.parse(helpUrl));
127b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                    Intent intent = new Intent(Intent.ACTION_VIEW, fullUri);
128b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
129b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                            | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
130b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                    startActivity(intent);
131b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                } else {
132b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                    Log.e(TAG, "Help url not set.");
133b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen                }
134b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen            }
135b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen        });
136da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen        return v;
13726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    }
13826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
13926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    @Override
14026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public void onClick(View v) {
14126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        if (v.getTag() instanceof PaymentAppInfo) {
14226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            PaymentAppInfo appInfo = (PaymentAppInfo) v.getTag();
14326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            if (appInfo.componentName != null) {
14426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen                mPaymentBackend.setDefaultPaymentApp(appInfo.componentName);
14526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            }
14626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            refresh();
14726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        }
14826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    }
14926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
15026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    @Override
15126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public void onResume() {
15226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        super.onResume();
1530e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
15426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        refresh();
15526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    }
15626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
1570e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    @Override
1580e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    public void onPause() {
1590e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        mSettingsPackageMonitor.unregister();
1600e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        super.onPause();
1610e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    }
1620e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
1630e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    @Override
1640e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
1650e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        super.onCreateOptionsMenu(menu, inflater);
1665c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav        String searchUri = Settings.Secure.getString(getContentResolver(),
1675c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav                Settings.Secure.PAYMENT_SERVICE_SEARCH_URI);
1685c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav        if (!TextUtils.isEmpty(searchUri)) {
1695c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav            MenuItem menuItem = menu.add(R.string.nfc_payment_menu_item_add_service);
1705c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav            menuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
1715c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav            menuItem.setIntent(new Intent(Intent.ACTION_VIEW,Uri.parse(searchUri)));
1725c3052936883038d25b2afe52c2dd023e9aa6812Svetoslav        }
1730e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    }
1740e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
1750e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    private final Handler mHandler = new Handler() {
1760e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        @Override
1770e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        public void dispatchMessage(Message msg) {
1780e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen            refresh();
1790e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        }
1800e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    };
1810e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
1820e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    private class SettingsPackageMonitor extends PackageMonitor {
1830e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        @Override
1840e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        public void onPackageAdded(String packageName, int uid) {
1850e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen           mHandler.obtainMessage().sendToTarget();
1860e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        }
1870e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
1880e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        @Override
1890e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        public void onPackageAppeared(String packageName, int reason) {
1900e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen            mHandler.obtainMessage().sendToTarget();
1910e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        }
1920e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
1930e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        @Override
1940e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        public void onPackageDisappeared(String packageName, int reason) {
1950e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen            mHandler.obtainMessage().sendToTarget();
1960e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        }
1970e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
1980e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        @Override
1990e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        public void onPackageRemoved(String packageName, int uid) {
2000e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen            mHandler.obtainMessage().sendToTarget();
2010e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen        }
2020e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen    }
2030e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen
20426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    public static class PaymentAppPreference extends Preference {
20526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        private final OnClickListener listener;
20626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        private final PaymentAppInfo appInfo;
20726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
20826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        public PaymentAppPreference(Context context, PaymentAppInfo appInfo,
20926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen                OnClickListener listener) {
21026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            super(context);
21126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            setLayoutResource(R.layout.nfc_payment_option);
21226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            this.appInfo = appInfo;
21326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            this.listener = listener;
21426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        }
21526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
21626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        @Override
21726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        protected void onBindView(View view) {
21826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            super.onBindView(view);
21926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen
22026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            RadioButton radioButton = (RadioButton) view.findViewById(android.R.id.button1);
22126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen            radioButton.setChecked(appInfo.isDefault);
22200dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            radioButton.setOnClickListener(listener);
22300dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            radioButton.setTag(appInfo);
224da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen
225da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen            ImageView banner = (ImageView) view.findViewById(R.id.banner);
226da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen            banner.setImageDrawable(appInfo.banner);
22700dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            banner.setOnClickListener(listener);
22800dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            banner.setTag(appInfo);
22900dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen        }
23000dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen    }
23100dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen
23200dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen    @Override
23300dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen    public boolean onPreferenceChange(Preference preference, Object newValue) {
23400dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen        if (preference instanceof CheckBoxPreference) {
23500dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            mPaymentBackend.setForegroundMode(((Boolean) newValue).booleanValue());
23600dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            return true;
23700dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen        } else {
23800dbb74b8d699510ece683fc7ab12fc2343fa5d5Martijn Coenen            return false;
23926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen        }
24026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen    }
241b412e18296cf3958585efdaec15c8b9d28bd2c50Martijn Coenen}
242