UserCredentialsSettings: that fresh new blank look

Less obviously easy than it looks because we want to make it a
SettingsPreferenceFragment for consistency with the other blank
fragment implementations.

Fix: 30878596
Test: make RunSettingsRoboTests
Test: # open up Settings and have a look, uninstall cert, reinstall cert
Change-Id: Ifbe3132475c3104d76589a50dec3f436b9548585
diff --git a/src/com/android/settings/UserCredentialsSettings.java b/src/com/android/settings/UserCredentialsSettings.java
index ea9eee9..6cf1ae0 100644
--- a/src/com/android/settings/UserCredentialsSettings.java
+++ b/src/com/android/settings/UserCredentialsSettings.java
@@ -37,20 +37,18 @@
 import android.security.KeyChain;
 import android.security.KeyChain.KeyChainConnection;
 import android.security.KeyStore;
+import android.support.v7.widget.RecyclerView;
 import android.util.Log;
 import android.util.SparseArray;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
 import android.widget.TextView;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
@@ -63,11 +61,10 @@
 import static android.view.View.GONE;
 import static android.view.View.VISIBLE;
 
-public class UserCredentialsSettings extends OptionsMenuFragment implements OnItemClickListener {
+public class UserCredentialsSettings extends SettingsPreferenceFragment
+        implements View.OnClickListener {
     private static final String TAG = "UserCredentialsSettings";
 
-    private ListView mListView;
-
     @Override
     public int getMetricsCategory() {
         return MetricsEvent.USER_CREDENTIALS;
@@ -80,27 +77,18 @@
     }
 
     @Override
-    public View onCreateView(
-            LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
-        final View rootView = inflater.inflate(R.layout.user_credentials, parent, false);
-
-        // Set up an OnItemClickListener for the credential list.
-        mListView = (ListView) rootView.findViewById(R.id.credential_list);
-        mListView.setOnItemClickListener(this);
-
-        return rootView;
-    }
-
-    @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        final Credential item = (Credential) parent.getItemAtPosition(position);
-        CredentialDialogFragment.show(this, item);
+    public void onClick(final View view) {
+        final Credential item = (Credential) view.getTag();
+        if (item != null) {
+            CredentialDialogFragment.show(this, item);
+        }
     }
 
     protected void announceRemoval(String alias) {
-        if (isAdded()) {
-            mListView.announceForAccessibility(getString(R.string.user_credential_removed, alias));
+        if (!isAdded()) {
+            return;
         }
+        getListView().announceForAccessibility(getString(R.string.user_credential_removed, alias));
     }
 
     protected void refreshItems() {
@@ -288,25 +276,60 @@
 
         @Override
         protected void onPostExecute(List<Credential> credentials) {
-            final Credential[] credentialArray = credentials.toArray(new Credential[0]);
-            mListView.setAdapter(new CredentialAdapter(getContext(), credentialArray));
+            if (!isAdded()) {
+                return;
+            }
+
+            if (credentials == null || credentials.size() == 0) {
+                // Create a "no credentials installed" message for the empty case.
+                TextView emptyTextView = (TextView) getActivity().findViewById(android.R.id.empty);
+                emptyTextView.setText(R.string.user_credential_none_installed);
+                setEmptyView(emptyTextView);
+            } else {
+                setEmptyView(null);
+            }
+
+            getListView().setAdapter(
+                    new CredentialAdapter(credentials, UserCredentialsSettings.this));
         }
     }
 
     /**
      * Helper class to display {@link Credential}s in a list.
      */
-    private static class CredentialAdapter extends ArrayAdapter<Credential> {
+    private static class CredentialAdapter extends RecyclerView.Adapter<ViewHolder> {
         private static final int LAYOUT_RESOURCE = R.layout.user_credential_preference;
 
-        public CredentialAdapter(Context context, final Credential[] objects) {
-            super(context, LAYOUT_RESOURCE, objects);
+        private final List<Credential> mItems;
+        private final View.OnClickListener mListener;
+
+        public CredentialAdapter(List<Credential> items, @Nullable View.OnClickListener listener) {
+            mItems = items;
+            mListener = listener;
         }
 
         @Override
-        public View getView(int position, @Nullable View view, ViewGroup parent) {
-            return getCredentialView(getItem(position), LAYOUT_RESOURCE, view, parent,
-                    /* expanded */ false);
+        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+            return new ViewHolder(inflater.inflate(LAYOUT_RESOURCE, parent, false));
+        }
+
+        @Override
+        public void onBindViewHolder(ViewHolder h, int position) {
+            getCredentialView(mItems.get(position), LAYOUT_RESOURCE, h.itemView, null, false);
+            h.itemView.setTag(mItems.get(position));
+            h.itemView.setOnClickListener(mListener);
+        }
+
+        @Override
+        public int getItemCount() {
+            return mItems.size();
+        }
+    }
+
+    private static class ViewHolder extends RecyclerView.ViewHolder {
+        public ViewHolder(View item) {
+            super(item);
         }
     }