diff options
Diffstat (limited to 'OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui')
15 files changed, 152 insertions, 41 deletions
diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/DecryptActivity.java index 87b1204a4..ed81c2aa8 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/DecryptActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/DecryptActivity.java @@ -62,6 +62,7 @@ import android.widget.ViewFlipper; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.BufferedInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.regex.Matcher; @@ -642,7 +643,7 @@ public class DecryptActivity extends SherlockFragmentActivity { } try { - inStream = new FileInputStream(mInputFilename); + inStream = new BufferedInputStream(new FileInputStream(mInputFilename)); } catch (FileNotFoundException e) { Log.e(Constants.TAG, "File not found!", e); Toast.makeText(this, getString(R.string.error_fileNotFound, e.getMessage()), @@ -659,6 +660,9 @@ public class DecryptActivity extends SherlockFragmentActivity { // get decryption key for this inStream try { try { + if (inStream.markSupported()) { + inStream.mark(200); //should probably set this to the max size of two pgpF objects, if it even needs to be anything other than 0. + } mSecretKeyId = PgpMain.getDecryptionKeyId(this, inStream); if (mSecretKeyId == Id.key.none) { throw new PgpMain.PgpGeneralException( @@ -666,6 +670,9 @@ public class DecryptActivity extends SherlockFragmentActivity { } mAssumeSymmetricEncryption = false; } catch (PgpMain.NoAsymmetricEncryptionException e) { + if (inStream.markSupported()) { + inStream.reset(); + } mSecretKeyId = Id.key.symmetric; if (!PgpMain.hasSymmetricEncryption(this, inStream)) { throw new PgpMain.PgpGeneralException( @@ -914,7 +921,7 @@ public class DecryptActivity extends SherlockFragmentActivity { case Id.request.output_filename: { if (resultCode == RESULT_OK && data != null) { try { - String path = data.getData().getPath(); + String path = FileHelper.getPath(this, data.getData()); Log.d(Constants.TAG, "path=" + path); mFileDialog.setFilename(path); @@ -944,3 +951,4 @@ public class DecryptActivity extends SherlockFragmentActivity { } } + diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/EditKeyActivity.java index 90ee9838e..3d819a824 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/EditKeyActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/EditKeyActivity.java @@ -75,6 +75,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { public static final String EXTRA_NO_PASSPHRASE = "noPassphrase"; public static final String EXTRA_GENERATE_DEFAULT_KEYS = "generateDefaultKeys"; public static final String EXTRA_MASTER_KEY_ID = "masterKeyId"; + public static final String EXTRA_MASTER_CAN_SIGN = "masterCanSign"; // results when saving key public static final String RESULT_EXTRA_MASTER_KEY_ID = "masterKeyId"; @@ -97,6 +98,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { Vector<String> mUserIds; Vector<PGPSecretKey> mKeys; Vector<Integer> mKeysUsages; + boolean masterCanSign = true; // will be set to false to build layout later in handler private boolean mBuildLayout = true; @@ -192,6 +194,13 @@ public class EditKeyActivity extends SherlockFragmentActivity { } }); + //disable key passhphrase changing with empty private keys for no + //library fails, fix later + if (!masterCanSign) { + mChangePassPhrase.setEnabled(false); + mNoPassphrase.setEnabled(false); + } + if (mBuildLayout) { buildLayout(); } @@ -317,6 +326,9 @@ public class EditKeyActivity extends SherlockFragmentActivity { } if (extras != null) { + if (extras.containsKey(EXTRA_MASTER_CAN_SIGN)) { + masterCanSign = extras.getBoolean(EXTRA_MASTER_CAN_SIGN); + } if (extras.containsKey(EXTRA_MASTER_KEY_ID)) { long masterKeyId = extras.getLong(EXTRA_MASTER_KEY_ID); @@ -394,10 +406,12 @@ public class EditKeyActivity extends SherlockFragmentActivity { LinearLayout container = (LinearLayout) findViewById(R.id.edit_key_container); mUserIdsView = (SectionView) inflater.inflate(R.layout.edit_key_section, container, false); mUserIdsView.setType(Id.type.user_id); + mUserIdsView.setCanEdit(masterCanSign); mUserIdsView.setUserIds(mUserIds); container.addView(mUserIdsView); mKeysView = (SectionView) inflater.inflate(R.layout.edit_key_section, container, false); mKeysView.setType(Id.type.key); + mKeysView.setCanEdit(masterCanSign); mKeysView.setKeys(mKeys, mKeysUsages); container.addView(mKeysView); @@ -447,6 +461,7 @@ public class EditKeyActivity extends SherlockFragmentActivity { data.putIntegerArrayList(KeychainIntentService.SAVE_KEYRING_KEYS_USAGES, getKeysUsages(mKeysView)); data.putLong(KeychainIntentService.SAVE_KEYRING_MASTER_KEY_ID, getMasterKeyId()); + data.putBoolean(KeychainIntentService.SAVE_KEYRING_CAN_SIGN, masterCanSign); intent.putExtra(KeychainIntentService.EXTRA_DATA, data); diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/EncryptActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/EncryptActivity.java index 9d73fc6e5..c6b2d196a 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/EncryptActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/EncryptActivity.java @@ -678,6 +678,7 @@ public class EncryptActivity extends SherlockFragmentActivity { long encryptionKeyIds[] = null; int compressionId = 0; boolean signOnly = false; + long mSecretKeyIdToPass = 0; if (mMode.getCurrentView().getId() == R.id.modeSymmetric) { Log.d(Constants.TAG, "Symmetric encryption enabled!"); @@ -685,9 +686,9 @@ public class EncryptActivity extends SherlockFragmentActivity { if (passPhrase.length() == 0) { passPhrase = null; } - data.putString(KeychainIntentService.GENERATE_KEY_SYMMETRIC_PASSPHRASE, passPhrase); } else { + mSecretKeyIdToPass = mSecretKeyId; encryptionKeyIds = mEncryptionKeyIds; signOnly = (mEncryptionKeyIds == null || mEncryptionKeyIds.length == 0); } @@ -733,7 +734,7 @@ public class EncryptActivity extends SherlockFragmentActivity { useAsciiArmor = mAsciiArmorDemand; } - data.putLong(KeychainIntentService.ENCRYPT_SECRET_KEY_ID, mSecretKeyId); + data.putLong(KeychainIntentService.ENCRYPT_SECRET_KEY_ID, mSecretKeyIdToPass); data.putBoolean(KeychainIntentService.ENCRYPT_USE_ASCII_AMOR, useAsciiArmor); data.putLongArray(KeychainIntentService.ENCRYPT_ENCRYPTION_KEYS_IDS, encryptionKeyIds); data.putInt(KeychainIntentService.ENCRYPT_COMPRESSION_ID, compressionId); diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListSecretActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListSecretActivity.java index 0e6cdd6a1..52ce19f97 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListSecretActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListSecretActivity.java @@ -70,18 +70,19 @@ public class KeyListSecretActivity extends KeyListActivity { } } - public void checkPassPhraseAndEdit(long masterKeyId) { + public void checkPassPhraseAndEdit(long masterKeyId, boolean masterCanSign) { String passPhrase = PassphraseCacheService.getCachedPassphrase(this, masterKeyId); if (passPhrase == null) { - showPassphraseDialog(masterKeyId); + showPassphraseDialog(masterKeyId, masterCanSign); } else { PgpMain.setEditPassPhrase(passPhrase); - editKey(masterKeyId); + editKey(masterKeyId, masterCanSign); } } - private void showPassphraseDialog(final long masterKeyId) { + private void showPassphraseDialog(final long masterKeyId, boolean masterCanSign) { // Message is received after passphrase is cached + final boolean mCanSign = masterCanSign; Handler returnHandler = new Handler() { @Override public void handleMessage(Message message) { @@ -89,7 +90,7 @@ public class KeyListSecretActivity extends KeyListActivity { String passPhrase = PassphraseCacheService.getCachedPassphrase( KeyListSecretActivity.this, masterKeyId); PgpMain.setEditPassPhrase(passPhrase); - editKey(masterKeyId); + editKey(masterKeyId, mCanSign); } } }; @@ -115,9 +116,10 @@ public class KeyListSecretActivity extends KeyListActivity { startActivityForResult(intent, 0); } - private void editKey(long masterKeyId) { + private void editKey(long masterKeyId, boolean masterCanSign) { Intent intent = new Intent(EditKeyActivity.ACTION_EDIT_KEY); intent.putExtra(EditKeyActivity.EXTRA_MASTER_KEY_ID, masterKeyId); + intent.putExtra(EditKeyActivity.EXTRA_MASTER_CAN_SIGN, masterCanSign); startActivityForResult(intent, 0); } diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListSecretFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListSecretFragment.java index f4ba2b4d9..e41755840 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListSecretFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/KeyListSecretFragment.java @@ -91,9 +91,11 @@ public class KeyListSecretFragment extends KeyListFragment implements long masterKeyId = ProviderHelper .getSecretMasterKeyId(mKeyListSecretActivity, keyRingRowId); + boolean masterCanSign = ProviderHelper.getSecretMasterKeyCanSign(mKeyListSecretActivity, keyRingRowId); + switch (item.getItemId()) { case Id.menu.edit: - mKeyListSecretActivity.checkPassPhraseAndEdit(masterKeyId); + mKeyListSecretActivity.checkPassPhraseAndEdit(masterKeyId, masterCanSign); return true; diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyActivity.java index 14ccb17c7..10acd38d9 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyActivity.java @@ -34,8 +34,11 @@ public class SelectSecretKeyActivity extends SherlockFragmentActivity { public static final String ACTION_SELECT_SECRET_KEY = Constants.INTENT_PREFIX + "SELECT_SECRET_KEYRING"; + public static final String EXTRA_FILTER_CERTIFY = "filter_certify"; + public static final String RESULT_EXTRA_MASTER_KEY_ID = "masterKeyId"; public static final String RESULT_EXTRA_USER_ID = "userId"; + public static boolean filterCertify = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -61,6 +64,8 @@ public class SelectSecretKeyActivity extends SherlockFragmentActivity { // } // }); + filterCertify = getIntent().getBooleanExtra(EXTRA_FILTER_CERTIFY, false); + handleIntent(getIntent()); } diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java index a3d9167a3..4871b74bc 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SelectSecretKeyFragment.java @@ -91,12 +91,21 @@ public class SelectSecretKeyFragment extends SherlockListFragment implements // sample only has one Loader, so we don't care about the ID. Uri baseUri = KeyRings.buildSecretKeyRingsUri(); + String CapFilter = null; + if (((SelectSecretKeyActivity)getActivity()).filterCertify == true) { + CapFilter = "(cert>0)"; + } + // These are the rows that we will retrieve. long now = new Date().getTime() / 1000; String[] projection = new String[] { KeyRings._ID, KeyRings.MASTER_KEY_ID, UserIds.USER_ID, + "(SELECT COUNT(cert_keys." + Keys._ID + ") FROM " + Tables.KEYS + + " AS cert_keys WHERE cert_keys." + Keys.KEY_RING_ROW_ID + " = " + + KeychainDatabase.Tables.KEY_RINGS + "." + KeyRings._ID + " AND cert_keys." + + Keys.CAN_CERTIFY + " = '1') AS cert", "(SELECT COUNT(available_keys." + Keys._ID + ") FROM " + Tables.KEYS + " AS available_keys WHERE available_keys." + Keys.KEY_RING_ROW_ID + " = " + KeychainDatabase.Tables.KEY_RINGS + "." + KeyRings._ID @@ -127,7 +136,7 @@ public class SelectSecretKeyFragment extends SherlockListFragment implements // Now create and return a CursorLoader that will take care of // creating a Cursor for the data being displayed. - return new CursorLoader(getActivity(), baseUri, projection, null, null, orderBy); + return new CursorLoader(getActivity(), baseUri, projection, CapFilter, null, orderBy); } @Override diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SignKeyActivity.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SignKeyActivity.java index 21d55aca0..1e7fe0120 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SignKeyActivity.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/SignKeyActivity.java @@ -121,6 +121,7 @@ public class SignKeyActivity extends SherlockFragmentActivity { // kick off the SecretKey selection activity so the user chooses which key to sign with // first Intent intent = new Intent(this, SelectSecretKeyActivity.class); + intent.putExtra(SelectSecretKeyActivity.EXTRA_FILTER_CERTIFY, true); startActivityForResult(intent, Id.request.secret_keys); } } @@ -295,7 +296,8 @@ public class SignKeyActivity extends SherlockFragmentActivity { switch (requestCode) { case Id.request.secret_keys: { if (resultCode == RESULT_OK) { - mMasterKeyId = data.getLongExtra(EXTRA_KEY_ID, 0); + Bundle bundle = data.getExtras(); + mMasterKeyId = bundle.getLong(SelectSecretKeyActivity.RESULT_EXTRA_MASTER_KEY_ID); // re-enable the sign button so the user can initiate the sign process Button sign = (Button) findViewById(R.id.sign); diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java index 2f9cdb3b1..7c4d9cea3 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/dialog/FileDialogFragment.java @@ -191,4 +191,5 @@ public class FileDialogFragment extends DialogFragment { Log.w(Constants.TAG, "Messenger is null!", e); } } -}
\ No newline at end of file +} + diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java index 504de9d69..10fc74551 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/dialog/PassphraseDialogFragment.java @@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.ui.dialog; import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPPrivateKey; import org.spongycastle.openpgp.PGPSecretKey; +import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor; import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; import org.sufficientlysecure.keychain.Constants; @@ -63,6 +64,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor private Messenger mMessenger; private EditText mPassphraseEditText; + private boolean canKB; /** * Creates new instance of this dialog fragment @@ -137,8 +139,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Activity activity = getActivity(); - - long secretKeyId = getArguments().getLong(ARG_SECRET_KEY_ID); + final long secretKeyId = getArguments().getLong(ARG_SECRET_KEY_ID); mMessenger = getArguments().getParcelable(ARG_MESSENGER); AlertDialog.Builder alert = new AlertDialog.Builder(activity); @@ -152,8 +153,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor alert.setMessage(R.string.passPhraseForSymmetricEncryption); } else { // TODO: by master key id??? - secretKey = PgpHelper.getMasterKey(ProviderHelper.getPGPSecretKeyRingByMasterKeyId( - activity, secretKeyId)); + secretKey = PgpHelper.getMasterKey(ProviderHelper.getPGPSecretKeyRingByKeyId(activity, secretKeyId)); // secretKey = PGPHelper.getMasterKey(PGPMain.getSecretKeyRing(secretKeyId)); if (secretKey == null) { @@ -165,6 +165,7 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor } }); alert.setCancelable(false); + canKB = false; return alert.create(); } String userId = PgpHelper.getMainUserIdSafe(activity, secretKey); @@ -184,24 +185,43 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor @Override public void onClick(DialogInterface dialog, int id) { dismiss(); - + long curKeyIndex = 1; + boolean keyOK = true; String passPhrase = mPassphraseEditText.getText().toString(); long keyId; - if (secretKey != null) { - try { - PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder() - .setProvider(PgpMain.BOUNCY_CASTLE_PROVIDER_NAME).build( - passPhrase.toCharArray()); - PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); - if (testKey == null) { + PGPSecretKey clickSecretKey = secretKey; + + if (clickSecretKey != null) { + while (keyOK == true) { + if (clickSecretKey != null) { //check again for loop + try { + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder() + .setProvider(PgpMain.BOUNCY_CASTLE_PROVIDER_NAME).build( + passPhrase.toCharArray()); + PGPPrivateKey testKey = clickSecretKey.extractPrivateKey(keyDecryptor); + if (testKey == null) { + if (!clickSecretKey.isMasterKey()) { + Toast.makeText(activity, R.string.error_couldNotExtractPrivateKey, + Toast.LENGTH_SHORT).show(); + return; + } else { + clickSecretKey = PgpHelper.getKeyNum(ProviderHelper.getPGPSecretKeyRingByKeyId(activity, secretKeyId), curKeyIndex); + curKeyIndex++; //does post-increment work like C? + continue; + } + } else { + keyOK = false; + } + } catch (PGPException e) { + Toast.makeText(activity, R.string.wrongPassPhrase, Toast.LENGTH_SHORT) + .show(); + return; + } + } else { Toast.makeText(activity, R.string.error_couldNotExtractPrivateKey, Toast.LENGTH_SHORT).show(); - return; + return; //ran out of keys to try } - } catch (PGPException e) { - Toast.makeText(activity, R.string.wrongPassPhrase, Toast.LENGTH_SHORT) - .show(); - return; } keyId = secretKey.getKeyID(); } else { @@ -211,6 +231,9 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor // cache the new passphrase Log.d(Constants.TAG, "Everything okay! Caching entered passphrase"); PassphraseCacheService.addCachedPassphrase(activity, keyId, passPhrase); + if (keyOK == false && clickSecretKey.getKeyID() != keyId) { + PassphraseCacheService.addCachedPassphrase(activity, clickSecretKey.getKeyID(), passPhrase); + } sendMessageToHandler(MESSAGE_OKAY); } @@ -224,18 +247,20 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor } }); + canKB = true; return alert.create(); } @Override public void onActivityCreated(Bundle arg0) { super.onActivityCreated(arg0); - + if (canKB) { // request focus and open soft keyboard - mPassphraseEditText.requestFocus(); - getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); + mPassphraseEditText.requestFocus(); + getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); - mPassphraseEditText.setOnEditorActionListener(this); + mPassphraseEditText.setOnEditorActionListener(this); + } } /** @@ -272,4 +297,5 @@ public class PassphraseDialogFragment extends DialogFragment implements OnEditor } } -}
\ No newline at end of file +} + diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java index 1122fc522..e9a5674cd 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java @@ -125,6 +125,14 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener { super.onFinishInflate(); } + public void setCanEdit(boolean bCanEdit) { + if (!bCanEdit) { + mDeleteButton.setVisibility(View.INVISIBLE); + mUsage.setEnabled(false); + mExpiryDateButton.setEnabled(false); + } + } + public void setValue(PGPSecretKey key, boolean isMasterKey, int usage) { mKey = key; diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/KeyListAdapter.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/KeyListAdapter.java index 8e8d33886..75c764540 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/KeyListAdapter.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/KeyListAdapter.java @@ -151,6 +151,13 @@ public class KeyListAdapter extends CursorTreeAdapter { masterKeyIcon.setVisibility(View.VISIBLE); } + ImageView certifyIcon = (ImageView) view.findViewById(R.id.ic_certifyKey); + if (cursor.getInt(cursor.getColumnIndex(Keys.CAN_CERTIFY)) != 1) { + certifyIcon.setVisibility(View.GONE); + } else { + certifyIcon.setVisibility(View.VISIBLE); + } + ImageView encryptIcon = (ImageView) view.findViewById(R.id.ic_encryptKey); if (cursor.getInt(cursor.getColumnIndex(Keys.CAN_ENCRYPT)) != 1) { encryptIcon.setVisibility(View.GONE); @@ -160,7 +167,7 @@ public class KeyListAdapter extends CursorTreeAdapter { ImageView signIcon = (ImageView) view.findViewById(R.id.ic_signKey); if (cursor.getInt(cursor.getColumnIndex(Keys.CAN_SIGN)) != 1) { - signIcon.setVisibility(View.GONE); + signIcon.setVisibility(View.GONE); } else { signIcon.setVisibility(View.VISIBLE); } @@ -212,7 +219,7 @@ public class KeyListAdapter extends CursorTreeAdapter { switch (type) { case CHILD_FINGERPRINT: projection = new String[] { Keys._ID, Keys.KEY_ID, Keys.IS_MASTER_KEY, Keys.ALGORITHM, - Keys.KEY_SIZE, Keys.CAN_SIGN, Keys.CAN_ENCRYPT, }; + Keys.KEY_SIZE, Keys.CAN_CERTIFY, Keys.CAN_SIGN, Keys.CAN_ENCRYPT, }; sortOrder = Keys.RANK + " ASC"; // use only master key for fingerprint @@ -227,7 +234,7 @@ public class KeyListAdapter extends CursorTreeAdapter { case CHILD_KEY: projection = new String[] { Keys._ID, Keys.KEY_ID, Keys.IS_MASTER_KEY, Keys.ALGORITHM, - Keys.KEY_SIZE, Keys.CAN_SIGN, Keys.CAN_ENCRYPT, }; + Keys.KEY_SIZE, Keys.CAN_CERTIFY, Keys.CAN_SIGN, Keys.CAN_ENCRYPT, }; sortOrder = Keys.RANK + " ASC"; if (mKeyType == Id.type.public_key) { @@ -261,4 +268,4 @@ public class KeyListAdapter extends CursorTreeAdapter { return mContext.getContentResolver().query(uri, projection, selection, null, sortOrder); } -}
\ No newline at end of file +} diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SectionView.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SectionView.java index 7142e4426..898b05372 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SectionView.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SectionView.java @@ -45,6 +45,7 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.EditText; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; @@ -55,12 +56,14 @@ import java.util.Vector; public class SectionView extends LinearLayout implements OnClickListener, EditorListener { private LayoutInflater mInflater; private View mAdd; + private ImageView mPlusButton; private ViewGroup mEditors; private TextView mTitle; private int mType = 0; private Choice mNewKeyAlgorithmChoice; private int mNewKeySize; + private boolean canEdit = true; private SherlockFragmentActivity mActivity; @@ -99,6 +102,14 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor } } + public void setCanEdit(boolean bCanEdit) { + canEdit = bCanEdit; + mPlusButton = (ImageView)findViewById(R.id.plusbutton); + if (!canEdit) { + mPlusButton.setVisibility(View.INVISIBLE); + } + } + /** {@inheritDoc} */ @Override protected void onFinishInflate() { @@ -129,6 +140,7 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor /** {@inheritDoc} */ public void onClick(View v) { + if (canEdit) { switch (mType) { case Id.type.user_id: { UserIdEditor view = (UserIdEditor) mInflater.inflate(R.layout.edit_key_user_id_item, @@ -205,6 +217,7 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor } } this.updateEditorsVisible(); + } } public void setUserIds(Vector<String> list) { @@ -221,6 +234,7 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor if (mEditors.getChildCount() == 0) { view.setIsMainUserId(true); } + view.setCanEdit(canEdit); mEditors.addView(view); } @@ -241,6 +255,7 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor view.setEditorListener(this); boolean isMasterKey = (mEditors.getChildCount() == 0); view.setValue(list.get(i), isMasterKey, usages.get(i)); + view.setCanEdit(canEdit); mEditors.addView(view); } diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SelectKeyCursorAdapter.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SelectKeyCursorAdapter.java index da8ac94ee..17423136f 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SelectKeyCursorAdapter.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/SelectKeyCursorAdapter.java @@ -139,4 +139,4 @@ public class SelectKeyCursorAdapter extends CursorAdapter { return mInflater.inflate(R.layout.select_key_item, null); } -}
\ No newline at end of file +} diff --git a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/UserIdEditor.java b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/UserIdEditor.java index 2215d29e7..5b43ebbd9 100644 --- a/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/UserIdEditor.java +++ b/OpenPGP-Keychain/src/org/sufficientlysecure/keychain/ui/widget/UserIdEditor.java @@ -56,6 +56,16 @@ public class UserIdEditor extends LinearLayout implements Editor, OnClickListene } } + public void setCanEdit(boolean bCanEdit) { + if (!bCanEdit) { + mDeleteButton.setVisibility(View.INVISIBLE); + mName.setEnabled(false); + mIsMainUserId.setEnabled(false); + mEmail.setEnabled(false); + mComment.setEnabled(false); + } + } + public static class NoEmailException extends Exception { static final long serialVersionUID = 0xf812773344L; |