Loading src/com/android/settings/nfc/NfcPaymentPreferenceController.java +12 −4 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.nfc.NfcAdapter; import android.os.UserManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; Loading Loading @@ -127,7 +128,10 @@ public class NfcPaymentPreferenceController extends BasePreferenceController imp public CharSequence getSummary() { final PaymentAppInfo defaultApp = mPaymentBackend.getDefaultApp(); if (defaultApp != null) { return defaultApp.label; UserManager um = mContext.createContextAsUser( defaultApp.userHandle, /*flags=*/0).getSystemService(UserManager.class); return defaultApp.label + " (" + um.getUserName() + ")"; } else { return mContext.getText(R.string.nfc_payment_default_not_set); } Loading Loading @@ -218,12 +222,15 @@ public class NfcPaymentPreferenceController extends BasePreferenceController imp } // Prevent checked callback getting called on recycled views UserManager um = mContext.createContextAsUser( appInfo.userHandle, /*flags=*/0).getSystemService(UserManager.class); holder.radioButton.setOnCheckedChangeListener(null); holder.radioButton.setChecked(appInfo.isDefault); holder.radioButton.setContentDescription(appInfo.label); holder.radioButton.setContentDescription(appInfo.label + " (" + um.getUserName() + ")"); holder.radioButton.setOnCheckedChangeListener(this); holder.radioButton.setTag(appInfo); holder.radioButton.setText(appInfo.label); holder.radioButton.setText(appInfo.label + " (" + um.getUserName() + ")"); return convertView; } Loading @@ -245,7 +252,8 @@ public class NfcPaymentPreferenceController extends BasePreferenceController imp private void makeDefault(PaymentAppInfo appInfo) { if (!appInfo.isDefault) { mPaymentBackend.setDefaultPaymentApp(appInfo.componentName); mPaymentBackend.setDefaultPaymentApp(appInfo.componentName, appInfo.userHandle.getIdentifier()); } final Dialog dialog = mPreference.getDialog(); if (dialog != null) { Loading src/com/android/settings/nfc/PaymentBackend.java +104 −38 Original line number Diff line number Diff line Loading @@ -16,11 +16,10 @@ package com.android.settings.nfc; import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.nfc.NfcAdapter; import android.nfc.cardemulation.ApduServiceInfo; import android.nfc.cardemulation.CardEmulation; Loading Loading @@ -50,6 +49,15 @@ public class PaymentBackend { boolean isDefault; public ComponentName componentName; public ComponentName settingsComponent; public UserHandle userHandle; } /** * ComponentName of the payment application and the userId that it belongs to. */ public static class PaymentInfo { public ComponentName componentName; public int userId; } private final Context mContext; Loading Loading @@ -80,24 +88,36 @@ public class PaymentBackend { public void refresh() { PackageManager pm = mContext.getPackageManager(); List<ApduServiceInfo> serviceInfos = mCardEmuManager.getServices(CardEmulation.CATEGORY_PAYMENT); ArrayList<PaymentAppInfo> appInfos = new ArrayList<PaymentAppInfo>(); ArrayList<PaymentAppInfo> appInfosAllProfiles = new ArrayList<PaymentAppInfo>(); if (serviceInfos == null) { makeCallbacks(); return; } UserManager um = mContext.createContextAsUser( UserHandle.of(ActivityManager.getCurrentUser()), /*flags=*/0) .getSystemService(UserManager.class); List<UserHandle> userHandles = um.getEnabledProfiles(); ComponentName defaultAppName = getDefaultPaymentApp(); PaymentInfo defaultAppName = getDefaultPaymentApp(); PaymentAppInfo foundDefaultApp = null; for (ApduServiceInfo service : serviceInfos) { for (UserHandle uh : userHandles) { List<ApduServiceInfo> serviceInfosByProfile = mCardEmuManager.getServices(CardEmulation.CATEGORY_PAYMENT, uh.getIdentifier()); if (serviceInfosByProfile == null) continue; ArrayList<PaymentAppInfo> appInfos = new ArrayList<PaymentAppInfo>(); for (ApduServiceInfo service : serviceInfosByProfile) { PaymentAppInfo appInfo = new PaymentAppInfo(); appInfo.userHandle = uh; appInfo.label = service.loadLabel(pm); if (appInfo.label == null) { appInfo.label = service.loadAppLabel(pm); } appInfo.isDefault = service.getComponent().equals(defaultAppName); if (defaultAppName == null) { appInfo.isDefault = false; } else { appInfo.isDefault = service.getComponent().equals(defaultAppName.componentName) && defaultAppName.userId == uh.getIdentifier(); } if (appInfo.isDefault) { foundDefaultApp = appInfo; } Loading @@ -111,9 +131,12 @@ public class PaymentBackend { appInfo.settingsComponent = null; } appInfo.description = service.getDescription(); appInfos.add(appInfo); } mAppInfos = appInfos; appInfosAllProfiles.addAll(appInfos); } mAppInfos = appInfosAllProfiles; mDefaultAppInfo = foundDefaultApp; makeCallbacks(); } Loading Loading @@ -150,13 +173,36 @@ public class PaymentBackend { } void setForegroundMode(boolean foreground) { UserManager um = mContext.createContextAsUser( UserHandle.of(UserHandle.myUserId()), /*flags=*/0) .getSystemService(UserManager.class); List<UserHandle> userHandles = um.getEnabledProfiles(); for (UserHandle uh : userHandles) { Settings.Secure.putIntForUser(mContext.getContentResolver(), Settings.Secure.NFC_PAYMENT_FOREGROUND, foreground ? 1 : 0, UserHandle.myUserId()); Settings.Secure.NFC_PAYMENT_FOREGROUND, foreground ? 1 : 0, uh.getIdentifier()); } } ComponentName getDefaultPaymentApp() { PaymentInfo getDefaultPaymentApp() { UserManager um = mContext.createContextAsUser( UserHandle.of(ActivityManager.getCurrentUser()), /*flags=*/0) .getSystemService(UserManager.class); List<UserHandle> userHandles = um.getEnabledProfiles(); for (UserHandle uh : userHandles) { ComponentName defaultApp = getDefaultPaymentApp(uh.getIdentifier()); if (defaultApp != null) { PaymentInfo appInfo = new PaymentInfo(); appInfo.userId = uh.getIdentifier(); appInfo.componentName = defaultApp; return appInfo; } } return null; } ComponentName getDefaultPaymentApp(int userId) { String componentString = Settings.Secure.getStringForUser(mContext.getContentResolver(), Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, UserHandle.myUserId()); Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, userId); if (componentString != null) { return ComponentName.unflattenFromString(componentString); } else { Loading @@ -165,9 +211,29 @@ public class PaymentBackend { } public void setDefaultPaymentApp(ComponentName app) { setDefaultPaymentApp(app, UserHandle.myUserId()); } /** * Set Nfc default payment application */ public void setDefaultPaymentApp(ComponentName app, int userId) { UserManager um = mContext.createContextAsUser( UserHandle.of(ActivityManager.getCurrentUser()), /*flags=*/0) .getSystemService(UserManager.class); List<UserHandle> userHandles = um.getEnabledProfiles(); for (UserHandle uh : userHandles) { if (uh.getIdentifier() == userId) { Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, app != null ? app.flattenToString() : null, UserHandle.myUserId()); app != null ? app.flattenToString() : null, uh.getIdentifier()); } else { Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, null, uh.getIdentifier()); } } refresh(); } Loading src/com/android/settings/nfc/PaymentDefaultDialog.java +18 −9 Original line number Diff line number Diff line Loading @@ -21,12 +21,14 @@ import android.content.DialogInterface; import android.content.Intent; import android.nfc.cardemulation.CardEmulation; import android.os.Bundle; import android.os.UserHandle; import android.util.Log; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.settings.R; import com.android.settings.nfc.PaymentBackend.PaymentAppInfo; import com.android.settings.nfc.PaymentBackend.PaymentInfo; import java.util.List; Loading @@ -37,7 +39,7 @@ public final class PaymentDefaultDialog extends AlertActivity implements private static final int PAYMENT_APP_MAX_CAPTION_LENGTH = 40; private PaymentBackend mBackend; private ComponentName mNewDefault; private PaymentInfo mNewDefault; @Override protected void onCreate(Bundle savedInstanceState) { Loading @@ -51,9 +53,10 @@ public final class PaymentDefaultDialog extends AlertActivity implements ComponentName component = intent.getParcelableExtra( CardEmulation.EXTRA_SERVICE_COMPONENT); String category = intent.getStringExtra(CardEmulation.EXTRA_CATEGORY); int userId = intent.getIntExtra(CardEmulation.EXTRA_USERID, UserHandle.myUserId()); setResult(RESULT_CANCELED); if (!buildDialog(component, category)) { if (!buildDialog(component, category, userId)) { finish(); } Loading @@ -63,7 +66,7 @@ public final class PaymentDefaultDialog extends AlertActivity implements public void onClick(DialogInterface dialog, int which) { switch (which) { case BUTTON_POSITIVE: mBackend.setDefaultPaymentApp(mNewDefault); mBackend.setDefaultPaymentApp(mNewDefault.componentName, mNewDefault.userId); setResult(RESULT_OK); break; case BUTTON_NEGATIVE: Loading @@ -71,7 +74,7 @@ public final class PaymentDefaultDialog extends AlertActivity implements } } private boolean buildDialog(ComponentName component, String category) { private boolean buildDialog(ComponentName component, String category, int userId) { if (component == null || category == null) { Log.e(TAG, "Component or category are null"); return false; Loading @@ -88,10 +91,12 @@ public final class PaymentDefaultDialog extends AlertActivity implements List<PaymentAppInfo> services = mBackend.getPaymentAppInfos(); for (PaymentAppInfo service : services) { if (component.equals(service.componentName)) { // check if userId matches if (component.equals(service.componentName) && service.userHandle.getIdentifier() == userId) { requestedPaymentApp = service; } if (service.isDefault) { if (service.isDefault && service.userHandle.getIdentifier() == userId) { defaultPaymentApp = service; } } Loading @@ -102,13 +107,17 @@ public final class PaymentDefaultDialog extends AlertActivity implements } // Get current mode and default component ComponentName defaultComponent = mBackend.getDefaultPaymentApp(); if (defaultComponent != null && defaultComponent.equals(component)) { PaymentInfo defaultComponent = mBackend.getDefaultPaymentApp(); if (defaultComponent != null && defaultComponent.componentName.equals(component) && defaultComponent.userId == userId) { Log.e(TAG, "Component " + component + " is already default."); return false; } mNewDefault = component; mNewDefault = new PaymentInfo(); mNewDefault.componentName = component; mNewDefault.userId = userId; // Compose dialog; get final AlertController.AlertParams p = mAlertParams; if (defaultPaymentApp == null) { Loading Loading
src/com/android/settings/nfc/NfcPaymentPreferenceController.java +12 −4 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.nfc.NfcAdapter; import android.os.UserManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; Loading Loading @@ -127,7 +128,10 @@ public class NfcPaymentPreferenceController extends BasePreferenceController imp public CharSequence getSummary() { final PaymentAppInfo defaultApp = mPaymentBackend.getDefaultApp(); if (defaultApp != null) { return defaultApp.label; UserManager um = mContext.createContextAsUser( defaultApp.userHandle, /*flags=*/0).getSystemService(UserManager.class); return defaultApp.label + " (" + um.getUserName() + ")"; } else { return mContext.getText(R.string.nfc_payment_default_not_set); } Loading Loading @@ -218,12 +222,15 @@ public class NfcPaymentPreferenceController extends BasePreferenceController imp } // Prevent checked callback getting called on recycled views UserManager um = mContext.createContextAsUser( appInfo.userHandle, /*flags=*/0).getSystemService(UserManager.class); holder.radioButton.setOnCheckedChangeListener(null); holder.radioButton.setChecked(appInfo.isDefault); holder.radioButton.setContentDescription(appInfo.label); holder.radioButton.setContentDescription(appInfo.label + " (" + um.getUserName() + ")"); holder.radioButton.setOnCheckedChangeListener(this); holder.radioButton.setTag(appInfo); holder.radioButton.setText(appInfo.label); holder.radioButton.setText(appInfo.label + " (" + um.getUserName() + ")"); return convertView; } Loading @@ -245,7 +252,8 @@ public class NfcPaymentPreferenceController extends BasePreferenceController imp private void makeDefault(PaymentAppInfo appInfo) { if (!appInfo.isDefault) { mPaymentBackend.setDefaultPaymentApp(appInfo.componentName); mPaymentBackend.setDefaultPaymentApp(appInfo.componentName, appInfo.userHandle.getIdentifier()); } final Dialog dialog = mPreference.getDialog(); if (dialog != null) { Loading
src/com/android/settings/nfc/PaymentBackend.java +104 −38 Original line number Diff line number Diff line Loading @@ -16,11 +16,10 @@ package com.android.settings.nfc; import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.nfc.NfcAdapter; import android.nfc.cardemulation.ApduServiceInfo; import android.nfc.cardemulation.CardEmulation; Loading Loading @@ -50,6 +49,15 @@ public class PaymentBackend { boolean isDefault; public ComponentName componentName; public ComponentName settingsComponent; public UserHandle userHandle; } /** * ComponentName of the payment application and the userId that it belongs to. */ public static class PaymentInfo { public ComponentName componentName; public int userId; } private final Context mContext; Loading Loading @@ -80,24 +88,36 @@ public class PaymentBackend { public void refresh() { PackageManager pm = mContext.getPackageManager(); List<ApduServiceInfo> serviceInfos = mCardEmuManager.getServices(CardEmulation.CATEGORY_PAYMENT); ArrayList<PaymentAppInfo> appInfos = new ArrayList<PaymentAppInfo>(); ArrayList<PaymentAppInfo> appInfosAllProfiles = new ArrayList<PaymentAppInfo>(); if (serviceInfos == null) { makeCallbacks(); return; } UserManager um = mContext.createContextAsUser( UserHandle.of(ActivityManager.getCurrentUser()), /*flags=*/0) .getSystemService(UserManager.class); List<UserHandle> userHandles = um.getEnabledProfiles(); ComponentName defaultAppName = getDefaultPaymentApp(); PaymentInfo defaultAppName = getDefaultPaymentApp(); PaymentAppInfo foundDefaultApp = null; for (ApduServiceInfo service : serviceInfos) { for (UserHandle uh : userHandles) { List<ApduServiceInfo> serviceInfosByProfile = mCardEmuManager.getServices(CardEmulation.CATEGORY_PAYMENT, uh.getIdentifier()); if (serviceInfosByProfile == null) continue; ArrayList<PaymentAppInfo> appInfos = new ArrayList<PaymentAppInfo>(); for (ApduServiceInfo service : serviceInfosByProfile) { PaymentAppInfo appInfo = new PaymentAppInfo(); appInfo.userHandle = uh; appInfo.label = service.loadLabel(pm); if (appInfo.label == null) { appInfo.label = service.loadAppLabel(pm); } appInfo.isDefault = service.getComponent().equals(defaultAppName); if (defaultAppName == null) { appInfo.isDefault = false; } else { appInfo.isDefault = service.getComponent().equals(defaultAppName.componentName) && defaultAppName.userId == uh.getIdentifier(); } if (appInfo.isDefault) { foundDefaultApp = appInfo; } Loading @@ -111,9 +131,12 @@ public class PaymentBackend { appInfo.settingsComponent = null; } appInfo.description = service.getDescription(); appInfos.add(appInfo); } mAppInfos = appInfos; appInfosAllProfiles.addAll(appInfos); } mAppInfos = appInfosAllProfiles; mDefaultAppInfo = foundDefaultApp; makeCallbacks(); } Loading Loading @@ -150,13 +173,36 @@ public class PaymentBackend { } void setForegroundMode(boolean foreground) { UserManager um = mContext.createContextAsUser( UserHandle.of(UserHandle.myUserId()), /*flags=*/0) .getSystemService(UserManager.class); List<UserHandle> userHandles = um.getEnabledProfiles(); for (UserHandle uh : userHandles) { Settings.Secure.putIntForUser(mContext.getContentResolver(), Settings.Secure.NFC_PAYMENT_FOREGROUND, foreground ? 1 : 0, UserHandle.myUserId()); Settings.Secure.NFC_PAYMENT_FOREGROUND, foreground ? 1 : 0, uh.getIdentifier()); } } ComponentName getDefaultPaymentApp() { PaymentInfo getDefaultPaymentApp() { UserManager um = mContext.createContextAsUser( UserHandle.of(ActivityManager.getCurrentUser()), /*flags=*/0) .getSystemService(UserManager.class); List<UserHandle> userHandles = um.getEnabledProfiles(); for (UserHandle uh : userHandles) { ComponentName defaultApp = getDefaultPaymentApp(uh.getIdentifier()); if (defaultApp != null) { PaymentInfo appInfo = new PaymentInfo(); appInfo.userId = uh.getIdentifier(); appInfo.componentName = defaultApp; return appInfo; } } return null; } ComponentName getDefaultPaymentApp(int userId) { String componentString = Settings.Secure.getStringForUser(mContext.getContentResolver(), Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, UserHandle.myUserId()); Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, userId); if (componentString != null) { return ComponentName.unflattenFromString(componentString); } else { Loading @@ -165,9 +211,29 @@ public class PaymentBackend { } public void setDefaultPaymentApp(ComponentName app) { setDefaultPaymentApp(app, UserHandle.myUserId()); } /** * Set Nfc default payment application */ public void setDefaultPaymentApp(ComponentName app, int userId) { UserManager um = mContext.createContextAsUser( UserHandle.of(ActivityManager.getCurrentUser()), /*flags=*/0) .getSystemService(UserManager.class); List<UserHandle> userHandles = um.getEnabledProfiles(); for (UserHandle uh : userHandles) { if (uh.getIdentifier() == userId) { Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, app != null ? app.flattenToString() : null, UserHandle.myUserId()); app != null ? app.flattenToString() : null, uh.getIdentifier()); } else { Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT, null, uh.getIdentifier()); } } refresh(); } Loading
src/com/android/settings/nfc/PaymentDefaultDialog.java +18 −9 Original line number Diff line number Diff line Loading @@ -21,12 +21,14 @@ import android.content.DialogInterface; import android.content.Intent; import android.nfc.cardemulation.CardEmulation; import android.os.Bundle; import android.os.UserHandle; import android.util.Log; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.settings.R; import com.android.settings.nfc.PaymentBackend.PaymentAppInfo; import com.android.settings.nfc.PaymentBackend.PaymentInfo; import java.util.List; Loading @@ -37,7 +39,7 @@ public final class PaymentDefaultDialog extends AlertActivity implements private static final int PAYMENT_APP_MAX_CAPTION_LENGTH = 40; private PaymentBackend mBackend; private ComponentName mNewDefault; private PaymentInfo mNewDefault; @Override protected void onCreate(Bundle savedInstanceState) { Loading @@ -51,9 +53,10 @@ public final class PaymentDefaultDialog extends AlertActivity implements ComponentName component = intent.getParcelableExtra( CardEmulation.EXTRA_SERVICE_COMPONENT); String category = intent.getStringExtra(CardEmulation.EXTRA_CATEGORY); int userId = intent.getIntExtra(CardEmulation.EXTRA_USERID, UserHandle.myUserId()); setResult(RESULT_CANCELED); if (!buildDialog(component, category)) { if (!buildDialog(component, category, userId)) { finish(); } Loading @@ -63,7 +66,7 @@ public final class PaymentDefaultDialog extends AlertActivity implements public void onClick(DialogInterface dialog, int which) { switch (which) { case BUTTON_POSITIVE: mBackend.setDefaultPaymentApp(mNewDefault); mBackend.setDefaultPaymentApp(mNewDefault.componentName, mNewDefault.userId); setResult(RESULT_OK); break; case BUTTON_NEGATIVE: Loading @@ -71,7 +74,7 @@ public final class PaymentDefaultDialog extends AlertActivity implements } } private boolean buildDialog(ComponentName component, String category) { private boolean buildDialog(ComponentName component, String category, int userId) { if (component == null || category == null) { Log.e(TAG, "Component or category are null"); return false; Loading @@ -88,10 +91,12 @@ public final class PaymentDefaultDialog extends AlertActivity implements List<PaymentAppInfo> services = mBackend.getPaymentAppInfos(); for (PaymentAppInfo service : services) { if (component.equals(service.componentName)) { // check if userId matches if (component.equals(service.componentName) && service.userHandle.getIdentifier() == userId) { requestedPaymentApp = service; } if (service.isDefault) { if (service.isDefault && service.userHandle.getIdentifier() == userId) { defaultPaymentApp = service; } } Loading @@ -102,13 +107,17 @@ public final class PaymentDefaultDialog extends AlertActivity implements } // Get current mode and default component ComponentName defaultComponent = mBackend.getDefaultPaymentApp(); if (defaultComponent != null && defaultComponent.equals(component)) { PaymentInfo defaultComponent = mBackend.getDefaultPaymentApp(); if (defaultComponent != null && defaultComponent.componentName.equals(component) && defaultComponent.userId == userId) { Log.e(TAG, "Component " + component + " is already default."); return false; } mNewDefault = component; mNewDefault = new PaymentInfo(); mNewDefault.componentName = component; mNewDefault.userId = userId; // Compose dialog; get final AlertController.AlertParams p = mAlertParams; if (defaultPaymentApp == null) { Loading