From 0db22b55e1e938355f31e1012481c91cb75d608e Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 24 Apr 2017 18:59:43 +0200 Subject: [PATCH] add expiry date info to key status card --- .../keychain/ui/widget/KeyHealthCardView.java | 24 +++++++++++++++++++ .../ui/widget/KeyHealthPresenter.java | 11 +++++++-- .../ui/widget/SubkeyStatusLoader.java | 8 +++---- .../res/layout/key_health_card_content.xml | 24 ++++++++++++++++++- OpenKeychain/src/main/res/values/strings.xml | 2 ++ 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyHealthCardView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyHealthCardView.java index 1f321610c..a62db21f6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyHealthCardView.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyHealthCardView.java @@ -18,12 +18,15 @@ package org.sufficientlysecure.keychain.ui.widget; +import java.util.Date; + import android.content.Context; import android.support.annotation.ColorRes; import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; import android.support.v4.content.ContextCompat; import android.support.v7.widget.CardView; +import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -52,6 +55,8 @@ public class KeyHealthCardView extends CardView implements KeyHealthMvpView, OnC private final View vInsecureLayout; private final TextView vInsecureProblem; private final TextView vInsecureSolution; + private final View vExpiryLayout; + private final TextView vExpiryText; private KeyHealthClickListener keyHealthClickListener; @@ -74,6 +79,9 @@ public class KeyHealthCardView extends CardView implements KeyHealthMvpView, OnC vInsecureLayout = view.findViewById(R.id.key_insecure_layout); vInsecureProblem = (TextView) view.findViewById(R.id.key_insecure_problem); vInsecureSolution = (TextView) view.findViewById(R.id.key_insecure_solution); + + vExpiryLayout = view.findViewById(R.id.key_expiry_layout); + vExpiryText = (TextView) view.findViewById(R.id.key_expiry_text); } private enum KeyHealthDisplayStatus { @@ -147,6 +155,10 @@ public class KeyHealthCardView extends CardView implements KeyHealthMvpView, OnC @Override public void setPrimarySecurityProblem(KeySecurityProblem securityProblem) { + if (securityProblem == null) { + vInsecureLayout.setVisibility(View.GONE); + return; + } vInsecureLayout.setVisibility(View.VISIBLE); if (securityProblem instanceof InsecureBitStrength) { @@ -165,6 +177,18 @@ public class KeyHealthCardView extends CardView implements KeyHealthMvpView, OnC } + @Override + public void setPrimaryExpiryDate(Date expiry) { + if (expiry == null) { + vExpiryLayout.setVisibility(View.GONE); + return; + } + vExpiryLayout.setVisibility(View.VISIBLE); + + String expiryText = DateFormat.getMediumDateFormat(getContext()).format(expiry); + vExpiryText.setText(getResources().getString(R.string.key_expiry_text, expiryText)); + } + @Override public void onClick(View view) { if (keyHealthClickListener != null) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyHealthPresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyHealthPresenter.java index 6ba2ae0e0..cc90cef9b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyHealthPresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyHealthPresenter.java @@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.ui.widget; import java.util.Comparator; +import java.util.Date; import android.content.Context; import android.os.Bundle; @@ -97,6 +98,7 @@ public class KeyHealthPresenter implements LoaderCallbacks { KeyHealthStatus keyHealthStatus = determineKeyHealthStatus(subkeyStatus); boolean isInsecure = keyHealthStatus == KeyHealthStatus.INSECURE; + boolean isExpired = keyHealthStatus == KeyHealthStatus.EXPIRED; if (isInsecure) { boolean primaryKeySecurityProblem = subkeyStatus.keyCertify.mSecurityProblem != null; if (primaryKeySecurityProblem) { @@ -108,10 +110,13 @@ public class KeyHealthPresenter implements LoaderCallbacks { view.setShowExpander(false); displayExpandedInfo(false); } + } else if (isExpired) { + view.setKeyStatus(keyHealthStatus); + view.setPrimaryExpiryDate(subkeyStatus.keyCertify.mExpiry); + view.setShowExpander(false); } else { view.setKeyStatus(keyHealthStatus); - view.setShowExpander( - keyHealthStatus != KeyHealthStatus.EXPIRED && keyHealthStatus != KeyHealthStatus.REVOKED); + view.setShowExpander(keyHealthStatus != KeyHealthStatus.REVOKED); } } @@ -253,6 +258,7 @@ public class KeyHealthPresenter implements LoaderCallbacks { interface KeyHealthMvpView { void setKeyStatus(KeyHealthStatus keyHealthStatus); void setPrimarySecurityProblem(KeySecurityProblem securityProblem); + void setPrimaryExpiryDate(Date expiry); void setShowExpander(boolean showExpander); void showExpandedState(KeyDisplayStatus certifyStatus, KeyDisplayStatus signStatus, @@ -260,6 +266,7 @@ public class KeyHealthPresenter implements LoaderCallbacks { void hideExpandedInfo(); void setOnHealthClickListener(KeyHealthClickListener keyHealthClickListener); + } interface KeyStatusMvpView { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SubkeyStatusLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SubkeyStatusLoader.java index 748f38c95..0ed882b3d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SubkeyStatusLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SubkeyStatusLoader.java @@ -143,6 +143,7 @@ class SubkeyStatusLoader extends AsyncTaskLoader { final Date mCreation; final SecretKeyType mSecretKeyType; final boolean mIsRevoked, mIsExpired; + final Date mExpiry; final boolean mCanCertify, mCanSign, mCanEncrypt; final KeySecurityProblem mSecurityProblem; @@ -155,11 +156,8 @@ class SubkeyStatusLoader extends AsyncTaskLoader { mSecretKeyType = SecretKeyType.fromNum(cursor.getInt(INDEX_HAS_SECRET)); mIsRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0; - Date expiryDate = null; - if (!cursor.isNull(INDEX_EXPIRY)) { - expiryDate = new Date(cursor.getLong(INDEX_EXPIRY) * 1000); - } - mIsExpired = expiryDate != null && expiryDate.before(new Date()); + mExpiry = cursor.isNull(INDEX_EXPIRY) ? null : new Date(cursor.getLong(INDEX_EXPIRY) * 1000); + mIsExpired = mExpiry != null && mExpiry.before(new Date()); mCanCertify = cursor.getInt(INDEX_CAN_CERTIFY) > 0; mCanSign = cursor.getInt(INDEX_CAN_SIGN) > 0; diff --git a/OpenKeychain/src/main/res/layout/key_health_card_content.xml b/OpenKeychain/src/main/res/layout/key_health_card_content.xml index 6fbb6ef6e..1f252ae0d 100644 --- a/OpenKeychain/src/main/res/layout/key_health_card_content.xml +++ b/OpenKeychain/src/main/res/layout/key_health_card_content.xml @@ -89,7 +89,7 @@ android:paddingRight="8dp" android:id="@+id/key_insecure_layout" android:visibility="gone" - tools:visibility="visible"> + tools:visibility="gone"> + + + + + "This key uses the %1$s algorithm, which is not whitelisted." "This key can\'t be upgraded. For secure communication, the owner must generate a new key." + "This key expired on %1$s." +