From 95e47e3407095a518a1500be0bbe8a33b5f790d8 Mon Sep 17 00:00:00 2001
From: m2049r <30435443+m2049r@users.noreply.github.com>
Date: Tue, 8 Aug 2017 22:06:48 +0200
Subject: [PATCH] check daemon availability
show txs immediately
only save on first sync
no store on close
Increased Version
---
app/app.iml | 1 +
app/build.gradle | 4 +-
app/src/main/cpp/monerujo.cpp | 3 +-
.../com/m2049r/xmrwallet/LoginActivity.java | 71 +++++++++++++++---
.../com/m2049r/xmrwallet/WalletActivity.java | 34 +++++++--
.../layout/TransactionInfoAdapter.java | 30 ++++----
.../xmrwallet/model/TransactionHistory.java | 8 +-
.../xmrwallet/model/TransactionInfo.java | 10 +--
.../com/m2049r/xmrwallet/model/Wallet.java | 10 +--
.../xmrwallet/model/WalletListener.java | 8 +-
.../m2049r/xmrwallet/model/WalletManager.java | 12 +--
.../xmrwallet/service/WalletService.java | 45 ++++++-----
.../com/m2049r/xmrwallet/util/Helper.java | 17 ++---
app/src/main/res/layout/wallet_activity.xml | 10 +--
app/src/main/res/values/strings.xml | 4 +-
.../monero/lib/armeabi-v7a/libwallet.a | Bin 17051496 -> 17050444 bytes
xmrwallet.iml | 4 +-
17 files changed, 175 insertions(+), 96 deletions(-)
diff --git a/app/app.iml b/app/app.iml
index b6bdf79..25bc19b 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -89,6 +89,7 @@
+ * * 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.
@@ -25,6 +25,7 @@ import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.StrictMode;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.KeyEvent;
@@ -46,11 +47,19 @@ import com.m2049r.xmrwallet.model.WalletManager;
import com.m2049r.xmrwallet.util.Helper;
import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
public class LoginActivity extends Activity {
static final String TAG = "LoginActivity";
+
+ static final int MIN_DAEMON_VERSION = 65544;
+ static final int DAEMON_TIMEOUT = 500; // deamon must respond in 500ms
+
ListView listView;
List
+ *
* 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.
@@ -97,6 +97,7 @@ public class WalletActivity extends AppCompatActivity
Log.d(TAG, "onStop()");
releaseWakeLock();
disconnectWalletService();
+ this.synced = false;
super.onStop();
}
@@ -145,6 +146,7 @@ public class WalletActivity extends AppCompatActivity
balanceView.setText(Wallet.getDisplayAmount(wallet.getBalance()));
unlockedView.setText(Wallet.getDisplayAmount(wallet.getUnlockedBalance()));
String sync = "";
+ // TODO: getConnectionStatus() blocks as it tries to connect - this is bad in the UI thread!
if (wallet.getConnectionStatus() == Wallet.ConnectionStatus.ConnectionStatus_Connected) {
if (!wallet.isSynchronized()) {
long n = wallet.getDaemonBlockChainHeight() - wallet.getBlockChainHeight();
@@ -160,13 +162,19 @@ public class WalletActivity extends AppCompatActivity
sync = getString(R.string.status_synced) + ": " + wallet.getBlockChainHeight();
if (!synced) {
hideProgress();
+ saveWallet(); // save ONLY on first sync
+ // the usual use case is:
+ // open the wallet, wait for sync, check balance, close app
+ // even if we wait for new transactions, they will be synced and saved next time
+ // the advantage here is that we are storing the state while the app is open
+ // and don't get into timing issues
synced = true;
}
}
}
- String t = (wallet.isTestNet() ? getString(R.string.connect_testnet) : getString(R.string.connect_mainnet));
+ String net = (wallet.isTestNet() ? getString(R.string.connect_testnet) : getString(R.string.connect_mainnet));
syncProgressView.setText(sync);
- connectionStatusView.setText(t + " " + wallet.getConnectionStatus().toString().substring(17));
+ connectionStatusView.setText(net + " " + wallet.getConnectionStatus().toString().substring(17));
}
@Override
@@ -241,11 +249,22 @@ public class WalletActivity extends AppCompatActivity
mBoundService.setObserver(null);
unbindService(mConnection);
mIsBound = false;
- Toast.makeText(getApplicationContext(), getString(R.string.status_wallet_unloading), Toast.LENGTH_LONG).show();
Log.d(TAG, "UNBOUND");
}
}
+ void saveWallet() {
+ if (mIsBound) { // no point in talking to unbound service
+ Intent intent = new Intent(getApplicationContext(), WalletService.class);
+ intent.putExtra(WalletService.REQUEST, WalletService.REQUEST_CMD_STORE);
+ startService(intent);
+ Toast.makeText(getApplicationContext(), getString(R.string.status_wallet_unloading), Toast.LENGTH_LONG).show();
+ Log.d(TAG, "STORE request sent");
+ } else {
+ Log.e(TAG, "Service not bound");
+ }
+ }
+
// Callbacks from TransactionInfoAdapter
@Override
public void onInteraction(final View view, final TransactionInfo infoItem) {
@@ -279,6 +298,7 @@ public class WalletActivity extends AppCompatActivity
@Override
protected void onPause() {
Log.d(TAG, "onPause()");
+ //saveWallet(); //TODO: do it here if we really need to ...
super.onPause();
}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
index e2a730b..88ab78e 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
@@ -1,12 +1,12 @@
-/**
+/*
* 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.
@@ -38,10 +38,10 @@ import java.util.List;
import java.util.TimeZone;
public class TransactionInfoAdapter extends RecyclerView.Adapter
+ *
* 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.
diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java b/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java
index 48634d7..a32444d 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/TransactionInfo.java
@@ -1,12 +1,12 @@
-/**
+/*
* 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.
@@ -23,7 +23,7 @@ public class TransactionInfo {
public long handle;
- public TransactionInfo(long handle) {
+ TransactionInfo(long handle) {
this.handle = handle;
}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
index 2e2dfaa..2eaaf8f 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
@@ -1,12 +1,12 @@
-/**
+/*
* 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.
@@ -35,7 +35,7 @@ public class Wallet {
private long handle = 0;
private long listenerHandle = 0;
- public Wallet(long handle) {
+ Wallet(long handle) {
this.handle = handle;
}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/WalletListener.java b/app/src/main/java/com/m2049r/xmrwallet/model/WalletListener.java
index ea7f1f4..f7ee66f 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/WalletListener.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/WalletListener.java
@@ -1,12 +1,12 @@
-/**
+/*
* 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.
diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
index 1c9e46d..2757877 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
@@ -1,12 +1,12 @@
-/**
+/*
* 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.
@@ -29,7 +29,7 @@ import java.util.List;
import java.util.Map;
public class WalletManager {
- final static String TAG = "WalletManager";
+ private final static String TAG = "WalletManager";
static {
System.loadLibrary("monerujo");
@@ -204,7 +204,7 @@ public class WalletManager {
private native void setDaemonAddressJ(String address);
- public native int getConnectedDaemonVersion();
+ public native int getDaemonVersion();
public native long getBlockchainHeight();
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
index 5517b0e..4cdc4f0 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
@@ -1,12 +1,12 @@
-/**
+/*
* 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.
@@ -16,9 +16,7 @@
package com.m2049r.xmrwallet.service;
-import android.app.ProgressDialog;
import android.app.Service;
-import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
@@ -27,10 +25,8 @@ import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
-import android.os.PowerManager;
import android.os.Process;
import android.util.Log;
-import android.widget.Toast;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.model.Wallet;
@@ -47,10 +43,11 @@ import com.m2049r.xmrwallet.util.Helper;
public class WalletService extends Service {
final static String TAG = "WalletService";
- public static final String REQUEST = "request";
public static final String REQUEST_WALLET = "wallet";
+ public static final String REQUEST = "request";
public static final String REQUEST_CMD_LOAD = "load";
public static final String REQUEST_CMD_LOAD_PW = "walletPassword";
+ public static final String REQUEST_CMD_STORE = "store";
public static final int START_SERVICE = 1;
public static final int STOP_SERVICE = 2;
@@ -70,7 +67,7 @@ public class WalletService extends Service {
this.wallet = aWallet;
}
- public void start() {
+ void start() {
Log.d(TAG, "MyWalletListener.start()");
if (wallet == null) throw new IllegalStateException("No wallet!");
//acquireWakeLock();
@@ -78,7 +75,7 @@ public class WalletService extends Service {
wallet.startRefresh();
}
- public void stop() {
+ void stop() {
Log.d(TAG, "MyWalletListener.stop()");
if (wallet == null) throw new IllegalStateException("No wallet!");
wallet.pauseRefresh();
@@ -178,7 +175,7 @@ public class WalletService extends Service {
// Handler that receives messages from the thread
private final class ServiceHandler extends Handler {
- public ServiceHandler(Looper looper) {
+ ServiceHandler(Looper looper) {
super(looper);
}
@@ -188,11 +185,19 @@ public class WalletService extends Service {
switch (msg.arg2) {
case START_SERVICE: {
Bundle extras = msg.getData();
- String walletId = extras.getString(REQUEST_WALLET, null);
- String walletPw = extras.getString(REQUEST_CMD_LOAD_PW, null);
- Log.d(TAG, "LOAD wallet " + walletId);// + ":" + walletPw);
- if (walletId != null) {
- start(walletId, walletPw); // TODO What if this fails?
+ String cmd = extras.getString(REQUEST, null);
+ if (cmd.equals(REQUEST_CMD_LOAD)) {
+ String walletId = extras.getString(REQUEST_WALLET, null);
+ String walletPw = extras.getString(REQUEST_CMD_LOAD_PW, null);
+ Log.d(TAG, "LOAD wallet " + walletId);// + ":" + walletPw);
+ if (walletId != null) {
+ start(walletId, walletPw); // TODO What if this fails?
+ }
+ } else if (cmd.equals(REQUEST_CMD_STORE)) {
+ Wallet myWallet = getWallet();
+ Log.d(TAG, "storing wallet: " + myWallet.getName());
+ getWallet().store();
+ Log.d(TAG, "wallet stored: " + myWallet.getName());
}
}
break;
@@ -251,7 +256,6 @@ public class WalletService extends Service {
// this should not matter since the old activity is not getting updates
// and the new one is not listening yet (although it will be bound)
Log.d(TAG, "onStartCommand()");
- //acquireWakeLock(); // we want to be awake for the fun stuff
// For each start request, send a message to start a job and deliver the
// start ID so we know which request we're stopping when we finish the job
Message msg = mServiceHandler.obtainMessage();
@@ -293,6 +297,11 @@ public class WalletService extends Service {
showProgress(95);
}
Log.d(TAG, "start() done");
+ if (observer != null) {
+ Wallet myWallet = getWallet();
+ myWallet.getHistory().refresh();
+ observer.onRefreshed(myWallet, true);
+ }
}
public void stop() {
diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
index 118056d..873c89f 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java
@@ -1,12 +1,12 @@
-/**
+/*
* 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.
@@ -28,8 +28,8 @@ import com.m2049r.xmrwallet.R;
import java.io.File;
public class Helper {
- static final String TAG = "Helper";
- static final String WALLET_DIR = "Monerujo";
+ private static final String TAG = "Helper";
+ private static final String WALLET_DIR = "Monerujo";
static public File getStorageRoot(Context context) {
if (!isExternalStorageWritable()) {
@@ -79,10 +79,7 @@ public class Helper {
/* Checks if external storage is available for read and write */
static public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
- if (Environment.MEDIA_MOUNTED.equals(state)) {
- return true;
- }
- return false;
+ return Environment.MEDIA_MOUNTED.equals(state);
}
}
diff --git a/app/src/main/res/layout/wallet_activity.xml b/app/src/main/res/layout/wallet_activity.xml
index 06beacd..7c80acd 100644
--- a/app/src/main/res/layout/wallet_activity.xml
+++ b/app/src/main/res/layout/wallet_activity.xml
@@ -62,7 +62,7 @@
android:textSize="10sp"
android:layout_marginTop="8dp"
android:layout_marginLeft="8dp"
- android:text="Connecting..."
+ android:text="Loading..."
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -73,7 +73,7 @@
android:textSize="10sp"
android:layout_marginTop="8dp"
android:layout_marginLeft="8dp"
- android:text="Connecting..."
+ android:text="Loading..."
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvConnectionStatus" />
@@ -81,8 +81,8 @@
7e)
z6 knH{S&Yr+M(D=1
zya_38sn+|AZ}Gk_v|GFqN60VNo08@E6pk9
z^Y5*7cRZ-SdoGQ_xSZmQ{#My1x-i+}PfE1rhy5$tTjh5C#ZIf-$=~ZRrrNxc{2f?(
z)w<}#6zJ{$B-z?PKmVR~R(Ytu-eHx~{L>CuJGj_iFwB}i&fku;ce($$Q?2=Wj{kML
z^~N;+xL>Rd=KDLb5!Z==q1N&<{q4`N%D4HSYipJ7^1rNE<@x@spDpd{Vu}BjA=Uy9
z_&fKs$}9birD{Lk8~@-zNx4_X=&|MY(wa>S@CKI@v8KiFEn*59Ltl64_o^Upn9
z-4NnU|0iCn{GR`sqt*_Z{Lg%6l|S=8H^^H4EC2OLR(Y>Kr;Sx^^$(1BPE0-YFAn*)
z9
H#`%BI1cs|g(9~XS
z6W%Tr`FWI5kzrFR-jxRoEzhX1p5DGrn)=3z2F|!a#2LNX{B9q9cbHq<2k`qJ#gv$I
zI|c2N8#Uz}!=T<`P&u!|t~f6ZvA%ppKz(JW*zLrN!>4(txz*OmRVf8^#&MDHuhTjH
zCt~{26$m;QdJ?q7B|aeV7_`IrxQM_LB2LOSyC`xp>8C`7v0d6!!
cO>M}jAO|IdOoqGQo4xI!d-wMfMc
zL1#V7jRhw}$~l{velA$PltQ{+O0oV>u(hSzCQbQf+0#+5wWr&kf{Wa%QD9YYok+P&
zA`G_&_a}cc`6rUTrLQVC8svkxCD8E^)mqQzI7Jsf#q$^Y{NwW+qbGw;_!Rn3Xg+pQ
zCYi~kA4xi&cPNt%A3Z4L`2;{=%qzi#o(|2cfraLUx028MYGqR5tuNA>b82of8!zUQ
z2*DbgNay?)31UMDTwB@G@APK&%Qdp
umadA2r
zuT8qnXSoev&pq=ZA