From bce0fe62217e1f174559354b1a0dc06fd9663385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 10 Mar 2015 01:44:07 +0100 Subject: Add additional email addresses in create key --- .../keychain/ui/CreateKeyEmailFragment.java | 180 ++++++++++++++++++++- 1 file changed, 178 insertions(+), 2 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java index d9f391149..66424e012 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java @@ -20,17 +20,30 @@ package org.sufficientlysecure.keychain.ui; import android.app.Activity; import android.content.Context; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.os.Messenger; import android.support.v4.app.Fragment; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; +import android.widget.Button; import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.TextView; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; +import org.sufficientlysecure.keychain.ui.dialog.AddEmailDialogFragment; +import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment; import org.sufficientlysecure.keychain.ui.widget.EmailEditText; +import java.util.ArrayList; +import java.util.List; + public class CreateKeyEmailFragment extends Fragment { public static final String ARG_NAME = "name"; @@ -38,10 +51,14 @@ public class CreateKeyEmailFragment extends Fragment { CreateKeyActivity mCreateKeyActivity; EmailEditText mEmailEdit; + RecyclerView mEmailsRecyclerView; View mBackButton; View mNextButton; String mName; + ArrayList mAdditionalEmailModels; + + EmailAdapter mEmailAdapter; /** * Creates new instance of this fragment @@ -86,6 +103,7 @@ public class CreateKeyEmailFragment extends Fragment { mEmailEdit = (EmailEditText) view.findViewById(R.id.create_key_email); mBackButton = view.findViewById(R.id.create_key_back_button); mNextButton = view.findViewById(R.id.create_key_next_button); + mEmailsRecyclerView = (RecyclerView) view.findViewById(R.id.create_key_emails); // initial values mName = getArguments().getString(ARG_NAME); @@ -108,10 +126,45 @@ public class CreateKeyEmailFragment extends Fragment { createKeyCheck(); } }); + mEmailsRecyclerView.setHasFixedSize(true); + mEmailsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + mEmailsRecyclerView.setItemAnimator(new DefaultItemAnimator()); + + mAdditionalEmailModels = new ArrayList<>(); + mEmailAdapter = new EmailAdapter(mAdditionalEmailModels, new View.OnClickListener() { + @Override + public void onClick(View v) { + addEmail(); + } + }); + mEmailsRecyclerView.setAdapter(mEmailAdapter); return view; } + private void addEmail() { + Handler returnHandler = new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == SetPassphraseDialogFragment.MESSAGE_OKAY) { + Bundle data = message.getData(); + + // add new user id + mEmailAdapter.add( + data.getString(AddEmailDialogFragment.MESSAGE_DATA_EMAIL) + ); + } + } + }; + + // Create a new Messenger for the communication back + Messenger messenger = new Messenger(returnHandler); + + AddEmailDialogFragment addEmailDialog = AddEmailDialogFragment.newInstance(messenger); + + addEmailDialog.show(getActivity().getSupportFragmentManager(), "addEmailDialog"); + } + @Override public void onAttach(Activity activity) { super.onAttach(activity); @@ -121,14 +174,137 @@ public class CreateKeyEmailFragment extends Fragment { private void createKeyCheck() { if (isEditTextNotEmpty(getActivity(), mEmailEdit)) { + ArrayList emails = new ArrayList<>(); + for (EmailAdapter.ViewModel holder : mAdditionalEmailModels) { + emails.add(holder.toString()); + } + CreateKeyPassphraseFragment frag = CreateKeyPassphraseFragment.newInstance( mName, - mEmailEdit.getText().toString() + mEmailEdit.getText().toString(), + emails ); mCreateKeyActivity.loadFragment(null, frag, FragAction.TO_RIGHT); } } + public static class EmailAdapter extends RecyclerView.Adapter { + private List mDataset; + private View.OnClickListener mFooterOnClickListener; + private static final int TYPE_FOOTER = 0; + private static final int TYPE_ITEM = 1; + + public static class ViewModel { + String email; + + ViewModel(String email) { + this.email = email; + } + + @Override + public String toString() { + return email; + } + } + + // Provide a reference to the views for each data item + // Complex data items may need more than one view per item, and + // you provide access to all the views for a data item in a view holder + public static class ViewHolder extends RecyclerView.ViewHolder { + // each data item is just a string in this case + public TextView mTextView; + public ImageButton mDeleteButton; + + public ViewHolder(View itemView) { + super(itemView); + mTextView = (TextView) itemView.findViewById(R.id.create_key_email_item_email); + mDeleteButton = (ImageButton) itemView.findViewById(R.id.create_key_email_item_delete_button); + } + } + + class FooterHolder extends RecyclerView.ViewHolder { + public Button mAddButton; + + public FooterHolder(View itemView) { + super(itemView); + mAddButton = (Button) itemView.findViewById(R.id.create_key_add_email); + } + } + + // Provide a suitable constructor (depends on the kind of dataset) + public EmailAdapter(List myDataset, View.OnClickListener onFooterClickListener) { + mDataset = myDataset; + mFooterOnClickListener = onFooterClickListener; + } + + // Create new views (invoked by the layout manager) + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (viewType == TYPE_FOOTER) { + View v = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.create_key_email_list_footer, parent, false); + return new FooterHolder(v); + } else { + //inflate your layout and pass it to view holder + View v = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.create_key_email_list_item, parent, false); + return new ViewHolder(v); + } + } + + // Replace the contents of a view (invoked by the layout manager) + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { + if (holder instanceof ViewHolder) { + ViewHolder thisHolder = (ViewHolder) holder; + // - get element from your dataset at this position + // - replace the contents of the view with that element + final ViewModel model = mDataset.get(position); + + thisHolder.mTextView.setText(model.email); + thisHolder.mDeleteButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + remove(model); + } + }); + } else if (holder instanceof FooterHolder) { + FooterHolder thisHolder = (FooterHolder) holder; + thisHolder.mAddButton.setOnClickListener(mFooterOnClickListener); + } + } + + // Return the size of your dataset (invoked by the layout manager) + @Override + public int getItemCount() { + return mDataset.size() + 1; + } + + @Override + public int getItemViewType(int position) { + if (isPositionFooter(position)) { + return TYPE_FOOTER; + } else { + return TYPE_ITEM; + } + } + + private boolean isPositionFooter(int position) { + return position == mDataset.size(); + } + + public void add(String email) { + mDataset.add(new ViewModel(email)); + notifyItemInserted(mDataset.size() - 1); + } + + public void remove(ViewModel model) { + int position = mDataset.indexOf(model); + mDataset.remove(position); + notifyItemRemoved(position); + } + } + } -- cgit v1.2.3