Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6420cdb authored by Robin Lee's avatar Robin Lee Committed by Android (Google) Code Review
Browse files

Merge "Convert credential view to DialogFragment"

parents 6e68a1cd 04046a19
Loading
Loading
Loading
Loading
+107 −31
Original line number Diff line number Diff line
@@ -17,10 +17,16 @@
package com.android.settings;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.security.Credentials;
import android.security.KeyStore;
import android.view.LayoutInflater;
@@ -29,7 +35,6 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

@@ -56,7 +61,7 @@ public class UserCredentialsSettings extends InstrumentedFragment implements OnI
    @Override
    public void onResume() {
        super.onResume();
        new AliasLoader().execute();
        refreshItems();
    }

    @Override
@@ -74,13 +79,40 @@ public class UserCredentialsSettings extends InstrumentedFragment implements OnI
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        final Credential item = (Credential) parent.getItemAtPosition(position);
        CredentialDialogFragment.show(this, item);
    }

    protected void refreshItems() {
        if (isAdded()) {
            new AliasLoader().execute();
        }
    }

    public static class CredentialDialogFragment extends DialogFragment {
        private static final String TAG = "CredentialDialogFragment";
        private static final String ARG_CREDENTIAL = "credential";

        public static void show(Fragment target, Credential item) {
            final Bundle args = new Bundle();
            args.putParcelable(ARG_CREDENTIAL, item);

            final CredentialDialogFragment frag = new CredentialDialogFragment();
            frag.setTargetFragment(target, /* requestCode */ -1);
            frag.setArguments(args);
            frag.show(target.getFragmentManager(), TAG);
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            final Credential item = (Credential) getArguments().getParcelable(ARG_CREDENTIAL);
            View root = getActivity().getLayoutInflater()
                    .inflate(R.layout.user_credential_dialog, null);
            ViewGroup infoContainer = (ViewGroup) root.findViewById(R.id.credential_container);
        infoContainer.addView(parent.getAdapter().getView(position, null, null));
            View view = new CredentialAdapter(getActivity(), R.layout.user_credential,
                    new Credential[] {item}).getView(0, null, null);
            infoContainer.addView(view);

        new AlertDialog.Builder(getActivity())
            return new AlertDialog.Builder(getActivity())
                    .setView(root)
                    .setTitle(R.string.user_credential_title)
                    .setPositiveButton(R.string.done, null)
@@ -89,11 +121,20 @@ public class UserCredentialsSettings extends InstrumentedFragment implements OnI
                                @Override public void onClick(DialogInterface dialog, int id) {
                                    final KeyStore ks = KeyStore.getInstance();
                                    Credentials.deleteAllTypesForAlias(ks, item.alias);
                                new AliasLoader().execute();
                                    dialog.dismiss();
                                }
                            })
                .show();
                    .create();
        }

        @Override
        public void onDismiss(DialogInterface dialog) {
            final Fragment target = getTargetFragment();
            if (target instanceof UserCredentialsSettings) {
                ((UserCredentialsSettings) target).refreshItems();
            }
            super.onDismiss(dialog);
        }
    }

    /**
@@ -101,9 +142,9 @@ public class UserCredentialsSettings extends InstrumentedFragment implements OnI
     * The credentials are stored in a {@link CredentialAdapter} attached to the main
     * {@link ListView} in the fragment.
     */
    private class AliasLoader extends AsyncTask<Void, Void, ListAdapter> {
    private class AliasLoader extends AsyncTask<Void, Void, SortedMap<String, Credential>> {
        @Override
        protected ListAdapter doInBackground(Void... params) {
        protected SortedMap<String, Credential> doInBackground(Void... params) {
            // Create a list of names for credential sets, ordered by name.
            SortedMap<String, Credential> credentials = new TreeMap<>();
            KeyStore keyStore = KeyStore.getInstance();
@@ -116,15 +157,14 @@ public class UserCredentialsSettings extends InstrumentedFragment implements OnI
                    c.storedTypes.add(type);
                }
            }

            // Flatten to array so that the list can be presented via ArrayAdapter.
            Credential[] results = credentials.values().toArray(new Credential[0]);
            return new CredentialAdapter(getActivity(), R.layout.user_credential, results);
            return credentials;
        }

        @Override
        protected void onPostExecute(ListAdapter credentials) {
            mListView.setAdapter(credentials);
        protected void onPostExecute(SortedMap<String, Credential> credentials) {
            // Convert the results to an array and present them using an ArrayAdapter.
            mListView.setAdapter(new CredentialAdapter(getContext(), R.layout.user_credential,
                    credentials.values().toArray(new Credential[0])));
        }
    }

@@ -154,7 +194,7 @@ public class UserCredentialsSettings extends InstrumentedFragment implements OnI
        }
    }

    private static class Credential {
    private static class Credential implements Parcelable {
        private static enum Type {
            CA_CERTIFICATE (Credentials.CA_CERTIFICATE),
            USER_CERTIFICATE (Credentials.USER_CERTIFICATE),
@@ -183,10 +223,46 @@ public class UserCredentialsSettings extends InstrumentedFragment implements OnI
         *   <li>{@link Credentials.USER_SECRET_KEY}</li>
         * </ul>
         */
        final Set<Type> storedTypes = EnumSet.noneOf(Type.class);
        final EnumSet<Type> storedTypes = EnumSet.noneOf(Type.class);

        Credential(final String alias) {
            this.alias = alias;
        }

        Credential(Parcel in) {
            this(in.readString());

            long typeBits = in.readLong();
            for (Type i : Type.values()) {
                if ((typeBits & (1L << i.ordinal())) != 0L) {
                    storedTypes.add(i);
                }
            }
        }

        public void writeToParcel(Parcel out, int flags) {
            out.writeString(alias);

            long typeBits = 0;
            for (Type i : storedTypes) {
                typeBits |= 1L << i.ordinal();
            }
            out.writeLong(typeBits);
        }

        public int describeContents() {
            return 0;
        }

        public static final Parcelable.Creator<Credential> CREATOR
                = new Parcelable.Creator<Credential>() {
            public Credential createFromParcel(Parcel in) {
                return new Credential(in);
            }

            public Credential[] newArray(int size) {
                return new Credential[size];
            }
        };
    }
}