mirror of https://github.com/m2049r/xmrwallet.git
Direct Streetmode & credentials for disabling it (#469)
- Add wallet menu item to enter streetmode directly - Add credentials check to leave streetmode (someone-snatches-your-phone-scenario) - Recheck credentials for showing secrets after entering streetmode
This commit is contained in:
parent
29583fa40d
commit
5bfb920979
|
@ -162,7 +162,7 @@ public class LoginActivity extends BaseActivity
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onWalletSelected(String walletName, String daemon) {
|
public boolean onWalletSelected(String walletName, String daemon, boolean streetmode) {
|
||||||
if (daemon.length() == 0) {
|
if (daemon.length() == 0) {
|
||||||
Toast.makeText(this, getString(R.string.prompt_daemon_missing), Toast.LENGTH_SHORT).show();
|
Toast.makeText(this, getString(R.string.prompt_daemon_missing), Toast.LENGTH_SHORT).show();
|
||||||
return false;
|
return false;
|
||||||
|
@ -170,7 +170,7 @@ public class LoginActivity extends BaseActivity
|
||||||
if (checkServiceRunning()) return false;
|
if (checkServiceRunning()) return false;
|
||||||
try {
|
try {
|
||||||
WalletNode aWalletNode = new WalletNode(walletName, daemon, WalletManager.getInstance().getNetworkType());
|
WalletNode aWalletNode = new WalletNode(walletName, daemon, WalletManager.getInstance().getNetworkType());
|
||||||
new AsyncOpenWallet().execute(aWalletNode);
|
new AsyncOpenWallet(streetmode).execute(aWalletNode);
|
||||||
} catch (IllegalArgumentException ex) {
|
} catch (IllegalArgumentException ex) {
|
||||||
Timber.e(ex.getLocalizedMessage());
|
Timber.e(ex.getLocalizedMessage());
|
||||||
Toast.makeText(this, ex.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
|
Toast.makeText(this, ex.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
|
||||||
|
@ -580,12 +580,14 @@ public class LoginActivity extends BaseActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void startWallet(String walletName, String walletPassword, boolean fingerprintUsed) {
|
void startWallet(String walletName, String walletPassword,
|
||||||
|
boolean fingerprintUsed, boolean streetmode) {
|
||||||
Timber.d("startWallet()");
|
Timber.d("startWallet()");
|
||||||
Intent intent = new Intent(getApplicationContext(), WalletActivity.class);
|
Intent intent = new Intent(getApplicationContext(), WalletActivity.class);
|
||||||
intent.putExtra(WalletActivity.REQUEST_ID, walletName);
|
intent.putExtra(WalletActivity.REQUEST_ID, walletName);
|
||||||
intent.putExtra(WalletActivity.REQUEST_PW, walletPassword);
|
intent.putExtra(WalletActivity.REQUEST_PW, walletPassword);
|
||||||
intent.putExtra(WalletActivity.REQUEST_FINGERPRINT_USED, fingerprintUsed);
|
intent.putExtra(WalletActivity.REQUEST_FINGERPRINT_USED, fingerprintUsed);
|
||||||
|
intent.putExtra(WalletActivity.REQUEST_STREETMODE, streetmode);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1098,7 +1100,12 @@ public class LoginActivity extends BaseActivity
|
||||||
final static int INVALID = 2;
|
final static int INVALID = 2;
|
||||||
final static int IOEX = 3;
|
final static int IOEX = 3;
|
||||||
|
|
||||||
WalletNode walletNode;
|
private WalletNode walletNode;
|
||||||
|
private final boolean streetmode;
|
||||||
|
|
||||||
|
public AsyncOpenWallet(boolean streetmode) {
|
||||||
|
this.streetmode = streetmode;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPreExecute() {
|
protected void onPreExecute() {
|
||||||
|
@ -1147,7 +1154,7 @@ public class LoginActivity extends BaseActivity
|
||||||
case OK:
|
case OK:
|
||||||
Timber.d("selected wallet is .%s.", walletNode.getName());
|
Timber.d("selected wallet is .%s.", walletNode.getName());
|
||||||
// now it's getting real, onValidateFields if wallet exists
|
// now it's getting real, onValidateFields if wallet exists
|
||||||
promptAndStart(walletNode);
|
promptAndStart(walletNode, streetmode);
|
||||||
break;
|
break;
|
||||||
case TIMEOUT:
|
case TIMEOUT:
|
||||||
Toast.makeText(LoginActivity.this, getString(R.string.status_wallet_connect_timeout), Toast.LENGTH_LONG).show();
|
Toast.makeText(LoginActivity.this, getString(R.string.status_wallet_connect_timeout), Toast.LENGTH_LONG).show();
|
||||||
|
@ -1184,7 +1191,7 @@ public class LoginActivity extends BaseActivity
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void promptAndStart(WalletNode walletNode) {
|
void promptAndStart(WalletNode walletNode, final boolean streetmode) {
|
||||||
File walletFile = Helper.getWalletFile(this, walletNode.getName());
|
File walletFile = Helper.getWalletFile(this, walletNode.getName());
|
||||||
if (WalletManager.getInstance().walletExists(walletFile)) {
|
if (WalletManager.getInstance().walletExists(walletFile)) {
|
||||||
WalletManager.getInstance().setDaemon(walletNode);
|
WalletManager.getInstance().setDaemon(walletNode);
|
||||||
|
@ -1193,7 +1200,7 @@ public class LoginActivity extends BaseActivity
|
||||||
@Override
|
@Override
|
||||||
public void action(String walletName, String password, boolean fingerprintUsed) {
|
public void action(String walletName, String password, boolean fingerprintUsed) {
|
||||||
if (checkDevice(walletName, password))
|
if (checkDevice(walletName, password))
|
||||||
startWallet(walletName, password, fingerprintUsed);
|
startWallet(walletName, password, fingerprintUsed, streetmode);
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -81,7 +81,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||||
|
|
||||||
File getStorageRoot();
|
File getStorageRoot();
|
||||||
|
|
||||||
boolean onWalletSelected(String wallet, String daemon);
|
boolean onWalletSelected(String wallet, String daemon, boolean streetmode);
|
||||||
|
|
||||||
void onWalletDetails(String wallet);
|
void onWalletDetails(String wallet);
|
||||||
|
|
||||||
|
@ -238,8 +238,11 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||||
Toast.makeText(getActivity(), getString(R.string.prompt_wrong_net), Toast.LENGTH_LONG).show();
|
Toast.makeText(getActivity(), getString(R.string.prompt_wrong_net), Toast.LENGTH_LONG).show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
openWalet(infoItem.name, false);
|
||||||
|
}
|
||||||
|
|
||||||
if (activityCallback.onWalletSelected(infoItem.name, getDaemon())) {
|
private void openWalet(String name, boolean streetmode) {
|
||||||
|
if (activityCallback.onWalletSelected(name, getDaemon(), streetmode)) {
|
||||||
savePrefs();
|
savePrefs();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -247,6 +250,9 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
||||||
@Override
|
@Override
|
||||||
public boolean onContextInteraction(MenuItem item, WalletManager.WalletInfo listItem) {
|
public boolean onContextInteraction(MenuItem item, WalletManager.WalletInfo listItem) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
|
case R.id.action_streetmode:
|
||||||
|
openWalet(listItem.name, true);
|
||||||
|
break;
|
||||||
case R.id.action_info:
|
case R.id.action_info:
|
||||||
showInfo(listItem.name);
|
showInfo(listItem.name);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -80,6 +80,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||||
public static final String REQUEST_ID = "id";
|
public static final String REQUEST_ID = "id";
|
||||||
public static final String REQUEST_PW = "pw";
|
public static final String REQUEST_PW = "pw";
|
||||||
public static final String REQUEST_FINGERPRINT_USED = "fingerprint";
|
public static final String REQUEST_FINGERPRINT_USED = "fingerprint";
|
||||||
|
public static final String REQUEST_STREETMODE = "streetmode";
|
||||||
|
|
||||||
private NavigationView accountsView;
|
private NavigationView accountsView;
|
||||||
private DrawerLayout drawer;
|
private DrawerLayout drawer;
|
||||||
|
@ -87,6 +88,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||||
|
|
||||||
private Toolbar toolbar;
|
private Toolbar toolbar;
|
||||||
private boolean needVerifyIdentity;
|
private boolean needVerifyIdentity;
|
||||||
|
private boolean requestStreetMode = false;
|
||||||
|
|
||||||
private String password;
|
private String password;
|
||||||
|
|
||||||
|
@ -135,13 +137,13 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||||
return streetMode > 0;
|
return streetMode > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void toggleStreetMode() {
|
private void enableStreetMode(boolean enable) {
|
||||||
if (streetMode == 0) {
|
if (enable) {
|
||||||
|
needVerifyIdentity = true;
|
||||||
streetMode = getWallet().getDaemonBlockChainHeight();
|
streetMode = getWallet().getDaemonBlockChainHeight();
|
||||||
} else {
|
} else {
|
||||||
streetMode = 0;
|
streetMode = 0;
|
||||||
}
|
}
|
||||||
Timber.e("streetMode=" + streetMode);
|
|
||||||
updateAccountsBalance();
|
updateAccountsBalance();
|
||||||
forceUpdate();
|
forceUpdate();
|
||||||
}
|
}
|
||||||
|
@ -178,6 +180,8 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||||
acquireWakeLock();
|
acquireWakeLock();
|
||||||
String walletId = extras.getString(REQUEST_ID);
|
String walletId = extras.getString(REQUEST_ID);
|
||||||
needVerifyIdentity = extras.getBoolean(REQUEST_FINGERPRINT_USED);
|
needVerifyIdentity = extras.getBoolean(REQUEST_FINGERPRINT_USED);
|
||||||
|
// we can set the streetmode height AFTER opening the wallet
|
||||||
|
requestStreetMode = extras.getBoolean(REQUEST_STREETMODE);
|
||||||
password = extras.getString(REQUEST_PW);
|
password = extras.getString(REQUEST_PW);
|
||||||
connectWalletService(walletId, password);
|
connectWalletService(walletId, password);
|
||||||
} else {
|
} else {
|
||||||
|
@ -259,18 +263,65 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||||
onAccountRename();
|
onAccountRename();
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_streetmode:
|
case R.id.action_streetmode:
|
||||||
toggleStreetMode();
|
if (isStreetMode()) { // disable streetmode
|
||||||
|
onDisableStreetMode();
|
||||||
|
} else {
|
||||||
|
onEnableStreetMode();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateStreetMode() {
|
||||||
if (isStreetMode()) {
|
if (isStreetMode()) {
|
||||||
toolbar.setBackgroundResource(R.drawable.backgound_toolbar_streetmode);
|
toolbar.setBackgroundResource(R.drawable.backgound_toolbar_streetmode);
|
||||||
} else {
|
} else {
|
||||||
showNet();
|
showNet();
|
||||||
}
|
}
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
return true;
|
|
||||||
default:
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
|
private void onEnableStreetMode() {
|
||||||
|
enableStreetMode(true);
|
||||||
|
updateStreetMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onDisableStreetMode() {
|
||||||
|
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
switch (which) {
|
||||||
|
case DialogInterface.BUTTON_POSITIVE:
|
||||||
|
Helper.promptPassword(WalletActivity.this, getWallet().getName(), true, new Helper.PasswordAction() {
|
||||||
|
@Override
|
||||||
|
public void action(String walletName, String password, boolean fingerprintUsed) {
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
enableStreetMode(false);
|
||||||
|
updateStreetMode();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case DialogInterface.BUTTON_NEGATIVE:
|
||||||
|
// do nothing
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setMessage(getString(R.string.details_alert_message))
|
||||||
|
.setPositiveButton(getString(R.string.details_alert_yes), dialogClickListener)
|
||||||
|
.setNegativeButton(getString(R.string.details_alert_no), dialogClickListener)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void onWalletChangePassword() {
|
public void onWalletChangePassword() {
|
||||||
try {
|
try {
|
||||||
|
@ -595,6 +646,8 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||||
haveWallet = true;
|
haveWallet = true;
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
|
|
||||||
|
enableStreetMode(requestStreetMode);
|
||||||
|
|
||||||
final WalletFragment walletFragment = (WalletFragment)
|
final WalletFragment walletFragment = (WalletFragment)
|
||||||
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
|
getSupportFragmentManager().findFragmentById(R.id.fragment_container);
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
|
@ -1173,16 +1226,4 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
|
||||||
Toast.LENGTH_SHORT).show();
|
Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Override
|
|
||||||
// public void invalidateOptionsMenu() {
|
|
||||||
// super.invalidateOptionsMenu();
|
|
||||||
// if (isStreetMode()) {
|
|
||||||
// item.setIcon(R.drawable.gunther_csi_24dp);
|
|
||||||
// toolbar.setBackgroundResource(R.drawable.backgound_toolbar_streetmode);
|
|
||||||
// } else {
|
|
||||||
// item.setIcon(R.drawable.gunther_24dp);
|
|
||||||
// showNet();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_streetmode"
|
||||||
|
android:orderInCategory="50"
|
||||||
|
android:title="@string/menu_streetmode" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_receive"
|
android:id="@+id/action_receive"
|
||||||
android:orderInCategory="100"
|
android:orderInCategory="100"
|
||||||
|
|
Loading…
Reference in New Issue