Merge "HCE: Latest UX and strings." into klp-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 49e8977..653290d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1621,15 +1621,10 @@
                 android:resource="@id/nfc_payment_settings" />
         </activity>
         <activity android:name=".nfc.PaymentDefaultDialog"
-                  android:label="@string/nfc_payment_set_default"
+                  android:label="@string/nfc_payment_set_default_label"
                   android:excludeFromRecents="true"
                   android:theme="@*android:style/Theme.Holo.Light.Dialog.Alert">
             <intent-filter>
-                <!-- TODO this filter can be removed -->
-                <action android:name="android.nfc.cardemulation.ACTION_CHANGE_DEFAULT" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <intent-filter>
                 <action android:name="android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
diff --git a/res/drawable-hdpi/nfc_payment_empty_state.png b/res/drawable-hdpi/nfc_payment_empty_state.png
new file mode 100644
index 0000000..69b22f2
--- /dev/null
+++ b/res/drawable-hdpi/nfc_payment_empty_state.png
Binary files differ
diff --git a/res/drawable-mdpi/nfc_payment_empty_state.png b/res/drawable-mdpi/nfc_payment_empty_state.png
new file mode 100644
index 0000000..1ab7187
--- /dev/null
+++ b/res/drawable-mdpi/nfc_payment_empty_state.png
Binary files differ
diff --git a/res/drawable-xhdpi/nfc_payment_empty_state.png b/res/drawable-xhdpi/nfc_payment_empty_state.png
new file mode 100644
index 0000000..3951c82
--- /dev/null
+++ b/res/drawable-xhdpi/nfc_payment_empty_state.png
Binary files differ
diff --git a/res/drawable-xxhdpi/nfc_payment_empty_state.png b/res/drawable-xxhdpi/nfc_payment_empty_state.png
new file mode 100644
index 0000000..914021a
--- /dev/null
+++ b/res/drawable-xxhdpi/nfc_payment_empty_state.png
Binary files differ
diff --git a/res/layout/nfc_payment.xml b/res/layout/nfc_payment.xml
new file mode 100644
index 0000000..92fe86f
--- /dev/null
+++ b/res/layout/nfc_payment.xml
@@ -0,0 +1,33 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center_vertical"
+        android:orientation="vertical" >
+        <TextView
+            android:id="@+id/nfc_payment_empty_text"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:textSize="24sp"
+            android:visibility="gone"
+            android:paddingBottom="16dp"
+            android:text="@string/nfc_payment_no_apps"/>
+        <ImageView
+            android:id="@+id/nfc_payment_tap_image"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:visibility="gone"
+            android:src="@drawable/nfc_payment_empty_state"/>
+    </LinearLayout>
+    <ListView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="5dp" />
+
+</FrameLayout>
diff --git a/res/layout/nfc_payment_option.xml b/res/layout/nfc_payment_option.xml
index 122e041..04fdc07 100644
--- a/res/layout/nfc_payment_option.xml
+++ b/res/layout/nfc_payment_option.xml
@@ -13,7 +13,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_weight="1"
@@ -21,53 +21,24 @@
     android:focusable="true"
     android:clickable="true"
     android:gravity="center_vertical"
+    android:paddingTop="10dp"
+    android:paddingBottom="10dp"
     android:minHeight="?android:attr/listPreferredItemHeight"
     android:background="?android:attr/selectableItemBackground">
-    <LinearLayout
+    <FrameLayout
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:gravity="center"
         android:minWidth="@*android:dimen/preference_icon_minWidth"
         android:orientation="horizontal">
         <ImageView
-            android:id="@+android:id/icon"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
+            android:id="@+id/banner"
             android:layout_gravity="center"
-            android:minWidth="48dp"
+            android:layout_width="wrap_content"
+            android:layout_height="96dp"
             android:scaleType="centerInside"
-            android:layout_marginEnd="@*android:dimen/preference_item_padding_inner"
                 />
-    </LinearLayout>
-    <RelativeLayout
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginEnd="6dip"
-        android:layout_marginTop="6dip"
-        android:layout_marginBottom="6dip"
-        android:layout_weight="1">
-        <TextView
-            android:id="@+android:id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:singleLine="true"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:ellipsize="marquee"
-            android:fadingEdge="horizontal"/>
-        <TextView
-            android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/title"
-            android:layout_alignStart="@android:id/title"
-            android:paddingBottom="3dip"
-            android:visibility="gone"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textSize="13sp"
-            android:textColor="?android:attr/textColorSecondary"
-            android:focusable="false"
-            android:maxLines="4" />
-    </RelativeLayout>
+    </FrameLayout>
     <RadioButton
         android:id="@android:id/button1"
         android:layout_width="wrap_content"
@@ -77,4 +48,4 @@
         android:duplicateParentState="true"
         android:clickable="false"
         android:focusable="false" />
-</LinearLayout>
+</RelativeLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 492697d..d316609 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4678,13 +4678,13 @@
 
     <!-- NFC payment settings --><skip/>
     <string name="nfc_payment_settings_title">Payments</string>
-    <!-- Option to tell Android to ask the user which payment app to use every time
-         a payment terminal is tapped -->
-    <string name="nfc_payment_ask">Ask every time</string>
+    <!-- String shown when there are no NFC payment applications installed -->
+    <string name="nfc_payment_no_apps">DO NOT TRANSLATE ME</string>
     <!-- Label for the dialog that is shown when the user is asked to set a
          preferred payment application -->
-    <string name="nfc_payment_set_default">Set as your preference?</string>
-
+    <string name="nfc_payment_set_default_label">Set as your preference?</string>
+    <string name="nfc_payment_set_default">Always use <xliff:g id="app">%1$s</xliff:g> when you tap and pay?</string>
+    <string name="nfc_payment_set_default_instead_of">Always use <xliff:g id="app">%1$s</xliff:g> instead of <xliff:g id="app">%2$s</xliff:g> when you tap and pay?</string>
     <!-- Restrictions settings --><skip/>
 
     <!-- Restriction settings title [CHAR LIMIT=35] -->
diff --git a/src/com/android/settings/nfc/PaymentBackend.java b/src/com/android/settings/nfc/PaymentBackend.java
index e2f110f..59f4ddf 100644
--- a/src/com/android/settings/nfc/PaymentBackend.java
+++ b/src/com/android/settings/nfc/PaymentBackend.java
@@ -33,7 +33,7 @@
 
     public static class PaymentAppInfo {
         CharSequence caption;
-        Drawable icon;
+        Drawable banner;
         boolean isDefault;
         public ComponentName componentName;
     }
@@ -62,7 +62,7 @@
         for (ApduServiceInfo service : serviceInfos) {
             PaymentAppInfo appInfo = new PaymentAppInfo();
             appInfo.caption = service.loadLabel(pm);
-            appInfo.icon = service.loadIcon(pm);
+            appInfo.banner = service.loadBanner(pm);
             appInfo.isDefault = service.getComponent().equals(defaultApp);
             appInfo.componentName = service.getComponent();
             appInfos.add(appInfo);
diff --git a/src/com/android/settings/nfc/PaymentDefaultDialog.java b/src/com/android/settings/nfc/PaymentDefaultDialog.java
index ae2f4c1..538af2e 100644
--- a/src/com/android/settings/nfc/PaymentDefaultDialog.java
+++ b/src/com/android/settings/nfc/PaymentDefaultDialog.java
@@ -125,12 +125,15 @@
 
         // Compose dialog; get
         final AlertController.AlertParams p = mAlertParams;
-        p.mTitle = getString(R.string.nfc_payment_set_default);
+        p.mTitle = getString(R.string.nfc_payment_set_default_label);
         if (defaultAppInfo == null) {
-            p.mMessage = "Always use " + newAppInfo.loadLabel(pm) + " when you tap and pay?";
+            String formatString = getString(R.string.nfc_payment_set_default);
+            String msg = String.format(formatString, newAppInfo.loadLabel(pm));
+            p.mMessage = msg;
         } else {
-            p.mMessage = "Always use " + newAppInfo.loadLabel(pm) + " instead of " +
-                    defaultAppInfo.loadLabel(pm) + " when you tap and pay?";
+            String formatString = getString(R.string.nfc_payment_set_default_instead_of);
+            String msg = String.format(formatString, newAppInfo.loadLabel(pm), defaultAppInfo.loadLabel(pm));
+            p.mMessage = msg;
         }
         p.mPositiveButtonText = getString(R.string.yes);
         p.mNegativeButtonText = getString(R.string.no);
diff --git a/src/com/android/settings/nfc/PaymentSettings.java b/src/com/android/settings/nfc/PaymentSettings.java
index af569ac..d3ccbaf 100644
--- a/src/com/android/settings/nfc/PaymentSettings.java
+++ b/src/com/android/settings/nfc/PaymentSettings.java
@@ -21,9 +21,14 @@
 import android.preference.Preference;
 import android.preference.PreferenceManager;
 import android.preference.PreferenceScreen;
+import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.ImageView;
 import android.widget.RadioButton;
+import android.widget.TextView;
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -34,14 +39,17 @@
 public class PaymentSettings extends SettingsPreferenceFragment implements
         OnClickListener {
     public static final String TAG = "PaymentSettings";
+    private LayoutInflater mInflater;
     private PaymentBackend mPaymentBackend;
 
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         setHasOptionsMenu(false);
         mPaymentBackend = new PaymentBackend(getActivity());
+        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     }
 
     public void refresh() {
@@ -55,12 +63,35 @@
             for (PaymentAppInfo appInfo : appInfos) {
                 PaymentAppPreference preference =
                         new PaymentAppPreference(getActivity(), appInfo, this);
-                preference.setIcon(appInfo.icon);
                 preference.setTitle(appInfo.caption);
-                screen.addPreference(preference);
+                if (appInfo.banner != null) {
+                    screen.addPreference(preference);
+                } else {
+                    // Ignore, no banner
+                    Log.e(TAG, "Couldn't load banner drawable of service " + appInfo.componentName);
+                }
             }
         }
-        setPreferenceScreen(screen);
+        TextView emptyText = (TextView) getView().findViewById(R.id.nfc_payment_empty_text);
+        ImageView emptyImage = (ImageView) getView().findViewById(R.id.nfc_payment_tap_image);
+        if (screen.getPreferenceCount() == 0) {
+            emptyText.setVisibility(View.VISIBLE);
+            emptyImage.setVisibility(View.VISIBLE);
+        } else {
+            emptyText.setVisibility(View.GONE);
+            emptyImage.setVisibility(View.GONE);
+            setPreferenceScreen(screen);
+        }
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        super.onCreateView(inflater, container, savedInstanceState);
+
+        View v = mInflater.inflate(R.layout.nfc_payment, container, false);
+
+        return v;
     }
 
     @Override
@@ -101,6 +132,9 @@
 
             RadioButton radioButton = (RadioButton) view.findViewById(android.R.id.button1);
             radioButton.setChecked(appInfo.isDefault);
+
+            ImageView banner = (ImageView) view.findViewById(R.id.banner);
+            banner.setImageDrawable(appInfo.banner);
         }
     }
 }
\ No newline at end of file