display sign-only as a special mode like pgp/inline

This commit is contained in:
Vincent Breitmoser 2016-11-14 13:56:15 +01:00
parent 3d434786af
commit b72a3ce8a0
5 changed files with 97 additions and 35 deletions

View file

@ -4,6 +4,7 @@ package com.fsck.k9.activity.compose;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.fsck.k9.activity.compose.RecipientMvpView.CryptoSpecialModeDisplayType;
import com.fsck.k9.activity.compose.RecipientMvpView.CryptoStatusDisplayType; import com.fsck.k9.activity.compose.RecipientMvpView.CryptoStatusDisplayType;
import com.fsck.k9.activity.compose.RecipientPresenter.CryptoMode; import com.fsck.k9.activity.compose.RecipientPresenter.CryptoMode;
import com.fsck.k9.activity.compose.RecipientPresenter.CryptoProviderState; import com.fsck.k9.activity.compose.RecipientPresenter.CryptoProviderState;
@ -43,7 +44,7 @@ public class ComposeCryptoStatus {
return signingKeyId; return signingKeyId;
} }
public CryptoStatusDisplayType getCryptoStatusDisplayType() { CryptoStatusDisplayType getCryptoStatusDisplayType() {
switch (cryptoProviderState) { switch (cryptoProviderState) {
case UNCONFIGURED: case UNCONFIGURED:
return CryptoStatusDisplayType.UNCONFIGURED; return CryptoStatusDisplayType.UNCONFIGURED;
@ -87,6 +88,22 @@ public class ComposeCryptoStatus {
} }
} }
CryptoSpecialModeDisplayType getCryptoSpecialModeDisplayType() {
if (cryptoProviderState != CryptoProviderState.OK) {
return CryptoSpecialModeDisplayType.NONE;
}
if (isPgpInlineModeEnabled()) {
return CryptoSpecialModeDisplayType.PGP_INLINE;
}
if (isSignOnly()) {
return CryptoSpecialModeDisplayType.SIGN_ONLY;
}
return CryptoSpecialModeDisplayType.NONE;
}
public boolean shouldUsePgpMessageBuilder() { public boolean shouldUsePgpMessageBuilder() {
return cryptoProviderState != CryptoProviderState.UNCONFIGURED && cryptoMode != CryptoMode.DISABLE; return cryptoProviderState != CryptoProviderState.UNCONFIGURED && cryptoMode != CryptoMode.DISABLE;
} }
@ -223,11 +240,11 @@ public class ComposeCryptoStatus {
return null; return null;
} }
public enum AttachErrorState { enum AttachErrorState {
IS_INLINE IS_INLINE
} }
public AttachErrorState getAttachErrorStateOrNull() { AttachErrorState getAttachErrorStateOrNull() {
if (cryptoProviderState == CryptoProviderState.UNCONFIGURED) { if (cryptoProviderState == CryptoProviderState.UNCONFIGURED) {
return null; return null;
} }

View file

@ -33,7 +33,10 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
private static final int VIEW_INDEX_CRYPTO_STATUS_DISABLED_NO_KEY = 4; private static final int VIEW_INDEX_CRYPTO_STATUS_DISABLED_NO_KEY = 4;
private static final int VIEW_INDEX_CRYPTO_STATUS_UNTRUSTED = 5; private static final int VIEW_INDEX_CRYPTO_STATUS_UNTRUSTED = 5;
private static final int VIEW_INDEX_CRYPTO_STATUS_TRUSTED = 6; private static final int VIEW_INDEX_CRYPTO_STATUS_TRUSTED = 6;
private static final int VIEW_INDEX_CRYPTO_STATUS_SIGN_ONLY = 7; private static final int VIEW_INDEX_CRYPTO_STATUS_SIGN_ONLY = 0;
private static final int VIEW_INDEX_CRYPTO_SPECIAL_PGP_INLINE = 0;
private static final int VIEW_INDEX_CRYPTO_SPECIAL_SIGN_ONLY = 1;
private static final int VIEW_INDEX_BCC_EXPANDER_VISIBLE = 0; private static final int VIEW_INDEX_BCC_EXPANDER_VISIBLE = 0;
private static final int VIEW_INDEX_BCC_EXPANDER_HIDDEN = 1; private static final int VIEW_INDEX_BCC_EXPANDER_HIDDEN = 1;
@ -48,7 +51,7 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
private final RecipientSelectView bccView; private final RecipientSelectView bccView;
private final ViewAnimator cryptoStatusView; private final ViewAnimator cryptoStatusView;
private final ViewAnimator recipientExpanderContainer; private final ViewAnimator recipientExpanderContainer;
private final View pgpInlineIndicator; private final ViewAnimator cryptoSpecialModeIndicator;
private RecipientPresenter presenter; private RecipientPresenter presenter;
@ -65,7 +68,8 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
recipientExpanderContainer = (ViewAnimator) activity.findViewById(R.id.recipient_expander_container); recipientExpanderContainer = (ViewAnimator) activity.findViewById(R.id.recipient_expander_container);
cryptoStatusView = (ViewAnimator) activity.findViewById(R.id.crypto_status); cryptoStatusView = (ViewAnimator) activity.findViewById(R.id.crypto_status);
cryptoStatusView.setOnClickListener(this); cryptoStatusView.setOnClickListener(this);
pgpInlineIndicator = activity.findViewById(R.id.pgp_inline_indicator); cryptoSpecialModeIndicator = (ViewAnimator) activity.findViewById(R.id.crypto_special_mode);
cryptoSpecialModeIndicator.setOnClickListener(this);
toView.setOnFocusChangeListener(this); toView.setOnFocusChangeListener(this);
ccView.setOnFocusChangeListener(this); ccView.setOnFocusChangeListener(this);
@ -80,8 +84,6 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
toLabel.setOnClickListener(this); toLabel.setOnClickListener(this);
ccLabel.setOnClickListener(this); ccLabel.setOnClickListener(this);
bccLabel.setOnClickListener(this); bccLabel.setOnClickListener(this);
pgpInlineIndicator.setOnClickListener(this);
} }
public void setPresenter(final RecipientPresenter presenter) { public void setPresenter(final RecipientPresenter presenter) {
@ -282,12 +284,19 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
bccView.setError(bccView.getContext().getString(R.string.compose_error_incomplete_recipient)); bccView.setError(bccView.getContext().getString(R.string.compose_error_incomplete_recipient));
} }
public void showPgpInlineModeIndicator(boolean pgpInlineModeEnabled) { public void showCryptoSpecialMode(CryptoSpecialModeDisplayType cryptoSpecialModeDisplayType) {
pgpInlineIndicator.setVisibility(pgpInlineModeEnabled ? View.VISIBLE : View.GONE); boolean shouldBeHidden = cryptoSpecialModeDisplayType.childToDisplay == VIEW_INDEX_HIDDEN;
if (shouldBeHidden) {
cryptoSpecialModeIndicator.setVisibility(View.GONE);
return;
}
cryptoSpecialModeIndicator.setVisibility(View.VISIBLE);
cryptoSpecialModeIndicator.setDisplayedChild(cryptoSpecialModeDisplayType.childToDisplay);
activity.invalidateOptionsMenu(); activity.invalidateOptionsMenu();
} }
public void showCryptoStatus(final CryptoStatusDisplayType cryptoStatusDisplayType) { public void showCryptoStatus(CryptoStatusDisplayType cryptoStatusDisplayType) {
boolean shouldBeHidden = cryptoStatusDisplayType.childToDisplay == VIEW_INDEX_HIDDEN; boolean shouldBeHidden = cryptoStatusDisplayType.childToDisplay == VIEW_INDEX_HIDDEN;
if (shouldBeHidden) { if (shouldBeHidden) {
cryptoStatusView.setVisibility(View.GONE); cryptoStatusView.setVisibility(View.GONE);
@ -295,14 +304,17 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
} }
cryptoStatusView.setVisibility(View.VISIBLE); cryptoStatusView.setVisibility(View.VISIBLE);
int childToDisplay = cryptoStatusDisplayType.childToDisplay; cryptoStatusView.setDisplayedChild(cryptoStatusDisplayType.childToDisplay);
cryptoStatusView.setDisplayedChild(childToDisplay);
} }
public void showContactPicker(int requestCode) { public void showContactPicker(int requestCode) {
activity.showContactPicker(requestCode); activity.showContactPicker(requestCode);
} }
public void showErrorIsSignOnly() {
Toast.makeText(activity, R.string.error_sign_only_no_encryption, Toast.LENGTH_LONG).show();
}
public void showErrorContactNoAddress() { public void showErrorContactNoAddress() {
Toast.makeText(activity, R.string.error_contact_address_not_found, Toast.LENGTH_LONG).show(); Toast.makeText(activity, R.string.error_contact_address_not_found, Toast.LENGTH_LONG).show();
} }
@ -372,8 +384,8 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
presenter.onClickCryptoStatus(); presenter.onClickCryptoStatus();
break; break;
} }
case R.id.pgp_inline_indicator: { case R.id.crypto_special_mode: {
presenter.onClickPgpInlineIndicator(); presenter.onClickCryptoSpecialModeIndicator();
} }
} }
} }
@ -384,12 +396,12 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
} }
public void showOpenPgpInlineDialog(boolean firstTime) { public void showOpenPgpInlineDialog(boolean firstTime) {
PgpInlineDialog dialog = PgpInlineDialog.newInstance(firstTime, R.id.pgp_inline_indicator); PgpInlineDialog dialog = PgpInlineDialog.newInstance(firstTime, R.id.crypto_special_mode);
dialog.show(activity.getFragmentManager(), "openpgp_inline"); dialog.show(activity.getFragmentManager(), "openpgp_inline");
} }
public void showOpenPgpSignOnlyDialog(boolean firstTime) { public void showOpenPgpSignOnlyDialog(boolean firstTime) {
PgpSignOnlyDialog dialog = PgpSignOnlyDialog.newInstance(firstTime, R.id.crypto_status); PgpSignOnlyDialog dialog = PgpSignOnlyDialog.newInstance(firstTime, R.id.crypto_special_mode);
dialog.show(activity.getFragmentManager(), "openpgp_signonly"); dialog.show(activity.getFragmentManager(), "openpgp_signonly");
} }
@ -425,4 +437,17 @@ public class RecipientMvpView implements OnFocusChangeListener, OnClickListener
this.childToDisplay = childToDisplay; this.childToDisplay = childToDisplay;
} }
} }
public enum CryptoSpecialModeDisplayType {
NONE(VIEW_INDEX_HIDDEN),
PGP_INLINE(VIEW_INDEX_CRYPTO_SPECIAL_PGP_INLINE),
SIGN_ONLY(VIEW_INDEX_CRYPTO_SPECIAL_SIGN_ONLY);
final int childToDisplay;
CryptoSpecialModeDisplayType(int childToDisplay) {
this.childToDisplay = childToDisplay;
}
}
} }

View file

@ -351,7 +351,7 @@ public class RecipientPresenter implements PermissionPingCallback {
} }
recipientMvpView.showCryptoStatus(getCurrentCryptoStatus().getCryptoStatusDisplayType()); recipientMvpView.showCryptoStatus(getCurrentCryptoStatus().getCryptoStatusDisplayType());
recipientMvpView.showPgpInlineModeIndicator(getCurrentCryptoStatus().isPgpInlineModeEnabled()); recipientMvpView.showCryptoSpecialMode(getCurrentCryptoStatus().getCryptoSpecialModeDisplayType());
} }
public ComposeCryptoStatus getCurrentCryptoStatus() { public ComposeCryptoStatus getCurrentCryptoStatus() {
@ -551,7 +551,7 @@ public class RecipientPresenter implements PermissionPingCallback {
return; return;
case OK: case OK:
if (cachedCryptoStatus.isSignOnly()) { if (cachedCryptoStatus.isSignOnly()) {
recipientMvpView.showOpenPgpSignOnlyDialog(false); recipientMvpView.showErrorIsSignOnly();
} else { } else {
recipientMvpView.showCryptoDialog(currentCryptoMode); recipientMvpView.showCryptoDialog(currentCryptoMode);
} }
@ -765,8 +765,15 @@ public class RecipientPresenter implements PermissionPingCallback {
return false; return false;
} }
public void onClickPgpInlineIndicator() { void onClickCryptoSpecialModeIndicator() {
recipientMvpView.showOpenPgpInlineDialog(false); ComposeCryptoStatus currentCryptoStatus = getCurrentCryptoStatus();
if (currentCryptoStatus.isPgpInlineModeEnabled()) {
recipientMvpView.showOpenPgpInlineDialog(false);
} else if (currentCryptoStatus.isSignOnly()) {
recipientMvpView.showOpenPgpSignOnlyDialog(false);
} else {
throw new IllegalStateException("This icon should not be clickable while no special mode is active!");
}
} }
public enum CryptoProviderState { public enum CryptoProviderState {

View file

@ -47,17 +47,37 @@
style="@style/ComposeEditText" style="@style/ComposeEditText"
/> />
<ImageView <com.fsck.k9.view.ToolableViewAnimator
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="8dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:id="@+id/pgp_inline_indicator" android:padding="8dp"
android:src="@drawable/compatibility" android:id="@+id/crypto_special_mode"
android:tint="@color/light_black"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" tools:visibility="visible"
/> android:inAnimation="@anim/fade_in"
android:outAnimation="@anim/fade_out"
custom:previewInitialChild="0">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/compatibility"
android:tint="@color/light_black"
android:visibility="gone"
tools:visibility="visible"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/status_signature_verified_cutout"
android:tint="?attr/openpgp_blue"
/>
</com.fsck.k9.view.ToolableViewAnimator>
<com.fsck.k9.view.ToolableViewAnimator <com.fsck.k9.view.ToolableViewAnimator
@ -205,14 +225,6 @@
</FrameLayout> </FrameLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/status_signature_verified_cutout"
android:tint="?attr/openpgp_blue"
/>
</com.fsck.k9.view.ToolableViewAnimator> </com.fsck.k9.view.ToolableViewAnimator>
</LinearLayout> </LinearLayout>

View file

@ -1229,5 +1229,6 @@ Please submit bug reports, contribute new features and ask questions at
<string name="recipient_error_non_ascii">Special characters are currently not supported!</string> <string name="recipient_error_non_ascii">Special characters are currently not supported!</string>
<string name="recipient_error_parse_failed">Error parsing address!</string> <string name="recipient_error_parse_failed">Error parsing address!</string>
<string name="account_settings_crypto_support_sign_only">Support signing of unencrypted messages</string> <string name="account_settings_crypto_support_sign_only">Support signing of unencrypted messages</string>
<string name="error_sign_only_no_encryption">Encryption unavailable in sign-only mode!</string>
</resources> </resources>