add override button to security problem dialog
This commit is contained in:
@@ -39,12 +39,14 @@ import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.ViewAnimator;
|
||||
|
||||
import org.sufficientlysecure.keychain.R;
|
||||
import org.sufficientlysecure.keychain.remote.ui.SecurityProblemPresenter.RemoteSecurityProblemView;
|
||||
import org.sufficientlysecure.keychain.ui.dialog.CustomAlertDialogBuilder;
|
||||
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
|
||||
import org.sufficientlysecure.keychain.ui.util.ThemeChanger;
|
||||
import org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator;
|
||||
|
||||
|
||||
public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
|
||||
@@ -79,11 +81,17 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
|
||||
}
|
||||
|
||||
public static class RemoteRegisterDialogFragment extends DialogFragment {
|
||||
public static final int SECONDARY_CHILD_NONE = 0;
|
||||
public static final int SECONDARY_CHILD_RECOMMENDATION = 1;
|
||||
public static final int SECONDARY_CHILD_OVERRIDE = 2;
|
||||
public static final int SECONDARY_CHILD_OVERRIDE_OK = 3;
|
||||
private SecurityProblemPresenter presenter;
|
||||
private RemoteSecurityProblemView mvpView;
|
||||
|
||||
private Button buttonGotIt;
|
||||
private Button buttonViewKey;
|
||||
private Button buttonOverride;
|
||||
private Button buttonOverrideUndo;
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
@@ -99,6 +107,8 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
|
||||
|
||||
buttonGotIt = (Button) view.findViewById(R.id.button_allow);
|
||||
buttonViewKey = (Button) view.findViewById(R.id.button_view_key);
|
||||
buttonOverride = (Button) view.findViewById(R.id.button_override);
|
||||
buttonOverrideUndo = (Button) view.findViewById(R.id.button_override_undo);
|
||||
|
||||
setupListenersForPresenter();
|
||||
mvpView = createMvpView(view);
|
||||
@@ -139,9 +149,13 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
|
||||
final ImageView iconClientApp = (ImageView) view.findViewById(R.id.icon_client_app);
|
||||
final TextView explanationText = (TextView) insecureWarningLayout.findViewById(R.id.dialog_insecure_text);
|
||||
final TextView recommendText = (TextView) insecureWarningLayout.findViewById(R.id.dialog_insecure_recommend_text);
|
||||
final View recommendLayout = insecureWarningLayout.findViewById(R.id.dialog_insecure_recommend_layout);
|
||||
final TextView overrideText = (TextView) insecureWarningLayout.findViewById(R.id.dialog_insecure_override_text);
|
||||
final ToolableViewAnimator secondaryLayoutAnimator =
|
||||
(ToolableViewAnimator) insecureWarningLayout.findViewById(R.id.dialog_insecure_secondary_layout);
|
||||
|
||||
return new RemoteSecurityProblemView() {
|
||||
private boolean layoutInitialized = false;
|
||||
|
||||
@Override
|
||||
public void finishAsCancelled() {
|
||||
FragmentActivity activity = getActivity();
|
||||
@@ -167,26 +181,30 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
|
||||
|
||||
private void showGeneric(@StringRes int explanationStringRes) {
|
||||
explanationText.setText(explanationStringRes);
|
||||
recommendLayout.setVisibility(View.GONE);
|
||||
secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_NONE, layoutInitialized);
|
||||
layoutInitialized = true;
|
||||
}
|
||||
|
||||
private void showGeneric(String explanationString) {
|
||||
explanationText.setText(explanationString);
|
||||
recommendLayout.setVisibility(View.GONE);
|
||||
secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_NONE, layoutInitialized);
|
||||
layoutInitialized = true;
|
||||
}
|
||||
|
||||
private void showGenericWithRecommendation(
|
||||
@StringRes int explanationStringRes, @StringRes int recommendationStringRes) {
|
||||
explanationText.setText(explanationStringRes);
|
||||
recommendText.setText(recommendationStringRes);
|
||||
recommendLayout.setVisibility(View.VISIBLE);
|
||||
secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_RECOMMENDATION, layoutInitialized);
|
||||
layoutInitialized = true;
|
||||
}
|
||||
|
||||
private void showGenericWithRecommendation(
|
||||
String explanationString, @StringRes int recommendationStringRes) {
|
||||
explanationText.setText(explanationString);
|
||||
recommendText.setText(recommendationStringRes);
|
||||
recommendLayout.setVisibility(View.VISIBLE);
|
||||
secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_RECOMMENDATION, layoutInitialized);
|
||||
layoutInitialized = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -246,10 +264,33 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
|
||||
showGeneric(R.string.insecure_sign_unidentified);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showOverrideMessage(int countdown) {
|
||||
secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_OVERRIDE, true);
|
||||
overrideText.setText(getString(R.string.dialog_insecure_override, countdown));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showOverrideOk() {
|
||||
secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_OVERRIDE_OK, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showViewKeyButton() {
|
||||
buttonViewKey.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showOverrideButton() {
|
||||
buttonOverride.setVisibility(View.VISIBLE);
|
||||
buttonOverrideUndo.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showOverrideUndoButton() {
|
||||
buttonOverride.setVisibility(View.GONE);
|
||||
buttonOverrideUndo.setVisibility(View.VISIBLE);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -266,6 +307,18 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
|
||||
presenter.onClickViewKey();
|
||||
}
|
||||
});
|
||||
buttonOverride.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
presenter.onClickOverride();
|
||||
}
|
||||
});
|
||||
buttonOverrideUndo.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
presenter.onClickOverrideUndo();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,12 +24,18 @@ import org.sufficientlysecure.keychain.ui.ViewKeyActivity;
|
||||
|
||||
|
||||
class SecurityProblemPresenter {
|
||||
private static final int OVERRIDE_REQUIRED_COUNT = 3;
|
||||
|
||||
|
||||
private final Context context;
|
||||
private final PackageManager packageManager;
|
||||
|
||||
|
||||
private RemoteSecurityProblemView view;
|
||||
private Long viewKeyMasterKeyId;
|
||||
private int overrideCounter;
|
||||
private String packageName;
|
||||
private Serializable securityProblem;
|
||||
|
||||
|
||||
SecurityProblemPresenter(Context context) {
|
||||
@@ -42,17 +48,19 @@ class SecurityProblemPresenter {
|
||||
}
|
||||
|
||||
void setupFromIntentData(String packageName, Serializable securityProblem) {
|
||||
this.packageName = packageName;
|
||||
this.securityProblem = securityProblem;
|
||||
|
||||
refreshSecurityProblemDisplay();
|
||||
refreshPackageInfo();
|
||||
}
|
||||
|
||||
private void refreshSecurityProblemDisplay() {
|
||||
if (securityProblem instanceof DecryptVerifySecurityProblem) {
|
||||
setupFromDecryptVerifySecurityProblem((DecryptVerifySecurityProblem) securityProblem);
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unhandled security problem type!");
|
||||
}
|
||||
|
||||
try {
|
||||
setPackageInfo(packageName);
|
||||
} catch (NameNotFoundException e) {
|
||||
throw new IllegalStateException("Unable to find info of calling app!", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void setupFromDecryptVerifySecurityProblem(DecryptVerifySecurityProblem securityProblem) {
|
||||
@@ -71,6 +79,10 @@ class SecurityProblemPresenter {
|
||||
viewKeyMasterKeyId = keySecurityProblem.masterKeyId;
|
||||
view.showViewKeyButton();
|
||||
|
||||
if (keySecurityProblem.isIdentifiable()) {
|
||||
view.showOverrideButton();
|
||||
}
|
||||
|
||||
if (keySecurityProblem instanceof InsecureBitStrength) {
|
||||
InsecureBitStrength problem = (InsecureBitStrength) keySecurityProblem;
|
||||
view.showLayoutEncryptInsecureBitsize(problem.algorithm, problem.bitStrength);
|
||||
@@ -116,14 +128,30 @@ class SecurityProblemPresenter {
|
||||
view.showLayoutInsecureHashAlgorithm(signatureSecurityProblem.hashAlgorithm);
|
||||
}
|
||||
|
||||
private void setPackageInfo(String packageName) throws NameNotFoundException {
|
||||
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
|
||||
private void refreshPackageInfo() {
|
||||
ApplicationInfo applicationInfo;
|
||||
try {
|
||||
applicationInfo = packageManager.getApplicationInfo(packageName, 0);
|
||||
} catch (NameNotFoundException e) {
|
||||
throw new IllegalStateException("Could not retrieve package info!");
|
||||
}
|
||||
Drawable appIcon = packageManager.getApplicationIcon(applicationInfo);
|
||||
// CharSequence appName = packageManager.getApplicationLabel(applicationInfo);
|
||||
|
||||
view.setTitleClientIcon(appIcon);
|
||||
}
|
||||
|
||||
private void incrementOverrideAndDisplayOrTrigger() {
|
||||
int overrideCountLeft = OVERRIDE_REQUIRED_COUNT - overrideCounter;
|
||||
if (overrideCountLeft > 0) {
|
||||
overrideCounter++;
|
||||
view.showOverrideMessage(overrideCountLeft);
|
||||
} else {
|
||||
view.showOverrideOk();
|
||||
view.showOverrideUndoButton();
|
||||
}
|
||||
}
|
||||
|
||||
void onClickGotIt() {
|
||||
view.finishAsCancelled();
|
||||
}
|
||||
@@ -134,6 +162,15 @@ class SecurityProblemPresenter {
|
||||
context.startActivity(viewKeyIntent);
|
||||
}
|
||||
|
||||
void onClickOverride() {
|
||||
incrementOverrideAndDisplayOrTrigger();
|
||||
}
|
||||
|
||||
void onClickOverrideUndo() {
|
||||
overrideCounter = 0;
|
||||
refreshSecurityProblemDisplay();
|
||||
}
|
||||
|
||||
void onCancel() {
|
||||
view.finishAsCancelled();
|
||||
}
|
||||
@@ -154,6 +191,11 @@ class SecurityProblemPresenter {
|
||||
|
||||
void showLayoutInsecureHashAlgorithm(int hashAlgorithm);
|
||||
|
||||
void showOverrideMessage(int countdown);
|
||||
void showOverrideOk();
|
||||
|
||||
void showViewKeyButton();
|
||||
void showOverrideButton();
|
||||
void showOverrideUndoButton();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user