tweaks & fixed store() error, refactoring

This commit is contained in:
m2049r 2017-08-18 02:01:39 +02:00
parent c9ae39508f
commit 62433f6e10
8 changed files with 117 additions and 134 deletions

View File

@ -579,6 +579,9 @@ Java_com_m2049r_xmrwallet_model_Wallet_store(JNIEnv *env, jobject instance,
const char *_path = env->GetStringUTFChars(path, JNI_FALSE); const char *_path = env->GetStringUTFChars(path, JNI_FALSE);
Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance); Bitmonero::Wallet *wallet = getHandle<Bitmonero::Wallet>(env, instance);
bool success = wallet->store(std::string(_path)); bool success = wallet->store(std::string(_path));
if (!success) {
LOGE("store() %s", wallet->errorString().c_str());
}
env->ReleaseStringUTFChars(path, _path); env->ReleaseStringUTFChars(path, _path);
return success; return success;
} }

View File

@ -25,7 +25,9 @@ import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import com.m2049r.xmrwallet.model.Wallet;
import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.service.MoneroHandlerThread;
public class GenerateReviewFragment extends Fragment { public class GenerateReviewFragment extends Fragment {
static final String TAG = "GenerateReviewFragment"; static final String TAG = "GenerateReviewFragment";
@ -65,7 +67,12 @@ public class GenerateReviewFragment extends Fragment {
} }
}); });
showDetails(); Bundle b = getArguments();
String name = b.getString("name");
String password = b.getString("password");
String type = b.getString("type");
show(name, password, type);
return view; return view;
} }
@ -76,33 +83,41 @@ public class GenerateReviewFragment extends Fragment {
activityCallback.onAccept(name, password); activityCallback.onAccept(name, password);
} }
public void showDetails() { private void show(final String walletPath, final String password, final String type) {
Bundle b = getArguments(); new Thread(null,
String name = b.getString("name"); new Runnable() {
String password = b.getString("password"); @Override
String address = b.getString("address"); public void run() {
String seed = b.getString("seed"); Wallet wallet = WalletManager.getInstance().openWallet(walletPath, password);
String view = b.getString("viewkey"); final String name = wallet.getName();
String spend = b.getString("spendkey"); final String seed = wallet.getSeed();
final String address = wallet.getAddress();
final String view = wallet.getSecretViewKey();
final String spend = wallet.isWatchOnly() ? "" : "not available - use seed for recovery";
wallet.close();
tvWalletName.setText(name); getActivity().runOnUiThread(new Runnable() {
tvWalletPassword.setText(password); public void run() {
tvWalletAddress.setText(address); if (type.equals(GenerateReviewFragment.VIEW_ACCEPT)) {
tvWalletMnemonic.setText(seed); tvWalletPassword.setText(password);
tvWalletViewKey.setText(view); bAccept.setVisibility(View.VISIBLE);
if (spend.length() > 0) { // should be == 64, but spendkey is not in the API yet bAccept.setEnabled(true);
tvWalletSpendKey.setText(spend); }
} else { tvWalletName.setText(name);
tvWalletSpendKey.setText(getString(R.string.generate_wallet_watchonly)); tvWalletAddress.setText(address);
} tvWalletMnemonic.setText(seed);
tvWalletViewKey.setText(view);
if (spend.length() > 0) { //TODO should be == 64, but spendkey is not in the API yet
tvWalletSpendKey.setText(spend);
} else {
tvWalletSpendKey.setText(getString(R.string.generate_wallet_watchonly));
}
}
});
}
}
, "DetailsReview", MoneroHandlerThread.THREAD_STACK_SIZE).start();
String type = b.getString("view");
if (type.equals(GenerateReviewFragment.VIEW_ACCEPT)) {
bAccept.setVisibility(View.VISIBLE);
bAccept.setEnabled(true);
} else {
bAccept.setVisibility(View.GONE);
}
} }
GenerateReviewFragment.Listener activityCallback; GenerateReviewFragment.Listener activityCallback;

View File

@ -94,12 +94,12 @@ public class LoginActivity extends AppCompatActivity
@Override @Override
public void onWalletDetails(final String walletName) { public void onWalletDetails(final String walletName) {
Log.d(TAG, "details for wallet ." + walletName + "."); Log.d(TAG, "details for wallet ." + walletName + ".");
String walletPath = Helper.getWalletPath(this, walletName); final String walletPath = Helper.getWalletPath(this, walletName);
if (WalletManager.getInstance().walletExists(walletPath)) { if (WalletManager.getInstance().walletExists(walletPath)) {
promptPassword(walletName, new PasswordAction() { promptPassword(walletName, new PasswordAction() {
@Override @Override
public void action(String walletName, String password) { public void action(String walletName, String password) {
startDetails(walletName, password); startDetails(walletPath, password, GenerateReviewFragment.VIEW_DETAILS);
} }
}); });
} else { // this cannot really happen as we prefilter choices } else { // this cannot really happen as we prefilter choices
@ -226,31 +226,13 @@ public class LoginActivity extends AppCompatActivity
startActivity(intent); startActivity(intent);
} }
void startDetails(final String walletName, final String password) { void startDetails(final String walletPath, final String password, String type) {
Log.d(TAG, "startDetails()"); Log.d(TAG, "startDetails()");
new Thread(null, Bundle b = new Bundle();
new Runnable() { b.putString("name", walletPath);
@Override b.putString("password", password);
public void run() { b.putString("type", type);
String path = Helper.getWalletPath(getApplicationContext(), walletName); startReviewFragment(b);
Wallet wallet = WalletManager.getInstance().openWallet(path, password);
final String seed = wallet.getSeed();
final String address = wallet.getAddress();
final String view = wallet.getSecretViewKey();
final String spend = wallet.isWatchOnly() ? "" : "not available - use seed for recovery";
wallet.close();
Bundle b = new Bundle();
b.putString("name", walletName);
b.putString("password", password);
b.putString("seed", seed);
b.putString("address", address);
b.putString("viewkey", view);
b.putString("spendkey", spend);
b.putString("view", GenerateReviewFragment.VIEW_DETAILS);
startReviewFragment(b);
}
}
, "DetailsWallet", MoneroHandlerThread.THREAD_STACK_SIZE).start();
} }
@ -332,53 +314,36 @@ public class LoginActivity extends AppCompatActivity
if (cacheFile.exists() || keysFile.exists() || addressFile.exists()) { if (cacheFile.exists() || keysFile.exists() || addressFile.exists()) {
Log.e(TAG, "Cannot remove all old wallet files: " + cacheFile.getAbsolutePath()); Log.e(TAG, "Cannot remove all old wallet files: " + cacheFile.getAbsolutePath());
genFragment.walletGenerateError(); genFragment.walletGenerateError();
;
return; return;
} }
final String newWalletPath = new File(newWalletFolder, name).getAbsolutePath(); String newWalletPath = new File(newWalletFolder, name).getAbsolutePath();
new Thread(null, boolean success = walletCreator.createWallet(newWalletPath, password);
new Runnable() { if (success) {
@Override startDetails(newWalletPath, password, GenerateReviewFragment.VIEW_ACCEPT);
public void run() { } else {
Log.d(TAG, "creating wallet " + newWalletPath); Toast.makeText(LoginActivity.this,
Wallet newWallet = walletCreator.createWallet(newWalletPath, password); getString(R.string.generate_wallet_create_failed), Toast.LENGTH_LONG).show();
final String seed = newWallet.getSeed(); Log.e(TAG, "Could not create new wallet in " + newWalletPath);
final String address = newWallet.getAddress();
final String view = newWallet.getSecretViewKey(); }
final String spend = newWallet.isWatchOnly() ? "" : "not available - use seed for recovery";
newWallet.close();
Log.d(TAG, "Created " + address);
//TODO: is runOnUiThread needed?
runOnUiThread(new Runnable() {
public void run() {
Bundle b = new Bundle();
b.putString("name", name);
b.putString("password", password);
b.putString("seed", seed);
b.putString("address", address);
b.putString("viewkey", view);
b.putString("spendkey", spend);
b.putString("view", GenerateReviewFragment.VIEW_ACCEPT);
startReviewFragment(b);
}
});
}
}
, "CreateWallet", MoneroHandlerThread.THREAD_STACK_SIZE).start();
} }
interface WalletCreator { interface WalletCreator {
Wallet createWallet(String path, String password); boolean createWallet(String path, String password);
} }
@Override @Override
public void onGenerate(String name, String password) { public void onGenerate(String name, String password) {
createWallet(name, password, createWallet(name, password,
new WalletCreator() { new WalletCreator() {
public Wallet createWallet(String path, String password) { public boolean createWallet(String path, String password) {
return WalletManager.getInstance() Wallet newWallet = WalletManager.getInstance()
.createWallet(path, password, MNEMONIC_LANGUAGE); .createWallet(path, password, MNEMONIC_LANGUAGE);
boolean success = (newWallet.getStatus() == Wallet.Status.Status_Ok);
if (!success) Log.e(TAG, newWallet.getErrorString());
newWallet.close();
return success;
} }
}); });
} }
@ -387,11 +352,14 @@ public class LoginActivity extends AppCompatActivity
public void onGenerate(String name, String password, final String seed, final long restoreHeight) { public void onGenerate(String name, String password, final String seed, final long restoreHeight) {
createWallet(name, password, createWallet(name, password,
new WalletCreator() { new WalletCreator() {
public Wallet createWallet(String path, String password) { public boolean createWallet(String path, String password) {
Wallet newWallet = WalletManager.getInstance().recoveryWallet(path, seed, restoreHeight); Wallet newWallet = WalletManager.getInstance().recoveryWallet(path, seed, restoreHeight);
boolean success = (newWallet.getStatus() == Wallet.Status.Status_Ok);
if (!success) Log.e(TAG, newWallet.getErrorString());
newWallet.setPassword(password); newWallet.setPassword(password);
newWallet.store(); success = success && newWallet.store();
return newWallet; newWallet.close();
return success;
} }
}); });
} }
@ -401,13 +369,16 @@ public class LoginActivity extends AppCompatActivity
final String address, final String viewKey, final String spendKey, final long restoreHeight) { final String address, final String viewKey, final String spendKey, final long restoreHeight) {
createWallet(name, password, createWallet(name, password,
new WalletCreator() { new WalletCreator() {
public Wallet createWallet(String path, String password) { public boolean createWallet(String path, String password) {
Wallet newWallet = WalletManager.getInstance() Wallet newWallet = WalletManager.getInstance()
.createWalletFromKeys(path, MNEMONIC_LANGUAGE, restoreHeight, .createWalletFromKeys(path, MNEMONIC_LANGUAGE, restoreHeight,
address, viewKey, spendKey); address, viewKey, spendKey);
boolean success = (newWallet.getStatus() == Wallet.Status.Status_Ok);
if (!success) Log.e(TAG, newWallet.getErrorString());
newWallet.setPassword(password); newWallet.setPassword(password);
newWallet.store(); success = success && newWallet.store();
return newWallet; newWallet.close();
return success;
} }
}); });
} }
@ -417,31 +388,20 @@ public class LoginActivity extends AppCompatActivity
public void onAccept(final String name, final String password) { public void onAccept(final String name, final String password) {
final File newWalletFolder = new File(getStorageRoot(), ".new"); final File newWalletFolder = new File(getStorageRoot(), ".new");
final File walletFolder = getStorageRoot(); final File walletFolder = getStorageRoot();
new Thread(null, final String walletPath = new File(walletFolder, name).getAbsolutePath();
new Runnable() { final boolean rc = copyWallet(walletFolder, newWalletFolder, name)
@Override &&
public void run() { (testWallet(walletPath, password) == Wallet.Status.Status_Ok);
final String walletPath = new File(walletFolder, name).getAbsolutePath(); if (rc) {
final boolean rc = copyWallet(walletFolder, newWalletFolder, name) getFragmentManager().popBackStack("gen",
&& FragmentManager.POP_BACK_STACK_INCLUSIVE);
(testWallet(walletPath, password) == Wallet.Status.Status_Ok); Toast.makeText(LoginActivity.this,
runOnUiThread(new Runnable() { getString(R.string.generate_wallet_created), Toast.LENGTH_SHORT).show();
public void run() { } else {
if (rc) { Log.e(TAG, "Wallet store failed to " + walletPath);
getFragmentManager().popBackStack("gen", Toast.makeText(LoginActivity.this,
FragmentManager.POP_BACK_STACK_INCLUSIVE); getString(R.string.generate_wallet_create_failed_2), Toast.LENGTH_LONG).show();
Toast.makeText(LoginActivity.this, }
getString(R.string.generate_wallet_created), Toast.LENGTH_SHORT).show();
} else {
Log.e(TAG, "Wallet store failed to " + walletPath);
Toast.makeText(LoginActivity.this,
getString(R.string.generate_wallet_create_failed_2), Toast.LENGTH_LONG).show();
}
}
});
}
}
, "AcceptWallet", MoneroHandlerThread.THREAD_STACK_SIZE).start();
} }
Wallet.Status testWallet(String path, String password) { Wallet.Status testWallet(String path, String password) {
@ -458,6 +418,7 @@ public class LoginActivity extends AppCompatActivity
boolean success = false; boolean success = false;
try { try {
// TODO: the cache is corrupt if we recover (!!) // TODO: the cache is corrupt if we recover (!!)
// TODO: the cache is ok if we immediately to a full refresh()
// TODO recoveryheight is ignored but not on watchonly wallet ?! - find out why // TODO recoveryheight is ignored but not on watchonly wallet ?! - find out why
//copyFile(dstDir, srcDir, name); //copyFile(dstDir, srcDir, name);
copyFile(dstDir, srcDir, name + ".keys"); copyFile(dstDir, srcDir, name + ".keys");

View File

@ -256,10 +256,14 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment.
} }
@Override @Override
public void onWalletStored() { public void onWalletStored(final boolean success) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
public void run() { public void run() {
Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_unloaded), Toast.LENGTH_SHORT).show(); if (success) {
Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_unloaded), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(WalletActivity.this, getString(R.string.status_wallet_unload_failed), Toast.LENGTH_LONG).show();
}
} }
}); });
} }

View File

@ -28,8 +28,7 @@ public class Wallet {
static final String TAG = "Wallet"; static final String TAG = "Wallet";
public String getName() { public String getName() {
String p = getPath(); return new File(getPath()).getName();
return new File(p).getName();
} }
private long handle = 0; private long handle = 0;
@ -83,7 +82,7 @@ public class Wallet {
public native String getSecretViewKey(); public native String getSecretViewKey();
public boolean store() { public boolean store() {
return store(this.getPath()); return store("");
} }
public native boolean store(String path); public native boolean store(String path);

View File

@ -193,7 +193,7 @@ public class WalletService extends Service {
void onProgress(int n); void onProgress(int n);
void onWalletStored(); void onWalletStored(boolean success);
} }
String progressText = null; String progressText = null;
@ -258,9 +258,12 @@ public class WalletService extends Service {
} else if (cmd.equals(REQUEST_CMD_STORE)) { } else if (cmd.equals(REQUEST_CMD_STORE)) {
Wallet myWallet = getWallet(); Wallet myWallet = getWallet();
Log.d(TAG, "storing wallet: " + myWallet.getName()); Log.d(TAG, "storing wallet: " + myWallet.getName());
myWallet.store(); boolean rc = myWallet.store();
Log.d(TAG, "wallet stored: " + myWallet.getName()); Log.d(TAG, "wallet stored: " + myWallet.getName() + " with rc=" + rc);
if (observer != null) observer.onWalletStored(); if (!rc) {
Log.d(TAG, "Wallet store failed: " + myWallet.getErrorString());
}
if (observer != null) observer.onWalletStored(rc);
} }
} }
break; break;

View File

@ -34,8 +34,8 @@
<LinearLayout <LinearLayout
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:orientation="horizontal"
android:weightSum="2"> android:weightSum="2">
<TextView <TextView
@ -43,7 +43,6 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/generate_name_hint"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/colorPrimaryDark" android:textColor="@color/colorPrimaryDark"
android:textSize="16sp" /> android:textSize="16sp" />
@ -53,7 +52,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/generate_password_hint" android:text="***"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/colorPrimaryDark" android:textColor="@color/colorPrimaryDark"
android:textSize="16sp" /> android:textSize="16sp" />
@ -72,7 +71,6 @@
android:id="@+id/tvWalletMnemonic" android:id="@+id/tvWalletMnemonic"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/generate_mnemonic_placeholder"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/colorPrimaryDark" android:textColor="@color/colorPrimaryDark"
android:textSize="16sp" /> android:textSize="16sp" />
@ -92,7 +90,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
android:text="@string/generate_address_placeholder"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/colorPrimaryDark" android:textColor="@color/colorPrimaryDark"
android:textIsSelectable="true" android:textIsSelectable="true"
@ -113,7 +110,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
android:text="@string/generate_viewkey_placeholder"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/colorPrimaryDark" android:textColor="@color/colorPrimaryDark"
android:textIsSelectable="true" android:textIsSelectable="true"
@ -134,7 +130,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
android:text="@string/generate_spendkey_placeholder"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/colorPrimaryDark" android:textColor="@color/colorPrimaryDark"
android:textIsSelectable="true" android:textIsSelectable="true"
@ -146,6 +141,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:background="@color/colorPrimary" android:background="@color/colorPrimary"
android:text="@string/generate_button_accept" /> android:text="@string/generate_button_accept"
android:visibility="gone" />
</LinearLayout> </LinearLayout>

View File

@ -12,6 +12,7 @@
<string name="status_wallet_loading">Loading Wallet &#8230;</string> <string name="status_wallet_loading">Loading Wallet &#8230;</string>
<string name="status_wallet_unloading">Saving Wallet</string> <string name="status_wallet_unloading">Saving Wallet</string>
<string name="status_wallet_unloaded">Wallet saved</string> <string name="status_wallet_unloaded">Wallet saved</string>
<string name="status_wallet_unload_failed">Wallet save failed!</string>
<string name="status_wallet_connecting">Connecting &#8230;</string> <string name="status_wallet_connecting">Connecting &#8230;</string>
<string name="status_working">Working on it &#8230;</string> <string name="status_working">Working on it &#8230;</string>
@ -58,6 +59,7 @@
<string name="generate_wallet_exists">Wallet exists! Choose another name</string> <string name="generate_wallet_exists">Wallet exists! Choose another name</string>
<string name="generate_wallet_created">Wallet created</string> <string name="generate_wallet_created">Wallet created</string>
<string name="generate_wallet_create_failed">Wallet create failed</string>
<string name="generate_wallet_create_failed_1">Wallet create failed (1/2)</string> <string name="generate_wallet_create_failed_1">Wallet create failed (1/2)</string>
<string name="generate_wallet_create_failed_2">Wallet create failed (2/2)</string> <string name="generate_wallet_create_failed_2">Wallet create failed (2/2)</string>
<string name="generate_address_placeholder">9tDC52GsMjTNt4dpnRCwAF7ekVBkbkgkXGaMKTcSTpBhGpqkPX56jCNRydLq9oGjbbAQBsZhLfgmTKsntmxRd3TaJFYM2f8</string> <string name="generate_address_placeholder">9tDC52GsMjTNt4dpnRCwAF7ekVBkbkgkXGaMKTcSTpBhGpqkPX56jCNRydLq9oGjbbAQBsZhLfgmTKsntmxRd3TaJFYM2f8</string>