mirror of
https://github.com/jwinterm/LightWallet2.git
synced 2026-10-17 05:21:26 +02:00
Tx history and wallet save now working.
This commit is contained in:
@@ -74,7 +74,7 @@ public class DaemonView {
|
||||
daemonlayout.add(rewardlabel).pad(padvalue);
|
||||
daemonlayout.add(rewardvalue).pad(padvalue).row();
|
||||
|
||||
daemonlayout.add(new Label("", uiSkin)).fill().expand();
|
||||
daemonlayout.add(new Label("", uiSkin));
|
||||
}
|
||||
|
||||
public void Update(DaemonValues daemonvalues) {
|
||||
|
||||
@@ -29,7 +29,7 @@ public class HistoryView {
|
||||
|
||||
historylayout.add(new Label("Transaction history (click to copy txid)", uiSkin)).row();
|
||||
historylayout.add(new Label("Type | Amount | Transaction ID", uiSkin)).row();
|
||||
historylayout.add(scroller).fill().expand();
|
||||
historylayout.add(scroller).fill();
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ public class ImportKeysScreen extends AbstractScreen {
|
||||
|
||||
Stage stage;
|
||||
Table screenlayout;
|
||||
Skin uiSkin;
|
||||
int padvalue;
|
||||
|
||||
Image logo;
|
||||
@@ -58,7 +57,6 @@ public class ImportKeysScreen extends AbstractScreen {
|
||||
public ImportKeysScreen(final LightWallet game) {
|
||||
super(game);
|
||||
|
||||
uiSkin = new Skin(Gdx.files.internal("skin/uiskin.json"));
|
||||
padvalue = 20;
|
||||
|
||||
stage = new Stage();
|
||||
@@ -75,23 +73,23 @@ public class ImportKeysScreen extends AbstractScreen {
|
||||
+ "The wallet keys file will be copied to the local directory and a new binary file will be created. "
|
||||
+ "The default bitmonerod node is set for moneroclub, if you want to run a local daemon change the node field to http://localhost:18081.";
|
||||
|
||||
instructionlabel= new Label(instruction, uiSkin);
|
||||
instructionlabel= new Label(instruction, game.uiSkin);
|
||||
instructionlabel.setWrap(true);
|
||||
textcontainer = new Table();
|
||||
textcontainer.add(instructionlabel).width(600);
|
||||
|
||||
inputtable = new Table();
|
||||
|
||||
pathlabel = new Label("Wallet path: ", uiSkin);
|
||||
pathtext = new TextField("", uiSkin);
|
||||
pathlabel = new Label("Wallet path: ", game.uiSkin);
|
||||
pathtext = new TextField("", game.uiSkin);
|
||||
|
||||
pwlabel = new Label("Password: ", uiSkin);
|
||||
pwtext = new TextField("", uiSkin);
|
||||
pwlabel = new Label("Password: ", game.uiSkin);
|
||||
pwtext = new TextField("", game.uiSkin);
|
||||
pwtext.setPasswordMode(true);
|
||||
pwtext.setPasswordCharacter((char) 42);
|
||||
|
||||
nodelabel = new Label("Node address: ", uiSkin);
|
||||
nodetext = new TextField(Constants.moneroclubdmn, uiSkin);
|
||||
nodelabel = new Label("Node address: ", game.uiSkin);
|
||||
nodetext = new TextField(Constants.moneroclubdmn, game.uiSkin);
|
||||
|
||||
inputtable.add(pathlabel).width(200);
|
||||
inputtable.add(pathtext).width(400).row();
|
||||
@@ -102,7 +100,7 @@ public class ImportKeysScreen extends AbstractScreen {
|
||||
|
||||
buttontable = new Table();
|
||||
|
||||
importbutton = new TextButton("Import!", uiSkin);
|
||||
importbutton = new TextButton("Import!", game.uiSkin);
|
||||
importbutton.addListener(new ClickListener() {
|
||||
@Override
|
||||
public void clicked (InputEvent event, float x, float y) {
|
||||
@@ -113,7 +111,7 @@ public class ImportKeysScreen extends AbstractScreen {
|
||||
}
|
||||
});
|
||||
|
||||
gobackbutton = new TextButton("Cancel", uiSkin);
|
||||
gobackbutton = new TextButton("Cancel", game.uiSkin);
|
||||
gobackbutton.addListener(new ClickListener() {
|
||||
@Override
|
||||
public void clicked (InputEvent event, float x, float y) {
|
||||
@@ -165,37 +163,35 @@ public class ImportKeysScreen extends AbstractScreen {
|
||||
|
||||
|
||||
// Create success and failure dialogs to show based on outcome
|
||||
Dialog successdialog = new Dialog("Success!", uiSkin, "dialog") {
|
||||
Dialog successdialog = new Dialog("Success!", game.uiSkin, "dialog") {
|
||||
public void result(Object obj) {
|
||||
System.out.println("result "+obj);
|
||||
}
|
||||
};
|
||||
Label successlabel = new Label("", uiSkin);
|
||||
Label successlabel = new Label("", game.uiSkin);
|
||||
successlabel.setWrap(true);
|
||||
successdialog.add(successlabel).width(400).row();
|
||||
successdialog.button("Continue", true).addListener(new ClickListener() {
|
||||
@Override
|
||||
public void clicked (InputEvent event, float x, float y) {
|
||||
game.setScreen(new MainScreen(game));
|
||||
uiSkin.dispose();
|
||||
stage.dispose();
|
||||
}
|
||||
});
|
||||
successdialog.key(Keys.ENTER, true); //sends "true" when the ENTER key is pressed
|
||||
|
||||
Dialog failuredialog = new Dialog("Utter failure!", uiSkin, "dialog") {
|
||||
Dialog failuredialog = new Dialog("Utter failure!", game.uiSkin, "dialog") {
|
||||
public void result(Object obj) {
|
||||
System.out.println("result "+obj);
|
||||
}
|
||||
};
|
||||
Label failurelabel = new Label("Wallet import failed. Click to start over.", uiSkin);
|
||||
Label failurelabel = new Label("Wallet import failed. Click to start over.", game.uiSkin);
|
||||
failurelabel.setWrap(true);
|
||||
failuredialog.add(failurelabel).width(400).row();
|
||||
failuredialog.button("Continue", true).addListener(new ClickListener() {
|
||||
@Override
|
||||
public void clicked (InputEvent event, float x, float y) {
|
||||
game.setScreen(new WizardScreen(game));
|
||||
uiSkin.dispose();
|
||||
stage.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -10,15 +10,20 @@ import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.Input.Keys;
|
||||
import com.badlogic.gdx.graphics.Texture;
|
||||
import com.badlogic.gdx.scenes.scene2d.InputEvent;
|
||||
import com.badlogic.gdx.scenes.scene2d.Stage;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Button;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Image;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Label;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
|
||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
|
||||
import com.badlogic.gdx.utils.Align;
|
||||
import com.badlogic.gdx.utils.AtomicQueue;
|
||||
import com.jw.lightwallet.LightWallet;
|
||||
import com.jw.lightwallet.daemon.DaemonRPC;
|
||||
@@ -91,7 +96,7 @@ public class MainScreen extends AbstractScreen {
|
||||
balancerpc = new BalanceRPC();
|
||||
balancevalues = new BalanceValues();
|
||||
|
||||
walletsaverpc = new WalletSaveRPC();
|
||||
walletsaverpc = new WalletSaveRPC(game);
|
||||
walletsavevalues= new WalletSaveValues();
|
||||
|
||||
stage = new Stage();
|
||||
@@ -146,16 +151,19 @@ public class MainScreen extends AbstractScreen {
|
||||
buttonrow.add(txhistorybutton).width(Constants.WORLD_WIDTH/4);
|
||||
screenlayout.add(buttonrow).top().row();
|
||||
|
||||
screenlayout.add(logo).pad(10).center().row();
|
||||
screenlayout.add(logo).pad(5).center().row();
|
||||
|
||||
daemonview = new DaemonView(game);
|
||||
walletview = new WalletView(game);
|
||||
walletview = new WalletView(game, walletsaverpc);
|
||||
transactionview = new TransactionView();
|
||||
historyview = new HistoryView();
|
||||
viewcontainer.add(daemonview.daemonlayout).expand().bottom();
|
||||
viewcontainer.add(daemonview.daemonlayout).expand().fill();
|
||||
screenlayout.add(viewcontainer);
|
||||
|
||||
// viewcontainer.setFillParent(true);
|
||||
screenlayout.setFillParent(true);
|
||||
screenlayout.top();
|
||||
// screenlayout.setDebug(true);
|
||||
stage.addActor(screenlayout);
|
||||
}
|
||||
|
||||
@@ -214,7 +222,7 @@ public class MainScreen extends AbstractScreen {
|
||||
}
|
||||
if (sixtysectimer == true) {
|
||||
// Timer task to try and save wallet every minute
|
||||
walletsaverpc.trysave(walletsavevalues);
|
||||
walletsaverpc.trysave(walletview.getSavewalletlabel());
|
||||
dumptxlist();
|
||||
sixtysectimer = false;
|
||||
accum60s = 0;
|
||||
@@ -225,11 +233,12 @@ public class MainScreen extends AbstractScreen {
|
||||
|
||||
}
|
||||
|
||||
// Launch simplewallet in its own thread
|
||||
public void launchsimplewallet() {
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// do something important here, asynchronously to the rendering thread
|
||||
// Setup simplewallet command with the specified file, password, and node address
|
||||
try {
|
||||
Gdx.app.log(LightWallet.LOG, "Command is: " + "simplewallet --wallet-file " + game.walletvalues.getName()
|
||||
+ " --password " + game.walletvalues.getPw() + " --daemon-address " + game.walletvalues.getNode()
|
||||
@@ -240,6 +249,7 @@ public class MainScreen extends AbstractScreen {
|
||||
wr = new BufferedReader(new InputStreamReader(wp.getInputStream()));
|
||||
while (true) {
|
||||
String str = wr.readLine();
|
||||
// Gdx.app.log(LightWallet.LOG, str);
|
||||
wq.put(str);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -263,19 +273,50 @@ public class MainScreen extends AbstractScreen {
|
||||
String queuepoll = wq.poll();
|
||||
// Gdx.app.log(LightWallet.LOG, "Queue result: " + queuepoll);
|
||||
try{
|
||||
// If the string contains "height" then update the daemon and wallet screen blockheight
|
||||
if (queuepoll != null && queuepoll.contains("height:")) {
|
||||
String height = queuepoll.split("height: ")[1].split(",")[0];
|
||||
Gdx.app.log(LightWallet.LOG, "Queue result: " + queuepoll);
|
||||
walletview.syncvalue.setText(height + " / " + daemonvalues.getBlockheight());
|
||||
if (height.equals(Integer.toString(daemonvalues.getBlockheight()))) {
|
||||
walletview.syncvalue.setStyle(game.uiSkin.get("greenlabel", LabelStyle.class));
|
||||
} else {walletview.syncvalue.setStyle(game.uiSkin.get("default", LabelStyle.class));}
|
||||
}
|
||||
else if (queuepoll != null && queuepoll.contains("height ")) {
|
||||
String height = queuepoll.split("height ")[1].split(",")[0];
|
||||
Gdx.app.log(LightWallet.LOG, "Queue result: " + queuepoll);
|
||||
walletview.syncvalue.setText(height + " / " + daemonvalues.getBlockheight());
|
||||
if (height.equals(Integer.toString(daemonvalues.getBlockheight()))) {
|
||||
walletview.syncvalue.setStyle(game.uiSkin.get("greenlabel", LabelStyle.class));
|
||||
} else {walletview.syncvalue.setStyle(game.uiSkin.get("default", LabelStyle.class));}
|
||||
}
|
||||
// If the string contains "money" then create a tx and add it to the txlist
|
||||
else if (queuepoll != null && queuepoll.contains("money")) {
|
||||
txlist.add(Tx.StringToTx(queuepoll));
|
||||
// Gdx.app.log(LightWallet.LOG, "Found tx: " + txlist.get(txlist.size()-1).txid +
|
||||
// " of type " + txlist.get(txlist.size()-1).type + " and amount " + txlist.get(txlist.size()-1).amount);
|
||||
}
|
||||
}
|
||||
// If the string contains "invalid password" then show popup and return to password screen
|
||||
else if (queuepoll != null && queuepoll.contains("invalid password")) {
|
||||
wp.destroy();
|
||||
Dialog failuredialog = new Dialog("Password incorrect!", game.uiSkin, "dialog") {
|
||||
public void result(Object obj) {
|
||||
System.out.println("result "+obj);
|
||||
}
|
||||
};
|
||||
Label failurelabel = new Label("Simplewallet reports you entered an invalid password, click to try again.", game.uiSkin);
|
||||
failurelabel.setWrap(true);
|
||||
failuredialog.add(failurelabel).width(400).row();
|
||||
failuredialog.button("Continue", true).addListener(new ClickListener() {
|
||||
@Override
|
||||
public void clicked (InputEvent event, float x, float y) {
|
||||
game.setScreen(new PasswordScreen(game));
|
||||
stage.dispose();
|
||||
}
|
||||
});
|
||||
failuredialog.key(Keys.ENTER, true); //sends "true" when the ENTER key is pressed
|
||||
failuredialog.show(stage);
|
||||
}
|
||||
} catch (NullPointerException e){e.printStackTrace();}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,28 +8,33 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
|
||||
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
|
||||
import com.jw.lightwallet.LightWallet;
|
||||
import com.jw.lightwallet.wallet.WalletSaveRPC;
|
||||
|
||||
public class WalletView {
|
||||
LightWallet game;
|
||||
WalletSaveRPC walletsaverpc;
|
||||
|
||||
Table walletlayout;
|
||||
Table walletlayout;
|
||||
|
||||
Label namelabel;
|
||||
Label namevalue;
|
||||
TextButton addresslabel;
|
||||
Label addressvalue;
|
||||
Label synclabel;
|
||||
Label syncvalue;
|
||||
Label unlockedlabel;
|
||||
Label unlockedvalue;
|
||||
Label lockedlabel;
|
||||
Label lockedvalue;
|
||||
TextButton savewalletbtn;
|
||||
Label savewalletlabel;
|
||||
Label namelabel;
|
||||
Label namevalue;
|
||||
TextButton addresslabel;
|
||||
Label addressvalue;
|
||||
Label synclabel;
|
||||
Label syncvalue;
|
||||
Label unlockedlabel;
|
||||
Label unlockedvalue;
|
||||
Label lockedlabel;
|
||||
Label lockedvalue;
|
||||
TextButton savewalletbtn;
|
||||
Label savewalletlabel;
|
||||
|
||||
int padvalue;
|
||||
int padvalue;
|
||||
|
||||
|
||||
public WalletView (final LightWallet game) {
|
||||
public WalletView (final LightWallet game, final WalletSaveRPC walletsaverpc) {
|
||||
this.game = game;
|
||||
this.walletsaverpc = walletsaverpc;
|
||||
|
||||
walletlayout = new Table();
|
||||
padvalue = 16;
|
||||
@@ -63,7 +68,16 @@ public class WalletView {
|
||||
savewalletbtn = new TextButton("Save wallet\n(will attempt autosave every 60 s)", game.uiSkin);
|
||||
savewalletlabel = new Label("Not saved :(", game.uiSkin, "redlabel");
|
||||
walletlayout.add(savewalletbtn);
|
||||
walletlayout.add(savewalletlabel).fill().expand();
|
||||
walletlayout.add(savewalletlabel);
|
||||
|
||||
walletlayout.add(new Label("", game.uiSkin)).fill().expand();
|
||||
|
||||
savewalletbtn.addListener(new ClickListener() {
|
||||
@Override
|
||||
public void clicked (InputEvent event, float x, float y) {
|
||||
walletsaverpc.trysave(savewalletlabel);
|
||||
}
|
||||
});
|
||||
|
||||
addresslabel.addListener(new ClickListener() {
|
||||
@Override
|
||||
@@ -73,4 +87,14 @@ public class WalletView {
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
public Label getSavewalletlabel() {
|
||||
return savewalletlabel;
|
||||
}
|
||||
|
||||
|
||||
public void setSavewalletlabel(Label savewalletlabel) {
|
||||
this.savewalletlabel = savewalletlabel;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.jw.lightwallet.utils;
|
||||
|
||||
public class WalletSaveValues {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -5,21 +5,27 @@ import com.badlogic.gdx.Net.HttpMethods;
|
||||
import com.badlogic.gdx.Net.HttpRequest;
|
||||
import com.badlogic.gdx.Net.HttpResponse;
|
||||
import com.badlogic.gdx.Net.HttpResponseListener;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Label;
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
|
||||
import com.google.gson.Gson;
|
||||
import com.jw.lightwallet.LightWallet;
|
||||
import com.jw.lightwallet.screens.WalletView;
|
||||
import com.jw.lightwallet.utils.WalletSaveValues;
|
||||
|
||||
|
||||
public class WalletSaveRPC {
|
||||
LightWallet game;
|
||||
public String swaddress;
|
||||
String response;
|
||||
String store;
|
||||
|
||||
public WalletSaveRPC () {
|
||||
public WalletSaveRPC (LightWallet game) {
|
||||
this.game = game;
|
||||
swaddress = "http://localhost:19091/json_rpc";
|
||||
store = "{\"jsonrpc\":\"2.0\",\"id\":\"test\",\"method\":\"store\",\"params\":[]}";
|
||||
}
|
||||
|
||||
public void trysave (final WalletSaveValues walletsavevalues) {
|
||||
public void trysave (final Label savestatuslabel) {
|
||||
HttpRequest httpGet = new HttpRequest(HttpMethods.POST);
|
||||
httpGet.setUrl(swaddress);
|
||||
httpGet.setContent(store);
|
||||
@@ -28,14 +34,14 @@ public class WalletSaveRPC {
|
||||
public void handleHttpResponse(HttpResponse httpResponse) {
|
||||
response = httpResponse.getResultAsString();
|
||||
//System.out.print("Balance response: " + response);
|
||||
|
||||
|
||||
savestatuslabel.setText("Successfully saved");
|
||||
savestatuslabel.setStyle(game.uiSkin.get("greenlabel", LabelStyle.class));
|
||||
}
|
||||
|
||||
public void failed(Throwable t) {
|
||||
response = "failed";
|
||||
//System.out.print("Failed response status is: " + response);
|
||||
//do stuff here based on the failed attempt
|
||||
savestatuslabel.setText("Save failed");
|
||||
savestatuslabel.setStyle(game.uiSkin.get("redlabel", LabelStyle.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user