1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.nfc; 18 19 import android.content.ComponentName; 20 import android.content.DialogInterface; 21 import android.content.Intent; 22 import android.nfc.cardemulation.CardEmulation; 23 import android.os.Bundle; 24 import android.util.Log; 25 26 import com.android.internal.app.AlertActivity; 27 import com.android.internal.app.AlertController; 28 import com.android.settings.R; 29 import com.android.settings.nfc.PaymentBackend.PaymentAppInfo; 30 31 import java.util.List; 32 33 public final class PaymentDefaultDialog extends AlertActivity implements 34 DialogInterface.OnClickListener { 35 36 public static final String TAG = "PaymentDefaultDialog"; 37 private static final int PAYMENT_APP_MAX_CAPTION_LENGTH = 40; 38 39 private PaymentBackend mBackend; 40 private ComponentName mNewDefault; 41 42 @Override onCreate(Bundle savedInstanceState)43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 try { 46 mBackend = new PaymentBackend(this); 47 } catch (NullPointerException e) { 48 finish(); 49 } 50 Intent intent = getIntent(); 51 ComponentName component = intent.getParcelableExtra( 52 CardEmulation.EXTRA_SERVICE_COMPONENT); 53 String category = intent.getStringExtra(CardEmulation.EXTRA_CATEGORY); 54 55 setResult(RESULT_CANCELED); 56 if (!buildDialog(component, category)) { 57 finish(); 58 } 59 60 } 61 62 @Override onClick(DialogInterface dialog, int which)63 public void onClick(DialogInterface dialog, int which) { 64 switch (which) { 65 case BUTTON_POSITIVE: 66 mBackend.setDefaultPaymentApp(mNewDefault); 67 setResult(RESULT_OK); 68 break; 69 case BUTTON_NEGATIVE: 70 break; 71 } 72 } 73 buildDialog(ComponentName component, String category)74 private boolean buildDialog(ComponentName component, String category) { 75 if (component == null || category == null) { 76 Log.e(TAG, "Component or category are null"); 77 return false; 78 } 79 80 if (!CardEmulation.CATEGORY_PAYMENT.equals(category)) { 81 Log.e(TAG, "Don't support defaults for category " + category); 82 return false; 83 } 84 85 // Check if passed in service exists 86 PaymentAppInfo requestedPaymentApp = null; 87 PaymentAppInfo defaultPaymentApp = null; 88 89 List<PaymentAppInfo> services = mBackend.getPaymentAppInfos(); 90 for (PaymentAppInfo service : services) { 91 if (component.equals(service.componentName)) { 92 requestedPaymentApp = service; 93 } 94 if (service.isDefault) { 95 defaultPaymentApp = service; 96 } 97 } 98 99 if (requestedPaymentApp == null) { 100 Log.e(TAG, "Component " + component + " is not a registered payment service."); 101 return false; 102 } 103 104 // Get current mode and default component 105 ComponentName defaultComponent = mBackend.getDefaultPaymentApp(); 106 if (defaultComponent != null && defaultComponent.equals(component)) { 107 Log.e(TAG, "Component " + component + " is already default."); 108 return false; 109 } 110 111 mNewDefault = component; 112 // Compose dialog; get 113 final AlertController.AlertParams p = mAlertParams; 114 p.mTitle = getString(R.string.nfc_payment_set_default_label); 115 if (defaultPaymentApp == null) { 116 String formatString = getString(R.string.nfc_payment_set_default); 117 String msg = String.format(formatString, 118 sanitizePaymentAppCaption(requestedPaymentApp.label.toString())); 119 p.mMessage = msg; 120 } else { 121 String formatString = getString(R.string.nfc_payment_set_default_instead_of); 122 String msg = String.format(formatString, 123 sanitizePaymentAppCaption(requestedPaymentApp.label.toString()), 124 sanitizePaymentAppCaption(defaultPaymentApp.label.toString())); 125 p.mMessage = msg; 126 } 127 p.mPositiveButtonText = getString(R.string.yes); 128 p.mNegativeButtonText = getString(R.string.no); 129 p.mPositiveButtonListener = this; 130 p.mNegativeButtonListener = this; 131 setupAlert(); 132 133 return true; 134 } 135 sanitizePaymentAppCaption(String input)136 private String sanitizePaymentAppCaption(String input) { 137 String sanitizedString = input.replace('\n', ' ').replace('\r', ' ').trim(); 138 139 140 if (sanitizedString.length() > PAYMENT_APP_MAX_CAPTION_LENGTH) { 141 return sanitizedString.substring(0, PAYMENT_APP_MAX_CAPTION_LENGTH); 142 } 143 144 return sanitizedString; 145 } 146 147 } 148