Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Show CAN info message #546

Merged
merged 2 commits into from
Oct 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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