mirror of
https://github.com/m2049r/xmrwallet
synced 2025-09-06 19:00:30 +02:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
7d7de14827 | ||
![]() |
1c709da92c | ||
![]() |
a9092497b2 | ||
![]() |
b1f530e64a | ||
![]() |
8c086b77d3 | ||
![]() |
c0fdfe87be | ||
![]() |
6cfd840283 | ||
![]() |
d80cde1136 |
@@ -60,9 +60,13 @@ set_target_properties(boost_wserialization PROPERTIES IMPORTED_LOCATION
|
|||||||
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_wserialization.a)
|
${EXTERNAL_LIBS_DIR}/boost/lib/${ANDROID_ABI}/libboost_wserialization.a)
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# Monero set(libs_to_merge wallet cryptonote_core cryptonote_basic mnemonics common cncrypto ringct)
|
# Monero
|
||||||
#############
|
#############
|
||||||
|
|
||||||
|
add_library(wallet_api STATIC IMPORTED)
|
||||||
|
set_target_properties(wallet_api PROPERTIES IMPORTED_LOCATION
|
||||||
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libwallet_api.a)
|
||||||
|
|
||||||
add_library(wallet STATIC IMPORTED)
|
add_library(wallet STATIC IMPORTED)
|
||||||
set_target_properties(wallet PROPERTIES IMPORTED_LOCATION
|
set_target_properties(wallet PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libwallet.a)
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libwallet.a)
|
||||||
@@ -91,11 +95,9 @@ add_library(ringct STATIC IMPORTED)
|
|||||||
set_target_properties(ringct PROPERTIES IMPORTED_LOCATION
|
set_target_properties(ringct PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libringct.a)
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libringct.a)
|
||||||
|
|
||||||
#####
|
add_library(ringct_basic STATIC IMPORTED)
|
||||||
|
set_target_properties(ringct_basic PROPERTIES IMPORTED_LOCATION
|
||||||
add_library(p2p STATIC IMPORTED)
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libringct_basic.a)
|
||||||
set_target_properties(p2p PROPERTIES IMPORTED_LOCATION
|
|
||||||
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libp2p.a)
|
|
||||||
|
|
||||||
add_library(blockchain_db STATIC IMPORTED)
|
add_library(blockchain_db STATIC IMPORTED)
|
||||||
set_target_properties(blockchain_db PROPERTIES IMPORTED_LOCATION
|
set_target_properties(blockchain_db PROPERTIES IMPORTED_LOCATION
|
||||||
@@ -113,7 +115,6 @@ add_library(unbound STATIC IMPORTED)
|
|||||||
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION
|
set_target_properties(unbound PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libunbound.a)
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libunbound.a)
|
||||||
|
|
||||||
####
|
|
||||||
add_library(epee STATIC IMPORTED)
|
add_library(epee STATIC IMPORTED)
|
||||||
set_target_properties(epee PROPERTIES IMPORTED_LOCATION
|
set_target_properties(epee PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libepee.a)
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libepee.a)
|
||||||
@@ -122,9 +123,21 @@ add_library(blocks STATIC IMPORTED)
|
|||||||
set_target_properties(blocks PROPERTIES IMPORTED_LOCATION
|
set_target_properties(blocks PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libblocks.a)
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libblocks.a)
|
||||||
|
|
||||||
add_library(miniupnpc STATIC IMPORTED)
|
add_library(checkpoints STATIC IMPORTED)
|
||||||
set_target_properties(miniupnpc PROPERTIES IMPORTED_LOCATION
|
set_target_properties(checkpoints PROPERTIES IMPORTED_LOCATION
|
||||||
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libminiupnpc.a)
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libcheckpoints.a)
|
||||||
|
|
||||||
|
add_library(device STATIC IMPORTED)
|
||||||
|
set_target_properties(device PROPERTIES IMPORTED_LOCATION
|
||||||
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libdevice.a)
|
||||||
|
|
||||||
|
add_library(multisig STATIC IMPORTED)
|
||||||
|
set_target_properties(multisig PROPERTIES IMPORTED_LOCATION
|
||||||
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libmultisig.a)
|
||||||
|
|
||||||
|
add_library(version STATIC IMPORTED)
|
||||||
|
set_target_properties(version PROPERTIES IMPORTED_LOCATION
|
||||||
|
${EXTERNAL_LIBS_DIR}/monero/lib/${ANDROID_ABI}/libversion.a)
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# System
|
# System
|
||||||
@@ -137,23 +150,26 @@ include_directories( ${EXTERNAL_LIBS_DIR}/monero/include )
|
|||||||
message(STATUS EXTERNAL_LIBS_DIR : ${EXTERNAL_LIBS_DIR})
|
message(STATUS EXTERNAL_LIBS_DIR : ${EXTERNAL_LIBS_DIR})
|
||||||
|
|
||||||
target_link_libraries( monerujo
|
target_link_libraries( monerujo
|
||||||
|
|
||||||
|
wallet_api
|
||||||
wallet
|
wallet
|
||||||
cryptonote_core
|
cryptonote_core
|
||||||
cryptonote_basic
|
cryptonote_basic
|
||||||
mnemonics
|
mnemonics
|
||||||
ringct
|
ringct
|
||||||
|
ringct_basic
|
||||||
common
|
common
|
||||||
cncrypto
|
cncrypto
|
||||||
|
|
||||||
blockchain_db
|
blockchain_db
|
||||||
lmdb
|
lmdb
|
||||||
easylogging
|
easylogging
|
||||||
unbound
|
unbound
|
||||||
p2p
|
|
||||||
|
|
||||||
epee
|
epee
|
||||||
blocks
|
blocks
|
||||||
miniupnpc
|
checkpoints
|
||||||
|
device
|
||||||
|
multisig
|
||||||
|
version
|
||||||
|
|
||||||
boost_chrono
|
boost_chrono
|
||||||
boost_date_time
|
boost_date_time
|
||||||
|
@@ -8,8 +8,8 @@ android {
|
|||||||
applicationId "com.m2049r.xmrwallet"
|
applicationId "com.m2049r.xmrwallet"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 25
|
targetSdkVersion 25
|
||||||
versionCode 72
|
versionCode 83
|
||||||
versionName "1.3.12 'Satoshis Dream'"
|
versionName "1.4.3 'Monero Spedner'"
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
@@ -18,7 +18,7 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ndk {
|
ndk {
|
||||||
abiFilters 'armeabi-v7a'
|
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,8 +41,21 @@ android {
|
|||||||
abi {
|
abi {
|
||||||
enable true
|
enable true
|
||||||
reset()
|
reset()
|
||||||
include "armeabi-v7a"
|
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||||
universalApk false
|
universalApk true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map for the version code that gives each ABI a value.
|
||||||
|
def abiCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
|
||||||
|
|
||||||
|
// APKs for the same app that all have the same version information.
|
||||||
|
android.applicationVariants.all { variant ->
|
||||||
|
// Assigns a different version code for each output APK.
|
||||||
|
variant.outputs.each {
|
||||||
|
output ->
|
||||||
|
def abiName = output.getFilter(com.android.build.OutputFile.ABI)
|
||||||
|
output.versionCodeOverride = abiCodes.get(abiName, 0) + 10 * variant.versionCode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -91,5 +104,7 @@ dependencyVerification {
|
|||||||
'com.google.zxing:core:bba7724e02a997cec38213af77133ee8e24b0d5cf5fa7ecbc16a4fa93f11ee0d',
|
'com.google.zxing:core:bba7724e02a997cec38213af77133ee8e24b0d5cf5fa7ecbc16a4fa93f11ee0d',
|
||||||
'com.squareup.okio:okio:734269c3ebc5090e3b23566db558f421f0b4027277c79ad5d176b8ec168bb850',
|
'com.squareup.okio:okio:734269c3ebc5090e3b23566db558f421f0b4027277c79ad5d176b8ec168bb850',
|
||||||
'com.squareup.okhttp3:okhttp:7265adbd6f028aade307f58569d814835cd02bc9beffb70c25f72c9de50d61c4',
|
'com.squareup.okhttp3:okhttp:7265adbd6f028aade307f58569d814835cd02bc9beffb70c25f72c9de50d61c4',
|
||||||
|
'com.jakewharton.timber:timber:35c22867f2673132e97e17857d36bb2fc25f5790f0425406833ed0254d62fc66',
|
||||||
|
'com.nulab-inc:zxcvbn:18d7862a6abd2705defec478d77dedadf8f3bb7cf811df22995494f05485785f',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -386,7 +386,7 @@ public class GenerateFragment extends Fragment {
|
|||||||
|
|
||||||
private boolean checkAddress() {
|
private boolean checkAddress() {
|
||||||
String address = etWalletAddress.getEditText().getText().toString();
|
String address = etWalletAddress.getEditText().getText().toString();
|
||||||
boolean ok = Wallet.isAddressValid(address, WalletManager.getInstance().isTestNet());
|
boolean ok = Wallet.isAddressValid(address);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
etWalletAddress.setError(getString(R.string.generate_check_address));
|
etWalletAddress.setError(getString(R.string.generate_check_address));
|
||||||
} else {
|
} else {
|
||||||
|
@@ -34,6 +34,7 @@ import android.widget.ScrollView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.m2049r.xmrwallet.model.NetworkType;
|
||||||
import com.m2049r.xmrwallet.widget.Toolbar;
|
import com.m2049r.xmrwallet.widget.Toolbar;
|
||||||
import com.m2049r.xmrwallet.model.Wallet;
|
import com.m2049r.xmrwallet.model.Wallet;
|
||||||
import com.m2049r.xmrwallet.model.WalletManager;
|
import com.m2049r.xmrwallet.model.WalletManager;
|
||||||
@@ -81,7 +82,7 @@ public class GenerateReviewFragment extends Fragment {
|
|||||||
|
|
||||||
bAccept = (Button) view.findViewById(R.id.bAccept);
|
bAccept = (Button) view.findViewById(R.id.bAccept);
|
||||||
|
|
||||||
boolean testnet = WalletManager.getInstance().isTestNet();
|
boolean testnet = WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet;
|
||||||
tvWalletMnemonic.setTextIsSelectable(testnet);
|
tvWalletMnemonic.setTextIsSelectable(testnet);
|
||||||
tvWalletSpendKey.setTextIsSelectable(testnet);
|
tvWalletSpendKey.setTextIsSelectable(testnet);
|
||||||
|
|
||||||
@@ -185,6 +186,7 @@ public class GenerateReviewFragment extends Fragment {
|
|||||||
name = wallet.getName();
|
name = wallet.getName();
|
||||||
status = wallet.getStatus();
|
status = wallet.getStatus();
|
||||||
if (status != Wallet.Status.Status_Ok) {
|
if (status != Wallet.Status.Status_Ok) {
|
||||||
|
Timber.e(wallet.getErrorString());
|
||||||
if (closeWallet) wallet.close();
|
if (closeWallet) wallet.close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -45,6 +45,7 @@ import android.widget.Toast;
|
|||||||
|
|
||||||
import com.m2049r.xmrwallet.dialog.HelpFragment;
|
import com.m2049r.xmrwallet.dialog.HelpFragment;
|
||||||
import com.m2049r.xmrwallet.layout.WalletInfoAdapter;
|
import com.m2049r.xmrwallet.layout.WalletInfoAdapter;
|
||||||
|
import com.m2049r.xmrwallet.model.NetworkType;
|
||||||
import com.m2049r.xmrwallet.model.WalletManager;
|
import com.m2049r.xmrwallet.model.WalletManager;
|
||||||
import com.m2049r.xmrwallet.util.Helper;
|
import com.m2049r.xmrwallet.util.Helper;
|
||||||
import com.m2049r.xmrwallet.util.NodeList;
|
import com.m2049r.xmrwallet.util.NodeList;
|
||||||
@@ -81,11 +82,11 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
|
|
||||||
File getStorageRoot();
|
File getStorageRoot();
|
||||||
|
|
||||||
boolean onWalletSelected(String wallet, String daemon, boolean testnet);
|
boolean onWalletSelected(String wallet, String daemon);
|
||||||
|
|
||||||
void onWalletDetails(String wallet, boolean testnet);
|
void onWalletDetails(String wallet);
|
||||||
|
|
||||||
void onWalletReceive(String wallet, boolean testnet);
|
void onWalletReceive(String wallet);
|
||||||
|
|
||||||
void onWalletRename(String name);
|
void onWalletRename(String name);
|
||||||
|
|
||||||
@@ -93,14 +94,16 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
|
|
||||||
void onWalletArchive(String walletName);
|
void onWalletArchive(String walletName);
|
||||||
|
|
||||||
void onAddWallet(boolean testnet, String type);
|
void onAddWallet(String type);
|
||||||
|
|
||||||
void showNet(boolean testnet);
|
void showNet();
|
||||||
|
|
||||||
void setToolbarButton(int type);
|
void setToolbarButton(int type);
|
||||||
|
|
||||||
void setTitle(String title);
|
void setTitle(String title);
|
||||||
|
|
||||||
|
void setNetworkType(NetworkType networkType);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -126,8 +129,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
super.onResume();
|
super.onResume();
|
||||||
Timber.d("onResume()");
|
Timber.d("onResume()");
|
||||||
activityCallback.setTitle(null);
|
activityCallback.setTitle(null);
|
||||||
activityCallback.setToolbarButton(Toolbar.BUTTON_DONATE);
|
activityCallback.setToolbarButton(Toolbar.BUTTON_CREDITS);
|
||||||
activityCallback.showNet(isTestnet());
|
activityCallback.showNet();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -244,13 +247,13 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
// Callbacks from WalletInfoAdapter
|
// Callbacks from WalletInfoAdapter
|
||||||
@Override
|
@Override
|
||||||
public void onInteraction(final View view, final WalletManager.WalletInfo infoItem) {
|
public void onInteraction(final View view, final WalletManager.WalletInfo infoItem) {
|
||||||
String x = isTestnet() ? "9A-" : "4-";
|
String addressPrefix = addressPrefix();
|
||||||
if (x.indexOf(infoItem.address.charAt(0)) < 0) {
|
if (addressPrefix.indexOf(infoItem.address.charAt(0)) < 0) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (activityCallback.onWalletSelected(infoItem.name, getDaemon(), isTestnet())) {
|
if (activityCallback.onWalletSelected(infoItem.name, getDaemon())) {
|
||||||
savePrefs();
|
savePrefs();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -279,11 +282,24 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String addressPrefix() {
|
||||||
|
switch (WalletManager.getInstance().getNetworkType()) {
|
||||||
|
case NetworkType_Testnet:
|
||||||
|
return "9A-";
|
||||||
|
case NetworkType_Mainnet:
|
||||||
|
return "4-";
|
||||||
|
case NetworkType_Stagenet:
|
||||||
|
return "5-";
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException("Unsupported Network: " + WalletManager.getInstance().getNetworkType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void filterList() {
|
private void filterList() {
|
||||||
displayedList.clear();
|
displayedList.clear();
|
||||||
String x = isTestnet() ? "9A" : "4";
|
String addressPrefix = addressPrefix();
|
||||||
for (WalletManager.WalletInfo s : walletList) {
|
for (WalletManager.WalletInfo s : walletList) {
|
||||||
if (x.indexOf(s.address.charAt(0)) >= 0) displayedList.add(s);
|
if (addressPrefix.indexOf(s.address.charAt(0)) >= 0) displayedList.add(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -313,11 +329,11 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showInfo(@NonNull String name) {
|
private void showInfo(@NonNull String name) {
|
||||||
activityCallback.onWalletDetails(name, isTestnet());
|
activityCallback.onWalletDetails(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showReceive(@NonNull String name) {
|
private void showReceive(@NonNull String name) {
|
||||||
activityCallback.onWalletReceive(name, isTestnet());
|
activityCallback.onWalletReceive(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -329,29 +345,31 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
@Override
|
@Override
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
inflater.inflate(R.menu.list_menu, menu);
|
inflater.inflate(R.menu.list_menu, menu);
|
||||||
menu.findItem(R.id.action_testnet).setChecked(isTestnet());
|
menu.findItem(R.id.action_testnet).setChecked(testnetCheckMenu);
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean testnet = BuildConfig.DEBUG;
|
private boolean testnetCheckMenu = BuildConfig.DEBUG;
|
||||||
|
|
||||||
boolean isTestnet() {
|
//boolean isTestnet() {
|
||||||
return testnet;
|
// return testnet;
|
||||||
}
|
//}
|
||||||
|
|
||||||
public boolean onTestnetMenuItem() {
|
public boolean onTestnetMenuItem() {
|
||||||
boolean lastState = testnet;
|
boolean lastState = testnetCheckMenu;
|
||||||
setNet(!lastState, true); // set and save
|
setNet(!lastState, true); // set and save
|
||||||
return !lastState;
|
return !lastState;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNet(boolean testnet, boolean save) {
|
public void setNet(boolean testnetChecked, boolean save) {
|
||||||
this.testnet = testnet;
|
this.testnetCheckMenu = testnetChecked;
|
||||||
activityCallback.showNet(testnet);
|
NetworkType net = testnetChecked ? NetworkType.NetworkType_Testnet : NetworkType.NetworkType_Mainnet;
|
||||||
|
activityCallback.setNetworkType(net);
|
||||||
|
activityCallback.showNet();
|
||||||
if (save) {
|
if (save) {
|
||||||
savePrefs(true); // use previous state as we just clicked it
|
savePrefs(true); // use previous state as we just clicked it
|
||||||
}
|
}
|
||||||
if (testnet) {
|
if (testnetChecked) {
|
||||||
setDaemon(daemonTestNet);
|
setDaemon(daemonTestNet);
|
||||||
} else {
|
} else {
|
||||||
setDaemon(daemonMainNet);
|
setDaemon(daemonMainNet);
|
||||||
@@ -379,7 +397,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
|
|
||||||
daemonMainNet = new NodeList(sharedPref.getString(PREF_DAEMON_MAINNET, PREF_DAEMONLIST_MAINNET));
|
daemonMainNet = new NodeList(sharedPref.getString(PREF_DAEMON_MAINNET, PREF_DAEMONLIST_MAINNET));
|
||||||
daemonTestNet = new NodeList(sharedPref.getString(PREF_DAEMON_TESTNET, PREF_DAEMONLIST_TESTNET));
|
daemonTestNet = new NodeList(sharedPref.getString(PREF_DAEMON_TESTNET, PREF_DAEMONLIST_TESTNET));
|
||||||
setNet(isTestnet(), false);
|
setNet(testnetCheckMenu, false);
|
||||||
|
|
||||||
showXmrtoEnabled = sharedPref.getBoolean(PREF_SHOW_XMRTO_ENABLED, true);
|
showXmrtoEnabled = sharedPref.getBoolean(PREF_SHOW_XMRTO_ENABLED, true);
|
||||||
}
|
}
|
||||||
@@ -398,7 +416,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
void savePrefs(boolean usePreviousTestnetState) {
|
void savePrefs(boolean usePreviousTestnetState) {
|
||||||
Timber.d("SAVE / %s", usePreviousTestnetState);
|
Timber.d("SAVE / %s", usePreviousTestnetState);
|
||||||
// save the daemon address for the net
|
// save the daemon address for the net
|
||||||
boolean testnet = isTestnet() ^ usePreviousTestnetState;
|
boolean testnet = testnetCheckMenu ^ usePreviousTestnetState;
|
||||||
String daemon = getDaemon();
|
String daemon = getDaemon();
|
||||||
if (testnet) {
|
if (testnet) {
|
||||||
daemonTestNet.setRecent(daemon);
|
daemonTestNet.setRecent(daemon);
|
||||||
@@ -484,19 +502,19 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
|
|||||||
case R.id.fabNew:
|
case R.id.fabNew:
|
||||||
fabScreen.setVisibility(View.INVISIBLE);
|
fabScreen.setVisibility(View.INVISIBLE);
|
||||||
isFabOpen = false;
|
isFabOpen = false;
|
||||||
activityCallback.onAddWallet(isTestnet(), GenerateFragment.TYPE_NEW);
|
activityCallback.onAddWallet(GenerateFragment.TYPE_NEW);
|
||||||
break;
|
break;
|
||||||
case R.id.fabView:
|
case R.id.fabView:
|
||||||
animateFAB();
|
animateFAB();
|
||||||
activityCallback.onAddWallet(isTestnet(), GenerateFragment.TYPE_VIEWONLY);
|
activityCallback.onAddWallet(GenerateFragment.TYPE_VIEWONLY);
|
||||||
break;
|
break;
|
||||||
case R.id.fabKey:
|
case R.id.fabKey:
|
||||||
animateFAB();
|
animateFAB();
|
||||||
activityCallback.onAddWallet(isTestnet(), GenerateFragment.TYPE_KEY);
|
activityCallback.onAddWallet(GenerateFragment.TYPE_KEY);
|
||||||
break;
|
break;
|
||||||
case R.id.fabSeed:
|
case R.id.fabSeed:
|
||||||
animateFAB();
|
animateFAB();
|
||||||
activityCallback.onAddWallet(isTestnet(), GenerateFragment.TYPE_SEED);
|
activityCallback.onAddWallet(GenerateFragment.TYPE_SEED);
|
||||||
break;
|
break;
|
||||||
case R.id.fabScreen:
|
case R.id.fabScreen:
|
||||||
animateFAB();
|
animateFAB();
|
||||||
|
@@ -300,7 +300,7 @@ public class ReceiveFragment extends Fragment {
|
|||||||
String paymentId = etPaymentId.getEditText().getText().toString();
|
String paymentId = etPaymentId.getEditText().getText().toString();
|
||||||
String xmrAmount = evAmount.getAmount();
|
String xmrAmount = evAmount.getAmount();
|
||||||
Timber.d("%s/%s/%s", xmrAmount, paymentId, address);
|
Timber.d("%s/%s/%s", xmrAmount, paymentId, address);
|
||||||
if ((xmrAmount == null) || !Wallet.isAddressValid(address, WalletManager.getInstance().isTestNet())) {
|
if ((xmrAmount == null) || !Wallet.isAddressValid(address)) {
|
||||||
clearQR();
|
clearQR();
|
||||||
Timber.d("CLEARQR");
|
Timber.d("CLEARQR");
|
||||||
return;
|
return;
|
||||||
|
@@ -36,7 +36,7 @@ import android.widget.Toast;
|
|||||||
|
|
||||||
import com.m2049r.xmrwallet.data.BarcodeData;
|
import com.m2049r.xmrwallet.data.BarcodeData;
|
||||||
import com.m2049r.xmrwallet.data.TxData;
|
import com.m2049r.xmrwallet.data.TxData;
|
||||||
import com.m2049r.xmrwallet.dialog.DonationFragment;
|
import com.m2049r.xmrwallet.dialog.CreditsFragment;
|
||||||
import com.m2049r.xmrwallet.dialog.HelpFragment;
|
import com.m2049r.xmrwallet.dialog.HelpFragment;
|
||||||
import com.m2049r.xmrwallet.fragment.send.SendAddressWizardFragment;
|
import com.m2049r.xmrwallet.fragment.send.SendAddressWizardFragment;
|
||||||
import com.m2049r.xmrwallet.fragment.send.SendFragment;
|
import com.m2049r.xmrwallet.fragment.send.SendFragment;
|
||||||
@@ -159,8 +159,8 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
|
|||||||
case R.id.action_info:
|
case R.id.action_info:
|
||||||
onWalletDetails();
|
onWalletDetails();
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_donate:
|
case R.id.action_credits:
|
||||||
DonationFragment.display(getSupportFragmentManager());
|
CreditsFragment.display(getSupportFragmentManager());
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_share:
|
case R.id.action_share:
|
||||||
onShareTxInfo();
|
onShareTxInfo();
|
||||||
@@ -213,8 +213,8 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
|
|||||||
case Toolbar.BUTTON_CLOSE:
|
case Toolbar.BUTTON_CLOSE:
|
||||||
finish();
|
finish();
|
||||||
break;
|
break;
|
||||||
case Toolbar.BUTTON_DONATE:
|
case Toolbar.BUTTON_CREDITS:
|
||||||
Toast.makeText(WalletActivity.this, getString(R.string.label_donate), Toast.LENGTH_SHORT).show();
|
Toast.makeText(WalletActivity.this, getString(R.string.label_credits), Toast.LENGTH_SHORT).show();
|
||||||
case Toolbar.BUTTON_NONE:
|
case Toolbar.BUTTON_NONE:
|
||||||
default:
|
default:
|
||||||
Timber.e("Button " + type + "pressed - how can this be?");
|
Timber.e("Button " + type + "pressed - how can this be?");
|
||||||
@@ -222,13 +222,6 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
boolean testnet = WalletManager.getInstance().isTestNet();
|
|
||||||
if (testnet) {
|
|
||||||
toolbar.setBackgroundResource(R.color.colorPrimaryDark);
|
|
||||||
} else {
|
|
||||||
toolbar.setBackgroundResource(R.drawable.backgound_toolbar_mainnet);
|
|
||||||
}
|
|
||||||
|
|
||||||
Fragment walletFragment = new WalletFragment();
|
Fragment walletFragment = new WalletFragment();
|
||||||
getSupportFragmentManager().beginTransaction()
|
getSupportFragmentManager().beginTransaction()
|
||||||
.add(R.id.fragment_container, walletFragment, WalletFragment.class.getName()).commit();
|
.add(R.id.fragment_container, walletFragment, WalletFragment.class.getName()).commit();
|
||||||
@@ -238,6 +231,23 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
|
|||||||
Timber.d("onCreate() done.");
|
Timber.d("onCreate() done.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showNet() {
|
||||||
|
switch (WalletManager.getInstance().getNetworkType()) {
|
||||||
|
case NetworkType_Mainnet:
|
||||||
|
toolbar.setBackgroundResource(R.drawable.backgound_toolbar_mainnet);
|
||||||
|
break;
|
||||||
|
case NetworkType_Testnet:
|
||||||
|
toolbar.setBackgroundResource(R.color.colorPrimaryDark);
|
||||||
|
break;
|
||||||
|
case NetworkType_Stagenet:
|
||||||
|
toolbar.setBackgroundResource(R.color.colorPrimaryDark);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException("Unsupported Network: " + WalletManager.getInstance().getNetworkType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public Wallet getWallet() {
|
public Wallet getWallet() {
|
||||||
if (mBoundService == null) throw new IllegalStateException("WalletService not bound.");
|
if (mBoundService == null) throw new IllegalStateException("WalletService not bound.");
|
||||||
return mBoundService.getWallet();
|
return mBoundService.getWallet();
|
||||||
@@ -798,7 +808,7 @@ public class WalletActivity extends SecureActivity implements WalletFragment.Lis
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean verifyWalletPassword(String password) {
|
public boolean verifyWalletPassword(String password) {
|
||||||
String walletPath = new File(Helper.getStorageRoot(this),
|
String walletPath = new File(Helper.getWalletRoot(this),
|
||||||
getWalletName() + ".keys").getAbsolutePath();
|
getWalletName() + ".keys").getAbsolutePath();
|
||||||
return WalletManager.getInstance().verifyWalletPassword(walletPath, password, true);
|
return WalletManager.getInstance().verifyWalletPassword(walletPath, password, true);
|
||||||
}
|
}
|
||||||
|
@@ -19,13 +19,15 @@ package com.m2049r.xmrwallet;
|
|||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
|
||||||
|
import com.m2049r.xmrwallet.util.Helper;
|
||||||
|
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
public class XmrWalletApplication extends Application {
|
public class XmrWalletApplication extends Application {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
|
||||||
if (BuildConfig.DEBUG) {
|
if (BuildConfig.DEBUG) {
|
||||||
Timber.plant(new Timber.DebugTree());
|
Timber.plant(new Timber.DebugTree());
|
||||||
}
|
}
|
||||||
|
@@ -18,6 +18,7 @@ package com.m2049r.xmrwallet.data;
|
|||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
|
import com.m2049r.xmrwallet.model.NetworkType;
|
||||||
import com.m2049r.xmrwallet.model.Wallet;
|
import com.m2049r.xmrwallet.model.Wallet;
|
||||||
import com.m2049r.xmrwallet.model.WalletManager;
|
import com.m2049r.xmrwallet.model.WalletManager;
|
||||||
import com.m2049r.xmrwallet.util.BitcoinAddressValidator;
|
import com.m2049r.xmrwallet.util.BitcoinAddressValidator;
|
||||||
@@ -178,7 +179,7 @@ public class BarcodeData {
|
|||||||
return null; // we have an amount but its not a number!
|
return null; // we have an amount but its not a number!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!BitcoinAddressValidator.validate(address, WalletManager.getInstance().isTestNet())) {
|
if (!BitcoinAddressValidator.validate(address)) {
|
||||||
Timber.d("address invalid");
|
Timber.d("address invalid");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -190,7 +191,7 @@ public class BarcodeData {
|
|||||||
|
|
||||||
if (address == null) return null;
|
if (address == null) return null;
|
||||||
|
|
||||||
if (!BitcoinAddressValidator.validate(address, WalletManager.getInstance().isTestNet())) {
|
if (!BitcoinAddressValidator.validate(address)) {
|
||||||
Timber.d("address invalid");
|
Timber.d("address invalid");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
108
app/src/main/java/com/m2049r/xmrwallet/data/WalletNode.java
Normal file
108
app/src/main/java/com/m2049r/xmrwallet/data/WalletNode.java
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 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.data;
|
||||||
|
|
||||||
|
import com.m2049r.xmrwallet.model.NetworkType;
|
||||||
|
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.SocketAddress;
|
||||||
|
|
||||||
|
public class WalletNode {
|
||||||
|
private final String name;
|
||||||
|
private final String host;
|
||||||
|
private final int port;
|
||||||
|
private final String user;
|
||||||
|
private final String password;
|
||||||
|
private final NetworkType networkType;
|
||||||
|
|
||||||
|
public WalletNode(String walletName, String daemon, NetworkType networkType) {
|
||||||
|
if ((daemon == null) || daemon.isEmpty())
|
||||||
|
throw new IllegalArgumentException("daemon is empty");
|
||||||
|
this.name = walletName;
|
||||||
|
String daemonAddress;
|
||||||
|
String a[] = daemon.split("@");
|
||||||
|
if (a.length == 1) { // no credentials
|
||||||
|
daemonAddress = a[0];
|
||||||
|
user = "";
|
||||||
|
password = "";
|
||||||
|
} else if (a.length == 2) { // credentials
|
||||||
|
String userPassword[] = a[0].split(":");
|
||||||
|
if (userPassword.length != 2)
|
||||||
|
throw new IllegalArgumentException("User:Password invalid");
|
||||||
|
user = userPassword[0];
|
||||||
|
if (!user.isEmpty()) {
|
||||||
|
password = userPassword[1];
|
||||||
|
} else {
|
||||||
|
password = "";
|
||||||
|
}
|
||||||
|
daemonAddress = a[1];
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Too many @");
|
||||||
|
}
|
||||||
|
|
||||||
|
String da[] = daemonAddress.split(":");
|
||||||
|
if ((da.length > 2) || (da.length < 1))
|
||||||
|
throw new IllegalArgumentException("Too many ':' or too few");
|
||||||
|
host = da[0];
|
||||||
|
if (da.length == 2) {
|
||||||
|
try {
|
||||||
|
port = Integer.parseInt(da[1]);
|
||||||
|
} catch (NumberFormatException ex) {
|
||||||
|
throw new IllegalArgumentException("Port not numeric");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (networkType) {
|
||||||
|
case NetworkType_Mainnet:
|
||||||
|
port = 18081;
|
||||||
|
break;
|
||||||
|
case NetworkType_Testnet:
|
||||||
|
port = 28081;
|
||||||
|
break;
|
||||||
|
case NetworkType_Stagenet:
|
||||||
|
port = 38081;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
port = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.networkType = networkType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAddress() {
|
||||||
|
return host + ":" + port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SocketAddress getSocketAddress() {
|
||||||
|
return new InetSocketAddress(host, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isValid() {
|
||||||
|
return !host.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
@@ -28,16 +28,14 @@ import android.text.Html;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import com.m2049r.xmrwallet.R;
|
import com.m2049r.xmrwallet.R;
|
||||||
import com.m2049r.xmrwallet.util.Helper;
|
|
||||||
|
|
||||||
public class DonationFragment extends DialogFragment {
|
public class CreditsFragment extends DialogFragment {
|
||||||
static final String TAG = "DonationFragment";
|
static final String TAG = "DonationFragment";
|
||||||
|
|
||||||
public static DonationFragment newInstance() {
|
public static CreditsFragment newInstance() {
|
||||||
return new DonationFragment();
|
return new CreditsFragment();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void display(FragmentManager fm) {
|
public static void display(FragmentManager fm) {
|
||||||
@@ -47,24 +45,14 @@ public class DonationFragment extends DialogFragment {
|
|||||||
ft.remove(prev);
|
ft.remove(prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
DonationFragment.newInstance().show(ft, TAG);
|
CreditsFragment.newInstance().show(ft, TAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_donation, null);
|
final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_credits, null);
|
||||||
|
|
||||||
((TextView) view.findViewById(R.id.tvCredits)).setText(Html.fromHtml(getString(R.string.donation_credits)));
|
((TextView) view.findViewById(R.id.tvCredits)).setText(Html.fromHtml(getString(R.string.credits_text)));
|
||||||
|
|
||||||
(view.findViewById(R.id.bCopyAddress)).
|
|
||||||
setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
Helper.clipBoardCopy(getActivity(), getString(R.string.label_copy_address),
|
|
||||||
((TextView) view.findViewById(R.id.tvWalletAddress)).getText().toString());
|
|
||||||
Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
builder.setView(view);
|
builder.setView(view);
|
@@ -212,7 +212,7 @@ public class SendAddressWizardFragment extends SendWizardFragment {
|
|||||||
private boolean checkAddressNoError() {
|
private boolean checkAddressNoError() {
|
||||||
String address = etAddress.getEditText().getText().toString();
|
String address = etAddress.getEditText().getText().toString();
|
||||||
return Wallet.isAddressValid(address)
|
return Wallet.isAddressValid(address)
|
||||||
|| BitcoinAddressValidator.validate(address, WalletManager.getInstance().isTestNet());
|
|| BitcoinAddressValidator.validate(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkAddress() {
|
private boolean checkAddress() {
|
||||||
@@ -228,13 +228,13 @@ public class SendAddressWizardFragment extends SendWizardFragment {
|
|||||||
private boolean isIntegratedAddress() {
|
private boolean isIntegratedAddress() {
|
||||||
String address = etAddress.getEditText().getText().toString();
|
String address = etAddress.getEditText().getText().toString();
|
||||||
return (address.length() == INTEGRATED_ADDRESS_LENGTH)
|
return (address.length() == INTEGRATED_ADDRESS_LENGTH)
|
||||||
&& Wallet.isAddressValid(address, WalletManager.getInstance().isTestNet());
|
&& Wallet.isAddressValid(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isBitcoinAddress() {
|
private boolean isBitcoinAddress() {
|
||||||
String address = etAddress.getEditText().getText().toString();
|
String address = etAddress.getEditText().getText().toString();
|
||||||
if ((address.length() >= 27) && (address.length() <= 34))
|
if ((address.length() >= 27) && (address.length() <= 34))
|
||||||
return BitcoinAddressValidator.validate(address, WalletManager.getInstance().isTestNet());
|
return BitcoinAddressValidator.validate(address);
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -54,7 +54,8 @@ public class SendSettingsWizardFragment extends SendWizardFragment {
|
|||||||
TxData getTxData();
|
TxData getTxData();
|
||||||
}
|
}
|
||||||
|
|
||||||
final static int Mixins[] = {4, 7, 12, 25}; // must match the layout XML
|
// Mixin = Ringsize - 1
|
||||||
|
final static int Mixins[] = {6, 9, 12, 25}; // must match the layout XML / "@array/mixin"
|
||||||
final static PendingTransaction.Priority Priorities[] =
|
final static PendingTransaction.Priority Priorities[] =
|
||||||
{PendingTransaction.Priority.Priority_Default,
|
{PendingTransaction.Priority.Priority_Default,
|
||||||
PendingTransaction.Priority.Priority_Low,
|
PendingTransaction.Priority.Priority_Low,
|
||||||
|
@@ -77,7 +77,7 @@ public class SendSuccessWizardFragment extends SendWizardFragment {
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Helper.clipBoardCopy(getActivity(), getString(R.string.label_send_txid), tvTxId.getText().toString());
|
Helper.clipBoardCopy(getActivity(), getString(R.string.label_send_txid), tvTxId.getText().toString());
|
||||||
Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show();
|
Toast.makeText(getActivity(), getString(R.string.message_copy_txid), Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -137,12 +137,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter<TransactionInfo
|
|||||||
ivTxType.setVisibility(View.GONE); // gives us more space for the amount
|
ivTxType.setVisibility(View.GONE); // gives us more space for the amount
|
||||||
}
|
}
|
||||||
|
|
||||||
long realAmount = infoItem.amount;
|
String displayAmount = Helper.getDisplayAmount(infoItem.amount, Helper.DISPLAY_DIGITS_INFO);
|
||||||
if (infoItem.isPending) {
|
|
||||||
realAmount = realAmount - infoItem.fee;
|
|
||||||
}
|
|
||||||
|
|
||||||
String displayAmount = Helper.getDisplayAmount(realAmount, Helper.DISPLAY_DIGITS_INFO);
|
|
||||||
if (infoItem.direction == TransactionInfo.Direction.Direction_Out) {
|
if (infoItem.direction == TransactionInfo.Direction.Direction_Out) {
|
||||||
tvAmount.setText(context.getString(R.string.tx_list_amount_negative, displayAmount));
|
tvAmount.setText(context.getString(R.string.tx_list_amount_negative, displayAmount));
|
||||||
} else {
|
} else {
|
||||||
|
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 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.model;
|
||||||
|
|
||||||
|
public enum NetworkType {
|
||||||
|
NetworkType_Mainnet(0),
|
||||||
|
NetworkType_Testnet(1),
|
||||||
|
NetworkType_Stagenet(2);
|
||||||
|
|
||||||
|
public static NetworkType fromInteger(int n) {
|
||||||
|
switch (n) {
|
||||||
|
case 0:
|
||||||
|
return NetworkType_Mainnet;
|
||||||
|
case 1:
|
||||||
|
return NetworkType_Testnet;
|
||||||
|
case 2:
|
||||||
|
return NetworkType_Stagenet;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int value;
|
||||||
|
|
||||||
|
NetworkType(int value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
}
|
@@ -84,7 +84,14 @@ public class PendingTransaction {
|
|||||||
|
|
||||||
public native long getFee();
|
public native long getFee();
|
||||||
|
|
||||||
public native String getFirstTxId();
|
public String getFirstTxId() {
|
||||||
|
String id = getFirstTxIdJ();
|
||||||
|
if (id == null)
|
||||||
|
throw new IndexOutOfBoundsException();
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public native String getFirstTxIdJ();
|
||||||
|
|
||||||
public native long getTxCount();
|
public native long getTxCount();
|
||||||
|
|
||||||
|
@@ -79,7 +79,11 @@ public class Wallet {
|
|||||||
|
|
||||||
public native String getPath();
|
public native String getPath();
|
||||||
|
|
||||||
public native boolean isTestNet();
|
public NetworkType getNetworkType() {
|
||||||
|
return NetworkType.fromInteger(nettype());
|
||||||
|
}
|
||||||
|
|
||||||
|
public native int nettype();
|
||||||
|
|
||||||
//TODO virtual void hardForkInfo(uint8_t &version, uint64_t &earliest_height) const = 0;
|
//TODO virtual void hardForkInfo(uint8_t &version, uint64_t &earliest_height) const = 0;
|
||||||
//TODO virtual bool useForkRules(uint8_t version, int64_t early_blocks) const = 0;
|
//TODO virtual bool useForkRules(uint8_t version, int64_t early_blocks) const = 0;
|
||||||
@@ -155,10 +159,10 @@ public class Wallet {
|
|||||||
public static native boolean isPaymentIdValid(String payment_id);
|
public static native boolean isPaymentIdValid(String payment_id);
|
||||||
|
|
||||||
public static boolean isAddressValid(String address) {
|
public static boolean isAddressValid(String address) {
|
||||||
return isAddressValid(address, WalletManager.getInstance().isTestNet());
|
return isAddressValid(address, WalletManager.getInstance().getNetworkType().getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static native boolean isAddressValid(String address, boolean isTestNet);
|
public static native boolean isAddressValid(String address, int networkType);
|
||||||
|
|
||||||
//TODO static static bool keyValid(const std::string &secret_key_string, const std::string &address_string, bool isViewKey, bool testnet, std::string &error);
|
//TODO static static bool keyValid(const std::string &secret_key_string, const std::string &address_string, bool isViewKey, bool testnet, std::string &error);
|
||||||
|
|
||||||
|
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.m2049r.xmrwallet.model;
|
package com.m2049r.xmrwallet.model;
|
||||||
|
|
||||||
|
import com.m2049r.xmrwallet.data.WalletNode;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
@@ -69,22 +71,22 @@ public class WalletManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Wallet createWallet(File aFile, String password, String language) {
|
public Wallet createWallet(File aFile, String password, String language) {
|
||||||
long walletHandle = createWalletJ(aFile.getAbsolutePath(), password, language, isTestNet());
|
long walletHandle = createWalletJ(aFile.getAbsolutePath(), password, language, getNetworkType().getValue());
|
||||||
Wallet wallet = new Wallet(walletHandle);
|
Wallet wallet = new Wallet(walletHandle);
|
||||||
manageWallet(wallet);
|
manageWallet(wallet);
|
||||||
return wallet;
|
return wallet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private native long createWalletJ(String path, String password, String language, boolean isTestNet);
|
private native long createWalletJ(String path, String password, String language, int networkType);
|
||||||
|
|
||||||
public Wallet openWallet(String path, String password) {
|
public Wallet openWallet(String path, String password) {
|
||||||
long walletHandle = openWalletJ(path, password, isTestNet());
|
long walletHandle = openWalletJ(path, password, getNetworkType().getValue());
|
||||||
Wallet wallet = new Wallet(walletHandle);
|
Wallet wallet = new Wallet(walletHandle);
|
||||||
manageWallet(wallet);
|
manageWallet(wallet);
|
||||||
return wallet;
|
return wallet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private native long openWalletJ(String path, String password, boolean isTestNet);
|
private native long openWalletJ(String path, String password, int networkType);
|
||||||
|
|
||||||
public Wallet recoveryWallet(File aFile, String password, String mnemonic) {
|
public Wallet recoveryWallet(File aFile, String password, String mnemonic) {
|
||||||
return recoveryWallet(aFile, password, mnemonic, 0);
|
return recoveryWallet(aFile, password, mnemonic, 0);
|
||||||
@@ -92,28 +94,28 @@ public class WalletManager {
|
|||||||
|
|
||||||
public Wallet recoveryWallet(File aFile, String password, String mnemonic, long restoreHeight) {
|
public Wallet recoveryWallet(File aFile, String password, String mnemonic, long restoreHeight) {
|
||||||
long walletHandle = recoveryWalletJ(aFile.getAbsolutePath(), password, mnemonic,
|
long walletHandle = recoveryWalletJ(aFile.getAbsolutePath(), password, mnemonic,
|
||||||
isTestNet(), restoreHeight);
|
getNetworkType().getValue(), restoreHeight);
|
||||||
Wallet wallet = new Wallet(walletHandle);
|
Wallet wallet = new Wallet(walletHandle);
|
||||||
manageWallet(wallet);
|
manageWallet(wallet);
|
||||||
return wallet;
|
return wallet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private native long recoveryWalletJ(String path, String password, String mnemonic,
|
private native long recoveryWalletJ(String path, String password, String mnemonic,
|
||||||
boolean isTestNet, long restoreHeight);
|
int networkType, long restoreHeight);
|
||||||
|
|
||||||
public Wallet createWalletWithKeys(File aFile, String password, String language, long restoreHeight,
|
public Wallet createWalletWithKeys(File aFile, String password, String language, long restoreHeight,
|
||||||
String addressString, String viewKeyString, String spendKeyString) {
|
String addressString, String viewKeyString, String spendKeyString) {
|
||||||
long walletHandle = createWalletWithKeysJ(aFile.getAbsolutePath(), password,
|
long walletHandle = createWalletFromKeysJ(aFile.getAbsolutePath(), password,
|
||||||
language, isTestNet(), restoreHeight,
|
language, getNetworkType().getValue(), restoreHeight,
|
||||||
addressString, viewKeyString, spendKeyString);
|
addressString, viewKeyString, spendKeyString);
|
||||||
Wallet wallet = new Wallet(walletHandle);
|
Wallet wallet = new Wallet(walletHandle);
|
||||||
manageWallet(wallet);
|
manageWallet(wallet);
|
||||||
return wallet;
|
return wallet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private native long createWalletWithKeysJ(String path, String password,
|
private native long createWalletFromKeysJ(String path, String password,
|
||||||
String language,
|
String language,
|
||||||
boolean isTestNet,
|
int networkType,
|
||||||
long restoreHeight,
|
long restoreHeight,
|
||||||
String addressString,
|
String addressString,
|
||||||
String viewKeyString,
|
String viewKeyString,
|
||||||
@@ -204,24 +206,23 @@ public class WalletManager {
|
|||||||
//TODO virtual bool checkPayment(const std::string &address, const std::string &txid, const std::string &txkey, const std::string &daemon_address, uint64_t &received, uint64_t &height, std::string &error) const = 0;
|
//TODO virtual bool checkPayment(const std::string &address, const std::string &txid, const std::string &txkey, const std::string &daemon_address, uint64_t &received, uint64_t &height, std::string &error) const = 0;
|
||||||
|
|
||||||
private String daemonAddress = null;
|
private String daemonAddress = null;
|
||||||
private boolean testnet = true;
|
private NetworkType networkType = null;
|
||||||
|
|
||||||
public boolean isTestNet() {
|
public NetworkType getNetworkType() {
|
||||||
if (daemonAddress == null) {
|
return networkType;
|
||||||
return true;
|
|
||||||
// assume testnet not explicitly initialised
|
|
||||||
//throw new IllegalStateException("use setDaemon() to initialise daemon and net first!");
|
|
||||||
}
|
|
||||||
return testnet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDaemon(String address, boolean testnet, String username, String password) {
|
//public void setDaemon(String address, NetworkType networkType, String username, String password) {
|
||||||
//Timber.d("SETDAEMON " + username + "/" + password + "/" + address);
|
public void setDaemon(WalletNode walletNode) {
|
||||||
this.daemonAddress = address;
|
this.daemonAddress = walletNode.getAddress();
|
||||||
this.testnet = testnet;
|
this.networkType = networkType;
|
||||||
this.daemonUsername = username;
|
this.daemonUsername = walletNode.getUsername();
|
||||||
this.daemonPassword = password;
|
this.daemonPassword = walletNode.getPassword();
|
||||||
setDaemonAddressJ(address);
|
setDaemonAddressJ(daemonAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNetworkType(NetworkType networkType) {
|
||||||
|
this.networkType = networkType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDaemonAddress() {
|
public String getDaemonAddress() {
|
||||||
|
@@ -524,7 +524,7 @@ public class WalletService extends Service {
|
|||||||
showProgress(20);
|
showProgress(20);
|
||||||
Wallet wallet = null;
|
Wallet wallet = null;
|
||||||
WalletManager walletMgr = WalletManager.getInstance();
|
WalletManager walletMgr = WalletManager.getInstance();
|
||||||
Timber.d("WalletManager testnet=%s", walletMgr.isTestNet());
|
Timber.d("WalletManager network=%s", walletMgr.getNetworkType().name());
|
||||||
showProgress(30);
|
showProgress(30);
|
||||||
if (walletMgr.walletExists(path)) {
|
if (walletMgr.walletExists(path)) {
|
||||||
Timber.d("open wallet %s", path);
|
Timber.d("open wallet %s", path);
|
||||||
|
@@ -18,6 +18,9 @@ package com.m2049r.xmrwallet.util;
|
|||||||
|
|
||||||
// based on https://rosettacode.org/wiki/Bitcoin/address_validation#Java
|
// based on https://rosettacode.org/wiki/Bitcoin/address_validation#Java
|
||||||
|
|
||||||
|
import com.m2049r.xmrwallet.model.NetworkType;
|
||||||
|
import com.m2049r.xmrwallet.model.WalletManager;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
@@ -27,6 +30,11 @@ public class BitcoinAddressValidator {
|
|||||||
|
|
||||||
private static final String ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
private static final String ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||||||
|
|
||||||
|
public static boolean validate(String addrress) {
|
||||||
|
return validate(addrress,
|
||||||
|
WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean validate(String addrress, boolean testnet) {
|
public static boolean validate(String addrress, boolean testnet) {
|
||||||
if (addrress.length() < 26 || addrress.length() > 35)
|
if (addrress.length() < 26 || addrress.length() > 35)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -31,12 +31,15 @@ import android.graphics.drawable.Drawable;
|
|||||||
import android.graphics.drawable.VectorDrawable;
|
import android.graphics.drawable.VectorDrawable;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
|
import android.system.ErrnoException;
|
||||||
|
import android.system.Os;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.view.animation.Animation;
|
import android.view.animation.Animation;
|
||||||
import android.view.animation.AnimationUtils;
|
import android.view.animation.AnimationUtils;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
|
||||||
import com.m2049r.xmrwallet.R;
|
import com.m2049r.xmrwallet.R;
|
||||||
|
import com.m2049r.xmrwallet.model.NetworkType;
|
||||||
import com.m2049r.xmrwallet.model.Wallet;
|
import com.m2049r.xmrwallet.model.Wallet;
|
||||||
import com.m2049r.xmrwallet.model.WalletManager;
|
import com.m2049r.xmrwallet.model.WalletManager;
|
||||||
|
|
||||||
@@ -55,16 +58,21 @@ import timber.log.Timber;
|
|||||||
|
|
||||||
public class Helper {
|
public class Helper {
|
||||||
static private final String WALLET_DIR = "monerujo";
|
static private final String WALLET_DIR = "monerujo";
|
||||||
|
static private final String HOME_DIR = "monero";
|
||||||
|
|
||||||
static public int DISPLAY_DIGITS_INFO = 5;
|
static public int DISPLAY_DIGITS_INFO = 5;
|
||||||
|
|
||||||
static public File getStorageRoot(Context context) {
|
static public File getWalletRoot(Context context) {
|
||||||
|
return getStorage(context, WALLET_DIR);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public File getStorage(Context context, String folderName) {
|
||||||
if (!isExternalStorageWritable()) {
|
if (!isExternalStorageWritable()) {
|
||||||
String msg = context.getString(R.string.message_strorage_not_writable);
|
String msg = context.getString(R.string.message_strorage_not_writable);
|
||||||
Timber.e(msg);
|
Timber.e(msg);
|
||||||
throw new IllegalStateException(msg);
|
throw new IllegalStateException(msg);
|
||||||
}
|
}
|
||||||
File dir = new File(Environment.getExternalStorageDirectory(), WALLET_DIR);
|
File dir = new File(Environment.getExternalStorageDirectory(), folderName);
|
||||||
if (!dir.exists()) {
|
if (!dir.exists()) {
|
||||||
Timber.i("Creating %s", dir.getAbsolutePath());
|
Timber.i("Creating %s", dir.getAbsolutePath());
|
||||||
dir.mkdirs(); // try to make it
|
dir.mkdirs(); // try to make it
|
||||||
@@ -114,9 +122,9 @@ public class Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static public File getWalletFile(Context context, String aWalletName) {
|
static public File getWalletFile(Context context, String aWalletName) {
|
||||||
File walletDir = getStorageRoot(context);
|
File walletDir = getWalletRoot(context);
|
||||||
File f = new File(walletDir, aWalletName);
|
File f = new File(walletDir, aWalletName);
|
||||||
Timber.d("wallet= %s size= %d", f.getAbsolutePath(), f.length());
|
Timber.d("wallet=%s size= %d", f.getAbsolutePath(), f.length());
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,10 +271,20 @@ public class Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static public HttpUrl getXmrToBaseUrl() {
|
static public HttpUrl getXmrToBaseUrl() {
|
||||||
if ((WalletManager.getInstance() == null) || WalletManager.getInstance().isTestNet()) {
|
if ((WalletManager.getInstance() == null)
|
||||||
|
|| (WalletManager.getInstance().getNetworkType() != NetworkType.NetworkType_Mainnet)) {
|
||||||
return HttpUrl.parse("https://test.xmr.to/api/v2/xmr2btc/");
|
return HttpUrl.parse("https://test.xmr.to/api/v2/xmr2btc/");
|
||||||
} else {
|
} else {
|
||||||
return HttpUrl.parse("https://xmr.to/api/v2/xmr2btc/");
|
return HttpUrl.parse("https://xmr.to/api/v2/xmr2btc/");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public void setMoneroHome(Context context) {
|
||||||
|
try {
|
||||||
|
String home = getStorage(context, HOME_DIR).getAbsolutePath();
|
||||||
|
Os.setenv("HOME", home, true);
|
||||||
|
} catch (ErrnoException ex) {
|
||||||
|
throw new IllegalStateException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -45,7 +45,7 @@ public class Toolbar extends android.support.v7.widget.Toolbar {
|
|||||||
ImageView toolbarImage;
|
ImageView toolbarImage;
|
||||||
TextView toolbarTitle;
|
TextView toolbarTitle;
|
||||||
TextView toolbarSubtitle;
|
TextView toolbarSubtitle;
|
||||||
Button bDonate;
|
Button bCredits;
|
||||||
|
|
||||||
public Toolbar(Context context) {
|
public Toolbar(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -87,8 +87,8 @@ public class Toolbar extends android.support.v7.widget.Toolbar {
|
|||||||
|
|
||||||
toolbarTitle = (TextView) findViewById(R.id.toolbarTitle);
|
toolbarTitle = (TextView) findViewById(R.id.toolbarTitle);
|
||||||
toolbarSubtitle = (TextView) findViewById(R.id.toolbarSubtitle);
|
toolbarSubtitle = (TextView) findViewById(R.id.toolbarSubtitle);
|
||||||
bDonate = (Button) findViewById(R.id.bDonate);
|
bCredits = (Button) findViewById(R.id.bCredits);
|
||||||
bDonate.setOnClickListener(new View.OnClickListener() {
|
bCredits.setOnClickListener(new View.OnClickListener() {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
if (onButtonListener != null) {
|
if (onButtonListener != null) {
|
||||||
onButtonListener.onButton(buttonType);
|
onButtonListener.onButton(buttonType);
|
||||||
@@ -116,43 +116,43 @@ public class Toolbar extends android.support.v7.widget.Toolbar {
|
|||||||
public final static int BUTTON_NONE = 0;
|
public final static int BUTTON_NONE = 0;
|
||||||
public final static int BUTTON_BACK = 1;
|
public final static int BUTTON_BACK = 1;
|
||||||
public final static int BUTTON_CLOSE = 2;
|
public final static int BUTTON_CLOSE = 2;
|
||||||
public final static int BUTTON_DONATE = 3;
|
public final static int BUTTON_CREDITS = 3;
|
||||||
public final static int BUTTON_CANCEL = 4;
|
public final static int BUTTON_CANCEL = 4;
|
||||||
|
|
||||||
int buttonType = BUTTON_DONATE;
|
int buttonType = BUTTON_CREDITS;
|
||||||
|
|
||||||
public void setButton(int type) {
|
public void setButton(int type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case BUTTON_BACK:
|
case BUTTON_BACK:
|
||||||
Timber.d("BUTTON_BACK");
|
Timber.d("BUTTON_BACK");
|
||||||
bDonate.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_arrow_back_white_24dp, 0, 0, 0);
|
bCredits.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_arrow_back_white_24dp, 0, 0, 0);
|
||||||
bDonate.setText(null);
|
bCredits.setText(null);
|
||||||
bDonate.setVisibility(View.VISIBLE);
|
bCredits.setVisibility(View.VISIBLE);
|
||||||
break;
|
break;
|
||||||
case BUTTON_CLOSE:
|
case BUTTON_CLOSE:
|
||||||
Timber.d("BUTTON_CLOSE");
|
Timber.d("BUTTON_CLOSE");
|
||||||
bDonate.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_close_white_24dp, 0, 0, 0);
|
bCredits.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_close_white_24dp, 0, 0, 0);
|
||||||
bDonate.setText(R.string.label_close);
|
bCredits.setText(R.string.label_close);
|
||||||
bDonate.setVisibility(View.VISIBLE);
|
bCredits.setVisibility(View.VISIBLE);
|
||||||
break;
|
break;
|
||||||
case BUTTON_DONATE:
|
case BUTTON_CREDITS:
|
||||||
Timber.d("BUTTON_DONATE");
|
Timber.d("BUTTON_CREDITS");
|
||||||
bDonate.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_favorite_white_24dp, 0, 0, 0);
|
bCredits.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_favorite_white_24dp, 0, 0, 0);
|
||||||
bDonate.setText(R.string.label_donate);
|
bCredits.setText(R.string.label_credits);
|
||||||
bDonate.setVisibility(View.VISIBLE);
|
bCredits.setVisibility(View.VISIBLE);
|
||||||
break;
|
break;
|
||||||
case BUTTON_CANCEL:
|
case BUTTON_CANCEL:
|
||||||
Timber.d("BUTTON_CANCEL");
|
Timber.d("BUTTON_CANCEL");
|
||||||
bDonate.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_close_white_24dp, 0, 0, 0);
|
bCredits.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_close_white_24dp, 0, 0, 0);
|
||||||
bDonate.setText(R.string.label_cancel);
|
bCredits.setText(R.string.label_cancel);
|
||||||
bDonate.setVisibility(View.VISIBLE);
|
bCredits.setVisibility(View.VISIBLE);
|
||||||
break;
|
break;
|
||||||
case BUTTON_NONE:
|
case BUTTON_NONE:
|
||||||
default:
|
default:
|
||||||
Timber.d("BUTTON_NONE");
|
Timber.d("BUTTON_NONE");
|
||||||
bDonate.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
bCredits.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
|
||||||
bDonate.setText(null);
|
bCredits.setText(null);
|
||||||
bDonate.setVisibility(View.INVISIBLE);
|
bCredits.setVisibility(View.INVISIBLE);
|
||||||
}
|
}
|
||||||
buttonType = type;
|
buttonType = type;
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
30
app/src/main/res/layout/fragment_credits.xml
Normal file
30
app/src/main/res/layout/fragment_credits.xml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:paddingEnd="16dp"
|
||||||
|
android:paddingStart="16dp">
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="100dp"
|
||||||
|
android:src="@drawable/gunther_coder" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvCredits"
|
||||||
|
style="@style/MoneroText"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/header_top"
|
||||||
|
android:autoLink="web"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/credits_text" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
@@ -1,79 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingTop="8dp"
|
|
||||||
android:paddingEnd="16dp"
|
|
||||||
android:paddingStart="16dp">
|
|
||||||
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="100dp"
|
|
||||||
android:src="@drawable/gunther_donate" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/MoneroText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:text="@string/donation_text"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/header_top"
|
|
||||||
android:background="@drawable/backgound_spinner"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="@dimen/header_top">
|
|
||||||
|
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
style="@style/MoneroLabel.Heading.Donation"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:text="@string/donation_address_label" />
|
|
||||||
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/bCopyAddress"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:layout_marginEnd="8dp"
|
|
||||||
android:background="?android:selectableItemBackground"
|
|
||||||
android:src="@drawable/ic_content_copy_black_24dp" />
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tvWalletAddress"
|
|
||||||
style="@style/MoneroText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/data_top"
|
|
||||||
android:text="@string/donation_address"
|
|
||||||
android:textAlignment="center"
|
|
||||||
android:textColor="@color/moneroBlack"
|
|
||||||
android:textSize="17sp" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tvCredits"
|
|
||||||
style="@style/MoneroText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/header_top"
|
|
||||||
android:autoLink="web"
|
|
||||||
android:gravity="center"
|
|
||||||
android:text="@string/donation_credits" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
@@ -113,8 +113,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="bottom|end"
|
android:layout_gravity="bottom|end"
|
||||||
android:layout_marginBottom="88dp"
|
android:layout_marginBottom="88dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp">
|
||||||
android:background="?android:attr/selectableItemBackgroundBorderless">
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/fabSeedT"
|
android:id="@+id/fabSeedT"
|
||||||
|
@@ -3,12 +3,12 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/bDonate"
|
android:id="@+id/bCredits"
|
||||||
style="@style/ToolBarStyle.ActionButton"
|
style="@style/ToolBarStyle.ActionButton"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:drawableStart="@drawable/ic_favorite_white_24dp"
|
android:drawableStart="@drawable/ic_favorite_white_24dp"
|
||||||
android:text="@string/label_donate" />
|
android:text="@string/label_credits" />
|
||||||
|
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@@ -3,10 +3,10 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_donate"
|
android:id="@+id/action_credits"
|
||||||
android:icon="@drawable/ic_favorite_white_24dp"
|
android:icon="@drawable/ic_favorite_white_24dp"
|
||||||
android:orderInCategory="10"
|
android:orderInCategory="10"
|
||||||
android:title="@string/label_donate"
|
android:title="@string/label_credits"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
|
@@ -4,13 +4,7 @@
|
|||||||
<string name="about_close">Cerrar</string>
|
<string name="about_close">Cerrar</string>
|
||||||
<string name="about_version">Versión %1$s (%2$d)</string>
|
<string name="about_version">Versión %1$s (%2$d)</string>
|
||||||
|
|
||||||
<string name="donation_text">
|
<string name="credits_text"><![CDATA[
|
||||||
\"¡Donad, bastardos ingratos!\"
|
|
||||||
</string>
|
|
||||||
|
|
||||||
<string name="donation_address_label">Donaciones</string>
|
|
||||||
|
|
||||||
<string name="donation_credits"><![CDATA[
|
|
||||||
<b>Créditos</b>
|
<b>Créditos</b>
|
||||||
<br/>
|
<br/>
|
||||||
m2049r, baltsar777, anhdres, keejef,
|
m2049r, baltsar777, anhdres, keejef,
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user