Tweaks based on alpha feedback (#110)

* donation+privacy policy screens + bugfixes

* opacity

* mnemonic left aligned

* smaller scan button

* spread out fabs

* doExchnage on lose focus of amount

* specify wallet create type
This commit is contained in:
m2049r 2017-11-02 22:48:20 +01:00 committed by GitHub
parent 4ac6a03d63
commit 716b830b7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 488 additions and 46 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@
/captures /captures
.externalNativeBuild .externalNativeBuild
.DS_Store .DS_Store
/app/release

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

View File

@ -33,6 +33,7 @@ import android.view.inputmethod.EditorInfo;
import android.widget.Button; import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import com.m2049r.xmrwallet.layout.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;
import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.Helper;
@ -366,7 +367,25 @@ public class GenerateFragment extends Fragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
Log.d(TAG, "onResume()"); Log.d(TAG, "onResume()");
activityCallback.setTitle(getString(R.string.generate_title)); activityCallback.setTitle(getString(R.string.generate_title) + " - " + getType());
activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
}
String getType() {
switch (type) {
case TYPE_KEY:
return getString(R.string.generate_wallet_type_key);
case TYPE_NEW:
return getString(R.string.generate_wallet_type_new);
case TYPE_SEED:
return getString(R.string.generate_wallet_type_seed);
case TYPE_VIEWONLY:
return getString(R.string.generate_wallet_type_view);
default:
Log.e(TAG, "unknown type " + type);
return "?";
}
} }
GenerateFragment.Listener activityCallback; GenerateFragment.Listener activityCallback;
@ -379,6 +398,9 @@ public class GenerateFragment extends Fragment {
void onGenerate(String name, String password, String address, String viewKey, String spendKey, long height); void onGenerate(String name, String password, String address, String viewKey, String spendKey, long height);
void setTitle(String title); void setTitle(String title);
void setToolbarButton(int type);
} }
@Override @Override

View File

@ -47,8 +47,10 @@ import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.m2049r.xmrwallet.dialog.DonationFragment;
import com.m2049r.xmrwallet.dialog.HelpFragment; import com.m2049r.xmrwallet.dialog.HelpFragment;
import com.m2049r.xmrwallet.dialog.LicensesFragment; import com.m2049r.xmrwallet.dialog.LicensesFragment;
import com.m2049r.xmrwallet.dialog.PrivacyFragment;
import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.layout.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;
@ -120,7 +122,8 @@ public class LoginActivity extends AppCompatActivity
finish(); finish();
break; break;
case Toolbar.BUTTON_DONATE: case Toolbar.BUTTON_DONATE:
Toast.makeText(LoginActivity.this, getString(R.string.label_donate), Toast.LENGTH_SHORT).show(); DonationFragment.display(getSupportFragmentManager());
break;
case Toolbar.BUTTON_NONE: case Toolbar.BUTTON_NONE:
default: default:
Log.e(TAG, "Button " + type + "pressed - how can this be?"); Log.e(TAG, "Button " + type + "pressed - how can this be?");
@ -1056,9 +1059,12 @@ public class LoginActivity extends AppCompatActivity
case R.id.action_details_help: case R.id.action_details_help:
HelpFragment.displayHelp(getSupportFragmentManager(), R.raw.help_details); HelpFragment.displayHelp(getSupportFragmentManager(), R.raw.help_details);
return true; return true;
case R.id.action_lincense_info: case R.id.action_license_info:
LicensesFragment.displayLicensesFragment(getSupportFragmentManager()); LicensesFragment.displayLicensesFragment(getSupportFragmentManager());
return true; return true;
case R.id.action_privacy_policy:
PrivacyFragment.display(getSupportFragmentManager());
return true;
case R.id.action_testnet: case R.id.action_testnet:
try { try {
LoginFragment loginFragment = (LoginFragment) LoginFragment loginFragment = (LoginFragment)

View File

@ -143,6 +143,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
fabKeyL = (RelativeLayout) view.findViewById(R.id.fabKeyL); fabKeyL = (RelativeLayout) view.findViewById(R.id.fabKeyL);
fabSeedL = (RelativeLayout) view.findViewById(R.id.fabSeedL); fabSeedL = (RelativeLayout) view.findViewById(R.id.fabSeedL);
fab_pulse = AnimationUtils.loadAnimation(getContext(), R.anim.fab_pulse);
fab_open_screen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open_screen); fab_open_screen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open_screen);
fab_close_screen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_close_screen); fab_close_screen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_close_screen);
fab_open = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open); fab_open = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open);
@ -208,6 +209,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
}); });
loadPrefs(); loadPrefs();
return view; return view;
} }
@ -267,6 +269,11 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
filterList(); filterList();
adapter.setInfos(displayedList); adapter.setInfos(displayedList);
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
if (displayedList.isEmpty()) {
fab.startAnimation(fab_pulse);
} else {
fab.clearAnimation();
}
} }
private void showInfo(@NonNull String name) { private void showInfo(@NonNull String name) {
@ -381,6 +388,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter
private FrameLayout fabScreen; private FrameLayout fabScreen;
private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL; private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL;
private Animation fab_open, fab_close, rotate_forward, rotate_backward, fab_open_screen, fab_close_screen; private Animation fab_open, fab_close, rotate_forward, rotate_backward, fab_open_screen, fab_close_screen;
private Animation fab_pulse;
public boolean isFabOpen() { public boolean isFabOpen() {
return isFabOpen; return isFabOpen;

View File

@ -57,11 +57,8 @@ public class SendFragment extends Fragment {
private TextInputLayout etAddress; private TextInputLayout etAddress;
private TextInputLayout etPaymentId; private TextInputLayout etPaymentId;
//TextInputLayout etAmount;
private ExchangeView evAmount; private ExchangeView evAmount;
private TextView tvAmountB;
private Spinner sCurrencyA;
private Spinner sCurrencyB;
private Button bScan; private Button bScan;
private Spinner sMixin; private Spinner sMixin;
@ -102,9 +99,6 @@ public class SendFragment extends Fragment {
etAddress = (TextInputLayout) view.findViewById(R.id.etAddress); etAddress = (TextInputLayout) view.findViewById(R.id.etAddress);
etPaymentId = (TextInputLayout) view.findViewById(R.id.etPaymentId); etPaymentId = (TextInputLayout) view.findViewById(R.id.etPaymentId);
evAmount = (ExchangeView) view.findViewById(R.id.evAmount); evAmount = (ExchangeView) view.findViewById(R.id.evAmount);
tvAmountB = (TextView) view.findViewById(R.id.tvAmountB);
sCurrencyA = (Spinner) view.findViewById(R.id.sCurrencyA);
sCurrencyB = (Spinner) view.findViewById(R.id.sCurrencyB);
bScan = (Button) view.findViewById(R.id.bScan); bScan = (Button) view.findViewById(R.id.bScan);
bPrepareSend = (Button) view.findViewById(R.id.bPrepareSend); bPrepareSend = (Button) view.findViewById(R.id.bPrepareSend);
@ -140,18 +134,6 @@ public class SendFragment extends Fragment {
} }
}); });
evAmount.setOnNewAmountListener(new ExchangeView.OnNewAmountListener() {
@Override
public void onNewAmount(String xmr) {
if ((xmr != null)) {
// stupid workaround to not show error on open of screen
if ((checkAddressNoError() && checkAmountWithError()) || checkAmount()) {
etPaymentId.requestFocus();
}
}
}
});
etPaymentId.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { etPaymentId.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
@ -406,9 +388,6 @@ public class SendFragment extends Fragment {
} }
if ((data != null) && (data.amount <= 0)) { if ((data != null) && (data.amount <= 0)) {
evAmount.focus(); evAmount.focus();
} else {
etDummy.requestFocus();
Helper.hideKeyboard(getActivity());
} }
} }

View File

@ -36,6 +36,7 @@ import android.util.Log;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.Toast; import android.widget.Toast;
import com.m2049r.xmrwallet.dialog.DonationFragment;
import com.m2049r.xmrwallet.layout.Toolbar; import com.m2049r.xmrwallet.layout.Toolbar;
import com.m2049r.xmrwallet.model.PendingTransaction; import com.m2049r.xmrwallet.model.PendingTransaction;
import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.TransactionInfo;
@ -154,7 +155,7 @@ public class WalletActivity extends AppCompatActivity implements WalletFragment.
onWalletDetails(); onWalletDetails();
return true; return true;
case R.id.action_donate: case R.id.action_donate:
onWalletDetails(); DonationFragment.display(getSupportFragmentManager());
return true; return true;
case R.id.action_share: case R.id.action_share:
onShareTxInfo(); onShareTxInfo();

View File

@ -305,17 +305,17 @@ public class WalletFragment extends Fragment
long daemonHeight = activityCallback.getDaemonHeight(); long daemonHeight = activityCallback.getDaemonHeight();
if (!wallet.isSynchronized()) { if (!wallet.isSynchronized()) {
long n = daemonHeight - wallet.getBlockChainHeight(); long n = daemonHeight - wallet.getBlockChainHeight();
sync = formatter.format(n) + " " + getString(R.string.status_remaining); sync = getString(R.string.status_syncing) + " " + formatter.format(n) + " " + getString(R.string.status_remaining);
if (firstBlock == 0) { if (firstBlock == 0) {
firstBlock = wallet.getBlockChainHeight(); firstBlock = wallet.getBlockChainHeight();
} }
int x = 100 - Math.round(100f * n / (1f * daemonHeight - firstBlock)); int x = 100 - Math.round(100f * n / (1f * daemonHeight - firstBlock));
onProgress(getString(R.string.status_syncing) + " " + sync); //onProgress(getString(R.string.status_syncing) + " " + sync);
if (x == 0) x = -1; if (x == 0) x = -1;
onProgress(x); onProgress(x);
ivSynced.setVisibility(View.GONE); ivSynced.setVisibility(View.GONE);
} else { } else {
sync = getString(R.string.status_synced) + ": " + formatter.format(wallet.getBlockChainHeight()); sync = getString(R.string.status_synced) + formatter.format(wallet.getBlockChainHeight());
ivSynced.setVisibility(View.VISIBLE); ivSynced.setVisibility(View.VISIBLE);
} }
} }

View File

@ -0,0 +1,114 @@
/*
* 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.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Based on work by Adam Speakman http://speakman.net.nz
*/
package com.m2049r.xmrwallet.dialog;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebView;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.m2049r.xmrwallet.BuildConfig;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.util.Helper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class DonationFragment extends DialogFragment {
static final String TAG = "DonationFragment";
private static final String FRAGMENT_TAG = "com.m2049r.xmrwalelt.dialog.DonationFragment";
/**
* Creates a new instance of LicensesFragment with no Close button.
*
* @return A new licenses fragment.
*/
public static DonationFragment newInstance() {
return new DonationFragment();
}
/**
* Builds and displays a licenses fragment with no Close button. Requires
* "/res/raw/licenses.html" and "/res/layout/licenses_fragment.xml" to be
* present.
*
* @param fm A fragment manager instance used to display this LicensesFragment.
*/
public static void display(FragmentManager fm) {
FragmentTransaction ft = fm.beginTransaction();
Fragment prev = fm.findFragmentByTag(FRAGMENT_TAG);
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = DonationFragment.newInstance();
newFragment.show(ft, FRAGMENT_TAG);
}
@SuppressLint("InflateParams")
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_donation, null);
((TextView) view.findViewById(R.id.tvCredits)).setText(Html.fromHtml(getString(R.string.donation_credits)));
((ImageButton) 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());
builder.setView(view);
builder.setNegativeButton(R.string.about_close,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
return builder.create();
}
}

View File

@ -0,0 +1,93 @@
/*
* 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.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Based on work by Adam Speakman http://speakman.net.nz
*/
package com.m2049r.xmrwallet.dialog;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.m2049r.xmrwallet.R;
import com.m2049r.xmrwallet.util.Helper;
public class PrivacyFragment extends DialogFragment {
static final String TAG = "PrivacyFragment";
private static final String FRAGMENT_TAG = "com.m2049r.xmrwalelt.dialog.PrivacyFragment";
/**
* Creates a new instance of LicensesFragment with no Close button.
*
* @return A new licenses fragment.
*/
public static PrivacyFragment newInstance() {
return new PrivacyFragment();
}
/**
* Builds and displays a licenses fragment with no Close button. Requires
* "/res/raw/licenses.html" and "/res/layout/licenses_fragment.xml" to be
* present.
*
* @param fm A fragment manager instance used to display this LicensesFragment.
*/
public static void display(FragmentManager fm) {
FragmentTransaction ft = fm.beginTransaction();
Fragment prev = fm.findFragmentByTag(FRAGMENT_TAG);
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = PrivacyFragment.newInstance();
newFragment.show(ft, FRAGMENT_TAG);
}
@SuppressLint("InflateParams")
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_privacy_policy, null);
((TextView) view.findViewById(R.id.tvCredits)).setText(Html.fromHtml(getString(R.string.privacy_policy)));
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view);
builder.setNegativeButton(R.string.about_close,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
return builder.create();
}
}

View File

@ -67,6 +67,7 @@ public class ExchangeView extends LinearLayout implements AsyncExchangeRate.List
public void setAmount(String xmrAmount) { public void setAmount(String xmrAmount) {
if (xmrAmount != null) { if (xmrAmount != null) {
setCurrencyA(0); setCurrencyA(0);
etAmount.getEditText().setText(xmrAmount);
setXmr(xmrAmount); setXmr(xmrAmount);
this.notXmrAmount = null; this.notXmrAmount = null;
doExchange(); doExchange();
@ -191,6 +192,15 @@ public class ExchangeView extends LinearLayout implements AsyncExchangeRate.List
} }
}); });
etAmount.getEditText().setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
doExchange();
}
}
});
etAmount.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() { etAmount.getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<scale
android:duration="500"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:toXScale="2.0"
android:toYScale="2.0" />
</set>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z"/>
</vector>

View File

@ -0,0 +1,79 @@
<?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="8sp"
android:paddingEnd="16sp"
android:paddingStart="16sp">
<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="100sp"
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>

View File

@ -69,7 +69,7 @@
android:hint="@string/generate_mnemonic_hint" android:hint="@string/generate_mnemonic_hint"
android:imeOptions="actionNext" android:imeOptions="actionNext"
android:inputType="textMultiLine" android:inputType="textMultiLine"
android:textAlignment="center" /> android:textAlignment="textStart" />
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout

View File

@ -0,0 +1,31 @@
<?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="8sp"
android:paddingEnd="16sp"
android:paddingStart="16sp">
<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="50sp"
android:src="@drawable/ic_eye_black_24dp" />
<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="start"
android:text="@string/privacy_policy"
android:textSize="14sp" />
</LinearLayout>
</ScrollView>

View File

@ -47,10 +47,10 @@
<Button <Button
android:id="@+id/bScan" android:id="@+id/bScan"
style="@style/MoneroText.Button" style="@style/MoneroText.Button"
android:layout_width="56sp" android:layout_width="48dp"
android:layout_height="56sp" android:layout_height="48dp"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginStart="8sp" android:layout_marginStart="16sp"
android:background="@drawable/ic_scan" android:background="@drawable/ic_scan"
android:text="@string/send_qr_hint" /> android:text="@string/send_qr_hint" />
</LinearLayout> </LinearLayout>

View File

@ -8,7 +8,7 @@
android:id="@+id/fabScreen" android:id="@+id/fabScreen"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#CCffffff" android:background="#eeffffff"
android:visibility="invisible"> android:visibility="invisible">
<RelativeLayout <RelativeLayout
@ -16,7 +16,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|end" android:layout_gravity="bottom|end"
android:layout_marginBottom="224dp" android:layout_marginBottom="256dp"
android:layout_marginEnd="16dp"> android:layout_marginEnd="16dp">
<TextView <TextView
@ -48,7 +48,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|end" android:layout_gravity="bottom|end"
android:layout_marginBottom="176dp" android:layout_marginBottom="200dp"
android:layout_marginEnd="16dp"> android:layout_marginEnd="16dp">
<TextView <TextView
@ -80,7 +80,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|end" android:layout_gravity="bottom|end"
android:layout_marginBottom="128dp" android:layout_marginBottom="144dp"
android:layout_marginEnd="16dp"> android:layout_marginEnd="16dp">
<TextView <TextView
@ -112,7 +112,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|end" android:layout_gravity="bottom|end"
android:layout_marginBottom="80dp" android:layout_marginBottom="88dp"
android:layout_marginEnd="16dp"> android:layout_marginEnd="16dp">
<TextView <TextView

View File

@ -10,10 +10,15 @@
app:showAsAction="never" /> app:showAsAction="never" />
<item <item
android:id="@+id/action_lincense_info" android:id="@+id/action_license_info"
android:icon="@drawable/ic_info_white_24dp"
android:orderInCategory="200" android:orderInCategory="200"
android:title="@string/menu_about" android:title="@string/menu_about"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/action_privacy_policy"
android:orderInCategory="200"
android:title="@string/menu_privacy"
app:showAsAction="never" />
</menu> </menu>

View File

@ -7,7 +7,7 @@
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_donate"
app:showAsAction="always|withText" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_info" android:id="@+id/action_info"

View File

@ -10,7 +10,7 @@
<h1>Open Source Licenses</h1> <h1>Open Source Licenses</h1>
<h2>Licensed under the Apache License, Version 2.0</h2> <h2>Licensed under the Apache License, Version 2.0</h2>
<h3>monerujo (https://github.com/m2049r/xmrwallet)</h3> <h3>monerujo (https://github.com/m2049r/xmrwallet)</h3>
Copyright (c) m2049r et al. Copyright (c) 2017 m2049r et al.
<h3>The Android Open Source Project</h3> <h3>The Android Open Source Project</h3>
<ul> <ul>
<li>com.android.support:design</li> <li>com.android.support:design</li>

View File

@ -3,4 +3,59 @@
<string name="about_title">About</string> <string name="about_title">About</string>
<string name="about_close">Close</string> <string name="about_close">Close</string>
<string name="about_text">I am monerujo %1$s (%2$d)</string> <string name="about_text">I am monerujo %1$s (%2$d)</string>
<string name="donation_text">
\"Donate you ungrateful bastards!\"
</string>
<string name="donation_address_label">Donations Address</string>
<string name="donation_address">4AdkPJoxn7JCvAby9szgnt93MSEwdnxdhaASxbTBm6x5dCwmsDep2UYN4FhStDn5i11nsJbpU7oj59ahg8gXb1Mg3viqCuk</string>
<string name="donation_credits"><![CDATA[
<b>Credits</b>
<br/>
m2049r, baltsar777, rehrar, anhdres,
keejef, TheMonera
<br/><br/>
<a href="www.xmrujo.com">www.xmrujo.com</a>
]]></string>
<string name="privacy_policy"><![CDATA[
<h1>Privacy Policy</h1>
<p>This page informs you of our policies regarding the collection,
use and disclosure of personal information we receive from users of our
app (monerujo: Monero Wallet).
</p>
<p>By using the app, you agree to the collection and use of information in
accordance with this policy.
</p>
<h2>Data Collected</h2>
<p>Personal data is any kind of data that could identify an individual.
</p>
<p>Monero keys and public addresses are collected and processed by the app locally
for the purpose of processing transactions and transmitted into the Monero Network
in encrypted form.
</p>
<p>Other personal data is not collected.</p>
<h2>App Permissions</h2>
<ul>
<li>INTERNET : Connect to the Monero Network via a Monero Daemon Node</li>
<li>READ_EXTERNAL_STORAGE : Read wallet files stored on the device</li>
<li>WRITE_EXTERNAL_STORAGE : Write wallet files stored on the device</li>
<li>WAKE_LOCK : Keep device awake while syncing</li>
<li>CAMERA : Scan QR Codes for receiving Monero</li>
</ul>
<h2>Changes to this Privacy Policy</h2>
<p>We may update this privacy policy from time to time. We will notify
you of any changes by posting the new privacy policy in the app and on the
website (www.xmrujo.com)
You are advised to review this privacy policy periodically for any changes.
<p>This Privacy Policy was last updated: 2nd November, 2017.
</p>
<h2>Contact Us</h2>
<p>If you have any questions about our privacy policy,
or how your data is being collected and processed,
please e-mail privacy@xmrujo.com.
</p>
]]></string>
</resources> </resources>

View File

@ -5,6 +5,7 @@
<string name="menu_testnet">Testnet</string> <string name="menu_testnet">Testnet</string>
<string name="menu_about">About &#8230;</string> <string name="menu_about">About &#8230;</string>
<string name="menu_privacy">Privacy Policy &#8230;</string>
<string name="menu_share">Share</string> <string name="menu_share">Share</string>
<string name="menu_help">Help</string> <string name="menu_help">Help</string>
@ -71,7 +72,7 @@
<string name="label_watchonly">(Watch Only)</string> <string name="label_watchonly">(Watch Only)</string>
<string name="label_wallet_receive">Take</string> <string name="label_wallet_receive">Receive</string>
<string name="label_wallet_send">Give</string> <string name="label_wallet_send">Give</string>
<string name="title_amount">Amount</string> <string name="title_amount">Amount</string>
@ -89,9 +90,9 @@
<string name="local_service_connected">monerujo Service Connected</string> <string name="local_service_connected">monerujo Service Connected</string>
<string name="local_service_disconnected">monerujo Service Disconnected</string> <string name="local_service_disconnected">monerujo Service Disconnected</string>
<string name="status_synced">Synced</string> <string name="status_synced">Synced:</string>
<string name="status_remaining">Blocks remaining</string> <string name="status_remaining">Blocks remaining</string>
<string name="status_syncing">Syncing:</string> <string name="status_syncing">Scanning:</string>
<string name="prompt_problems">Problems</string> <string name="prompt_problems">Problems</string>
<string name="message_strorage_not_writable">External Storage is not writable! Panic!</string> <string name="message_strorage_not_writable">External Storage is not writable! Panic!</string>
@ -133,6 +134,11 @@
<string name="generate_mnemonic_placeholder">camp feline inflamed memoir afloat eight alerts females gutter cogs menu waveform gather tawny judge gusts yahoo doctor females biscuit alchemy reef agony austere camp</string> <string name="generate_mnemonic_placeholder">camp feline inflamed memoir afloat eight alerts females gutter cogs menu waveform gather tawny judge gusts yahoo doctor females biscuit alchemy reef agony austere camp</string>
<string name="generate_restoreheight_placeholder">1307882</string> <string name="generate_restoreheight_placeholder">1307882</string>
<string name="generate_wallet_type_key">Keys</string>
<string name="generate_wallet_type_new">New</string>
<string name="generate_wallet_type_seed">Seed</string>
<string name="generate_wallet_type_view">View</string>
<string name="generate_address_hint">Public Address</string> <string name="generate_address_hint">Public Address</string>
<string name="generate_viewkey_hint">View Key</string> <string name="generate_viewkey_hint">View Key</string>
<string name="generate_spendkey_hint">Spend Key</string> <string name="generate_spendkey_hint">Spend Key</string>
@ -258,5 +264,5 @@
<string name="fab_create_new">Create new wallet</string> <string name="fab_create_new">Create new wallet</string>
<string name="fab_restore_viewonly">Restore view-only wallet</string> <string name="fab_restore_viewonly">Restore view-only wallet</string>
<string name="fab_restore_key">Restore wallet from private keys</string> <string name="fab_restore_key">Restore wallet from private keys</string>
<string name="fab_restore_seed">Restore wallet 25 words seed</string> <string name="fab_restore_seed">Restore wallet 25 word seed</string>
</resources> </resources>

View File

@ -116,6 +116,12 @@
<item name="android:textStyle">bold</item> <item name="android:textStyle">bold</item>
</style> </style>
<style name="MoneroLabel.Heading.Donation">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/gradientPink</item>
<item name="android:textStyle">bold</item>
</style>
<style name="MoneroFab" parent="@android:style/TextAppearance.DeviceDefault.Medium"> <style name="MoneroFab" parent="@android:style/TextAppearance.DeviceDefault.Medium">
<item name="android:textSize">12sp</item> <item name="android:textSize">12sp</item>
<item name="android:textColor">@color/moneroFab</item> <item name="android:textColor">@color/moneroFab</item>
@ -192,10 +198,12 @@
</style> </style>
<style name="MoneroButton.Take"> <style name="MoneroButton.Take">
<item name="android:textColor">@color/white</item>
<item name="android:background">@color/take</item> <item name="android:background">@color/take</item>
</style> </style>
<style name="MoneroButton.Give"> <style name="MoneroButton.Give">
<item name="android:textColor">@color/white</item>
<item name="android:background">@color/give</item> <item name="android:background">@color/give</item>
</style> </style>