159 lines
No EOL
5.5 KiB
Java
159 lines
No EOL
5.5 KiB
Java
package com.tangem.presentation.dialog;
|
|
|
|
import android.app.Activity;
|
|
import android.app.AlertDialog;
|
|
import android.app.Dialog;
|
|
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.os.Bundle;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.WindowManager;
|
|
import android.widget.ProgressBar;
|
|
|
|
import com.tangem.wallet.R;
|
|
|
|
import java.util.Timer;
|
|
import java.util.TimerTask;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
import androidx.fragment.app.DialogFragment;
|
|
|
|
/**
|
|
* Created by dvol on 06.03.2018.
|
|
*/
|
|
public class WaitSecurityDelayDialog extends DialogFragment {
|
|
public static final String TAG = WaitSecurityDelayDialog.class.getSimpleName();
|
|
|
|
private ProgressBar progressBar;
|
|
private int msTimeout = 60000, msProgress = 0;
|
|
private Timer timer;
|
|
|
|
private static Timer timerToShowDelayDialog = null;
|
|
private static WaitSecurityDelayDialog instance = null;
|
|
|
|
private final static int minRemainingDelayToShowDialog = 1000;
|
|
private final static int delayBeforeShowDialog = 5000;
|
|
|
|
@Override
|
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
|
}
|
|
|
|
@Override
|
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
|
LayoutInflater inflater = getActivity().getLayoutInflater();
|
|
|
|
View v = inflater.inflate(R.layout.dialog_wait_pin2, null);
|
|
|
|
progressBar = v.findViewById(R.id.progressBar);
|
|
progressBar.setMax(msTimeout);
|
|
progressBar.setProgress(msProgress);
|
|
|
|
timer = new Timer();
|
|
timer.scheduleAtFixedRate(new TimerTask() {
|
|
@Override
|
|
public void run() {
|
|
progressBar.post(() -> {
|
|
int progress = WaitSecurityDelayDialog.this.progressBar.getProgress();
|
|
if (progress < WaitSecurityDelayDialog.this.progressBar.getMax()) {
|
|
WaitSecurityDelayDialog.this.progressBar.setProgress(progress + 1000);
|
|
}
|
|
});
|
|
}
|
|
}, 1000, 1000);
|
|
return new AlertDialog.Builder(getActivity())
|
|
.setIcon(R.drawable.tangem_logo_small_new)
|
|
.setTitle(R.string.security_delay)
|
|
.setView(v)
|
|
.setCancelable(false)
|
|
.create();
|
|
}
|
|
|
|
@Override
|
|
public void onCancel(@NonNull DialogInterface dialog) {
|
|
super.onCancel(dialog);
|
|
}
|
|
|
|
public static void onReadBeforeRequest(final AppCompatActivity activity, final int timeout) {
|
|
activity.runOnUiThread(() -> {
|
|
if (timerToShowDelayDialog != null || timeout < delayBeforeShowDialog + minRemainingDelayToShowDialog)
|
|
return;
|
|
timerToShowDelayDialog = new Timer();
|
|
timerToShowDelayDialog.schedule(new TimerTask() {
|
|
@Override
|
|
public void run() {
|
|
if (WaitSecurityDelayDialog.instance != null) return;
|
|
instance = new WaitSecurityDelayDialog();
|
|
instance.setup(timeout, delayBeforeShowDialog);
|
|
instance.setCancelable(false);
|
|
instance.show(activity.getSupportFragmentManager(), TAG);
|
|
}
|
|
}, delayBeforeShowDialog);
|
|
});
|
|
}
|
|
|
|
public static void onReadAfterRequest(final Activity activity) {
|
|
activity.runOnUiThread(() -> {
|
|
if (timerToShowDelayDialog == null) return;
|
|
timerToShowDelayDialog.cancel();
|
|
timerToShowDelayDialog = null;
|
|
});
|
|
}
|
|
|
|
public static void onReadWait(final AppCompatActivity activity, final int msec) {
|
|
activity.runOnUiThread(() -> {
|
|
if (timerToShowDelayDialog != null) {
|
|
timerToShowDelayDialog.cancel();
|
|
timerToShowDelayDialog = null;
|
|
}
|
|
|
|
if (msec == 0) {
|
|
if (instance != null && instance.isAdded()) {
|
|
instance.dismiss();
|
|
instance = null;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (instance == null) {
|
|
if (msec > minRemainingDelayToShowDialog) {
|
|
instance = new WaitSecurityDelayDialog();
|
|
// 1000ms - card delay notification interval
|
|
instance.setup(msec + 1000, 1000);
|
|
instance.setCancelable(false);
|
|
instance.show(activity.getSupportFragmentManager(), TAG);
|
|
}
|
|
} else
|
|
instance.setRemainingTimeout(msec);
|
|
});
|
|
}
|
|
|
|
private void setup(int msTimeout, int msProgress) {
|
|
this.msTimeout = msTimeout;
|
|
this.msProgress = msProgress;
|
|
}
|
|
|
|
private void setRemainingTimeout(final int msec) {
|
|
progressBar.post(() -> {
|
|
int progress = WaitSecurityDelayDialog.this.progressBar.getProgress();
|
|
if (timer != null) {
|
|
// we get delay latency from card for first time - don't change progress by timer, only by card answer
|
|
progressBar.setMax(progress + msec);
|
|
timer.cancel();
|
|
timer = null;
|
|
} else {
|
|
int newProgress = progressBar.getMax() - msec;
|
|
if (newProgress > progress)
|
|
progressBar.setProgress(newProgress);
|
|
else
|
|
progressBar.setMax(progress + msec);
|
|
}
|
|
});
|
|
}
|
|
|
|
} |