mirror of https://github.com/m2049r/xmrwallet.git
refactor onBackPressed to use the callback dispatcher (#937)
This commit is contained in:
parent
cd6f646b63
commit
451371cd92
|
@ -17,11 +17,14 @@
|
|||
package com.m2049r.xmrwallet;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.PowerManager;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import com.m2049r.xmrwallet.data.BarcodeData;
|
||||
import com.m2049r.xmrwallet.dialog.ProgressDialog;
|
||||
|
@ -35,18 +38,13 @@ public class BaseActivity extends SecureActivity
|
|||
|
||||
ProgressDialog progressDialog = null;
|
||||
|
||||
private class SimpleProgressDialog extends ProgressDialog {
|
||||
private static class SimpleProgressDialog extends ProgressDialog {
|
||||
|
||||
SimpleProgressDialog(Context context, int msgId) {
|
||||
super(context);
|
||||
setCancelable(false);
|
||||
setMessage(context.getString(msgId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
// prevent back button
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -59,13 +57,15 @@ public class BaseActivity extends SecureActivity
|
|||
progressDialog = new SimpleProgressDialog(BaseActivity.this, msgId);
|
||||
if (delayMillis > 0) {
|
||||
Handler handler = new Handler();
|
||||
handler.postDelayed(new Runnable() {
|
||||
public void run() {
|
||||
if (progressDialog != null) progressDialog.show();
|
||||
handler.postDelayed(() -> {
|
||||
if (progressDialog != null) {
|
||||
progressDialog.show();
|
||||
disableBackPressed();
|
||||
}
|
||||
}, delayMillis);
|
||||
} else {
|
||||
progressDialog.show();
|
||||
disableBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -75,6 +75,7 @@ public class BaseActivity extends SecureActivity
|
|||
progressDialog = new LedgerProgressDialog(BaseActivity.this, mode);
|
||||
Ledger.setListener((Ledger.Listener) progressDialog);
|
||||
progressDialog.show();
|
||||
disableBackPressed();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -87,6 +88,28 @@ public class BaseActivity extends SecureActivity
|
|||
progressDialog.dismiss();
|
||||
}
|
||||
progressDialog = null;
|
||||
enableBackPressed();
|
||||
}
|
||||
|
||||
OnBackPressedCallback backPressedCallback = new OnBackPressedCallback(false) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
// no going back
|
||||
}
|
||||
};
|
||||
|
||||
public void disableBackPressed() {
|
||||
backPressedCallback.setEnabled(true);
|
||||
}
|
||||
|
||||
public void enableBackPressed() {
|
||||
backPressedCallback.setEnabled(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
getOnBackPressedDispatcher().addCallback(this, backPressedCallback);
|
||||
}
|
||||
|
||||
static final int RELEASE_WAKE_LOCK_DELAY = 5000; // millisconds
|
||||
|
|
|
@ -40,6 +40,7 @@ import android.widget.ScrollView;
|
|||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
@ -98,6 +99,13 @@ public class GenerateReviewFragment extends Fragment {
|
|||
private String walletPath;
|
||||
private String walletName;
|
||||
|
||||
private OnBackPressedCallback backPressedCallback = new OnBackPressedCallback(false) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
// nothing
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
|
@ -160,6 +168,9 @@ public class GenerateReviewFragment extends Fragment {
|
|||
walletPath = args.getString(REQUEST_PATH);
|
||||
localPassword = args.getString(REQUEST_PASSWORD);
|
||||
showDetails();
|
||||
if (type.equals(GenerateReviewFragment.VIEW_TYPE_ACCEPT)) {
|
||||
backPressedCallback.setEnabled(true);
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
|
@ -420,14 +431,11 @@ public class GenerateReviewFragment extends Fragment {
|
|||
pbProgress.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
boolean backOk() {
|
||||
return !type.equals(GenerateReviewFragment.VIEW_TYPE_ACCEPT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(this, backPressedCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -295,7 +295,7 @@ public class LoginActivity extends BaseActivity
|
|||
toolbar.setOnButtonListener(type -> {
|
||||
switch (type) {
|
||||
case Toolbar.BUTTON_BACK:
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
break;
|
||||
case Toolbar.BUTTON_CLOSE:
|
||||
finish();
|
||||
|
@ -1086,30 +1086,6 @@ public class LoginActivity extends BaseActivity
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
|
||||
if (f instanceof GenerateReviewFragment) {
|
||||
if (((GenerateReviewFragment) f).backOk()) {
|
||||
super.onBackPressed();
|
||||
}
|
||||
} else if (f instanceof NodeFragment) {
|
||||
if (!((NodeFragment) f).isRefreshing()) {
|
||||
super.onBackPressed();
|
||||
} else {
|
||||
Toast.makeText(LoginActivity.this, getString(R.string.node_refresh_wait), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
} else if (f instanceof LoginFragment) {
|
||||
if (((LoginFragment) f).isFabOpen()) {
|
||||
((LoginFragment) f).animateFAB();
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
final int id = item.getItemId();
|
||||
|
@ -1294,21 +1270,21 @@ public class LoginActivity extends BaseActivity
|
|||
if (!Ledger.check()) {
|
||||
Ledger.disconnect();
|
||||
runOnUiThread(() -> Toast.makeText(LoginActivity.this,
|
||||
getString(R.string.toast_ledger_start_app, usbDevice.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
getString(R.string.toast_ledger_start_app, usbDevice.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
.show());
|
||||
} else {
|
||||
registerDetachReceiver();
|
||||
onLedgerAction();
|
||||
runOnUiThread(() -> Toast.makeText(LoginActivity.this,
|
||||
getString(R.string.toast_ledger_attached, usbDevice.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
getString(R.string.toast_ledger_attached, usbDevice.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
.show());
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
runOnUiThread(() -> Toast.makeText(LoginActivity.this,
|
||||
getString(R.string.open_wallet_ledger_missing),
|
||||
Toast.LENGTH_SHORT)
|
||||
getString(R.string.open_wallet_ledger_missing),
|
||||
Toast.LENGTH_SHORT)
|
||||
.show());
|
||||
}
|
||||
}
|
||||
|
@ -1368,8 +1344,8 @@ public class LoginActivity extends BaseActivity
|
|||
Timber.i("Ledger detached!");
|
||||
if (device != null)
|
||||
runOnUiThread(() -> Toast.makeText(LoginActivity.this,
|
||||
getString(R.string.toast_ledger_detached, device.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
getString(R.string.toast_ledger_detached, device.getProductName()),
|
||||
Toast.LENGTH_SHORT)
|
||||
.show());
|
||||
Ledger.disconnect();
|
||||
onLedgerAction();
|
||||
|
@ -1383,7 +1359,7 @@ public class LoginActivity extends BaseActivity
|
|||
public void onLedgerAction() {
|
||||
Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
|
||||
if (f instanceof GenerateFragment) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
} else if (f instanceof LoginFragment) {
|
||||
if (((LoginFragment) f).isFabOpen()) {
|
||||
((LoginFragment) f).animateFAB();
|
||||
|
|
|
@ -35,6 +35,7 @@ import android.widget.RelativeLayout;
|
|||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
@ -148,6 +149,13 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||
//activityCallback.runOnNetCipher(this::pingSelectedNode);
|
||||
}
|
||||
|
||||
private OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
animateFAB();
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
|
@ -287,6 +295,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -295,7 +304,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||
super.onCreateOptionsMenu(menu, inflater);
|
||||
}
|
||||
|
||||
private boolean isFabOpen = false;
|
||||
private boolean fabOpen = false;
|
||||
private FloatingActionButton fab, fabNew, fabView, fabKey, fabSeed, fabImport, fabLedger;
|
||||
private RelativeLayout fabScreen;
|
||||
private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL, fabImportL, fabLedgerL;
|
||||
|
@ -303,11 +312,16 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||
private Animation fab_pulse;
|
||||
|
||||
public boolean isFabOpen() {
|
||||
return isFabOpen;
|
||||
return fabOpen;
|
||||
}
|
||||
|
||||
private void setFabOpen(boolean value) {
|
||||
fabOpen = value;
|
||||
onBackPressedCallback.setEnabled(value);
|
||||
}
|
||||
|
||||
public void animateFAB() {
|
||||
if (isFabOpen) { // close the fab
|
||||
if (isFabOpen()) { // close the fab
|
||||
fabScreen.setClickable(false);
|
||||
fabScreen.startAnimation(fab_close_screen);
|
||||
fab.startAnimation(rotate_backward);
|
||||
|
@ -326,7 +340,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||
fabImportL.startAnimation(fab_close);
|
||||
fabImport.setClickable(false);
|
||||
}
|
||||
isFabOpen = false;
|
||||
setFabOpen(false);
|
||||
} else { // open the fab
|
||||
fabScreen.setClickable(true);
|
||||
fabScreen.startAnimation(fab_open_screen);
|
||||
|
@ -360,7 +374,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||
fabImportL.startAnimation(fab_open);
|
||||
fabImport.setClickable(true);
|
||||
}
|
||||
isFabOpen = true;
|
||||
setFabOpen(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -372,7 +386,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||
animateFAB();
|
||||
} else if (id == R.id.fabNew) {
|
||||
fabScreen.setVisibility(View.INVISIBLE);
|
||||
isFabOpen = false;
|
||||
setFabOpen(false);
|
||||
activityCallback.onAddWallet(GenerateFragment.TYPE_NEW);
|
||||
} else if (id == R.id.fabView) {
|
||||
animateFAB();
|
||||
|
|
|
@ -31,6 +31,7 @@ import android.widget.Button;
|
|||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
@ -145,6 +146,13 @@ public class NodeFragment extends Fragment
|
|||
}
|
||||
}
|
||||
|
||||
private OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
Toast.makeText(requireActivity(), getString(R.string.node_refresh_wait), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
|
@ -187,6 +195,7 @@ public class NodeFragment extends Fragment
|
|||
|
||||
private boolean refresh(int type) {
|
||||
if (asyncFindNodes != null) return false; // ignore refresh request as one is ongoing
|
||||
onBackPressedCallback.setEnabled(true);
|
||||
asyncFindNodes = new AsyncFindNodes();
|
||||
updateRefreshElements();
|
||||
asyncFindNodes.execute(type);
|
||||
|
@ -197,6 +206,7 @@ public class NodeFragment extends Fragment
|
|||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -342,6 +352,7 @@ public class NodeFragment extends Fragment
|
|||
|
||||
private void complete() {
|
||||
asyncFindNodes = null;
|
||||
onBackPressedCallback.setEnabled(false);
|
||||
if (!isAdded()) return;
|
||||
//if (isCancelled()) return;
|
||||
tvPull.setText(getString(R.string.node_pull_hint));
|
||||
|
@ -575,6 +586,7 @@ public class NodeFragment extends Fragment
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void restoreDefaultNodes() {
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2017 m2049r
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.m2049r.xmrwallet;
|
||||
|
||||
public interface OnBackPressedListener {
|
||||
boolean onBackPressed();
|
||||
}
|
|
@ -377,12 +377,12 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
|||
switch (type) {
|
||||
case Toolbar.BUTTON_BACK:
|
||||
onDisposeRequest();
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
break;
|
||||
case Toolbar.BUTTON_CANCEL:
|
||||
onDisposeRequest();
|
||||
Helper.hideKeyboard(WalletActivity.this);
|
||||
WalletActivity.super.onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
break;
|
||||
case Toolbar.BUTTON_CLOSE:
|
||||
finish();
|
||||
|
@ -964,23 +964,6 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
|||
return getWallet().getUnlockedBalance();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (drawer.isDrawerOpen(GravityCompat.START)) {
|
||||
drawer.closeDrawer(GravityCompat.START);
|
||||
return;
|
||||
}
|
||||
final Fragment fragment = getCurrentFragment();
|
||||
if (fragment instanceof OnBackPressedListener) {
|
||||
if (!((OnBackPressedListener) fragment).onBackPressed()) {
|
||||
super.onBackPressed();
|
||||
}
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
Helper.hideKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFragmentDone() {
|
||||
popFragmentStack(null);
|
||||
|
@ -1201,7 +1184,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
|||
@Override
|
||||
public void onSubaddressSelected(@Nullable final Subaddress subaddress) {
|
||||
selectedSubaddressIndex = subaddress.getAddressIndex();
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -29,6 +29,7 @@ import android.view.ViewGroup;
|
|||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
@ -37,7 +38,6 @@ import androidx.fragment.app.FragmentStatePagerAdapter;
|
|||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.google.android.material.transition.MaterialContainerTransform;
|
||||
import com.m2049r.xmrwallet.OnBackPressedListener;
|
||||
import com.m2049r.xmrwallet.OnUriScannedListener;
|
||||
import com.m2049r.xmrwallet.R;
|
||||
import com.m2049r.xmrwallet.WalletActivity;
|
||||
|
@ -63,7 +63,7 @@ public class SendFragment extends Fragment
|
|||
SendAmountWizardFragment.Listener,
|
||||
SendConfirmWizardFragment.Listener,
|
||||
SendSuccessWizardFragment.Listener,
|
||||
OnBackPressedListener, OnUriScannedListener {
|
||||
OnUriScannedListener {
|
||||
|
||||
final static public int MIXIN = 0;
|
||||
|
||||
|
@ -248,16 +248,18 @@ public class SendFragment extends Fragment
|
|||
private SpendViewPager spendViewPager;
|
||||
private SpendPagerAdapter pagerAdapter;
|
||||
|
||||
@Override
|
||||
public boolean onBackPressed() {
|
||||
if (isComitted()) return true; // no going back
|
||||
if (spendViewPager.getCurrentItem() == 0) {
|
||||
return false;
|
||||
} else {
|
||||
spendViewPager.previous();
|
||||
return true;
|
||||
OnBackPressedCallback backPressedCallback = new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (isComitted()) return; // no going back
|
||||
if (spendViewPager.getCurrentItem() == 0) {
|
||||
setEnabled(false);
|
||||
requireActivity().getOnBackPressedDispatcher().onBackPressed();
|
||||
} else {
|
||||
spendViewPager.previous();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public boolean onUriScanned(BarcodeData barcodeData) {
|
||||
|
@ -546,8 +548,9 @@ public class SendFragment extends Fragment
|
|||
final MaterialContainerTransform transform = new MaterialContainerTransform();
|
||||
transform.setDrawingViewId(R.id.fragment_container);
|
||||
transform.setDuration(getResources().getInteger(R.integer.tx_item_transition_duration));
|
||||
transform.setAllContainerColors(ThemeHelper.getThemedColor(getContext(), android.R.attr.colorBackground));
|
||||
transform.setAllContainerColors(ThemeHelper.getThemedColor(requireContext(), android.R.attr.colorBackground));
|
||||
setSharedElementEnterTransition(transform);
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(this, backPressedCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -46,11 +46,6 @@ public class LedgerProgressDialog extends ProgressDialog implements Ledger.Liste
|
|||
setMessage(context.getString(R.string.progress_ledger_progress));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
// prevent back button
|
||||
}
|
||||
|
||||
private int firstSubaddress = Integer.MAX_VALUE;
|
||||
|
||||
private boolean validate = false;
|
||||
|
|
Loading…
Reference in New Issue