add expiry date info to key status card
This commit is contained in:
@@ -18,12 +18,15 @@
|
|||||||
package org.sufficientlysecure.keychain.ui.widget;
|
package org.sufficientlysecure.keychain.ui.widget;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.annotation.ColorRes;
|
import android.support.annotation.ColorRes;
|
||||||
import android.support.annotation.DrawableRes;
|
import android.support.annotation.DrawableRes;
|
||||||
import android.support.annotation.StringRes;
|
import android.support.annotation.StringRes;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.support.v7.widget.CardView;
|
import android.support.v7.widget.CardView;
|
||||||
|
import android.text.format.DateFormat;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -52,6 +55,8 @@ public class KeyHealthCardView extends CardView implements KeyHealthMvpView, OnC
|
|||||||
private final View vInsecureLayout;
|
private final View vInsecureLayout;
|
||||||
private final TextView vInsecureProblem;
|
private final TextView vInsecureProblem;
|
||||||
private final TextView vInsecureSolution;
|
private final TextView vInsecureSolution;
|
||||||
|
private final View vExpiryLayout;
|
||||||
|
private final TextView vExpiryText;
|
||||||
|
|
||||||
private KeyHealthClickListener keyHealthClickListener;
|
private KeyHealthClickListener keyHealthClickListener;
|
||||||
|
|
||||||
@@ -74,6 +79,9 @@ public class KeyHealthCardView extends CardView implements KeyHealthMvpView, OnC
|
|||||||
vInsecureLayout = view.findViewById(R.id.key_insecure_layout);
|
vInsecureLayout = view.findViewById(R.id.key_insecure_layout);
|
||||||
vInsecureProblem = (TextView) view.findViewById(R.id.key_insecure_problem);
|
vInsecureProblem = (TextView) view.findViewById(R.id.key_insecure_problem);
|
||||||
vInsecureSolution = (TextView) view.findViewById(R.id.key_insecure_solution);
|
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 {
|
private enum KeyHealthDisplayStatus {
|
||||||
@@ -147,6 +155,10 @@ public class KeyHealthCardView extends CardView implements KeyHealthMvpView, OnC
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPrimarySecurityProblem(KeySecurityProblem securityProblem) {
|
public void setPrimarySecurityProblem(KeySecurityProblem securityProblem) {
|
||||||
|
if (securityProblem == null) {
|
||||||
|
vInsecureLayout.setVisibility(View.GONE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
vInsecureLayout.setVisibility(View.VISIBLE);
|
vInsecureLayout.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
if (securityProblem instanceof InsecureBitStrength) {
|
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
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
if (keyHealthClickListener != null) {
|
if (keyHealthClickListener != null) {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.ui.widget;
|
|||||||
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -97,6 +98,7 @@ public class KeyHealthPresenter implements LoaderCallbacks<KeySubkeyStatus> {
|
|||||||
KeyHealthStatus keyHealthStatus = determineKeyHealthStatus(subkeyStatus);
|
KeyHealthStatus keyHealthStatus = determineKeyHealthStatus(subkeyStatus);
|
||||||
|
|
||||||
boolean isInsecure = keyHealthStatus == KeyHealthStatus.INSECURE;
|
boolean isInsecure = keyHealthStatus == KeyHealthStatus.INSECURE;
|
||||||
|
boolean isExpired = keyHealthStatus == KeyHealthStatus.EXPIRED;
|
||||||
if (isInsecure) {
|
if (isInsecure) {
|
||||||
boolean primaryKeySecurityProblem = subkeyStatus.keyCertify.mSecurityProblem != null;
|
boolean primaryKeySecurityProblem = subkeyStatus.keyCertify.mSecurityProblem != null;
|
||||||
if (primaryKeySecurityProblem) {
|
if (primaryKeySecurityProblem) {
|
||||||
@@ -108,10 +110,13 @@ public class KeyHealthPresenter implements LoaderCallbacks<KeySubkeyStatus> {
|
|||||||
view.setShowExpander(false);
|
view.setShowExpander(false);
|
||||||
displayExpandedInfo(false);
|
displayExpandedInfo(false);
|
||||||
}
|
}
|
||||||
|
} else if (isExpired) {
|
||||||
|
view.setKeyStatus(keyHealthStatus);
|
||||||
|
view.setPrimaryExpiryDate(subkeyStatus.keyCertify.mExpiry);
|
||||||
|
view.setShowExpander(false);
|
||||||
} else {
|
} else {
|
||||||
view.setKeyStatus(keyHealthStatus);
|
view.setKeyStatus(keyHealthStatus);
|
||||||
view.setShowExpander(
|
view.setShowExpander(keyHealthStatus != KeyHealthStatus.REVOKED);
|
||||||
keyHealthStatus != KeyHealthStatus.EXPIRED && keyHealthStatus != KeyHealthStatus.REVOKED);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,6 +258,7 @@ public class KeyHealthPresenter implements LoaderCallbacks<KeySubkeyStatus> {
|
|||||||
interface KeyHealthMvpView {
|
interface KeyHealthMvpView {
|
||||||
void setKeyStatus(KeyHealthStatus keyHealthStatus);
|
void setKeyStatus(KeyHealthStatus keyHealthStatus);
|
||||||
void setPrimarySecurityProblem(KeySecurityProblem securityProblem);
|
void setPrimarySecurityProblem(KeySecurityProblem securityProblem);
|
||||||
|
void setPrimaryExpiryDate(Date expiry);
|
||||||
|
|
||||||
void setShowExpander(boolean showExpander);
|
void setShowExpander(boolean showExpander);
|
||||||
void showExpandedState(KeyDisplayStatus certifyStatus, KeyDisplayStatus signStatus,
|
void showExpandedState(KeyDisplayStatus certifyStatus, KeyDisplayStatus signStatus,
|
||||||
@@ -260,6 +266,7 @@ public class KeyHealthPresenter implements LoaderCallbacks<KeySubkeyStatus> {
|
|||||||
void hideExpandedInfo();
|
void hideExpandedInfo();
|
||||||
|
|
||||||
void setOnHealthClickListener(KeyHealthClickListener keyHealthClickListener);
|
void setOnHealthClickListener(KeyHealthClickListener keyHealthClickListener);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface KeyStatusMvpView {
|
interface KeyStatusMvpView {
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ class SubkeyStatusLoader extends AsyncTaskLoader<KeySubkeyStatus> {
|
|||||||
final Date mCreation;
|
final Date mCreation;
|
||||||
final SecretKeyType mSecretKeyType;
|
final SecretKeyType mSecretKeyType;
|
||||||
final boolean mIsRevoked, mIsExpired;
|
final boolean mIsRevoked, mIsExpired;
|
||||||
|
final Date mExpiry;
|
||||||
final boolean mCanCertify, mCanSign, mCanEncrypt;
|
final boolean mCanCertify, mCanSign, mCanEncrypt;
|
||||||
final KeySecurityProblem mSecurityProblem;
|
final KeySecurityProblem mSecurityProblem;
|
||||||
|
|
||||||
@@ -155,11 +156,8 @@ class SubkeyStatusLoader extends AsyncTaskLoader<KeySubkeyStatus> {
|
|||||||
mSecretKeyType = SecretKeyType.fromNum(cursor.getInt(INDEX_HAS_SECRET));
|
mSecretKeyType = SecretKeyType.fromNum(cursor.getInt(INDEX_HAS_SECRET));
|
||||||
|
|
||||||
mIsRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0;
|
mIsRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0;
|
||||||
Date expiryDate = null;
|
mExpiry = cursor.isNull(INDEX_EXPIRY) ? null : new Date(cursor.getLong(INDEX_EXPIRY) * 1000);
|
||||||
if (!cursor.isNull(INDEX_EXPIRY)) {
|
mIsExpired = mExpiry != null && mExpiry.before(new Date());
|
||||||
expiryDate = new Date(cursor.getLong(INDEX_EXPIRY) * 1000);
|
|
||||||
}
|
|
||||||
mIsExpired = expiryDate != null && expiryDate.before(new Date());
|
|
||||||
|
|
||||||
mCanCertify = cursor.getInt(INDEX_CAN_CERTIFY) > 0;
|
mCanCertify = cursor.getInt(INDEX_CAN_CERTIFY) > 0;
|
||||||
mCanSign = cursor.getInt(INDEX_CAN_SIGN) > 0;
|
mCanSign = cursor.getInt(INDEX_CAN_SIGN) > 0;
|
||||||
|
|||||||
@@ -89,7 +89,7 @@
|
|||||||
android:paddingRight="8dp"
|
android:paddingRight="8dp"
|
||||||
android:id="@+id/key_insecure_layout"
|
android:id="@+id/key_insecure_layout"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible">
|
tools:visibility="gone">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
@@ -125,6 +125,28 @@
|
|||||||
tools:text="@string/key_insecure_bitstrength_2048_solution" />
|
tools:text="@string/key_insecure_bitstrength_2048_solution" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
android:id="@+id/key_expiry_layout"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:id="@+id/key_expiry_text"
|
||||||
|
android:textAppearance="?android:textAppearanceSmall"
|
||||||
|
tools:text="@string/key_expiry_text"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<org.sufficientlysecure.keychain.ui.widget.KeyStatusList
|
<org.sufficientlysecure.keychain.ui.widget.KeyStatusList
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|||||||
@@ -1861,4 +1861,6 @@
|
|||||||
<string name="key_insecure_unknown_curve_problem">"This key uses the <b>%1$s</b> algorithm, which is not whitelisted."</string>
|
<string name="key_insecure_unknown_curve_problem">"This key uses the <b>%1$s</b> algorithm, which is not whitelisted."</string>
|
||||||
<string name="key_insecure_unknown_curve_solution">"This key can\'t be upgraded. For secure communication, the owner must generate a new key."</string>
|
<string name="key_insecure_unknown_curve_solution">"This key can\'t be upgraded. For secure communication, the owner must generate a new key."</string>
|
||||||
|
|
||||||
|
<string name="key_expiry_text">"This key expired on <b>%1$s</b>."</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user