diff options
Diffstat (limited to 'OpenKeychain/src')
35 files changed, 309 insertions, 995 deletions
| diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml index 6236ed94f..8d3518a81 100644 --- a/OpenKeychain/src/main/AndroidManifest.xml +++ b/OpenKeychain/src/main/AndroidManifest.xml @@ -94,11 +94,6 @@                  android:value=".ui.KeyListActivity" />          </activity>          <activity -            android:name=".ui.EditKeyActivityOld" -            android:configChanges="orientation|screenSize|keyboardHidden|keyboard" -            android:label="@string/title_edit_key" -            android:windowSoftInputMode="stateHidden" /> -        <activity              android:name=".ui.EditKeyActivity"              android:configChanges="orientation|screenSize|keyboardHidden|keyboard"              android:label="@string/title_edit_key" /> diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java index 6fc55cfb8..9d334d9bd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java @@ -34,7 +34,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.service.KeychainIntentService;  import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog; -import org.sufficientlysecure.keychain.service.OperationResults.ImportResult; +import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult;  import org.sufficientlysecure.keychain.service.OperationResults.SaveKeyringResult;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.ProgressScaler; @@ -123,14 +123,14 @@ public class PgpImportExport {      }      /** Imports keys from given data. If keyIds is given only those are imported */ -    public ImportResult importKeyRings(List<ParcelableKeyRing> entries) { +    public ImportKeyResult importKeyRings(List<ParcelableKeyRing> entries) {          updateProgress(R.string.progress_importing, 0, 100);          // If there aren't even any keys, do nothing here.          if (entries == null || entries.size() == 0) { -            return new ImportResult( -                    ImportResult.RESULT_FAIL_NOTHING, mProviderHelper.getLog(), 0, 0, 0); +            return new ImportKeyResult( +                    ImportKeyResult.RESULT_FAIL_NOTHING, mProviderHelper.getLog(), 0, 0, 0);          }          int newKeys = 0, oldKeys = 0, badKeys = 0; @@ -185,26 +185,26 @@ public class PgpImportExport {          int resultType = 0;          // special return case: no new keys at all          if (badKeys == 0 && newKeys == 0 && oldKeys == 0) { -            resultType = ImportResult.RESULT_FAIL_NOTHING; +            resultType = ImportKeyResult.RESULT_FAIL_NOTHING;          } else {              if (newKeys > 0) { -                resultType |= ImportResult.RESULT_OK_NEWKEYS; +                resultType |= ImportKeyResult.RESULT_OK_NEWKEYS;              }              if (oldKeys > 0) { -                resultType |= ImportResult.RESULT_OK_UPDATED; +                resultType |= ImportKeyResult.RESULT_OK_UPDATED;              }              if (badKeys > 0) { -                resultType |= ImportResult.RESULT_WITH_ERRORS; +                resultType |= ImportKeyResult.RESULT_WITH_ERRORS;                  if (newKeys == 0 && oldKeys == 0) { -                    resultType |= ImportResult.RESULT_ERROR; +                    resultType |= ImportKeyResult.RESULT_ERROR;                  }              }              if (log.containsWarnings()) { -                resultType |= ImportResult.RESULT_WITH_WARNINGS; +                resultType |= ImportKeyResult.RESULT_WITH_WARNINGS;              }          } -        return new ImportResult(resultType, log, newKeys, oldKeys, badKeys); +        return new ImportKeyResult(resultType, log, newKeys, oldKeys, badKeys);      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java index 6bce07824..e9d7e5958 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java @@ -47,9 +47,11 @@ import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder;  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException; +import org.sufficientlysecure.keychain.service.OperationResultParcel;  import org.sufficientlysecure.keychain.service.OperationResultParcel.LogLevel;  import org.sufficientlysecure.keychain.service.OperationResultParcel.LogType;  import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog; +import org.sufficientlysecure.keychain.service.OperationResults.EditKeyResult;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyAdd;  import org.sufficientlysecure.keychain.util.IterableIterator; @@ -163,8 +165,10 @@ public class PgpKeyOperation {          }      } -    public UncachedKeyRing createSecretKeyRing(SaveKeyringParcel saveParcel, OperationLog log, -                                               int indent) { +    public EditKeyResult createSecretKeyRing(SaveKeyringParcel saveParcel) { + +        OperationLog log = new OperationLog(); +        int indent = 0;          try { @@ -213,7 +217,7 @@ public class PgpKeyOperation {              PGPSecretKeyRing sKR = new PGPSecretKeyRing(                      masterSecretKey.getEncoded(), new JcaKeyFingerprintCalculator()); -            return internal(sKR, masterSecretKey, add.mFlags, saveParcel, "", log, indent); +            return internal(sKR, masterSecretKey, add.mFlags, saveParcel, "", log);          } catch (PGPException e) {              log.add(LogLevel.ERROR, LogType.MSG_CR_ERROR_INTERNAL_PGP, indent); @@ -237,8 +241,11 @@ public class PgpKeyOperation {       * are changed by adding new certificates, which implicitly override older certificates.       *       */ -    public UncachedKeyRing modifySecretKeyRing(WrappedSecretKeyRing wsKR, SaveKeyringParcel saveParcel, -                                               String passphrase, OperationLog log, int indent) { +    public EditKeyResult modifySecretKeyRing(WrappedSecretKeyRing wsKR, SaveKeyringParcel saveParcel, +                                               String passphrase) { + +        OperationLog log = new OperationLog(); +        int indent = 0;          /*           * 1. Unlock private key @@ -277,14 +284,16 @@ public class PgpKeyOperation {          // since this is the master key, this contains at least CERTIFY_OTHER          int masterKeyFlags = readKeyFlags(masterSecretKey.getPublicKey()) | KeyFlags.CERTIFY_OTHER; -        return internal(sKR, masterSecretKey, masterKeyFlags, saveParcel, passphrase, log, indent); +        return internal(sKR, masterSecretKey, masterKeyFlags, saveParcel, passphrase, log);      } -    private UncachedKeyRing internal(PGPSecretKeyRing sKR, PGPSecretKey masterSecretKey, +    private EditKeyResult internal(PGPSecretKeyRing sKR, PGPSecretKey masterSecretKey,                                       int masterKeyFlags,                                       SaveKeyringParcel saveParcel, String passphrase, -                                     OperationLog log, int indent) { +                                     OperationLog log) { + +        int indent = 1;          updateProgress(R.string.progress_certifying_master_key, 20, 100); @@ -614,7 +623,7 @@ public class PgpKeyOperation {          }          log.add(LogLevel.OK, LogType.MSG_MF_SUCCESS, indent); -        return new UncachedKeyRing(sKR); +        return new EditKeyResult(OperationResultParcel.RESULT_OK, log, new UncachedKeyRing(sKR));      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java index 0b1d521ad..86460c45d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java @@ -35,7 +35,7 @@ import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.remote.AccountSettings; -import org.sufficientlysecure.keychain.ui.EditKeyActivityOld; +import org.sufficientlysecure.keychain.ui.CreateKeyActivity;  import org.sufficientlysecure.keychain.ui.SelectSecretKeyLayoutFragment;  import org.sufficientlysecure.keychain.ui.adapter.KeyValueSpinnerAdapter;  import org.sufficientlysecure.keychain.util.AlgorithmNames; @@ -163,12 +163,9 @@ public class AccountSettingsFragment extends Fragment implements      }      private void createKey() { -        Intent intent = new Intent(getActivity(), EditKeyActivityOld.class); -        intent.setAction(EditKeyActivityOld.ACTION_CREATE_KEY); -        intent.putExtra(EditKeyActivityOld.EXTRA_GENERATE_DEFAULT_KEYS, true); -        // set default user id to account name -        intent.putExtra(EditKeyActivityOld.EXTRA_USER_IDS, mAccSettings.getAccountName()); -        startActivityForResult(intent, REQUEST_CODE_CREATE_KEY); +        Intent intent = new Intent(getActivity(), CreateKeyActivity.class); +        // startActivityForResult(intent, REQUEST_CODE_CREATE_KEY); +        startActivity(intent);      }      @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index 9a4cef2f1..0e38a1c47 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -24,6 +24,7 @@ import android.net.Uri;  import android.os.Bundle;  import android.os.Message;  import android.os.Messenger; +import android.os.Parcelable;  import android.os.RemoteException;  import org.sufficientlysecure.keychain.Constants; @@ -53,6 +54,8 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.provider.KeychainDatabase;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog; +import org.sufficientlysecure.keychain.service.OperationResults.EditKeyResult; +import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult;  import org.sufficientlysecure.keychain.util.InputData;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.util.ProgressScaler; @@ -332,38 +335,36 @@ public class KeychainIntentService extends IntentService                  /* Operation */                  ProviderHelper providerHelper = new ProviderHelper(this);                  PgpKeyOperation keyOperations = new PgpKeyOperation(new ProgressScaler(this, 10, 50, 100)); -                try { -                    OperationLog log = new OperationLog(); -                    UncachedKeyRing ring; -                    if (saveParcel.mMasterKeyId != null) { -                        String passphrase = data.getString(SAVE_KEYRING_PASSPHRASE); -                        WrappedSecretKeyRing secRing = -                                providerHelper.getWrappedSecretKeyRing(saveParcel.mMasterKeyId); - -                        ring = keyOperations.modifySecretKeyRing(secRing, saveParcel, -                                passphrase, log, 0); -                    } else { -                        ring = keyOperations.createSecretKeyRing(saveParcel, log, 0); -                    } +                EditKeyResult result; -                    providerHelper.saveSecretKeyRing(ring, new ProgressScaler(this, 10, 95, 100)); +                if (saveParcel.mMasterKeyId != null) { +                    String passphrase = data.getString(SAVE_KEYRING_PASSPHRASE); +                    WrappedSecretKeyRing secRing = +                            providerHelper.getWrappedSecretKeyRing(saveParcel.mMasterKeyId); -                    // cache new passphrase -                    if (saveParcel.mNewPassphrase != null) { -                        PassphraseCacheService.addCachedPassphrase(this, ring.getMasterKeyId(), -                                saveParcel.mNewPassphrase, ring.getPublicKey().getPrimaryUserIdWithFallback()); -                    } -                } catch (ProviderHelper.NotFoundException e) { -                    sendErrorToHandler(e); +                    result = keyOperations.modifySecretKeyRing(secRing, saveParcel, passphrase); +                } else { +                    result = keyOperations.createSecretKeyRing(saveParcel); +                } + +                UncachedKeyRing ring = result.getRing(); + +                providerHelper.saveSecretKeyRing(ring,  new ProgressScaler(this, 10, 95, 100)); + +                // cache new passphrase +                if (saveParcel.mNewPassphrase != null) { +                    PassphraseCacheService.addCachedPassphrase(this, ring.getMasterKeyId(), +                            saveParcel.mNewPassphrase, ring.getPublicKey().getPrimaryUserIdWithFallback());                  }                  setProgress(R.string.progress_done, 100, 100);                  /* Output */ -                sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY); +                sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, result);              } catch (Exception e) {                  sendErrorToHandler(e);              } +          } else if (ACTION_DELETE_FILE_SECURELY.equals(action)) {              try {                  /* Input */ @@ -390,7 +391,7 @@ public class KeychainIntentService extends IntentService                  List<ParcelableKeyRing> entries = data.getParcelableArrayList(IMPORT_KEY_LIST);                  PgpImportExport pgpImportExport = new PgpImportExport(this, this); -                OperationResults.ImportResult result = pgpImportExport.importKeyRings(entries); +                ImportKeyResult result = pgpImportExport.importKeyRings(entries);                  Bundle resultData = new Bundle();                  resultData.putParcelable(RESULT, result); @@ -623,6 +624,12 @@ public class KeychainIntentService extends IntentService          }      } +    private void sendMessageToHandler(Integer arg1, OperationResultParcel data) { +        Bundle bundle = new Bundle(); +        bundle.putParcelable(OperationResultParcel.EXTRA_RESULT, data); +        sendMessageToHandler(arg1, null, bundle); +    } +      private void sendMessageToHandler(Integer arg1, Bundle data) {          sendMessageToHandler(arg1, null, data);      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java index 755827482..0cdbe708e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentServiceHandler.java @@ -25,12 +25,11 @@ import android.os.Message;  import android.support.v4.app.FragmentActivity;  import android.support.v4.app.FragmentManager; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  public class KeychainIntentServiceHandler extends Handler { @@ -102,9 +101,9 @@ public class KeychainIntentServiceHandler extends Handler {                  // show error from service                  if (data.containsKey(DATA_ERROR)) { -                    AppMsg.makeText(mActivity, +                    Notify.showNotify(mActivity,                              mActivity.getString(R.string.error_message, data.getString(DATA_ERROR)), -                            AppMsg.STYLE_ALERT).show(); +                            Notify.Style.ERROR);                  }                  break; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java index e55ec5568..99cafd3f9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResultParcel.java @@ -1,10 +1,20 @@  package org.sufficientlysecure.keychain.service; +import android.app.Activity; +import android.content.Intent;  import android.os.Parcel;  import android.os.Parcelable; +import android.view.View; + +import com.github.johnpersano.supertoasts.SuperCardToast; +import com.github.johnpersano.supertoasts.SuperToast; +import com.github.johnpersano.supertoasts.util.OnClickWrapper; +import com.github.johnpersano.supertoasts.util.Style;  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.ui.LogDisplayActivity; +import org.sufficientlysecure.keychain.ui.LogDisplayFragment;  import org.sufficientlysecure.keychain.util.IterableIterator;  import org.sufficientlysecure.keychain.util.Log; @@ -24,6 +34,9 @@ import java.util.List;   *   */  public class OperationResultParcel implements Parcelable { + +    public static final String EXTRA_RESULT = "operation_result"; +      /** Holds the overall result, the number specifying varying degrees of success. The first bit       * is 0 on overall success, 1 on overall failure. All other bits may be used for more specific       * conditions. */ @@ -113,6 +126,68 @@ public class OperationResultParcel implements Parcelable {          }      } +    public SuperCardToast createNotify(final Activity activity) { + +        int resultType = getResult(); + +        String str; +        int duration, color; + +        // Not an overall failure +        if ((resultType & OperationResultParcel.RESULT_ERROR) == 0) { + +            if (getLog().containsWarnings()) { +                duration = 0; +                color = Style.ORANGE; +            } else { +                duration = SuperToast.Duration.LONG; +                color = Style.GREEN; +            } + +            str = "operation succeeded!"; +            // str = activity.getString(R.string.import_error); + +        } else { + +            duration = 0; +            color = Style.RED; + +            str = "operation failed"; +            // str = activity.getString(R.string.import_error); + +        } + +        boolean button = getLog() != null && !getLog().isEmpty(); +        SuperCardToast toast = new SuperCardToast(activity, +                button ? SuperToast.Type.BUTTON : SuperToast.Type.STANDARD, +                Style.getStyle(color, SuperToast.Animations.POPUP)); +        toast.setText(str); +        toast.setDuration(duration); +        toast.setIndeterminate(duration == 0); +        toast.setSwipeToDismiss(true); +        // If we have a log and it's non-empty, show a View Log button +        if (button) { +            toast.setButtonIcon(R.drawable.ic_action_view_as_list, +                    activity.getResources().getString(R.string.view_log)); +            toast.setButtonTextColor(activity.getResources().getColor(R.color.black)); +            toast.setTextColor(activity.getResources().getColor(R.color.black)); +            toast.setOnClickWrapper(new OnClickWrapper("supercardtoast", +                    new SuperToast.OnClickListener() { +                        @Override +                        public void onClick(View view, Parcelable token) { +                            Intent intent = new Intent( +                                    activity, LogDisplayActivity.class); +                            intent.putExtra(LogDisplayFragment.EXTRA_RESULT, OperationResultParcel.this); +                            activity.startActivity(intent); +                        } +                    } +            )); +        } + +        return toast; + +    } +      /** This is an enum of all possible log events.       *       * Element names should generally be prefixed with MSG_XX_ where XX is an @@ -132,6 +207,8 @@ public class OperationResultParcel implements Parcelable {       */      public static enum LogType { +        INTERNAL_ERROR (R.string.internal_error), +          // import public          MSG_IP(R.string.msg_ip),          MSG_IP_APPLY_BATCH (R.string.msg_ip_apply_batch), diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java index fd3d4ed00..6fb0db0e5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/OperationResults.java @@ -12,12 +12,13 @@ import com.github.johnpersano.supertoasts.util.OnClickWrapper;  import com.github.johnpersano.supertoasts.util.Style;  import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;  import org.sufficientlysecure.keychain.ui.LogDisplayActivity;  import org.sufficientlysecure.keychain.ui.LogDisplayFragment;  public abstract class OperationResults { -    public static class ImportResult extends OperationResultParcel { +    public static class ImportKeyResult extends OperationResultParcel {          public final int mNewKeys, mUpdatedKeys, mBadKeys; @@ -47,15 +48,15 @@ public abstract class OperationResults {              return (mResult & RESULT_FAIL_NOTHING) == RESULT_FAIL_NOTHING;          } -        public ImportResult(Parcel source) { +        public ImportKeyResult(Parcel source) {              super(source);              mNewKeys = source.readInt();              mUpdatedKeys = source.readInt();              mBadKeys = source.readInt();          } -        public ImportResult(int result, OperationLog log, -                            int newKeys, int updatedKeys, int badKeys) { +        public ImportKeyResult(int result, OperationLog log, +                               int newKeys, int updatedKeys, int badKeys) {              super(result, log);              mNewKeys = newKeys;              mUpdatedKeys = updatedKeys; @@ -70,17 +71,17 @@ public abstract class OperationResults {              dest.writeInt(mBadKeys);          } -        public static Creator<ImportResult> CREATOR = new Creator<ImportResult>() { -            public ImportResult createFromParcel(final Parcel source) { -                return new ImportResult(source); +        public static Creator<ImportKeyResult> CREATOR = new Creator<ImportKeyResult>() { +            public ImportKeyResult createFromParcel(final Parcel source) { +                return new ImportKeyResult(source);              } -            public ImportResult[] newArray(final int size) { -                return new ImportResult[size]; +            public ImportKeyResult[] newArray(final int size) { +                return new ImportKeyResult[size];              }          }; -        public void displayNotify(final Activity activity) { +        public SuperCardToast createNotify(final Activity activity) {              int resultType = getResult(); @@ -88,11 +89,11 @@ public abstract class OperationResults {              int duration, color;              // Not an overall failure -            if ((resultType & ImportResult.RESULT_ERROR) == 0) { +            if ((resultType & OperationResultParcel.RESULT_ERROR) == 0) {                  String withWarnings;                  // Any warnings? -                if ((resultType & ImportResult.RESULT_WITH_WARNINGS) > 0) { +                if ((resultType & ImportKeyResult.RESULT_WITH_WARNINGS) > 0) {                      duration = 0;                      color = Style.ORANGE;                      withWarnings = activity.getResources().getString(R.string.import_with_warnings); @@ -142,7 +143,7 @@ public abstract class OperationResults {              // If we have a log and it's non-empty, show a View Log button              if (button) {                  toast.setButtonIcon(R.drawable.ic_action_view_as_list, -                        activity.getResources().getString(R.string.import_view_log)); +                        activity.getResources().getString(R.string.view_log));                  toast.setButtonTextColor(activity.getResources().getColor(R.color.black));                  toast.setTextColor(activity.getResources().getColor(R.color.black));                  toast.setOnClickWrapper(new OnClickWrapper("supercardtoast", @@ -151,18 +152,50 @@ public abstract class OperationResults {                              public void onClick(View view, Parcelable token) {                                  Intent intent = new Intent(                                          activity, LogDisplayActivity.class); -                                intent.putExtra(LogDisplayFragment.EXTRA_RESULT, ImportResult.this); +                                intent.putExtra(LogDisplayFragment.EXTRA_RESULT, ImportKeyResult.this);                                  activity.startActivity(intent);                              }                          }                  ));              } -            toast.show(); + +            return toast;          }      } +    public static class EditKeyResult extends OperationResultParcel { + +        private transient UncachedKeyRing mRing; + +        public EditKeyResult(int result, OperationLog log, +                               UncachedKeyRing ring) { +            super(result, log); +            mRing = ring; +        } + +        public UncachedKeyRing getRing() { +            return mRing; +        } + +        public EditKeyResult(Parcel source) { +            super(source); +        } + +        public static Creator<EditKeyResult> CREATOR = new Creator<EditKeyResult>() { +            public EditKeyResult createFromParcel(final Parcel source) { +                return new EditKeyResult(source); +            } + +            public EditKeyResult[] newArray(final int size) { +                return new EditKeyResult[size]; +            } +        }; + +    } + +      public static class SaveKeyringResult extends OperationResultParcel {          public SaveKeyringResult(int result, OperationLog log) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java index 7b888eccb..5e20b24b5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyActivity.java @@ -43,8 +43,6 @@ import android.widget.ListView;  import android.widget.Spinner;  import android.widget.TextView; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.helper.Preferences; @@ -54,10 +52,12 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;  import org.sufficientlysecure.keychain.service.KeychainIntentService;  import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; +import org.sufficientlysecure.keychain.service.OperationResultParcel;  import org.sufficientlysecure.keychain.service.PassphraseCacheService;  import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;  import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  import java.util.ArrayList; @@ -256,8 +256,8 @@ public class CertifyKeyActivity extends ActionBarActivity implements          // Bail out if there is not at least one user id selected          ArrayList<String> userIds = mUserIdsAdapter.getSelectedUserIds();          if (userIds.isEmpty()) { -            AppMsg.makeText(CertifyKeyActivity.this, "No User IDs to sign selected!", -                    AppMsg.STYLE_ALERT).show(); +            Notify.showNotify(CertifyKeyActivity.this, "No Notify.Style IDs to sign selected!", +                    Notify.Style.ERROR);              return;          } @@ -284,8 +284,8 @@ public class CertifyKeyActivity extends ActionBarActivity implements                  if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { -                    AppMsg.makeText(CertifyKeyActivity.this, R.string.key_certify_success, -                            AppMsg.STYLE_INFO).show(); +                    Notify.showNotify(CertifyKeyActivity.this, R.string.key_certify_success, +                            Notify.Style.INFO);                      // check if we need to send the key to the server or not                      if (mUploadKeyCheckbox.isChecked()) { @@ -337,8 +337,10 @@ public class CertifyKeyActivity extends ActionBarActivity implements                  super.handleMessage(message);                  if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { -                    AppMsg.makeText(CertifyKeyActivity.this, R.string.key_send_success, -                            AppMsg.STYLE_INFO).show(); +                    Intent intent = new Intent(); +                    intent.putExtra(OperationResultParcel.EXTRA_RESULT, message.getData()); +                    Notify.showNotify(CertifyKeyActivity.this, R.string.key_send_success, +                            Notify.Style.INFO);                      setResult(RESULT_OK);                      finish(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java index c12b5b7be..56dfdbd95 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFileFragment.java @@ -34,8 +34,6 @@ import android.widget.CheckBox;  import android.widget.EditText;  import android.widget.ImageButton; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.helper.FileHelper; @@ -129,7 +127,6 @@ public class DecryptFileFragment extends DecryptFragment {          }          if (mInputFilename.equals("")) { -            //AppMsg.makeText(getActivity(), R.string.no_file_selected, AppMsg.STYLE_ALERT).show();              Notify.showNotify(getActivity(), R.string.no_file_selected, Notify.Style.ERROR);              return;          } @@ -137,11 +134,8 @@ public class DecryptFileFragment extends DecryptFragment {          if (mInputUri == null && mInputFilename.startsWith("file")) {              File file = new File(mInputFilename);              if (!file.exists() || !file.isFile()) { -                AppMsg.makeText( -                        getActivity(), -                        getString(R.string.error_message, -                                getString(R.string.error_file_not_found)), AppMsg.STYLE_ALERT) -                        .show(); +                Notify.showNotify(getActivity(), getString(R.string.error_message, +                                getString(R.string.error_file_not_found)), Notify.Style.ERROR);                  return;              }          } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java index 46462f924..cf7a0b4b8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptMessageFragment.java @@ -28,8 +28,6 @@ import android.view.View.OnClickListener;  import android.view.ViewGroup;  import android.widget.EditText; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; @@ -38,6 +36,7 @@ import org.sufficientlysecure.keychain.pgp.PgpHelper;  import org.sufficientlysecure.keychain.service.KeychainIntentService;  import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  import java.util.regex.Matcher; @@ -107,12 +106,10 @@ public class DecryptMessageFragment extends DecryptFragment {                  mCiphertext = matcher.group(1);                  decryptStart(null);              } else { -                AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_ALERT) -                        .show(); +                Notify.showNotify(getActivity(), R.string.error_invalid_data, Notify.Style.ERROR);              }          } else { -            AppMsg.makeText(getActivity(), R.string.error_invalid_data, AppMsg.STYLE_ALERT) -                    .show(); +            Notify.showNotify(getActivity(), R.string.error_invalid_data, Notify.Style.ERROR);          }      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java index d80425c3c..6ddaec17f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java @@ -33,7 +33,7 @@ public class EditKeyActivity extends ActionBarActivity {      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState); -        setContentView(R.layout.edit_key_activity_new); +        setContentView(R.layout.edit_key_activity);          Uri dataUri = getIntent().getData();          if (dataUri == null) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivityOld.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivityOld.java deleted file mode 100644 index 70ccb8800..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivityOld.java +++ /dev/null @@ -1,744 +0,0 @@ -/* - * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de> - * Copyright (C) 2010-2014 Thialfihar <thi@thialfihar.org> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program.  If not, see <http://www.gnu.org/licenses/>. - */ - -package org.sufficientlysecure.keychain.ui; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.os.Messenger; -import android.support.v4.app.ActivityCompat; -import android.support.v7.app.ActionBarActivity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.LinearLayout; -import android.widget.Toast; - -import com.devspark.appmsg.AppMsg; - -import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.R; -import org.sufficientlysecure.keychain.helper.ActionBarHelper; -import org.sufficientlysecure.keychain.helper.ExportHelper; -import org.sufficientlysecure.keychain.pgp.KeyRing; -import org.sufficientlysecure.keychain.pgp.UncachedSecretKey; -import org.sufficientlysecure.keychain.pgp.WrappedSecretKey; -import org.sufficientlysecure.keychain.pgp.WrappedSecretKeyRing; -import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; -import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; -import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.PassphraseCacheService; -import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder; -import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment; -import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment; -import org.sufficientlysecure.keychain.ui.widget.Editor; -import org.sufficientlysecure.keychain.ui.widget.Editor.EditorListener; -import org.sufficientlysecure.keychain.ui.widget.KeyEditor; -import org.sufficientlysecure.keychain.ui.widget.SectionView; -import org.sufficientlysecure.keychain.ui.widget.UserIdEditor; -import org.sufficientlysecure.keychain.util.Log; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -import java.util.Vector; - -public class EditKeyActivityOld extends ActionBarActivity implements EditorListener { - -    // Actions for internal use only: -    public static final String ACTION_CREATE_KEY = Constants.INTENT_PREFIX + "CREATE_KEY"; -    public static final String ACTION_EDIT_KEY = Constants.INTENT_PREFIX + "EDIT_KEY"; - -    // possible extra keys -    public static final String EXTRA_USER_IDS = "user_ids"; -    public static final String EXTRA_NO_PASSPHRASE = "no_passphrase"; -    public static final String EXTRA_GENERATE_DEFAULT_KEYS = "generate_default_keys"; - -    // EDIT -    private Uri mDataUri; - -    private SectionView mUserIdsView; -    private SectionView mKeysView; - -    private String mCurrentPassphrase = null; -    private String mNewPassphrase = null; -    private String mSavedNewPassphrase = null; -    private boolean mIsPassphraseSet; -    private boolean mNeedsSaving; -    private boolean mIsBrandNewKeyring = false; - -    private Button mChangePassphrase; - -    private CheckBox mNoPassphrase; - -    Vector<String> mUserIds; -    Vector<UncachedSecretKey> mKeys; -    Vector<Integer> mKeysUsages; -    boolean mMasterCanSign = true; - -    ExportHelper mExportHelper; - -    public boolean needsSaving() { -        mNeedsSaving = (mUserIdsView == null) ? false : mUserIdsView.needsSaving(); -        mNeedsSaving |= (mKeysView == null) ? false : mKeysView.needsSaving(); -        mNeedsSaving |= hasPassphraseChanged(); -        mNeedsSaving |= mIsBrandNewKeyring; -        return mNeedsSaving; -    } - - -    public void somethingChanged() { -        ActivityCompat.invalidateOptionsMenu(this); -    } - -    public void onDeleted(Editor e, boolean wasNewItem) { -        somethingChanged(); -    } - -    public void onEdited() { -        somethingChanged(); -    } - -    @Override -    public void onCreate(Bundle savedInstanceState) { -        super.onCreate(savedInstanceState); - -        mExportHelper = new ExportHelper(this); - -        // Inflate a "Done"/"Cancel" custom action bar view -        ActionBarHelper.setTwoButtonView(getSupportActionBar(), -                R.string.btn_save, R.drawable.ic_action_save, -                new View.OnClickListener() { -                    @Override -                    public void onClick(View v) { -                        // Save -                        saveClicked(); -                    } -                }, R.string.menu_key_edit_cancel, R.drawable.ic_action_cancel, -                new View.OnClickListener() { -                    @Override -                    public void onClick(View v) { -                        // Cancel -                        cancelClicked(); -                    } -                } -        ); - -        mUserIds = new Vector<String>(); -        mKeys = new Vector<UncachedSecretKey>(); -        mKeysUsages = new Vector<Integer>(); - -        // Catch Intents opened from other apps -        Intent intent = getIntent(); -        String action = intent.getAction(); -        if (ACTION_CREATE_KEY.equals(action)) { -            handleActionCreateKey(intent); -        } else if (ACTION_EDIT_KEY.equals(action)) { -            handleActionEditKey(intent); -        } -    } - -    /** -     * Handle intent action to create new key -     * -     * @param intent -     */ -    private void handleActionCreateKey(Intent intent) { -        Bundle extras = intent.getExtras(); - -        mCurrentPassphrase = ""; -        mIsBrandNewKeyring = true; - -        if (extras != null) { -            // if userId is given, prefill the fields -            if (extras.containsKey(EXTRA_USER_IDS)) { -                Log.d(Constants.TAG, "UserIds are given!"); -                mUserIds.add(extras.getString(EXTRA_USER_IDS)); -            } - -            // if no passphrase is given -            if (extras.containsKey(EXTRA_NO_PASSPHRASE)) { -                boolean noPassphrase = extras.getBoolean(EXTRA_NO_PASSPHRASE); -                if (noPassphrase) { -                    // check "no passphrase" checkbox and remove button -                    mNoPassphrase.setChecked(true); -                    mChangePassphrase.setVisibility(View.GONE); -                } -            } - -            // generate key -            if (extras.containsKey(EXTRA_GENERATE_DEFAULT_KEYS)) { -                /* -                boolean generateDefaultKeys = extras.getBoolean(EXTRA_GENERATE_DEFAULT_KEYS); -                if (generateDefaultKeys) { - -                    // fill values for this action -                    Bundle data = new Bundle(); -                    data.putString(KeychainIntentService.GENERATE_KEY_SYMMETRIC_PASSPHRASE, -                            mCurrentPassphrase); - -                    serviceIntent.putExtra(KeychainIntentService.EXTRA_DATA, data); - -                    // Message is received after generating is done in KeychainIntentService -                    KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler( -                            this, getResources().getQuantityString(R.plurals.progress_generating, 1), -                            ProgressDialog.STYLE_HORIZONTAL, true, - -                            new DialogInterface.OnCancelListener() { -                                @Override -                                public void onCancel(DialogInterface dialog) { -                                    // Stop key generation on cancel -                                    stopService(serviceIntent); -                                    EditKeyActivity.this.setResult(Activity.RESULT_CANCELED); -                                    EditKeyActivity.this.finish(); -                                } -                            }) { - -                        @Override -                        public void handleMessage(Message message) { -                            // handle messages by standard KeychainIntentServiceHandler first -                            super.handleMessage(message); - -                            if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { -                                // get new key from data bundle returned from service -                                Bundle data = message.getDataAsStringList(); - -                                ArrayList<UncachedSecretKey> newKeys = -                                        PgpConversionHelper.BytesToPGPSecretKeyList(data -                                                .getByteArray(KeychainIntentService.RESULT_NEW_KEY)); - -                                ArrayList<Integer> keyUsageFlags = data.getIntegerArrayList( -                                        KeychainIntentService.RESULT_KEY_USAGES); - -                                if (newKeys.size() == keyUsageFlags.size()) { -                                    for (int i = 0; i < newKeys.size(); ++i) { -                                        mKeys.add(newKeys.get(i)); -                                        mKeysUsages.add(keyUsageFlags.get(i)); -                                    } -                                } - -                                buildLayout(true); -                            } -                        } -                    }; - -                    // Create a new Messenger for the communication back -                    Messenger messenger = new Messenger(saveHandler); -                    serviceIntent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); - -                    saveHandler.showProgressDialog(this); - -                    // start service with intent -                    startService(serviceIntent); -                } -                */ -            } -        } else { -            buildLayout(false); -        } -    } - -    /** -     * Handle intent action to edit existing key -     * -     * @param intent -     */ -    private void handleActionEditKey(Intent intent) { -        mDataUri = intent.getData(); -        if (mDataUri == null) { -            Log.e(Constants.TAG, "Intent data missing. Should be Uri of key!"); -            finish(); -        } else { -            Log.d(Constants.TAG, "uri: " + mDataUri); - -            try { -                Uri secretUri = KeyRings.buildUnifiedKeyRingUri(mDataUri); -                WrappedSecretKeyRing keyRing = new ProviderHelper(this).getWrappedSecretKeyRing(secretUri); - -                mMasterCanSign = keyRing.getSecretKey().canCertify(); -                for (WrappedSecretKey key : keyRing.secretKeyIterator()) { -                    // Turn into uncached instance -                    mKeys.add(key.getUncached()); -                    mKeysUsages.add(key.getKeyUsage()); // get usage when view is created -                } - -                boolean isSet = false; -                for (String userId : keyRing.getSecretKey().getUserIds()) { -                    Log.d(Constants.TAG, "Added userId " + userId); -                    if (!isSet) { -                        isSet = true; -                        String[] parts = KeyRing.splitUserId(userId); -                        if (parts[0] != null) { -                            setTitle(parts[0]); -                        } -                    } -                    mUserIds.add(userId); -                } - -                buildLayout(false); - -                mCurrentPassphrase = ""; -                mIsPassphraseSet = keyRing.hasPassphrase(); -                if (!mIsPassphraseSet) { -                    // check "no passphrase" checkbox and remove button -                    mNoPassphrase.setChecked(true); -                    mChangePassphrase.setVisibility(View.GONE); -                } - -            } catch (ProviderHelper.NotFoundException e) { -                Log.e(Constants.TAG, "Keyring not found: " + e.getMessage(), e); -                Toast.makeText(this, R.string.error_no_secret_key_found, Toast.LENGTH_SHORT).show(); -                finish(); -            } - -        } -    } - -    /** -     * Shows the dialog to set a new passphrase -     */ -    private void showSetPassphraseDialog() { -        // Message is received after passphrase is cached -        Handler returnHandler = new Handler() { -            @Override -            public void handleMessage(Message message) { -                if (message.what == SetPassphraseDialogFragment.MESSAGE_OKAY) { -                    Bundle data = message.getData(); - -                    // set new returned passphrase! -                    mNewPassphrase = data -                            .getString(SetPassphraseDialogFragment.MESSAGE_NEW_PASSPHRASE); - -                    updatePassphraseButtonText(); -                    somethingChanged(); -                } -            } -        }; - -        // Create a new Messenger for the communication back -        Messenger messenger = new Messenger(returnHandler); - -        // set title based on isPassphraseSet() -        int title; -        if (isPassphraseSet()) { -            title = R.string.title_change_passphrase; -        } else { -            title = R.string.title_set_passphrase; -        } - -        SetPassphraseDialogFragment setPassphraseDialog = SetPassphraseDialogFragment.newInstance( -                messenger, null, title); - -        setPassphraseDialog.show(getSupportFragmentManager(), "setPassphraseDialog"); -    } - -    /** -     * Build layout based on mUserId, mKeys and mKeysUsages Vectors. It creates Views for every user -     * id and key. -     * -     * @param newKeys -     */ -    private void buildLayout(boolean newKeys) { -        setContentView(R.layout.edit_key_activity); - -        // find views -        mChangePassphrase = (Button) findViewById(R.id.edit_key_btn_change_passphrase); -        mNoPassphrase = (CheckBox) findViewById(R.id.edit_key_no_passphrase); -        // Build layout based on given userIds and keys - -        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); - -        LinearLayout container = (LinearLayout) findViewById(R.id.edit_key_container); -        if (mIsPassphraseSet) { -            mChangePassphrase.setText(getString(R.string.btn_change_passphrase)); -        } -        mUserIdsView = (SectionView) inflater.inflate(R.layout.edit_key_section, container, false); -        mUserIdsView.setType(SectionView.TYPE_USER_ID); -        mUserIdsView.setCanBeEdited(mMasterCanSign); -        mUserIdsView.setUserIds(mUserIds); -        mUserIdsView.setEditorListener(this); -        container.addView(mUserIdsView); -        mKeysView = (SectionView) inflater.inflate(R.layout.edit_key_section, container, false); -        mKeysView.setType(SectionView.TYPE_KEY); -        mKeysView.setCanBeEdited(mMasterCanSign); -        mKeysView.setKeys(mKeys, mKeysUsages, newKeys); -        mKeysView.setEditorListener(this); -        container.addView(mKeysView); - -        updatePassphraseButtonText(); - -        mChangePassphrase.setOnClickListener(new OnClickListener() { -            public void onClick(View v) { -                showSetPassphraseDialog(); -            } -        }); - -        // disable passphrase when no passphrase checkbox is checked! -        mNoPassphrase.setOnCheckedChangeListener(new OnCheckedChangeListener() { - -            @Override -            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { -                if (isChecked) { -                    // remove passphrase -                    mSavedNewPassphrase = mNewPassphrase; -                    mNewPassphrase = ""; -                    mChangePassphrase.setVisibility(View.GONE); -                } else { -                    mNewPassphrase = mSavedNewPassphrase; -                    mChangePassphrase.setVisibility(View.VISIBLE); -                } -                somethingChanged(); -            } -        }); -    } - -    private long getMasterKeyId() { -        if (mKeysView.getEditors().getChildCount() == 0) { -            return 0; -        } -        return ((KeyEditor) mKeysView.getEditors().getChildAt(0)).getValue().getKeyId(); -    } - -    public boolean isPassphraseSet() { -        if (mNoPassphrase.isChecked()) { -            return true; -        } else if ((mIsPassphraseSet) -                || (mNewPassphrase != null && !mNewPassphrase.equals(""))) { -            return true; -        } else { -            return false; -        } -    } - -    public boolean hasPassphraseChanged() { -        if (mNoPassphrase != null) { -            if (mNoPassphrase.isChecked()) { -                return mIsPassphraseSet; -            } else { -                return (mNewPassphrase != null && !mNewPassphrase.equals("")); -            } -        } else { -            return false; -        } -    } - -    private void saveClicked() { -        final long masterKeyId = getMasterKeyId(); -        if (needsSaving()) { //make sure, as some versions don't support invalidateOptionsMenu -            try { -                if (!isPassphraseSet()) { -                    throw new PgpGeneralException(this.getString(R.string.set_a_passphrase)); -                } - -                String passphrase; -                if (mIsPassphraseSet) { -                    passphrase = PassphraseCacheService.getCachedPassphrase(this, masterKeyId); -                } else { -                    passphrase = ""; -                } -                if (passphrase == null) { -                    PassphraseDialogFragment.show(this, masterKeyId, -                            new Handler() { -                                @Override -                                public void handleMessage(Message message) { -                                    if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) { -                                        mCurrentPassphrase = PassphraseCacheService.getCachedPassphrase( -                                                EditKeyActivityOld.this, masterKeyId); -                                        checkEmptyIDsWanted(); -                                    } -                                } -                            }); -                } else { -                    mCurrentPassphrase = passphrase; -                    checkEmptyIDsWanted(); -                } -            } catch (PgpGeneralException e) { -                AppMsg.makeText(this, getString(R.string.error_message, e.getMessage()), -                        AppMsg.STYLE_ALERT).show(); -            } -        } else { -            AppMsg.makeText(this, R.string.error_change_something_first, AppMsg.STYLE_ALERT).show(); -        } -    } - -    private void checkEmptyIDsWanted() { -        try { -            ArrayList<String> userIDs = getUserIds(mUserIdsView); -            List<Boolean> newIDs = mUserIdsView.getNewIDFlags(); -            ArrayList<String> originalIDs = mUserIdsView.getOriginalIDs(); -            int curID = 0; -            for (String userID : userIDs) { -                if (userID.equals("") && (!userID.equals(originalIDs.get(curID)) || newIDs.get(curID))) { -                    CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder( -                            EditKeyActivityOld.this); - -                    alert.setIcon(R.drawable.ic_dialog_alert_holo_light); -                    alert.setTitle(R.string.warning); -                    alert.setMessage(EditKeyActivityOld.this.getString(R.string.ask_empty_id_ok)); - -                    alert.setPositiveButton(EditKeyActivityOld.this.getString(android.R.string.yes), -                            new DialogInterface.OnClickListener() { -                                public void onClick(DialogInterface dialog, int id) { -                                    dialog.dismiss(); -                                    finallySaveClicked(); -                                } -                            } -                    ); -                    alert.setNegativeButton(this.getString(android.R.string.no), -                            new DialogInterface.OnClickListener() { -                                public void onClick(DialogInterface dialog, int id) { -                                    dialog.dismiss(); -                                } -                            } -                    ); -                    alert.setCancelable(false); -                    alert.show(); -                    return; -                } -                curID++; -            } -        } catch (PgpGeneralException e) { -            Log.e(Constants.TAG, getString(R.string.error_message, e.getMessage())); -            AppMsg.makeText(this, getString(R.string.error_message, e.getMessage()), AppMsg.STYLE_ALERT).show(); -        } -        finallySaveClicked(); -    } - -    private boolean[] toPrimitiveArray(final List<Boolean> booleanList) { -        final boolean[] primitives = new boolean[booleanList.size()]; -        int index = 0; -        for (Boolean object : booleanList) { -            primitives[index++] = object; -        } -        return primitives; -    } - -    private void finallySaveClicked() { -            /* -        try { -            // Send all information needed to service to edit key in other thread -            Intent intent = new Intent(this, KeychainIntentService.class); - -            intent.setAction(KeychainIntentService.ACTION_SAVE_KEYRING); - -            OldSaveKeyringParcel saveParams = new OldSaveKeyringParcel(); -            saveParams.userIds = getUserIds(mUserIdsView); -            saveParams.originalIDs = mUserIdsView.getOriginalIDs(); -            saveParams.deletedIDs = mUserIdsView.getDeletedIDs(); -            saveParams.newIDs = toPrimitiveArray(mUserIdsView.getNewIDFlags()); -            saveParams.primaryIDChanged = mUserIdsView.primaryChanged(); -            saveParams.moddedKeys = toPrimitiveArray(mKeysView.getNeedsSavingArray()); -            saveParams.deletedKeys = mKeysView.getDeletedKeys(); -            saveParams.keysExpiryDates = getKeysExpiryDates(mKeysView); -            saveParams.keysUsages = getKeysUsages(mKeysView); -            saveParams.mNewPassphrase = mNewPassphrase; -            saveParams.oldPassphrase = mCurrentPassphrase; -            saveParams.newKeys = toPrimitiveArray(mKeysView.getNewKeysArray()); -            saveParams.keys = getKeys(mKeysView); -            saveParams.originalPrimaryID = mUserIdsView.getOriginalPrimaryID(); - -            // fill values for this action -            Bundle data = new Bundle(); -            data.putBoolean(KeychainIntentService.SAVE_KEYRING_CAN_SIGN, mMasterCanSign); -            data.putParcelable(KeychainIntentService.SAVE_KEYRING_PARCEL, saveParams); - -            intent.putExtra(KeychainIntentService.EXTRA_DATA, data); - -            // Message is received after saving is done in KeychainIntentService -            KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(this, -                    getString(R.string.progress_saving), ProgressDialog.STYLE_HORIZONTAL) { -                public void handleMessage(Message message) { -                    // handle messages by standard KeychainIntentServiceHandler first -                    super.handleMessage(message); - -                    if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { -                        Intent data = new Intent(); - -                        // return uri pointing to new created key -                        Uri uri = KeyRings.buildGenericKeyRingUri(getMasterKeyId()); -                        data.setData(uri); - -                        setResult(RESULT_OK, data); -                        finish(); -                    } -                } -            }; - -            // Create a new Messenger for the communication back -            Messenger messenger = new Messenger(saveHandler); -            intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); - -            saveHandler.showProgressDialog(this); - -            // start service with intent -            startService(intent); -        } catch (PgpGeneralException e) { -            Log.e(Constants.TAG, getString(R.string.error_message, e.getMessage())); -            AppMsg.makeText(this, getString(R.string.error_message, e.getMessage()), -                    AppMsg.STYLE_ALERT).show(); -        } -            */ -    } - -    private void cancelClicked() { -        if (needsSaving()) { //ask if we want to save -            CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder( -                    EditKeyActivityOld.this); - -            alert.setIcon(R.drawable.ic_dialog_alert_holo_light); -            alert.setTitle(R.string.warning); -            alert.setMessage(EditKeyActivityOld.this.getString(R.string.ask_save_changed_key)); - -            alert.setPositiveButton(EditKeyActivityOld.this.getString(android.R.string.yes), -                    new DialogInterface.OnClickListener() { -                        public void onClick(DialogInterface dialog, int id) { -                            dialog.dismiss(); -                            saveClicked(); -                        } -                    }); -            alert.setNegativeButton(this.getString(android.R.string.no), -                    new DialogInterface.OnClickListener() { -                        public void onClick(DialogInterface dialog, int id) { -                            dialog.dismiss(); -                            setResult(RESULT_CANCELED); -                            finish(); -                        } -                    }); -            alert.setCancelable(false); -            alert.show(); -        } else { -            setResult(RESULT_CANCELED); -            finish(); -        } -    } - -    /** -     * Returns user ids from the SectionView -     * -     * @param userIdsView -     * @return -     */ -    private ArrayList<String> getUserIds(SectionView userIdsView) throws PgpGeneralException { -        ArrayList<String> userIds = new ArrayList<String>(); - -        ViewGroup userIdEditors = userIdsView.getEditors(); - -        boolean gotMainUserId = false; -        for (int i = 0; i < userIdEditors.getChildCount(); ++i) { -            UserIdEditor editor = (UserIdEditor) userIdEditors.getChildAt(i); -            String userId; -            userId = editor.getValue(); - -            if (editor.isMainUserId()) { -                userIds.add(0, userId); -                gotMainUserId = true; -            } else { -                userIds.add(userId); -            } -        } - -        if (userIds.size() == 0) { -            throw new PgpGeneralException(getString(R.string.error_key_needs_a_user_id)); -        } - -        if (!gotMainUserId) { -            throw new PgpGeneralException(getString(R.string.error_main_user_id_must_not_be_empty)); -        } - -        return userIds; -    } - -    /** -     * Returns keys from the SectionView -     * -     * @param keysView -     * @return -     */ -    private ArrayList<UncachedSecretKey> getKeys(SectionView keysView) throws PgpGeneralException { -        ArrayList<UncachedSecretKey> keys = new ArrayList<UncachedSecretKey>(); - -        ViewGroup keyEditors = keysView.getEditors(); - -        if (keyEditors.getChildCount() == 0) { -            throw new PgpGeneralException(getString(R.string.error_key_needs_master_key)); -        } - -        for (int i = 0; i < keyEditors.getChildCount(); ++i) { -            KeyEditor editor = (KeyEditor) keyEditors.getChildAt(i); -            keys.add(editor.getValue()); -        } - -        return keys; -    } - -    /** -     * Returns usage selections of keys from the SectionView -     * -     * @param keysView -     * @return -     */ -    private ArrayList<Integer> getKeysUsages(SectionView keysView) throws PgpGeneralException { -        ArrayList<Integer> keysUsages = new ArrayList<Integer>(); - -        ViewGroup keyEditors = keysView.getEditors(); - -        if (keyEditors.getChildCount() == 0) { -            throw new PgpGeneralException(getString(R.string.error_key_needs_master_key)); -        } - -        for (int i = 0; i < keyEditors.getChildCount(); ++i) { -            KeyEditor editor = (KeyEditor) keyEditors.getChildAt(i); -            keysUsages.add(editor.getUsage()); -        } - -        return keysUsages; -    } - -    private ArrayList<Calendar> getKeysExpiryDates(SectionView keysView) throws PgpGeneralException { -        ArrayList<Calendar> keysExpiryDates = new ArrayList<Calendar>(); - -        ViewGroup keyEditors = keysView.getEditors(); - -        if (keyEditors.getChildCount() == 0) { -            throw new PgpGeneralException(getString(R.string.error_key_needs_master_key)); -        } - -        for (int i = 0; i < keyEditors.getChildCount(); ++i) { -            KeyEditor editor = (KeyEditor) keyEditors.getChildAt(i); -            keysExpiryDates.add(editor.getExpiryDate()); -        } - -        return keysExpiryDates; -    } - -    private void updatePassphraseButtonText() { -        mChangePassphrase.setText(isPassphraseSet() ? getString(R.string.btn_change_passphrase) -                : getString(R.string.btn_set_passphrase)); -    } - -} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java index b41871a39..5ff864547 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java @@ -48,6 +48,8 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.service.KeychainIntentService;  import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;  import org.sufficientlysecure.keychain.service.OperationResults; +import org.sufficientlysecure.keychain.service.OperationResults.EditKeyResult; +import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult;  import org.sufficientlysecure.keychain.service.PassphraseCacheService;  import org.sufficientlysecure.keychain.service.SaveKeyringParcel;  import org.sufficientlysecure.keychain.ui.adapter.SubkeysAdapter; @@ -466,26 +468,30 @@ public class EditKeyFragment extends LoaderFragment implements                  super.handleMessage(message);                  if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { -                    getActivity().finish(); -                    // TODO below                      // get returned data bundle                      Bundle returnData = message.getData();                      if (returnData == null) {                          return;                      } -                    final OperationResults.SaveKeyringResult result = -                            returnData.getParcelable(KeychainIntentService.RESULT); +                    final OperationResults.EditKeyResult result = +                            returnData.getParcelable(EditKeyResult.EXTRA_RESULT);                      if (result == null) {                          return;                      } -                    // if good -> finish, return result to showkey and display there!                      // if bad -> display here! +                    if (!result.success()) { +                        result.createNotify(getActivity()).show(); +                        return; +                    } -//                    result.displayNotify(ImportKeysActivity.this); +                    // if good -> finish, return result to showkey and display there! +                    Intent intent = new Intent(); +                    intent.putExtra(EditKeyResult.EXTRA_RESULT, result); +                    getActivity().setResult(EditKeyActivity.RESULT_OK, intent); +                    getActivity().finish(); -//                    getActivity().finish();                  }              }          }; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java index fa6d6fab5..345e38a0e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFileFragment.java @@ -37,8 +37,6 @@ import android.widget.EditText;  import android.widget.ImageButton;  import android.widget.Spinner; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.helper.FileHelper; @@ -51,6 +49,7 @@ import org.sufficientlysecure.keychain.ui.dialog.FileDialogFragment;  import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;  import org.sufficientlysecure.keychain.util.Choice;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  import java.io.File; @@ -218,18 +217,18 @@ public class EncryptFileFragment extends Fragment {          }          if (mInputFilename.equals("")) { -            AppMsg.makeText(getActivity(), R.string.no_file_selected, AppMsg.STYLE_ALERT).show(); +            Notify.showNotify(getActivity(), R.string.no_file_selected, Notify.Style.ERROR);              return;          }          if (mInputUri == null && !mInputFilename.startsWith("content")) {              File file = new File(mInputFilename);              if (!file.exists() || !file.isFile()) { -                AppMsg.makeText( +                Notify.showNotify(                          getActivity(),                          getString(R.string.error_message, -                                getString(R.string.error_file_not_found)), AppMsg.STYLE_ALERT) -                        .show(); +                                getString(R.string.error_file_not_found)), Notify.Style.ERROR +                );                  return;              }          } @@ -240,13 +239,13 @@ public class EncryptFileFragment extends Fragment {              boolean gotPassphrase = (mEncryptInterface.getPassphrase() != null                      && mEncryptInterface.getPassphrase().length() != 0);              if (!gotPassphrase) { -                AppMsg.makeText(getActivity(), R.string.passphrase_must_not_be_empty, AppMsg.STYLE_ALERT) -                        .show(); +                Notify.showNotify(getActivity(), R.string.passphrase_must_not_be_empty, Notify.Style.ERROR) +                        ;                  return;              }              if (!mEncryptInterface.getPassphrase().equals(mEncryptInterface.getPassphraseAgain())) { -                AppMsg.makeText(getActivity(), R.string.passphrases_do_not_match, AppMsg.STYLE_ALERT).show(); +                Notify.showNotify(getActivity(), R.string.passphrases_do_not_match, Notify.Style.ERROR);                  return;              }          } else { @@ -256,13 +255,13 @@ public class EncryptFileFragment extends Fragment {                      && mEncryptInterface.getEncryptionKeys().length > 0);              if (!gotEncryptionKeys) { -                AppMsg.makeText(getActivity(), R.string.select_encryption_key, AppMsg.STYLE_ALERT).show(); +                Notify.showNotify(getActivity(), R.string.select_encryption_key, Notify.Style.ERROR);                  return;              }              if (!gotEncryptionKeys && mEncryptInterface.getSignatureKey() == 0) { -                AppMsg.makeText(getActivity(), R.string.select_encryption_or_signature_key, -                        AppMsg.STYLE_ALERT).show(); +                Notify.showNotify(getActivity(), R.string.select_encryption_or_signature_key, +                        Notify.Style.ERROR);                  return;              } @@ -345,8 +344,8 @@ public class EncryptFileFragment extends Fragment {                  super.handleMessage(message);                  if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) { -                    AppMsg.makeText(getActivity(), R.string.encrypt_sign_successful, -                            AppMsg.STYLE_INFO).show(); +                    Notify.showNotify(getActivity(), R.string.encrypt_sign_successful, +                            Notify.Style.INFO);                      if (mDeleteAfter.isChecked()) {                          // Create and show dialog to delete original file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java index 8a6103b16..e1760b4ed 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptMessageFragment.java @@ -30,8 +30,6 @@ import android.view.View;  import android.view.ViewGroup;  import android.widget.TextView; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; @@ -41,6 +39,7 @@ import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;  import org.sufficientlysecure.keychain.service.PassphraseCacheService;  import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  public class EncryptMessageFragment extends Fragment {      public static final String ARG_TEXT = "text"; @@ -126,13 +125,12 @@ public class EncryptMessageFragment extends Fragment {              boolean gotPassphrase = (mEncryptInterface.getPassphrase() != null                      && mEncryptInterface.getPassphrase().length() != 0);              if (!gotPassphrase) { -                AppMsg.makeText(getActivity(), R.string.passphrase_must_not_be_empty, AppMsg.STYLE_ALERT) -                        .show(); +                Notify.showNotify(getActivity(), R.string.passphrase_must_not_be_empty, Notify.Style.ERROR);                  return;              }              if (!mEncryptInterface.getPassphrase().equals(mEncryptInterface.getPassphraseAgain())) { -                AppMsg.makeText(getActivity(), R.string.passphrases_do_not_match, AppMsg.STYLE_ALERT).show(); +                Notify.showNotify(getActivity(), R.string.passphrases_do_not_match, Notify.Style.ERROR);                  return;              } @@ -143,8 +141,8 @@ public class EncryptMessageFragment extends Fragment {                      && mEncryptInterface.getEncryptionKeys().length > 0);              if (!gotEncryptionKeys && mEncryptInterface.getSignatureKey() == 0) { -                AppMsg.makeText(getActivity(), R.string.select_encryption_or_signature_key, -                        AppMsg.STYLE_ALERT).show(); +                Notify.showNotify(getActivity(), R.string.select_encryption_or_signature_key, +                        Notify.Style.ERROR);                  return;              } @@ -226,9 +224,8 @@ public class EncryptMessageFragment extends Fragment {                      if (toClipboard) {                          ClipboardReflection.copyToClipboard(getActivity(), output); -                        AppMsg.makeText(getActivity(), -                                R.string.encrypt_sign_clipboard_successful, AppMsg.STYLE_INFO) -                                .show(); +                        Notify.showNotify(getActivity(), +                                R.string.encrypt_sign_clipboard_successful, Notify.Style.INFO);                      } else {                          Intent sendIntent = new Intent(Intent.ACTION_SEND); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java index 3ff3b56bf..5ab4d69f1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -45,7 +45,7 @@ import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;  import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;  import org.sufficientlysecure.keychain.service.KeychainIntentService;  import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler; -import org.sufficientlysecure.keychain.service.OperationResults.ImportResult; +import org.sufficientlysecure.keychain.service.OperationResults.ImportKeyResult;  import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;  import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout;  import org.sufficientlysecure.keychain.util.Log; @@ -427,7 +427,7 @@ public class ImportKeysActivity extends ActionBarActivity {                      if (returnData == null) {                          return;                      } -                    final ImportResult result = +                    final ImportKeyResult result =                              returnData.getParcelable(KeychainIntentService.RESULT);                      if (result == null) {                          return; @@ -435,7 +435,7 @@ public class ImportKeysActivity extends ActionBarActivity {                      if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(getIntent().getAction())) {                          Intent intent = new Intent(); -                        intent.putExtra(EXTRA_RESULT, result); +                        intent.putExtra(ImportKeyResult.EXTRA_RESULT, result);                          ImportKeysActivity.this.setResult(RESULT_OK, intent);                          ImportKeysActivity.this.finish();                          return; @@ -451,7 +451,7 @@ public class ImportKeysActivity extends ActionBarActivity {                          return;                      } -                    result.displayNotify(ImportKeysActivity.this); +                    result.createNotify(ImportKeysActivity.this).show();                  }              }          }; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java index 588d9ead6..c74f4c96c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListActivity.java @@ -22,8 +22,6 @@ import android.os.Bundle;  import android.view.Menu;  import android.view.MenuItem; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.helper.ExportHelper; @@ -31,6 +29,7 @@ import org.sufficientlysecure.keychain.helper.Preferences;  import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainDatabase;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  import java.io.IOException; @@ -90,21 +89,21 @@ public class KeyListActivity extends DrawerActivity {              case R.id.menu_key_list_debug_read:                  try {                      KeychainDatabase.debugRead(this); -                    AppMsg.makeText(this, "Restored from backup", AppMsg.STYLE_CONFIRM).show(); +                    Notify.showNotify(this, "Restored Notify.Style backup", Notify.Style.INFO);                      getContentResolver().notifyChange(KeychainContract.KeyRings.CONTENT_URI, null);                  } catch (IOException e) {                      Log.e(Constants.TAG, "IO Error", e); -                    AppMsg.makeText(this, "IO Error: " + e.getMessage(), AppMsg.STYLE_ALERT).show(); +                    Notify.showNotify(this, "IO Notify.Style: " + e.getMessage(), Notify.Style.ERROR);                  }                  return true;              case R.id.menu_key_list_debug_write:                  try {                      KeychainDatabase.debugWrite(this); -                    AppMsg.makeText(this, "Backup successful", AppMsg.STYLE_CONFIRM).show(); -                } catch (IOException e) { +                    Notify.showNotify(this, "Backup Notify.Style", Notify.Style.INFO); +                } catch(IOException e) {                      Log.e(Constants.TAG, "IO Error", e); -                    AppMsg.makeText(this, "IO Error: " + e.getMessage(), AppMsg.STYLE_ALERT).show(); +                    Notify.showNotify(this, "IO Notify.Style: " + e.getMessage(), Notify.Style.ERROR);                  }                  return true; @@ -131,4 +130,4 @@ public class KeyListActivity extends DrawerActivity {          startActivity(intent);      } -}
\ No newline at end of file +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index e2321ccf2..9f1ac0cdd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -53,8 +53,6 @@ import android.widget.ListView;  import android.widget.TextView;  import android.widget.Button; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.helper.ExportHelper; @@ -63,6 +61,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;  import org.sufficientlysecure.keychain.util.Highlighter;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  import java.util.Date;  import java.util.HashMap; @@ -338,8 +337,8 @@ public class KeyListFragment extends LoaderFragment      public void showDeleteKeyDialog(final ActionMode mode, long[] masterKeyIds, boolean hasSecret) {          // Can only work on singular secret keys          if(hasSecret && masterKeyIds.length > 1) { -            AppMsg.makeText(getActivity(), R.string.secret_cannot_multiple, -                    AppMsg.STYLE_ALERT).show(); +            Notify.showNotify(getActivity(), R.string.secret_cannot_multiple, +                    Notify.Style.ERROR);              return;          } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index c64cfe417..7a833026b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -19,7 +19,6 @@  package org.sufficientlysecure.keychain.ui;  import android.annotation.TargetApi; -import android.app.Activity;  import android.content.Intent;  import android.database.Cursor;  import android.graphics.PorterDuff; @@ -48,8 +47,6 @@ import android.widget.ImageView;  import android.widget.LinearLayout;  import android.widget.TextView; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.helper.ContactHelper; @@ -58,11 +55,12 @@ import org.sufficientlysecure.keychain.pgp.KeyRing;  import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;  import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.OperationResults.ImportResult; +import org.sufficientlysecure.keychain.service.OperationResultParcel;  import org.sufficientlysecure.keychain.ui.adapter.PagerTabStripAdapter;  import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout.TabColorizer;  import org.sufficientlysecure.keychain.util.Log;  import org.sufficientlysecure.keychain.ui.widget.SlidingTabLayout; +import org.sufficientlysecure.keychain.util.Notify;  import java.util.Date;  import java.util.HashMap; @@ -302,7 +300,7 @@ public class ViewKeyActivity extends ActionBarActivity implements                  }              }          } catch (ProviderHelper.NotFoundException e) { -            AppMsg.makeText(this, R.string.error_key_not_found, AppMsg.STYLE_ALERT).show(); +            Notify.showNotify(this, R.string.error_key_not_found, Notify.Style.ERROR);              Log.e(Constants.TAG, "Key not found", e);          }          return super.onOptionsItemSelected(item); @@ -359,22 +357,11 @@ public class ViewKeyActivity extends ActionBarActivity implements      @Override      protected void onActivityResult(int requestCode, int resultCode, Intent data) { -        switch (requestCode) { -            case REQUEST_CODE_LOOKUP_KEY: { -                if (resultCode == Activity.RESULT_OK) { -                    ImportResult result = data.getParcelableExtra(ImportKeysActivity.EXTRA_RESULT); -                    if (result != null) { -                        result.displayNotify(this); -                    } -                } -                break; -            } - -            default: { -                super.onActivityResult(requestCode, resultCode, data); - -                break; -            } +        if (data != null && data.hasExtra(OperationResultParcel.EXTRA_RESULT)) { +            OperationResultParcel result = data.getParcelableExtra(OperationResultParcel.EXTRA_RESULT); +            result.createNotify(this).show(); +        } else { +            super.onActivityResult(requestCode, resultCode, data);          }      } @@ -462,8 +449,8 @@ public class ViewKeyActivity extends ActionBarActivity implements          public void handleMessage(Message msg) {              switch (msg.what) {                  case NFC_SENT: -                    AppMsg.makeText(ViewKeyActivity.this, R.string.nfc_successful, -                            AppMsg.STYLE_INFO).show(); +                    Notify.showNotify( +                            ViewKeyActivity.this, R.string.nfc_successful, Notify.Style.INFO);                      break;              }          } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java index 50e1c6ad1..a156ff5f1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyMainFragment.java @@ -31,8 +31,6 @@ import android.view.ViewGroup;  import android.widget.ImageView;  import android.widget.ListView; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; @@ -42,6 +40,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  import java.util.Date; @@ -237,7 +236,7 @@ public class ViewKeyMainFragment extends LoaderFragment implements      private void encrypt(Uri dataUri) {          // If there is no encryption key, don't bother.          if (!mHasEncrypt) { -            AppMsg.makeText(getActivity(), R.string.error_no_encrypt_subkey, AppMsg.STYLE_ALERT).show(); +            Notify.showNotify(getActivity(), R.string.error_no_encrypt_subkey, Notify.Style.ERROR);              return;          }          try { @@ -258,13 +257,13 @@ public class ViewKeyMainFragment extends LoaderFragment implements      private void certify(Uri dataUri) {          Intent signIntent = new Intent(getActivity(), CertifyKeyActivity.class);          signIntent.setData(dataUri); -        startActivity(signIntent); +        startActivityForResult(signIntent, 0);      }      private void editKey(Uri dataUri) {          Intent editIntent = new Intent(getActivity(), EditKeyActivity.class);          editIntent.setData(KeychainContract.KeyRingData.buildSecretKeyRingUri(dataUri)); -        startActivity(editIntent); +        startActivityForResult(editIntent, 0);      }  } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java index 053907cc8..e81d5dbf7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyShareFragment.java @@ -40,8 +40,6 @@ import android.view.ViewGroup;  import android.widget.ImageView;  import android.widget.TextView; -import com.devspark.appmsg.AppMsg; -  import org.sufficientlysecure.keychain.Constants;  import org.sufficientlysecure.keychain.R;  import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; @@ -53,6 +51,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.Keys;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.ui.dialog.ShareNfcDialogFragment;  import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Notify;  import org.sufficientlysecure.keychain.util.QrCodeUtils;  import java.io.IOException; @@ -177,13 +176,13 @@ public class ViewKeyShareFragment extends LoaderFragment implements                  } else {                      message = getResources().getString(R.string.key_copied_to_clipboard);                  } -                AppMsg.makeText(getActivity(), message, AppMsg.STYLE_INFO).show(); +                Notify.showNotify(getActivity(), message, Notify.Style.OK);              } else {                  // Android will fail with android.os.TransactionTooLargeException if key is too big                  // see http://www.lonestarprod.com/?p=34                  if (content.length() >= 86389) { -                    AppMsg.makeText(getActivity(), R.string.key_too_big_for_sharing, -                            AppMsg.STYLE_ALERT).show(); +                    Notify.showNotify(getActivity(), R.string.key_too_big_for_sharing, +                            Notify.Style.ERROR);                      return;                  } @@ -201,13 +200,13 @@ public class ViewKeyShareFragment extends LoaderFragment implements              }          } catch (PgpGeneralException e) {              Log.e(Constants.TAG, "error processing key!", e); -            AppMsg.makeText(getActivity(), R.string.error_key_processing, AppMsg.STYLE_ALERT).show(); +            Notify.showNotify(getActivity(), R.string.error_key_processing, Notify.Style.ERROR);          } catch (IOException e) {              Log.e(Constants.TAG, "error processing key!", e); -            AppMsg.makeText(getActivity(), R.string.error_key_processing, AppMsg.STYLE_ALERT).show(); +            Notify.showNotify(getActivity(), R.string.error_key_processing, Notify.Style.ERROR);          } catch (ProviderHelper.NotFoundException e) {              Log.e(Constants.TAG, "key not found!", e); -            AppMsg.makeText(getActivity(), R.string.error_key_not_found, AppMsg.STYLE_ALERT).show(); +            Notify.showNotify(getActivity(), R.string.error_key_not_found, Notify.Style.ERROR);          }      } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Notify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Notify.java index 67f81fb24..22e3f5d66 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Notify.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Notify.java @@ -29,7 +29,7 @@ import com.github.johnpersano.supertoasts.SuperToast;   */  public class Notify { -    public static enum Style {OK, WARN, ERROR} +    public static enum Style {OK, WARN, INFO, ERROR}      /**       * Shows a simple in-layout notification with the CharSequence given as parameter diff --git a/OpenKeychain/src/main/res/layout/edit_key_activity.xml b/OpenKeychain/src/main/res/layout/edit_key_activity.xml index b6c5a1c9a..7e71ccf53 100644 --- a/OpenKeychain/src/main/res/layout/edit_key_activity.xml +++ b/OpenKeychain/src/main/res/layout/edit_key_activity.xml @@ -1,46 +1,15 @@  <?xml version="1.0" encoding="utf-8"?> -<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" -    xmlns:bootstrapbutton="http://schemas.android.com/apk/res-auto" -    android:layout_width="fill_parent" -    android:layout_height="fill_parent" -    android:fillViewport="true" -    android:orientation="vertical" > +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +    android:orientation="vertical" +    android:layout_width="match_parent" +    android:layout_height="match_parent"> -    <LinearLayout -        android:layout_width="fill_parent" -        android:layout_height="wrap_content" -        android:orientation="vertical" -        android:paddingLeft="16dp" -        android:paddingRight="16dp" > +    <include layout="@layout/notify_area"/> -        <TextView -            style="@style/SectionHeader" -            android:layout_width="wrap_content" -            android:layout_height="wrap_content" -            android:padding="4dp" -            android:text="@string/label_passphrase" /> +    <FrameLayout +        android:id="@+id/edit_key_fragment_container" +        android:layout_width="match_parent" +        android:layout_height="match_parent" +        android:orientation="vertical" /> -        <CheckBox -            android:id="@+id/edit_key_no_passphrase" -            android:layout_width="wrap_content" -            android:layout_height="wrap_content" -            android:text="@string/label_no_passphrase" /> - -        <Button -            android:id="@+id/edit_key_btn_change_passphrase" -            android:layout_width="match_parent" -            android:layout_height="60dp" -            android:padding="4dp" -            android:text="@string/btn_set_passphrase" -            android:drawableLeft="@drawable/ic_action_edit" -            android:background="@drawable/button_edgy" /> - -        <LinearLayout -            android:id="@+id/edit_key_container" -            android:layout_width="fill_parent" -            android:layout_height="wrap_content" -            android:orientation="vertical" > -        </LinearLayout> -    </LinearLayout> - -</ScrollView>
\ No newline at end of file +</LinearLayout>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/layout/edit_key_activity_new.xml b/OpenKeychain/src/main/res/layout/edit_key_activity_new.xml deleted file mode 100644 index f96b993c5..000000000 --- a/OpenKeychain/src/main/res/layout/edit_key_activity_new.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" -    android:orientation="vertical" -    android:layout_width="match_parent" -    android:layout_height="match_parent"> - -    <FrameLayout -        android:id="@+id/edit_key_fragment_container" -        android:layout_width="match_parent" -        android:layout_height="match_parent" -        android:orientation="vertical" /> - -</LinearLayout>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/layout/key_list_activity.xml b/OpenKeychain/src/main/res/layout/key_list_activity.xml index c4c2c35cb..6c9bed872 100644 --- a/OpenKeychain/src/main/res/layout/key_list_activity.xml +++ b/OpenKeychain/src/main/res/layout/key_list_activity.xml @@ -2,10 +2,19 @@  <android.support.v4.widget.FixedDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:id="@+id/drawer_layout"      android:layout_width="match_parent" -    android:layout_height="match_parent" > +    android:layout_height="match_parent"> -    <include layout="@layout/key_list_content"/> +    <LinearLayout +        android:orientation="vertical" +        android:layout_width="match_parent" +        android:layout_height="match_parent"> -    <include layout="@layout/drawer_list" /> +        <include layout="@layout/notify_area"/> + +        <include layout="@layout/key_list_content"/> + +        <include layout="@layout/drawer_list" /> + +    </LinearLayout>  </android.support.v4.widget.FixedDrawerLayout>
\ No newline at end of file diff --git a/OpenKeychain/src/main/res/layout/view_key_activity.xml b/OpenKeychain/src/main/res/layout/view_key_activity.xml index 27078c9e4..b15a73c0e 100644 --- a/OpenKeychain/src/main/res/layout/view_key_activity.xml +++ b/OpenKeychain/src/main/res/layout/view_key_activity.xml @@ -4,11 +4,7 @@      android:layout_height="match_parent"      android:orientation="vertical"> -    <LinearLayout -        android:id="@+id/card_container" -        android:layout_width="match_parent" -        android:layout_height="wrap_content" -        android:orientation="vertical" /> +    <include layout="@layout/notify_area"/>      <LinearLayout          android:id="@+id/view_key_status_layout" diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml index 50afd5c57..002243482 100644 --- a/OpenKeychain/src/main/res/values-es/strings.xml +++ b/OpenKeychain/src/main/res/values-es/strings.xml @@ -370,7 +370,7 @@      <item quantity="one">Clave%2$s importada con éxito.</item>      <item quantity="other">%1$d claves%2$s importadas con éxito.</item>    </plurals> -  <string name="import_view_log">Ver registro (log)</string> +  <string name="view_log">Ver registro (log)</string>    <string name="import_error_nothing">No hay nada que importar.</string>    <string name="import_error">¡Error importando claves!</string>    <string name="import_with_warnings">, con advertencias</string> diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index f3627e9eb..a3030a65e 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -358,7 +358,7 @@      <item quantity="one">Clef importée avec succès</item>      <item quantity="other">%1$d clefs importées avec succès</item>    </plurals> -  <string name="import_view_log">Consulter le journal</string> +  <string name="view_log">Consulter le journal</string>    <string name="import_error_nothing">Rien à importer.</string>    <string name="import_error">Erreur lors de l\'importation des clefs !</string>    <string name="import_with_warnings">, avec des avertissements</string> diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml index c8ec2614d..476b7fb31 100644 --- a/OpenKeychain/src/main/res/values-it/strings.xml +++ b/OpenKeychain/src/main/res/values-it/strings.xml @@ -354,7 +354,7 @@    <string name="import_clipboard_button">Ottieni chiave dagli appunti</string>    <string name="import_keybase_button">Ottieni chiave da Keybase.io</string>    <!--Import result toast--> -  <string name="import_view_log">Mostra registro</string> +  <string name="view_log">Mostra registro</string>    <string name="import_error_nothing">Niente da importare</string>    <string name="import_error">Errore di importazione chiavi!</string>    <string name="import_with_warnings">, con avvisi</string> diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index 13463df25..db1150102 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -358,7 +358,7 @@    <plurals name="import_keys_updated">      <item quantity="other">%1$d の鍵%2$sのアップデートに成功。</item>    </plurals> -  <string name="import_view_log">ログを見る</string> +  <string name="view_log">ログを見る</string>    <string name="import_error_nothing">インポートするものがありません。</string>    <string name="import_error">鍵のインポートのエラー!</string>    <string name="import_with_warnings">、とワーニング</string> diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml index 539a431b5..d15e35f50 100644 --- a/OpenKeychain/src/main/res/values-ru/strings.xml +++ b/OpenKeychain/src/main/res/values-ru/strings.xml @@ -371,7 +371,7 @@      <item quantity="few">и обновлено %1$d ключей%2$s.</item>      <item quantity="other">и обновлено %1$d ключей%2$s.</item>    </plurals> -  <string name="import_view_log">Смотреть журнал</string> +  <string name="view_log">Смотреть журнал</string>    <string name="import_error_nothing">Нет данных для импорта.</string>    <string name="import_error">Ошибка импорта ключей!</string>    <string name="import_with_warnings">, с предупреждениями</string> diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml index 6f5cc7cf1..90ad799a5 100644 --- a/OpenKeychain/src/main/res/values-uk/strings.xml +++ b/OpenKeychain/src/main/res/values-uk/strings.xml @@ -352,7 +352,7 @@    <string name="import_clipboard_button">Отримати ключ з буфера обміну</string>    <string name="import_keybase_button">Отримати ключ із Keybase.io</string>    <!--Import result toast--> -  <string name="import_view_log">Переглянути журнал</string> +  <string name="view_log">Переглянути журнал</string>    <string name="import_error_nothing">Нема що імпортувати.</string>    <string name="import_error">Помилка імпорту ключів!</string>    <!--Intent labels--> diff --git a/OpenKeychain/src/main/res/values/colors.xml b/OpenKeychain/src/main/res/values/colors.xml index c0042d215..449a09003 100644 --- a/OpenKeychain/src/main/res/values/colors.xml +++ b/OpenKeychain/src/main/res/values/colors.xml @@ -5,6 +5,7 @@      <color name="emphasis_dark">#9933cc</color>      <color name="bg_gray">#cecbce</color>      <color name="tertiary_text_light">#808080</color> +    <color name="alert">#ffdd3333</color>      <color name="holo_gray_light">#33999999</color>      <color name="holo_gray_bright">#33CCCCCC</color> diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index f6648ca3d..3a5e77d38 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -403,7 +403,7 @@          <item quantity="one">Successfully updated key%2$s.</item>          <item quantity="other">Successfully updated %1$d keys%2$s.</item>      </plurals> -    <string name="import_view_log">View Log</string> +    <string name="view_log">View Log</string>      <string name="import_error_nothing">Nothing to import.</string>      <string name="import_error">Error importing keys!</string>      <string name="import_with_warnings">, with warnings</string> @@ -695,6 +695,7 @@      <string name="passp_cache_notif_pwd">Password</string>      <!-- unsorted --> +    <string name="internal_error">Internal error!</string>      <string name="section_certifier_id">Certifier</string>      <string name="section_cert">Certificate Details</string>      <string name="label_user_id">Identity</string> | 
