Skip to content

Commit

Permalink
Merge pull request #546 from martenrebane/MOPPAND-1393
Browse files Browse the repository at this point in the history
Show CAN info message
  • Loading branch information
Counter178 authored Oct 18, 2024
2 parents 4f2e302 + fe2619b commit a0e4d39
Show file tree
Hide file tree
Showing 17 changed files with 271 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
Expand Down Expand Up @@ -131,6 +129,17 @@ public void setCan(String can) {
Timber.log(Log.ERROR, "Unable to save CAN");
}

public void setShowCanMessage(boolean showCanMessage) {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(resources.getString(R.string.nfc_show_can_message), showCanMessage);
editor.apply();
}

public boolean getShowCanMessage() {
return preferences.getBoolean(resources.getString(R.string.nfc_show_can_message),
true);
}

public boolean getIsRoleAskingEnabled() {
return preferences.getBoolean(resources.getString(R.string.main_settings_ask_role_and_address_key),
false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,13 +185,15 @@ void show(@Nullable Throwable documentsAddError, @Nullable Throwable documentRem
Html.fromHtml(UrlMessage.withURL(
getContext(),
R.string.signature_update_signature_error_message_too_many_requests,
R.string.signature_update_signature_error_message_additional_information
R.string.signature_update_signature_error_message_additional_information,
false
), Html.FROM_HTML_MODE_LEGACY));
} else if (signatureAddError instanceof OcspInvalidTimeSlotException) {
detailError = new OcspInvalidTimeSlotException(Html.fromHtml(UrlMessage.withURL(
getContext(),
R.string.signature_update_signature_error_message_invalid_time_slot,
R.string.signature_update_signature_error_message_additional_information
R.string.signature_update_signature_error_message_additional_information,
false
), Html.FROM_HTML_MODE_LEGACY));
} else if (signatureAddError instanceof CertificateRevokedException) {
updateError = new CertificateRevokedException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,11 @@ public void showStatus(NFCResponse response) {
if (response.status() == SessionStatusResponse.ProcessStatus.TECHNICAL_ERROR) {
messageView.setText(getContext().getString(R.string.signature_update_nfc_technical_error) + ":\n" + response.message());
iconView.setColorFilter(ContextCompat.getColor(context, R.color.error), PorterDuff.Mode.SRC_IN);
iconView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_icon_nfc_error));
} else {
messageView.setText(response.message());
iconView.setColorFilter(ContextCompat.getColor(context, R.color.accent), PorterDuff.Mode.SRC_IN);
iconView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_icon_nfc));
}
} else {
if (AccessibilityUtils.isTalkBackEnabled()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,15 @@
import java.nio.charset.StandardCharsets;

import ee.ria.DigiDoc.R;
import ee.ria.DigiDoc.android.Activity;
import ee.ria.DigiDoc.android.ApplicationApp;
import ee.ria.DigiDoc.android.Constants;
import ee.ria.DigiDoc.android.accessibility.AccessibilityUtils;
import ee.ria.DigiDoc.android.signature.update.SignatureAddView;
import ee.ria.DigiDoc.android.signature.update.SignatureUpdateViewModel;
import ee.ria.DigiDoc.android.utils.ErrorMessageUtil;
import ee.ria.DigiDoc.android.utils.navigator.Navigator;
import ee.ria.DigiDoc.android.utils.widget.NotificationDialog;
import ee.ria.DigiDoc.common.PinConstants;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.PublishSubject;
Expand All @@ -59,6 +61,8 @@ public class NFCView extends LinearLayout implements SignatureAddView<NFCRequest
private final TextInputLayout pinLayout;
private final MaterialTextView pinLabel;

private final NotificationDialog nfcCanNotificationDialog;

private AccessibilityManager.TouchExplorationStateChangeListener accessibilityTouchExplorationStateChangeListener;

public NFCView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
Expand All @@ -78,6 +82,9 @@ public NFCView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
pinLayout = findViewById(R.id.signatureUpdateNFCPIN2Layout);
pinLabel = findViewById(R.id.signatureUpdateNFCPIN2Label);

nfcCanNotificationDialog = new NotificationDialog(navigator.activity(),
R.string.signature_update_nfc_can_info, R.id.nfcCanNotificationDialog);

handleNFCSupportLayout();

if (AccessibilityUtils.isTalkBackEnabled()) {
Expand Down Expand Up @@ -113,6 +120,25 @@ public boolean positiveButtonEnabled() {
return canText != null && isCANLengthValid(canText.toString()) && pinText != null && isPinLengthValid(pinText.toString());
}

@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);

if (navigator.activity() instanceof Activity) {
boolean shouldShowCanMessage = ((Activity) navigator.activity())
.getSettingsDataStore()
.getShowCanMessage();

if (shouldShowCanMessage && visibility == VISIBLE && isNFCSupported()) {
postDelayed(nfcCanNotificationDialog::show, 1000);
} else {
nfcCanNotificationDialog.dismiss();
}
}

handleNFCSupportLayout();
}

@Override
public void reset(SignatureUpdateViewModel viewModel) {
canView.setText(viewModel.can());
Expand All @@ -124,6 +150,7 @@ public void reset(SignatureUpdateViewModel viewModel) {
message.clearFocus();
canView.clearFocus();
pinView.clearFocus();
nfcCanNotificationDialog.dismiss();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import ee.ria.DigiDoc.android.utils.navigator.ContentView;
import ee.ria.DigiDoc.android.utils.rxbinding.app.RxDialog;
import ee.ria.DigiDoc.sign.utils.UrlMessage;

import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.PublishSubject;
import io.reactivex.rxjava3.subjects.Subject;
Expand Down Expand Up @@ -48,7 +47,7 @@ public ConfirmationDialog(@NonNull Context context, @StringRes int message, int
setMessage(Html.fromHtml(UrlMessage.withURLAndQuestion(
getContext(),
message,
R.string.main_diagnostics_restart_message_read_more,
R.string.read_more_message,
R.string.main_diagnostics_restart_message_restart_now
), Html.FROM_HTML_MODE_LEGACY));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package ee.ria.DigiDoc.android.utils.widget;

import static androidx.core.content.ContextCompat.startActivity;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.view.Gravity;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.AppCompatCheckBox;
import androidx.coordinatorlayout.widget.CoordinatorLayout;

import ee.ria.DigiDoc.R;
import ee.ria.DigiDoc.android.Activity;
import ee.ria.DigiDoc.android.accessibility.AccessibilityUtils;
import ee.ria.DigiDoc.android.utils.SecureUtil;
import ee.ria.DigiDoc.android.utils.navigator.ContentView;
import ee.ria.DigiDoc.sign.utils.UrlMessage;

public final class NotificationDialog extends AlertDialog implements ContentView,
DialogInterface.OnClickListener {

private final Context context;
private final int action;
private CheckBox dontShowAgainCheckbox;

public NotificationDialog(@NonNull Context context, @StringRes int message, int action) {
super(context);
SecureUtil.markAsSecure(context, getWindow());

this.context = context;

if (action == R.id.nfcCanNotificationDialog) {
int layoutPadding = 50;
LinearLayout layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(layoutPadding, layoutPadding, layoutPadding, layoutPadding);

Spanned urlMessage = Html.fromHtml(UrlMessage.withURL(
context,
message,
R.string.read_more_message,
true
), Html.FROM_HTML_MODE_LEGACY);

TextView messageView = new TextView(context);
messageView.setTextAppearance(R.style.MaterialTypography_Dense_Body1);
messageView.setLayoutParams(new ViewGroup.LayoutParams(
CoordinatorLayout.LayoutParams.WRAP_CONTENT,
CoordinatorLayout.LayoutParams.WRAP_CONTENT)
);
messageView.setText(urlMessage);
messageView.setPadding(15, 0, 15, 25);
messageView.setGravity(Gravity.START);

messageView.setMovementMethod(LinkMovementMethod.getInstance());
messageView.setClickable(true);

messageView.setContentDescription(urlMessage);

if (AccessibilityUtils.isTalkBackEnabled()) {
messageView.setOnClickListener(view -> {
String messageWithUrl = context.getString(R.string.signature_update_nfc_can_info);
String url = UrlMessage.extractLink(messageWithUrl);
if (!url.isEmpty()) {
Intent uriIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(context, uriIntent, null);
}
});
} else {
messageView.setOnClickListener(null);
}

layout.addView(messageView);

dontShowAgainCheckbox = new AppCompatCheckBox(context);
dontShowAgainCheckbox.setId(android.R.id.checkbox);
dontShowAgainCheckbox.setText(R.string.dont_show_again_message);
layout.addView(dontShowAgainCheckbox);

Button centerButton = new Button(context);
centerButton.setText(context.getString(android.R.string.ok));
centerButton.setTextColor(Color.WHITE);
LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);

buttonLayoutParams.setMargins(15, 50, 15, 25);
buttonLayoutParams.gravity = Gravity.CENTER_HORIZONTAL;
centerButton.setLayoutParams(buttonLayoutParams);

centerButton.setOnClickListener(v -> onClick(this, DialogInterface.BUTTON_POSITIVE));

layout.addView(centerButton);

setView(layout);
}
else {
setMessage(context.getString(message));
setButton(BUTTON_POSITIVE, context.getString(android.R.string.ok), this);
}

this.action = action;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Override
public void onClick(DialogInterface dialog, int which) {
if (action == R.id.nfcCanNotificationDialog) {
if (context instanceof Activity) {
Activity activity = (Activity) context;

boolean isChecked = dontShowAgainCheckbox.isChecked();
activity.getSettingsDataStore().setShowCanMessage(!isChecked);
}
}
dismiss();
}

@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
String confirmationDialogDescription = getContext().getResources().getString(R.string.confirmation_dialog);
event.getText().add(confirmationDialogDescription + ",");
return true;
}
return super.dispatchPopulateAccessibilityEvent(event);
}
}
2 changes: 1 addition & 1 deletion app/src/main/res/drawable/ic_icon_nfc.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<clip-path
android:pathData="M38.3,24h48v48h-48z"/>
<path
android:pathData="M78.95,68.95L54.15,44.15C53.88,44.72 53.67,45.33 53.52,45.97C53.37,46.63 53.3,47.3 53.3,48C53.3,49.37 53.56,50.62 54.1,51.75C54.63,52.88 55.36,53.87 56.3,54.7L54.15,56.85C52.98,55.75 52.05,54.44 51.35,52.92C50.65,51.41 50.3,49.77 50.3,48C50.3,46.9 50.44,45.84 50.72,44.83C51.01,43.81 51.41,42.85 51.95,41.95L48.3,38.3C47.36,39.7 46.63,41.22 46.1,42.85C45.56,44.48 45.3,46.2 45.3,48C45.3,50.47 45.77,52.75 46.72,54.85C47.67,56.95 48.98,58.78 50.65,60.35L48.5,62.5C46.6,60.67 45.09,58.51 43.97,56.03C42.86,53.54 42.3,50.87 42.3,48C42.3,45.77 42.64,43.65 43.32,41.65C44.01,39.65 44.95,37.82 46.15,36.15L41.35,31.35L43.5,29.2L81.1,66.8L78.95,68.95ZM78.45,59.85L76.25,57.65C77.21,56.28 77.96,54.78 78.5,53.15C79.03,51.52 79.3,49.8 79.3,48C79.3,43.27 77.65,39.25 74.35,35.95C71.05,32.65 67.03,31 62.3,31C60.5,31 58.78,31.26 57.15,31.77C55.51,32.29 54,33.03 52.6,34L50.45,31.85C52.15,30.65 53.99,29.71 55.97,29.02C57.96,28.34 60.06,28 62.3,28C65.06,28 67.66,28.52 70.1,29.58C72.53,30.63 74.65,32.05 76.45,33.85C78.25,35.65 79.67,37.77 80.72,40.2C81.77,42.63 82.3,45.23 82.3,48C82.3,50.2 81.96,52.3 81.27,54.3C80.59,56.3 79.65,58.15 78.45,59.85ZM72.65,54.05L70.45,51.85C70.71,51.28 70.92,50.67 71.07,50.03C71.22,49.38 71.3,48.7 71.3,48C71.3,45.5 70.42,43.38 68.67,41.63C66.92,39.88 64.8,39 62.3,39C61.6,39 60.92,39.08 60.27,39.22C59.62,39.38 59.01,39.58 58.45,39.85L56.25,37.65C57.11,37.12 58.06,36.71 59.1,36.42C60.13,36.14 61.2,36 62.3,36C65.63,36 68.46,37.17 70.8,39.5C73.13,41.83 74.3,44.67 74.3,48C74.3,49.1 74.16,50.17 73.87,51.2C73.59,52.23 73.18,53.18 72.65,54.05Z"
android:pathData="M48.5,64.5C46.6,62.67 45.09,60.51 43.97,58.03C42.86,55.54 42.3,52.87 42.3,50C42.3,47.23 42.82,44.63 43.87,42.2C44.92,39.77 46.35,37.65 48.15,35.85C49.95,34.05 52.06,32.63 54.5,31.58C56.93,30.52 59.53,30 62.3,30C65.06,30 67.66,30.52 70.1,31.58C72.53,32.63 74.65,34.05 76.45,35.85C78.25,37.65 79.67,39.77 80.72,42.2C81.77,44.63 82.3,47.23 82.3,50C82.3,52.87 81.74,55.54 80.62,58.03C79.51,60.51 78,62.67 76.1,64.5L73.95,62.35C75.61,60.78 76.92,58.95 77.87,56.85C78.82,54.75 79.3,52.47 79.3,50C79.3,45.27 77.65,41.25 74.35,37.95C71.05,34.65 67.03,33 62.3,33C57.56,33 53.55,34.65 50.25,37.95C46.95,41.25 45.3,45.27 45.3,50C45.3,52.47 45.77,54.75 46.72,56.85C47.67,58.95 48.98,60.78 50.65,62.35L48.5,64.5ZM54.15,58.85C52.98,57.75 52.05,56.44 51.35,54.92C50.65,53.41 50.3,51.77 50.3,50C50.3,46.67 51.46,43.83 53.8,41.5C56.13,39.17 58.96,38 62.3,38C65.63,38 68.46,39.17 70.8,41.5C73.13,43.83 74.3,46.67 74.3,50C74.3,51.77 73.95,53.41 73.25,54.92C72.55,56.44 71.61,57.75 70.45,58.85L68.3,56.7C69.23,55.87 69.96,54.88 70.5,53.75C71.03,52.62 71.3,51.37 71.3,50C71.3,47.5 70.42,45.38 68.67,43.63C66.92,41.88 64.8,41 62.3,41C59.8,41 57.67,41.88 55.92,43.63C54.17,45.38 53.3,47.5 53.3,50C53.3,51.37 53.56,52.62 54.1,53.75C54.63,54.88 55.36,55.87 56.3,56.7L54.15,58.85ZM62.3,54C61.2,54 60.26,53.61 59.47,52.83C58.69,52.04 58.3,51.1 58.3,50C58.3,48.9 58.69,47.96 59.47,47.17C60.26,46.39 61.2,46 62.3,46C63.4,46 64.34,46.39 65.12,47.17C65.91,47.96 66.3,48.9 66.3,50C66.3,51.1 65.91,52.04 65.12,52.83C64.34,53.61 63.4,54 62.3,54Z"
android:fillColor="#3576B6"/>
</group>
<path
Expand Down
21 changes: 21 additions & 0 deletions app/src/main/res/drawable/ic_icon_nfc_error.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="124dp"
android:height="120dp"
android:viewportWidth="124"
android:viewportHeight="120">
<path
android:pathData="M122.2,60C122.2,92.27 95.29,118.5 62,118.5C28.71,118.5 1.8,92.27 1.8,60C1.8,27.73 28.71,1.5 62,1.5C95.29,1.5 122.2,27.73 122.2,60Z"
android:strokeWidth="3"
android:fillColor="#00000000"
android:strokeColor="#D73E3E"/>
<group>
<clip-path
android:pathData="M38.3,24h48v48h-48z"/>
<path
android:pathData="M60.8,53V34H63.8V53H60.8ZM60.8,62V59H63.8V62H60.8Z"
android:fillColor="#D73E3E"/>
</group>
<path
android:pathData="M57.92,77.05V87H55.87L51.87,80.33V87H49.82V77.05H51.87L55.88,83.73V77.05H57.92ZM61.76,77.05V87H59.71V77.05H61.76ZM65.72,81.3V82.9H61.2V81.3H65.72ZM66.2,77.05V78.65H61.2V77.05H66.2ZM73.16,83.7H75.2C75.16,84.37 74.98,84.96 74.65,85.48C74.33,86 73.87,86.41 73.29,86.7C72.71,86.99 72.01,87.14 71.2,87.14C70.56,87.14 69.99,87.03 69.48,86.81C68.98,86.59 68.54,86.27 68.18,85.85C67.83,85.44 67.56,84.94 67.37,84.35C67.18,83.76 67.09,83.1 67.09,82.37V81.68C67.09,80.95 67.19,80.29 67.38,79.71C67.57,79.11 67.85,78.61 68.21,78.2C68.58,77.78 69.01,77.46 69.52,77.24C70.02,77.01 70.59,76.9 71.21,76.9C72.04,76.9 72.74,77.05 73.31,77.35C73.88,77.66 74.33,78.07 74.64,78.6C74.96,79.13 75.15,79.73 75.22,80.4H73.17C73.14,80 73.06,79.66 72.93,79.38C72.79,79.1 72.58,78.89 72.31,78.75C72.03,78.6 71.67,78.53 71.21,78.53C70.87,78.53 70.57,78.59 70.32,78.72C70.06,78.85 69.85,79.04 69.67,79.3C69.5,79.56 69.37,79.89 69.28,80.29C69.2,80.68 69.16,81.14 69.16,81.67V82.37C69.16,82.89 69.2,83.34 69.28,83.73C69.35,84.12 69.47,84.45 69.63,84.72C69.8,84.98 70.01,85.18 70.26,85.32C70.52,85.45 70.83,85.52 71.2,85.52C71.63,85.52 71.98,85.45 72.26,85.31C72.54,85.17 72.75,84.97 72.89,84.7C73.04,84.43 73.13,84.1 73.16,83.7Z"
android:fillColor="#D73E3E"/>
</vector>
Loading

0 comments on commit a0e4d39

Please sign in to comment.