diff --git a/res/drawable-hdpi/ic_device_access_new_account.png b/res/drawable-hdpi/ic_device_access_new_account.png new file mode 100644 index 0000000..593b163 Binary files /dev/null and b/res/drawable-hdpi/ic_device_access_new_account.png differ diff --git a/res/drawable-mdpi/ic_device_access_new_account.png b/res/drawable-mdpi/ic_device_access_new_account.png new file mode 100644 index 0000000..aae6a95 Binary files /dev/null and b/res/drawable-mdpi/ic_device_access_new_account.png differ diff --git a/res/drawable-xhdpi/ic_device_access_new_account.png b/res/drawable-xhdpi/ic_device_access_new_account.png new file mode 100644 index 0000000..e61a09f Binary files /dev/null and b/res/drawable-xhdpi/ic_device_access_new_account.png differ diff --git a/res/layout/fragment_edit_identity.xml b/res/layout/fragment_edit_identity.xml index 1c4f56f..3b06d0a 100644 --- a/res/layout/fragment_edit_identity.xml +++ b/res/layout/fragment_edit_identity.xml @@ -31,12 +31,20 @@ android:hint="@string/description" android:inputType="text" /> - + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 9cd4710..9f3a2a3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -61,6 +61,7 @@ Password changed successfully Identities + New identity Public name Description Default identity diff --git a/src/i2p/bote/config/EditIdentityActivity.java b/src/i2p/bote/config/EditIdentityActivity.java index fa9b68a..23c7bcf 100644 --- a/src/i2p/bote/config/EditIdentityActivity.java +++ b/src/i2p/bote/config/EditIdentityActivity.java @@ -16,8 +16,11 @@ public class EditIdentityActivity extends ActionBarActivity implements getSupportActionBar().setDisplayHomeAsUpEnabled(true); if (savedInstanceState == null) { - EditIdentityFragment f = EditIdentityFragment.newInstance( - getIntent().getExtras().getString(EditIdentityFragment.IDENTITY_KEY)); + String key = null; + Bundle args = getIntent().getExtras(); + if (args != null) + key = args.getString(EditIdentityFragment.IDENTITY_KEY); + EditIdentityFragment f = EditIdentityFragment.newInstance(key); getSupportFragmentManager().beginTransaction() .add(R.id.edit_identity_frag, f).commit(); } diff --git a/src/i2p/bote/config/EditIdentityFragment.java b/src/i2p/bote/config/EditIdentityFragment.java index d85762a..5aef0f4 100644 --- a/src/i2p/bote/config/EditIdentityFragment.java +++ b/src/i2p/bote/config/EditIdentityFragment.java @@ -2,10 +2,13 @@ package i2p.bote.config; import java.io.IOException; import java.security.GeneralSecurityException; +import java.util.List; import i2p.bote.I2PBote; import i2p.bote.R; import i2p.bote.StatusListener; +import i2p.bote.crypto.CryptoFactory; +import i2p.bote.crypto.CryptoImplementation; import i2p.bote.email.EmailIdentity; import i2p.bote.fileencryption.PasswordException; import i2p.bote.util.BoteHelper; @@ -24,8 +27,10 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; +import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; +import android.widget.Spinner; import android.widget.TextView; public class EditIdentityFragment extends Fragment { @@ -60,11 +65,15 @@ public class EditIdentityFragment extends Fragment { // instance of this fragment after rotation. static final String IDENTITY_WAITER_TAG = "identityWaiterTask"; + static final int DEFAULT_CRYPTO_IMPL = 2; + private String mKey; private FragmentManager mFM; MenuItem mSave; EditText mNameField; EditText mDescField; + Spinner mCryptoField; + int mDefaultPos; CheckBox mDefaultField; TextView mError; @@ -104,20 +113,30 @@ public class EditIdentityFragment extends Fragment { mDefaultField = (CheckBox) view.findViewById(R.id.default_identity); mError = (TextView) view.findViewById(R.id.error); - try { - EmailIdentity identity = BoteHelper.getIdentity(mKey); - mNameField.setText(identity.getPublicName()); - mDescField.setText(identity.getDescription()); - mDefaultField.setChecked(identity.isDefault()); - } catch (PasswordException e) { - // TODO Handle - e.printStackTrace(); - } catch (IOException e) { - // TODO Handle - e.printStackTrace(); - } catch (GeneralSecurityException e) { - // TODO Handle - e.printStackTrace(); + if (mKey == null) { + // Show the encryption choice field + mCryptoField = (Spinner) view.findViewById(R.id.crypto_impl); + CryptoAdapter adapter = new CryptoAdapter(getActivity()); + mCryptoField.setAdapter(adapter); + mCryptoField.setSelection(mDefaultPos); + mCryptoField.setVisibility(View.VISIBLE); + } else { + // Load the identity to edit + try { + EmailIdentity identity = BoteHelper.getIdentity(mKey); + mNameField.setText(identity.getPublicName()); + mDescField.setText(identity.getDescription()); + mDefaultField.setChecked(identity.isDefault()); + } catch (PasswordException e) { + // TODO Handle + e.printStackTrace(); + } catch (IOException e) { + // TODO Handle + e.printStackTrace(); + } catch (GeneralSecurityException e) { + // TODO Handle + e.printStackTrace(); + } } } @@ -139,6 +158,10 @@ public class EditIdentityFragment extends Fragment { String description = mDescField.getText().toString(); boolean setDefault = mDefaultField.isChecked(); + int cryptoImplId = -1; + if (mKey == null) + cryptoImplId = ((CryptoImplementation) mCryptoField.getSelectedItem()).getId(); + InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mNameField.getWindowToken(), 0); @@ -146,8 +169,8 @@ public class EditIdentityFragment extends Fragment { mError.setText(""); IdentityWaiterFrag f = IdentityWaiterFrag.newInstance( - false, - -1, + (mKey == null ? true : false), + cryptoImplId, mKey, publicName, description, @@ -177,6 +200,40 @@ public class EditIdentityFragment extends Fragment { } } + private class CryptoAdapter extends ArrayAdapter { + public CryptoAdapter(Context context) { + super(context, android.R.layout.simple_spinner_item); + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + List instances = CryptoFactory.getInstances(); + mDefaultPos = 0; + for (CryptoImplementation instance : instances) { + add(instance); + if (instance.getId() == DEFAULT_CRYPTO_IMPL) + mDefaultPos = getPosition(instance); + } + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View v = super.getView(position, convertView, parent); + setViewText(v, position); + return v; + } + + @Override + public View getDropDownView (int position, View convertView, ViewGroup parent) { + View v = super.getDropDownView(position, convertView, parent); + setViewText(v, position); + return v; + } + + private void setViewText(View v, int position) { + TextView text = (TextView) v.findViewById(android.R.id.text1); + text.setText(getItem(position).getName()); + } + } + public static class IdentityWaiterFrag extends TaskFragment { static final String CREATE_NEW = "create_new"; static final String CRYPTO_IMPL_ID = "crypto_impl_id"; @@ -268,7 +325,6 @@ public class EditIdentityFragment extends Fragment { publishProgress(status); } }; - lsnr.updateStatus("Saving identity"); try { BoteHelper.createOrModifyIdentity( (Boolean) params[0], @@ -277,7 +333,9 @@ public class EditIdentityFragment extends Fragment { (String) params[3], (String) params[4], (String) params[5], - (Boolean) params[6]); + (Boolean) params[6], + lsnr); + lsnr.updateStatus("Saving identity"); I2PBote.getInstance().getIdentities().save(); return null; } catch (Throwable e) { diff --git a/src/i2p/bote/config/SettingsActivity.java b/src/i2p/bote/config/SettingsActivity.java index 1adb7a5..5f034cd 100644 --- a/src/i2p/bote/config/SettingsActivity.java +++ b/src/i2p/bote/config/SettingsActivity.java @@ -23,6 +23,8 @@ import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; @@ -102,6 +104,26 @@ public class SettingsActivity extends PreferenceActivity { super.onPause(); } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu + getMenuInflater().inflate(R.menu.settings, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_new_identity: + Intent ni = new Intent(this, EditIdentityActivity.class); + startActivity(ni); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + @Override protected boolean isValidFragment(String fragmentName) { return SettingsFragment.class.getName().equals(fragmentName);