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.ComponentName; 2026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.content.DialogInterface; 2126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.content.Intent; 22a73aa32278adb177042d4b5c873a0f08deb1d3f3Martijn Coenenimport android.nfc.cardemulation.CardEmulation; 2326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.os.Bundle; 2426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport android.util.Log; 2526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 2626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.internal.app.AlertActivity; 2726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.internal.app.AlertController; 2826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.settings.R; 2926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport com.android.settings.nfc.PaymentBackend.PaymentAppInfo; 3026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 3126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenimport java.util.List; 3226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 3326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenenpublic final class PaymentDefaultDialog extends AlertActivity implements 3426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen DialogInterface.OnClickListener { 3526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 3626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen public static final String TAG = "PaymentDefaultDialog"; 3778ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales private static final int PAYMENT_APP_MAX_CAPTION_LENGTH = 40; 3826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 3926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen private PaymentBackend mBackend; 4026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen private ComponentName mNewDefault; 4126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 4226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen @Override 4326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen protected void onCreate(Bundle savedInstanceState) { 4426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen super.onCreate(savedInstanceState); 4526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen mBackend = new PaymentBackend(this); 4626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen Intent intent = getIntent(); 4726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen ComponentName component = intent.getParcelableExtra( 48a73aa32278adb177042d4b5c873a0f08deb1d3f3Martijn Coenen CardEmulation.EXTRA_SERVICE_COMPONENT); 49a73aa32278adb177042d4b5c873a0f08deb1d3f3Martijn Coenen String category = intent.getStringExtra(CardEmulation.EXTRA_CATEGORY); 5026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 51e0a38911a3c2d884faaec4da32d19827d3347479Martijn Coenen setResult(RESULT_CANCELED); 5226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen if (!buildDialog(component, category)) { 5326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen finish(); 5426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 5526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 5626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 5726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 5826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen @Override 5926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen public void onClick(DialogInterface dialog, int which) { 6026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen switch (which) { 6126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen case BUTTON_POSITIVE: 6226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen mBackend.setDefaultPaymentApp(mNewDefault); 63e0a38911a3c2d884faaec4da32d19827d3347479Martijn Coenen setResult(RESULT_OK); 6426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen break; 6526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen case BUTTON_NEGATIVE: 6626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen break; 6726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 6826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 6926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 7026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen private boolean buildDialog(ComponentName component, String category) { 7126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen if (component == null || category == null) { 7226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen Log.e(TAG, "Component or category are null"); 7326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen return false; 7426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 7526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 76a73aa32278adb177042d4b5c873a0f08deb1d3f3Martijn Coenen if (!CardEmulation.CATEGORY_PAYMENT.equals(category)) { 7726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen Log.e(TAG, "Don't support defaults for category " + category); 7826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen return false; 7926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 8026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 8126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen // Check if passed in service exists 820e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen PaymentAppInfo requestedPaymentApp = null; 830e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen PaymentAppInfo defaultPaymentApp = null; 8426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 8526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen List<PaymentAppInfo> services = mBackend.getPaymentAppInfos(); 8626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen for (PaymentAppInfo service : services) { 8726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen if (component.equals(service.componentName)) { 880e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen requestedPaymentApp = service; 890e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen } 900e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen if (service.isDefault) { 910e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen defaultPaymentApp = service; 9226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 9326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 9426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 950e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen if (requestedPaymentApp == null) { 9626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen Log.e(TAG, "Component " + component + " is not a registered payment service."); 9726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen return false; 9826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 9926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 10026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen // Get current mode and default component 10126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen ComponentName defaultComponent = mBackend.getDefaultPaymentApp(); 10226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen if (defaultComponent != null && defaultComponent.equals(component)) { 10326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen Log.e(TAG, "Component " + component + " is already default."); 10426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen return false; 10526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 10626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 10726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen mNewDefault = component; 10826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen // Compose dialog; get 10926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen final AlertController.AlertParams p = mAlertParams; 110da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen p.mTitle = getString(R.string.nfc_payment_set_default_label); 1110e940d6c00d06578c4c0f89a95e5d31c8073fbc1Martijn Coenen if (defaultPaymentApp == null) { 112da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen String formatString = getString(R.string.nfc_payment_set_default); 11378ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales String msg = String.format(formatString, 114fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen sanitizePaymentAppCaption(requestedPaymentApp.label.toString())); 115da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen p.mMessage = msg; 11626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } else { 117da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen String formatString = getString(R.string.nfc_payment_set_default_instead_of); 11878ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales String msg = String.format(formatString, 119fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen sanitizePaymentAppCaption(requestedPaymentApp.label.toString()), 120fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen sanitizePaymentAppCaption(defaultPaymentApp.label.toString())); 121da6c0ba382c1c2c9b98f11a1ef9e572472654e27Martijn Coenen p.mMessage = msg; 12226515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 12326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen p.mPositiveButtonText = getString(R.string.yes); 12426515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen p.mNegativeButtonText = getString(R.string.no); 12526515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen p.mPositiveButtonListener = this; 12626515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen p.mNegativeButtonListener = this; 12726515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen setupAlert(); 12826515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 12926515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen return true; 13026515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen } 13126515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen 13278ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales private String sanitizePaymentAppCaption(String input) { 13378ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales String sanitizedString = input.replace('\n', ' ').replace('\r', ' ').trim(); 13478ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales 13578ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales 13678ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales if (sanitizedString.length() > PAYMENT_APP_MAX_CAPTION_LENGTH) { 13778ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales return sanitizedString.substring(0, PAYMENT_APP_MAX_CAPTION_LENGTH); 13878ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales } 13978ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales 14078ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales return sanitizedString; 14178ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales } 14278ce5e8c9f9e01502f5a544b7488b1ee000a2b6fAndres Morales 14326515da08707b6f8182cc8b0ed5e01e97aa92a96Martijn Coenen} 144