From cdb29bbc2eb883d75cc1b149c1eb291fdf05650e Mon Sep 17 00:00:00 2001 From: m2049r Date: Wed, 9 Mar 2022 19:10:30 +0100 Subject: [PATCH] themes (#821) * Support multiple colour themes * Fix sharing * Add settings * Fantastic UI tweaks --- app/build.gradle | 45 ++++--- app/src/main/AndroidManifest.xml | 15 ++- .../com/m2049r/xmrwallet/BaseActivity.java | 3 +- .../m2049r/xmrwallet/GenerateFragment.java | 6 +- .../xmrwallet/GenerateReviewFragment.java | 9 +- .../com/m2049r/xmrwallet/LoginActivity.java | 97 ++------------ .../com/m2049r/xmrwallet/LoginFragment.java | 26 +++- .../com/m2049r/xmrwallet/ReceiveFragment.java | 66 +++++---- .../com/m2049r/xmrwallet/SecureActivity.java | 6 +- .../m2049r/xmrwallet/SettingsFragment.java | 125 ++++++++++++++++++ .../java/com/m2049r/xmrwallet/TxFragment.java | 13 +- .../com/m2049r/xmrwallet/WalletActivity.java | 4 +- .../com/m2049r/xmrwallet/WalletFragment.java | 4 +- .../xmrwallet/XmrWalletApplication.java | 3 +- .../com/m2049r/xmrwallet/data/NodeInfo.java | 6 +- .../send/SendBtcSuccessWizardFragment.java | 23 +++- .../xmrwallet/fragment/send/SendFragment.java | 5 +- .../xmrwallet/layout/NodeInfoAdapter.java | 13 +- .../layout/TransactionInfoAdapter.java | 13 +- .../xmrwallet/service/WalletService.java | 3 +- .../com/m2049r/xmrwallet/util/Helper.java | 2 +- .../m2049r/xmrwallet/util/LocaleHelper.java | 6 +- .../xmrwallet/util/NightmodeHelper.java | 19 ++- .../com/m2049r/xmrwallet/util/Notice.java | 7 +- .../m2049r/xmrwallet/util/RestoreHeight.java | 12 ++ .../m2049r/xmrwallet/util/ThemeHelper.java | 23 ++++ .../xmrwallet/widget/ExchangeEditText.java | 3 +- .../com/m2049r/xmrwallet/widget/Toolbar.java | 38 +++--- app/src/main/res/color/btn_color_selector.xml | 2 +- .../main/res/drawable-v24/ic_check_circle.xml | 4 +- .../res/drawable-v24/ic_check_circle_xmr.xml | 4 +- .../res/drawable-v24/ic_xmrto_btc_off.xml | 14 ++ .../res/drawable-v24/ic_xmrto_dash_off.xml | 15 +++ .../res/drawable-v24/ic_xmrto_doge_off.xml | 14 ++ .../res/drawable-v24/ic_xmrto_eth_off.xml | 38 ++++++ .../res/drawable-v24/ic_xmrto_ltc_off.xml | 14 ++ app/src/main/res/drawable/backgound_seed.xml | 3 +- .../drawable/backgound_toolbar_mainnet.xml | 3 - .../drawable/backgound_toolbar_streetmode.xml | 3 - app/src/main/res/drawable/button_green.xml | 2 +- app/src/main/res/drawable/gradient_all.xml | 4 +- app/src/main/res/drawable/gradient_oval.xml | 4 +- app/src/main/res/drawable/gradient_street.xml | 4 +- .../res/drawable/gradient_street_efab.xml | 4 +- .../ic_account_balance_wallet_black_24dp.xml | 13 +- .../{ic_add_white_24dp.xml => ic_add.xml} | 6 +- ...d_circle_outline.xml => ic_add_circle.xml} | 2 +- .../main/res/drawable/ic_add_circle_white.xml | 9 -- ...nclusive_24dp.xml => ic_all_inclusive.xml} | 2 +- ..._back_white_24dp.xml => ic_arrow_back.xml} | 7 +- .../res/drawable/ic_baseline_cancel_24.xml | 10 -- .../res/drawable/ic_baseline_launch_24.xml | 10 -- app/src/main/res/drawable/ic_check_circle.xml | 2 +- .../main/res/drawable/ic_check_circle_xmr.xml | 2 +- .../main/res/drawable/ic_check_gray_24dp.xml | 9 -- .../main/res/drawable/ic_close_white_24dp.xml | 2 +- app/src/main/res/drawable/ic_done_all.xml | 2 +- .../main/res/drawable/ic_error_red_24dp.xml | 2 +- app/src/main/res/drawable/ic_eye.xml | 21 +-- .../main/res/drawable/ic_favorite_24dp.xml | 2 +- .../res/drawable/ic_favorite_border_24dp.xml | 2 +- .../res/drawable/ic_favorite_white_24dp.xml | 9 -- app/src/main/res/drawable/ic_fingerprint.xml | 12 +- .../main/res/drawable/ic_help_white_24dp.xml | 3 +- app/src/main/res/drawable/ic_import.xml | 10 ++ .../main/res/drawable/ic_info_green_36dp.xml | 12 -- .../main/res/drawable/ic_info_white_24dp.xml | 2 +- app/src/main/res/drawable/ic_key.xml | 2 +- ...down_24.xml => ic_keyboard_arrow_down.xml} | 0 ...row_up_24.xml => ic_keyboard_arrow_up.xml} | 0 .../main/res/drawable/ic_launch_external.xml | 10 ++ .../res/drawable/ic_launcher_background.xml | 41 +++--- .../res/drawable/ic_launcher_foreground.xml | 12 +- .../main/res/drawable/ic_ledger_restore.xml | 4 +- .../drawable/ic_logo_horizontol_xmrujo.xml | 19 +-- app/src/main/res/drawable/ic_monero_bw.xml | 4 +- app/src/main/res/drawable/ic_monerujo.xml | 14 +- ...xt_white_24dp.xml => ic_navigate_next.xml} | 4 +- .../drawable/ic_navigate_next_black_24dp.xml | 9 -- ...ev_white_24dp.xml => ic_navigate_prev.xml} | 0 app/src/main/res/drawable/ic_new.xml | 21 +-- .../{ic_nfc_black_24dp.xml => ic_nfc.xml} | 6 +- ...pending_orange_24dp.xml => ic_pending.xml} | 6 +- app/src/main/res/drawable/ic_refresh_24dp.xml | 9 -- .../res/drawable/ic_refresh_black_24dp.xml | 9 -- .../{ic_renew_24dp.xml => ic_renew.xml} | 0 app/src/main/res/drawable/ic_seed.xml | 10 +- app/src/main/res/drawable/ic_settings.xml | 10 ++ .../{ic_share_white_24dp.xml => ic_share.xml} | 3 +- .../main/res/drawable/ic_sideshift_circle.xml | 6 +- .../main/res/drawable/ic_sideshift_white.xml | 28 ++-- .../drawable/ic_smiley_ecstatic_filled.xml | 2 +- .../res/drawable/ic_smiley_gunther_filled.xml | 4 +- .../res/drawable/ic_smiley_happy_filled.xml | 2 +- .../res/drawable/ic_smiley_meh_filled.xml | 2 +- .../res/drawable/ic_smiley_neutral_filled.xml | 2 +- .../res/drawable/ic_smiley_sad_filled.xml | 2 +- ..._success_green_24dp.xml => ic_success.xml} | 2 +- ..._wifi_1_bar_24dp.xml => ic_wifi_1_bar.xml} | 4 +- ..._wifi_2_bar_24dp.xml => ic_wifi_2_bar.xml} | 4 +- ..._wifi_3_bar_24dp.xml => ic_wifi_3_bar.xml} | 4 +- ..._wifi_4_bar_24dp.xml => ic_wifi_4_bar.xml} | 2 +- ...i_lock_black_24dp.xml => ic_wifi_lock.xml} | 2 +- ...gnal_wifi_off_24dp.xml => ic_wifi_off.xml} | 2 +- .../main/res/drawable/ic_xmrto_btc_off.xml | 4 +- .../main/res/drawable/ic_xmrto_dash_off.xml | 6 +- .../main/res/drawable/ic_xmrto_doge_off.xml | 4 +- .../main/res/drawable/ic_xmrto_eth_off.xml | 14 +- app/src/main/res/drawable/ic_xmrto_logo.xml | 30 ++--- .../main/res/drawable/ic_xmrto_ltc_off.xml | 4 +- app/src/main/res/drawable/selector_login.xml | 4 +- app/src/main/res/drawable/texture_cash.png | Bin 49327 -> 0 bytes app/src/main/res/layout/fragment_generate.xml | 10 +- app/src/main/res/layout/fragment_login.xml | 8 +- app/src/main/res/layout/fragment_node.xml | 2 +- app/src/main/res/layout/fragment_receive.xml | 2 +- app/src/main/res/layout/fragment_review.xml | 4 +- app/src/main/res/layout/fragment_send.xml | 4 +- .../main/res/layout/fragment_send_address.xml | 2 +- .../main/res/layout/fragment_send_amount.xml | 6 +- .../res/layout/fragment_send_btc_success.xml | 4 +- .../main/res/layout/fragment_subaddress.xml | 2 +- app/src/main/res/layout/fragment_tx_info.xml | 3 +- app/src/main/res/layout/fragment_wallet.xml | 54 +++++--- app/src/main/res/layout/item_node.xml | 2 +- app/src/main/res/layout/item_subaddress.xml | 2 +- app/src/main/res/layout/item_transaction.xml | 7 +- app/src/main/res/layout/item_wallet.xml | 4 +- app/src/main/res/layout/layout_fabmenu.xml | 92 ++++++++----- app/src/main/res/layout/prompt_changepw.xml | 6 +- app/src/main/res/layout/prompt_password.xml | 1 + app/src/main/res/layout/template_notice.xml | 8 +- app/src/main/res/layout/view_toolbar.xml | 13 +- app/src/main/res/menu/drawer_view.xml | 2 +- app/src/main/res/menu/list_menu.xml | 32 +---- app/src/main/res/menu/receive_menu.xml | 5 +- app/src/main/res/menu/tx_info_menu.xml | 2 +- app/src/main/res/values-cat/strings.xml | 13 ++ app/src/main/res/values-de/strings.xml | 13 ++ app/src/main/res/values-el/strings.xml | 13 ++ app/src/main/res/values-eo/strings.xml | 13 ++ app/src/main/res/values-es/strings.xml | 13 ++ app/src/main/res/values-et/strings.xml | 13 ++ app/src/main/res/values-fr/strings.xml | 13 ++ app/src/main/res/values-hu/strings.xml | 13 ++ app/src/main/res/values-it/strings.xml | 13 ++ app/src/main/res/values-ja/strings.xml | 13 ++ app/src/main/res/values-nb/strings.xml | 13 ++ app/src/main/res/values-night-v23/styles.xml | 11 ++ app/src/main/res/values-night-v27/styles.xml | 12 ++ app/src/main/res/values-night/colors.xml | 70 ++++++++-- app/src/main/res/values-night/styles.xml | 23 +--- app/src/main/res/values-nl/strings.xml | 13 ++ app/src/main/res/values-pt-rBR/strings.xml | 13 ++ app/src/main/res/values-pt/strings.xml | 13 ++ app/src/main/res/values-ro/strings.xml | 13 ++ app/src/main/res/values-ru/strings.xml | 13 ++ app/src/main/res/values-sk/strings.xml | 13 ++ app/src/main/res/values-sr/strings.xml | 13 ++ app/src/main/res/values-sv/strings.xml | 13 ++ app/src/main/res/values-uk/strings.xml | 13 ++ app/src/main/res/values-v23/styles.xml | 11 ++ app/src/main/res/values-v27/styles.xml | 12 ++ app/src/main/res/values-zh-rCN/strings.xml | 13 ++ app/src/main/res/values-zh-rTW/strings.xml | 13 ++ app/src/main/res/values/arrays.xml | 13 ++ app/src/main/res/values/attrs.xml | 12 ++ app/src/main/res/values/colors.xml | 88 +++++++----- app/src/main/res/values/strings.xml | 20 +++ app/src/main/res/values/styles.xml | 90 +++++++++---- app/src/main/res/xml/root_preferences.xml | 35 +++++ build.gradle | 5 +- external-libs/VERSION | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 174 files changed, 1419 insertions(+), 755 deletions(-) create mode 100644 app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java create mode 100644 app/src/main/res/drawable-v24/ic_xmrto_btc_off.xml create mode 100644 app/src/main/res/drawable-v24/ic_xmrto_dash_off.xml create mode 100644 app/src/main/res/drawable-v24/ic_xmrto_doge_off.xml create mode 100644 app/src/main/res/drawable-v24/ic_xmrto_eth_off.xml create mode 100644 app/src/main/res/drawable-v24/ic_xmrto_ltc_off.xml rename app/src/main/res/drawable/{ic_add_white_24dp.xml => ic_add.xml} (65%) rename app/src/main/res/drawable/{ic_add_circle_outline.xml => ic_add_circle.xml} (90%) delete mode 100644 app/src/main/res/drawable/ic_add_circle_white.xml rename app/src/main/res/drawable/{ic_all_inclusive_24dp.xml => ic_all_inclusive.xml} (94%) rename app/src/main/res/drawable/{ic_arrow_back_white_24dp.xml => ic_arrow_back.xml} (58%) delete mode 100644 app/src/main/res/drawable/ic_baseline_cancel_24.xml delete mode 100644 app/src/main/res/drawable/ic_baseline_launch_24.xml delete mode 100644 app/src/main/res/drawable/ic_check_gray_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_favorite_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_import.xml delete mode 100644 app/src/main/res/drawable/ic_info_green_36dp.xml rename app/src/main/res/drawable/{ic_baseline_keyboard_arrow_down_24.xml => ic_keyboard_arrow_down.xml} (100%) rename app/src/main/res/drawable/{ic_baseline_keyboard_arrow_up_24.xml => ic_keyboard_arrow_up.xml} (100%) create mode 100644 app/src/main/res/drawable/ic_launch_external.xml rename app/src/main/res/drawable/{ic_navigate_next_white_24dp.xml => ic_navigate_next.xml} (79%) delete mode 100644 app/src/main/res/drawable/ic_navigate_next_black_24dp.xml rename app/src/main/res/drawable/{ic_navigate_prev_white_24dp.xml => ic_navigate_prev.xml} (100%) rename app/src/main/res/drawable/{ic_nfc_black_24dp.xml => ic_nfc.xml} (78%) rename app/src/main/res/drawable/{ic_pending_orange_24dp.xml => ic_pending.xml} (73%) delete mode 100644 app/src/main/res/drawable/ic_refresh_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_refresh_black_24dp.xml rename app/src/main/res/drawable/{ic_renew_24dp.xml => ic_renew.xml} (100%) create mode 100644 app/src/main/res/drawable/ic_settings.xml rename app/src/main/res/drawable/{ic_share_white_24dp.xml => ic_share.xml} (87%) rename app/src/main/res/drawable/{ic_success_green_24dp.xml => ic_success.xml} (87%) rename app/src/main/res/drawable/{ic_signal_wifi_1_bar_24dp.xml => ic_wifi_1_bar.xml} (85%) rename app/src/main/res/drawable/{ic_signal_wifi_2_bar_24dp.xml => ic_wifi_2_bar.xml} (85%) rename app/src/main/res/drawable/{ic_signal_wifi_3_bar_24dp.xml => ic_wifi_3_bar.xml} (86%) rename app/src/main/res/drawable/{ic_signal_wifi_4_bar_24dp.xml => ic_wifi_4_bar.xml} (89%) rename app/src/main/res/drawable/{ic_wifi_lock_black_24dp.xml => ic_wifi_lock.xml} (93%) rename app/src/main/res/drawable/{ic_signal_wifi_off_24dp.xml => ic_wifi_off.xml} (91%) delete mode 100644 app/src/main/res/drawable/texture_cash.png create mode 100644 app/src/main/res/values-night-v23/styles.xml create mode 100644 app/src/main/res/values-night-v27/styles.xml create mode 100644 app/src/main/res/values-v23/styles.xml create mode 100644 app/src/main/res/values-v27/styles.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/xml/root_preferences.xml diff --git a/app/build.gradle b/app/build.gradle index 4f5b7dee..71b0aff6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 30 + compileSdkVersion 31 buildToolsVersion '30.0.3' ndkVersion '17.2.4988734' defaultConfig { applicationId "com.m2049r.xmrwallet" minSdkVersion 21 - targetSdkVersion 30 - versionCode 1301 - versionName "2.3.1 'Doménikos'" + targetSdkVersion 31 + versionCode 1303 + versionName "2.3.3 'Baldaŭ'" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { @@ -120,38 +120,39 @@ static def getId(name) { } dependencies { - implementation 'androidx.core:core:1.6.0' - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.core:core:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01' - implementation 'androidx.constraintlayout:constraintlayout:2.1.1' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + implementation 'androidx.preference:preference:1.2.0' + + implementation 'com.google.android.material:material:1.5.0' implementation 'me.dm7.barcodescanner:zxing:1.9.8' - implementation "com.squareup.okhttp3:okhttp:4.9.0" - implementation "io.github.rburgst:okhttp-digest:2.5" - implementation "com.jakewharton.timber:timber:4.7.1" + implementation "com.squareup.okhttp3:okhttp:4.9.3" + implementation "io.github.rburgst:okhttp-digest:2.6" + implementation "com.jakewharton.timber:timber:5.0.1" implementation 'info.guardianproject.netcipher:netcipher:2.1.0' //implementation 'info.guardianproject.netcipher:netcipher-okhttp3:2.1.0' implementation fileTree(dir: 'libs/classes', include: ['*.jar']) - implementation 'com.nulab-inc:zxcvbn:1.3.0' + implementation 'com.nulab-inc:zxcvbn:1.5.2' implementation 'dnsjava:dnsjava:2.1.9' implementation 'org.jitsi:dnssecjava:1.2.0' - implementation 'org.slf4j:slf4j-nop:1.7.30' + implementation 'org.slf4j:slf4j-nop:1.7.36' implementation 'com.github.brnunes:swipeablerecyclerview:1.0.2' //noinspection GradleDependency - testImplementation "junit:junit:$rootProject.ext.junitVersion" - testImplementation "org.mockito:mockito-all:$rootProject.ext.mockitoVersion" - testImplementation "com.squareup.okhttp3:mockwebserver:4.9.0" - testImplementation 'org.json:json:20180813' - testImplementation 'net.jodah:concurrentunit:0.4.4' + testImplementation "junit:junit:4.13.2" + testImplementation "org.mockito:mockito-all:1.10.19" + testImplementation "com.squareup.okhttp3:mockwebserver:4.9.3" + testImplementation 'org.json:json:20211205' + testImplementation 'net.jodah:concurrentunit:0.4.6' - compileOnly 'org.projectlombok:lombok:1.18.16' - annotationProcessor 'org.projectlombok:lombok:1.18.16' + compileOnly 'org.projectlombok:lombok:1.18.22' + annotationProcessor 'org.projectlombok:lombok:1.18.22' } - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 017212ec..6056bba3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,7 +18,6 @@ - @@ -36,15 +35,17 @@ android:label="@string/app_name" android:preserveLegacyExternalStorage="true" android:supportsRtl="true" - android:theme="@style/MyMaterialTheme" + android:theme="@style/MyMaterialThemeClassic" android:usesCleartextTraffic="true"> + @@ -56,24 +57,25 @@ android:screenOrientation="behind" /> - + - + @@ -106,4 +108,5 @@ android:resource="@xml/filepaths" /> - + + \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java b/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java index b72c35bc..1f1f9b19 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java @@ -27,6 +27,7 @@ import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.Ndef; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -180,7 +181,7 @@ public class BaseActivity extends SecureActivity return; nfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), - 0); + Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0); } private void processNfcIntent(Intent intent) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java index 42fe137b..6370e99d 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java @@ -36,7 +36,6 @@ import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.Button; import android.widget.LinearLayout; -import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -58,7 +57,6 @@ import com.m2049r.xmrwallet.widget.Toolbar; import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Objects; import timber.log.Timber; @@ -299,10 +297,10 @@ public class GenerateFragment extends Fragment { if (etSeedOffset.getVisibility() == View.VISIBLE) { etSeedOffset.getEditText().getText().clear(); etSeedOffset.setVisibility(View.GONE); - bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_down_24, 0, 0, 0); + bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_down, 0, 0, 0); } else { etSeedOffset.setVisibility(View.VISIBLE); - bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_up_24, 0, 0, 0); + bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_up, 0, 0, 0); etSeedOffset.requestFocusFromTouch(); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java index 368317cb..cb40b843 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java @@ -46,7 +46,6 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.google.android.material.progressindicator.CircularProgressIndicator; import com.google.android.material.switchmaterial.SwitchMaterial; import com.google.android.material.textfield.TextInputLayout; import com.m2049r.xmrwallet.ledger.Ledger; @@ -200,10 +199,10 @@ public class GenerateReviewFragment extends Fragment { void toggleAdvancedInfo() { if (llAdvancedInfo.getVisibility() == View.VISIBLE) { llAdvancedInfo.setVisibility(View.GONE); - bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_down_24, 0, 0, 0); + bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_down, 0, 0, 0); } else { llAdvancedInfo.setVisibility(View.VISIBLE); - bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_up_24, 0, 0, 0); + bAdvancedInfo.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_up, 0, 0, 0); scrollview.post(() -> scrollview.fullScroll(ScrollView.FOCUS_DOWN)); } } @@ -212,10 +211,10 @@ public class GenerateReviewFragment extends Fragment { if (etSeedOffset.getVisibility() == View.VISIBLE) { etSeedOffset.getEditText().getText().clear(); etSeedOffset.setVisibility(View.GONE); - bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_down_24, 0, 0, 0); + bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_down, 0, 0, 0); } else { etSeedOffset.setVisibility(View.VISIBLE); - bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_keyboard_arrow_up_24, 0, 0, 0); + bSeedOffset.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_keyboard_arrow_up, 0, 0, 0); etSeedOffset.requestFocusFromTouch(); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java index 0b630175..418dfb96 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java @@ -26,6 +26,7 @@ import android.content.SharedPreferences; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -39,7 +40,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatDelegate; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -49,24 +49,19 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.m2049r.xmrwallet.data.DefaultNodes; import com.m2049r.xmrwallet.data.Node; import com.m2049r.xmrwallet.data.NodeInfo; -import com.m2049r.xmrwallet.dialog.AboutFragment; import com.m2049r.xmrwallet.dialog.CreditsFragment; import com.m2049r.xmrwallet.dialog.HelpFragment; -import com.m2049r.xmrwallet.dialog.PrivacyFragment; import com.m2049r.xmrwallet.ledger.Ledger; import com.m2049r.xmrwallet.ledger.LedgerProgressDialog; import com.m2049r.xmrwallet.model.NetworkType; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.service.WalletService; -import com.m2049r.xmrwallet.util.DayNightMode; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.KeyStoreHelper; import com.m2049r.xmrwallet.util.LegacyStorageHelper; -import com.m2049r.xmrwallet.util.LocaleHelper; import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor; import com.m2049r.xmrwallet.util.NetCipherHelper; -import com.m2049r.xmrwallet.util.NightmodeHelper; import com.m2049r.xmrwallet.util.ThemeHelper; import com.m2049r.xmrwallet.util.ZipBackup; import com.m2049r.xmrwallet.util.ZipRestore; @@ -77,12 +72,8 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashSet; -import java.util.Locale; import java.util.Map; import java.util.Set; @@ -90,7 +81,8 @@ import timber.log.Timber; public class LoginActivity extends BaseActivity implements LoginFragment.Listener, GenerateFragment.Listener, - GenerateReviewFragment.Listener, GenerateReviewFragment.AcceptListener, NodeFragment.Listener { + GenerateReviewFragment.Listener, GenerateReviewFragment.AcceptListener, + NodeFragment.Listener, SettingsFragment.Listener { private static final String GENERATE_STACK = "gen"; private static final String NODES_PREFS_NAME = "nodes"; @@ -293,6 +285,7 @@ public class LoginActivity extends BaseActivity @Override protected void onCreate(Bundle savedInstanceState) { Timber.d("onCreate()"); + ThemeHelper.setPreferred(this); super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); @@ -308,8 +301,8 @@ public class LoginActivity extends BaseActivity case Toolbar.BUTTON_CLOSE: finish(); break; - case Toolbar.BUTTON_CREDITS: - CreditsFragment.display(getSupportFragmentManager()); + case Toolbar.BUTTON_SETTINGS: + startSettingsFragment(); break; case Toolbar.BUTTON_NONE: break; @@ -785,6 +778,11 @@ public class LoginActivity extends BaseActivity Timber.d("NodeFragment placed"); } + void startSettingsFragment() { + replaceFragment(new SettingsFragment(), null, null); + Timber.d("SettingsFragment placed"); + } + void replaceFragment(Fragment newFragment, String stackName, Bundle extras) { if (extras != null) { newFragment.setArguments(extras); @@ -1089,61 +1087,6 @@ public class LoginActivity extends BaseActivity } } - public void onChangeLocale() { - final ArrayList availableLocales = LocaleHelper.getAvailableLocales(LoginActivity.this); - Collections.sort(availableLocales, (locale1, locale2) -> { - String localeString1 = LocaleHelper.getDisplayName(locale1, true); - String localeString2 = LocaleHelper.getDisplayName(locale2, true); - return localeString1.compareTo(localeString2); - }); - - String[] localeDisplayNames = new String[1 + availableLocales.size()]; - localeDisplayNames[0] = getString(R.string.language_system_default); - for (int i = 1; i < localeDisplayNames.length; i++) { - localeDisplayNames[i] = LocaleHelper.getDisplayName(availableLocales.get(i - 1), true); - } - - int currentLocaleIndex = 0; - String currentLocaleTag = LocaleHelper.getPreferredLanguageTag(LoginActivity.this); - if (!currentLocaleTag.isEmpty()) { - Locale currentLocale = Locale.forLanguageTag(currentLocaleTag); - String currentLocaleName = LocaleHelper.getDisplayName(currentLocale, true); - currentLocaleIndex = Arrays.asList(localeDisplayNames).indexOf(currentLocaleName); - if (currentLocaleIndex < 0) currentLocaleIndex = 0; - } - - AlertDialog.Builder builder = new MaterialAlertDialogBuilder(LoginActivity.this); - builder.setTitle(getString(R.string.menu_language)); - builder.setSingleChoiceItems(localeDisplayNames, currentLocaleIndex, (dialog, i) -> { - dialog.dismiss(); - - LocaleHelper.setAndSaveLocale(this, - (i == 0) ? "" : availableLocales.get(i - 1).toLanguageTag()); - startActivity(getIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)); - }); - builder.show(); - } - - public void onChangeTheme() { - final DayNightMode currentDayNightSetting = DayNightMode.getValue(AppCompatDelegate.getDefaultNightMode()); - // selection will be empty if UNKNOWN - - AlertDialog.Builder builder = new MaterialAlertDialogBuilder(LoginActivity.this); - builder.setTitle(getString(R.string.menu_daynight)); - - String[] modeNames = getResources().getStringArray(R.array.daynight_themes); - - builder.setSingleChoiceItems(modeNames, currentDayNightSetting.ordinal(), (dialog, i) -> { - dialog.dismiss(); - final DayNightMode mode = DayNightMode.values()[i]; - if (currentDayNightSetting != mode) { - NightmodeHelper.setAndSavePreferredNightmode(LoginActivity.this, mode); - LoginActivity.this.recreate(); - } - }); - builder.show(); - } - @Override public void onBackPressed() { Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container); @@ -1192,9 +1135,6 @@ public class LoginActivity extends BaseActivity } else if (id == R.id.action_details_changepw) { onWalletChangePassword(); return true; - } else if (id == R.id.action_license_info) { - AboutFragment.display(getSupportFragmentManager()); - return true; } else if (id == R.id.action_help_list) { HelpFragment.display(getSupportFragmentManager(), R.string.help_list); return true; @@ -1208,18 +1148,6 @@ public class LoginActivity extends BaseActivity ((NodeFragment) f).restoreDefaultNodes(); } return true; - } else if (id == R.id.action_privacy_policy) { - PrivacyFragment.display(getSupportFragmentManager()); - return true; - } else if (id == R.id.action_language) { - onChangeLocale(); - return true; - } else if (id == R.id.action_theme) { - onChangeTheme(); - return true; - } else if (id == R.id.action_restore) { - onWalletRestore(); - return true; } else if (id == R.id.action_ledger_seed) { Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container); if (f instanceof GenerateFragment) { @@ -1333,7 +1261,8 @@ public class LoginActivity extends BaseActivity registerReceiver(usbPermissionReceiver, new IntentFilter(ACTION_USB_PERMISSION)); usbManager.requestPermission(device, PendingIntent.getBroadcast(this, 0, - new Intent(ACTION_USB_PERMISSION), 0)); + new Intent(ACTION_USB_PERMISSION), + Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0)); } } else { Timber.d("no ledger device found"); diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java index 4841639d..21b85bef 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java @@ -38,7 +38,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; @@ -53,6 +52,7 @@ import com.m2049r.xmrwallet.util.KeyStoreHelper; import com.m2049r.xmrwallet.util.NetCipherHelper; import com.m2049r.xmrwallet.util.NodePinger; import com.m2049r.xmrwallet.util.Notice; +import com.m2049r.xmrwallet.util.ThemeHelper; import com.m2049r.xmrwallet.widget.Toolbar; import java.io.File; @@ -143,7 +143,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter super.onResume(); Timber.d("onResume() %s", activityCallback.getFavouriteNodes().size()); activityCallback.setTitle(null); - activityCallback.setToolbarButton(Toolbar.BUTTON_CREDITS); + activityCallback.setToolbarButton(Toolbar.BUTTON_SETTINGS); activityCallback.showNet(); showNetwork(); //activityCallback.runOnNetCipher(this::pingSelectedNode); @@ -163,12 +163,14 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter fabView = view.findViewById(R.id.fabView); fabKey = view.findViewById(R.id.fabKey); fabSeed = view.findViewById(R.id.fabSeed); + fabImport = view.findViewById(R.id.fabImport); fabLedger = view.findViewById(R.id.fabLedger); fabNewL = view.findViewById(R.id.fabNewL); fabViewL = view.findViewById(R.id.fabViewL); fabKeyL = view.findViewById(R.id.fabKeyL); fabSeedL = view.findViewById(R.id.fabSeedL); + fabImportL = view.findViewById(R.id.fabImportL); fabLedgerL = view.findViewById(R.id.fabLedgerL); fab_pulse = AnimationUtils.loadAnimation(getContext(), R.anim.fab_pulse); @@ -183,6 +185,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter fabView.setOnClickListener(this); fabKey.setOnClickListener(this); fabSeed.setOnClickListener(this); + fabImport.setOnClickListener(this); fabLedger.setOnClickListener(this); fabScreen.setOnClickListener(this); @@ -294,9 +297,9 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter } private boolean isFabOpen = false; - private FloatingActionButton fab, fabNew, fabView, fabKey, fabSeed, fabLedger; - private FrameLayout fabScreen; - private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL, fabLedgerL; + private FloatingActionButton fab, fabNew, fabView, fabKey, fabSeed, fabImport, fabLedger; + private RelativeLayout fabScreen; + private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL, fabImportL, fabLedgerL; private Animation fab_open, fab_close, rotate_forward, rotate_backward, fab_open_screen, fab_close_screen; private Animation fab_pulse; @@ -321,6 +324,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter fabKey.setClickable(false); fabSeedL.startAnimation(fab_close); fabSeed.setClickable(false); + fabImportL.startAnimation(fab_close); + fabImport.setClickable(false); } isFabOpen = false; } else { // open the fab @@ -333,6 +338,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter fabViewL.setVisibility(View.GONE); fabKeyL.setVisibility(View.GONE); fabSeedL.setVisibility(View.GONE); + fabImportL.setVisibility(View.GONE); fabLedgerL.startAnimation(fab_open); fabLedger.setClickable(true); @@ -342,6 +348,7 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter fabViewL.setVisibility(View.VISIBLE); fabKeyL.setVisibility(View.VISIBLE); fabSeedL.setVisibility(View.VISIBLE); + fabImportL.setVisibility(View.VISIBLE); fabNewL.startAnimation(fab_open); fabNew.setClickable(true); @@ -351,6 +358,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter fabKey.setClickable(true); fabSeedL.startAnimation(fab_open); fabSeed.setClickable(true); + fabImportL.startAnimation(fab_open); + fabImport.setClickable(true); } isFabOpen = true; } @@ -375,6 +384,9 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter } else if (id == R.id.fabSeed) { animateFAB(); activityCallback.onAddWallet(GenerateFragment.TYPE_SEED); + } else if (id == R.id.fabImport) { + animateFAB(); + activityCallback.onWalletRestore(); } else if (id == R.id.fabLedger) { Timber.d("FAB_LEDGER"); animateFAB(); @@ -403,8 +415,8 @@ public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInter private void setSubtext(String status) { final Context ctx = getContext(); final Spanned text = Html.fromHtml(ctx.getString(R.string.status, - Integer.toHexString(ContextCompat.getColor(ctx, R.color.monerujoGreen) & 0xFFFFFF), - Integer.toHexString(ContextCompat.getColor(ctx, R.color.monerujoBackground) & 0xFFFFFF), + Integer.toHexString(ThemeHelper.getThemedColor(ctx, R.attr.positiveColor) & 0xFFFFFF), + Integer.toHexString(ThemeHelper.getThemedColor(ctx, android.R.attr.colorBackground) & 0xFFFFFF), status, "")); tvNodeInfo.setText(text); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java index 48af0529..06621ff7 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/ReceiveFragment.java @@ -46,10 +46,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.widget.ShareActionProvider; -import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; -import androidx.core.view.MenuItemCompat; import androidx.fragment.app.Fragment; import com.google.android.material.textfield.TextInputLayout; @@ -89,6 +86,7 @@ public class ReceiveFragment extends Fragment { private ImageView ivQrCodeFull; private EditText etDummy; private ImageButton bCopyAddress; + private MenuItem shareItem; private Wallet wallet = null; private boolean isMyWallet = false; @@ -128,6 +126,7 @@ public class ReceiveFragment extends Fragment { evAmount.setOnNewAmountListener(xmr -> { Timber.d("new amount = %s", xmr); generateQr(); + if (shareRequested && (xmr != null)) share(); }); evAmount.setOnFailedExchangeListener(() -> { @@ -211,39 +210,38 @@ public class ReceiveFragment extends Fragment { setSharedElementEnterTransition(transform); } - private ShareActionProvider shareActionProvider; + private boolean shareRequested = false; @Override public void onCreateOptionsMenu(@NonNull Menu menu, final MenuInflater inflater) { inflater.inflate(R.menu.receive_menu, menu); super.onCreateOptionsMenu(menu, inflater); - // Locate MenuItem with ShareActionProvider - MenuItem item = menu.findItem(R.id.menu_item_share); - - // Fetch and store ShareActionProvider - shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item); - - shareActionProvider.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener() { - @Override - public boolean onShareTargetSelected(ShareActionProvider shareActionProvider, Intent intent) { - saveQrCode(); // save it only if we need it - return false; + shareItem = menu.findItem(R.id.menu_item_share); + shareItem.setOnMenuItemClickListener(item -> { + if (shareRequested) return true; + shareRequested = true; + if (!qrValid) { + evAmount.doExchange(); + } else { + share(); } + return true; }); } - private void setShareIntent() { - if (shareActionProvider != null) { - if (qrValid) { - shareActionProvider.setShareIntent(getShareIntent()); - } else { - shareActionProvider.setShareIntent(null); - } + private void share() { + shareRequested = false; + if (saveQrCode()) { + final Intent sendIntent = getSendIntent(); + if (sendIntent != null) + startActivity(Intent.createChooser(sendIntent, null)); + } else { + Toast.makeText(getActivity(), getString(R.string.message_qr_failed), Toast.LENGTH_SHORT).show(); } } - private void saveQrCode() { + private boolean saveQrCode() { if (!qrValid) throw new IllegalStateException("trying to save null qr code!"); File cachePath = new File(getActivity().getCacheDir(), "images"); @@ -255,33 +253,35 @@ public class ReceiveFragment extends Fragment { Bitmap qrBitmap = ((BitmapDrawable) ivQrCode.getDrawable()).getBitmap(); qrBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); stream.close(); + return true; } catch (IOException ex) { Timber.e(ex); // make sure we don't share an old qr code if (!png.delete()) throw new IllegalStateException("cannot delete old qr code"); // if we manage to delete it, the URI points to nothing and the user gets a toast with the error } + return false; } - private Intent getShareIntent() { - File imagePath = new File(getActivity().getCacheDir(), "images"); + private Intent getSendIntent() { + File imagePath = new File(requireActivity().getCacheDir(), "images"); File png = new File(imagePath, "QR.png"); - Uri contentUri = FileProvider.getUriForFile(getActivity(), - BuildConfig.APPLICATION_ID + ".fileprovider", png); + Uri contentUri = FileProvider.getUriForFile(requireActivity(), BuildConfig.APPLICATION_ID + ".fileprovider", png); if (contentUri != null) { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file - shareIntent.setDataAndType(contentUri, getActivity().getContentResolver().getType(contentUri)); + shareIntent.setTypeAndNormalize("image/png"); shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); - shareIntent.putExtra(Intent.EXTRA_TEXT, bcData.getUriString()); + if (bcData != null) + shareIntent.putExtra(Intent.EXTRA_TEXT, bcData.getUriString()); return shareIntent; } return null; } void copyAddress() { - Helper.clipBoardCopy(Objects.requireNonNull(getActivity()), getString(R.string.label_copy_address), subaddress.getAddress()); + Helper.clipBoardCopy(requireActivity(), getString(R.string.label_copy_address), subaddress.getAddress()); Toast.makeText(getActivity(), getString(R.string.message_copy_address), Toast.LENGTH_SHORT).show(); } @@ -291,7 +291,6 @@ public class ReceiveFragment extends Fragment { if (qrValid) { ivQrCode.setImageBitmap(null); qrValid = false; - setShareIntent(); if (isLoaded) tvQrCode.setVisibility(View.VISIBLE); } @@ -300,7 +299,6 @@ public class ReceiveFragment extends Fragment { void setQR(Bitmap qr) { ivQrCode.setImageBitmap(qr); qrValid = true; - setShareIntent(); tvQrCode.setVisibility(View.GONE); } @@ -462,8 +460,8 @@ public class ReceiveFragment extends Fragment { subaddress = newSubaddress; final Context context = getContext(); Spanned label = Html.fromHtml(context.getString(R.string.receive_subaddress, - Integer.toHexString(ContextCompat.getColor(context, R.color.monerujoGreen) & 0xFFFFFF), - Integer.toHexString(ContextCompat.getColor(context, R.color.monerujoBackground) & 0xFFFFFF), + Integer.toHexString(ThemeHelper.getThemedColor(context, R.attr.positiveColor) & 0xFFFFFF), + Integer.toHexString(ThemeHelper.getThemedColor(context, android.R.attr.colorBackground) & 0xFFFFFF), subaddress.getDisplayLabel(), subaddress.getAddress())); tvAddress.setText(label); generateQr(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java b/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java index 23db732e..238aeea1 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java @@ -66,11 +66,7 @@ public abstract class SecureActivity extends AppCompatActivity { Locale locale = LocaleHelper.getPreferredLocale(this); if (locale != null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - config.setLocale(locale); - } else { - config.locale = locale; - } + config.setLocale(locale); } return config; } diff --git a/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java new file mode 100644 index 00000000..6a4bb5ad --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/SettingsFragment.java @@ -0,0 +1,125 @@ +package com.m2049r.xmrwallet; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; + +import androidx.annotation.StyleRes; +import androidx.preference.ListPreference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceManager; + +import com.m2049r.xmrwallet.dialog.AboutFragment; +import com.m2049r.xmrwallet.dialog.CreditsFragment; +import com.m2049r.xmrwallet.dialog.PrivacyFragment; +import com.m2049r.xmrwallet.util.DayNightMode; +import com.m2049r.xmrwallet.util.LocaleHelper; +import com.m2049r.xmrwallet.util.NightmodeHelper; +import com.m2049r.xmrwallet.util.ThemeHelper; +import com.m2049r.xmrwallet.widget.Toolbar; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Locale; + +import timber.log.Timber; + +public class SettingsFragment extends PreferenceFragmentCompat + implements SharedPreferences.OnSharedPreferenceChangeListener { + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.root_preferences, rootKey); + + findPreference(getString(R.string.about_info)).setOnPreferenceClickListener(preference -> { + AboutFragment.display(getParentFragmentManager()); + return true; + }); + findPreference(getString(R.string.privacy_info)).setOnPreferenceClickListener(preference -> { + PrivacyFragment.display(getParentFragmentManager()); + return true; + }); + findPreference(getString(R.string.credits_info)).setOnPreferenceClickListener(preference -> { + CreditsFragment.display(getParentFragmentManager()); + return true; + }); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (key.equals(getString(R.string.preferred_locale))) { + activity.recreate(); + } else if (key.equals(getString(R.string.preferred_nightmode))) { + NightmodeHelper.setNightMode(DayNightMode.valueOf(sharedPreferences.getString(key, "AUTO"))); + } else if (key.equals(getString(R.string.preferred_theme))) { + ThemeHelper.setTheme((Activity) activity, sharedPreferences.getString(key, "Classic")); + activity.recreate(); + } + } + + private SettingsFragment.Listener activity; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof SettingsFragment.Listener) { + activity = (SettingsFragment.Listener) context; + } else { + throw new ClassCastException(context + " must implement Listener"); + } + } + + @Override + public void onResume() { + super.onResume(); + Timber.d("onResume()"); + activity.setSubtitle(getString(R.string.menu_settings)); + activity.setToolbarButton(Toolbar.BUTTON_BACK); + populateLanguages(); + PreferenceManager.getDefaultSharedPreferences(requireContext()) + .registerOnSharedPreferenceChangeListener(this); + } + + @Override + public void onPause() { + super.onPause(); + PreferenceManager.getDefaultSharedPreferences(requireContext()) + .unregisterOnSharedPreferenceChangeListener(this); + } + + public interface Listener { + void setToolbarButton(int type); + + void setSubtitle(String title); + + void recreate(); + + void setTheme(@StyleRes final int resId); + } + + public void populateLanguages() { + ListPreference language = findPreference(getString(R.string.preferred_locale)); + assert language != null; + + final ArrayList availableLocales = LocaleHelper.getAvailableLocales(requireContext()); + Collections.sort(availableLocales, (locale1, locale2) -> { + String localeString1 = LocaleHelper.getDisplayName(locale1, true); + String localeString2 = LocaleHelper.getDisplayName(locale2, true); + return localeString1.compareTo(localeString2); + }); + + String[] localeDisplayNames = new String[1 + availableLocales.size()]; + localeDisplayNames[0] = getString(R.string.language_system_default); + for (int i = 1; i < localeDisplayNames.length; i++) { + localeDisplayNames[i] = LocaleHelper.getDisplayName(availableLocales.get(i - 1), true); + } + language.setEntries(localeDisplayNames); + + String[] languageTags = new String[1 + availableLocales.size()]; + languageTags[0] = ""; + for (int i = 1; i < languageTags.length; i++) { + languageTags[i] = availableLocales.get(i - 1).toLanguageTag(); + } + language.setEntryValues(languageTags); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java index cca468a6..2160651b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/TxFragment.java @@ -35,7 +35,6 @@ import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import com.google.android.material.transition.MaterialContainerTransform; @@ -220,8 +219,8 @@ public class TxFragment extends Fragment { final Context ctx = getContext(); Spanned label = Html.fromHtml(ctx.getString(R.string.tx_account_formatted, info.accountIndex, info.addressIndex, - Integer.toHexString(ContextCompat.getColor(ctx, R.color.monerujoGreen) & 0xFFFFFF), - Integer.toHexString(ContextCompat.getColor(ctx, R.color.monerujoBackground) & 0xFFFFFF), + Integer.toHexString(ThemeHelper.getThemedColor(ctx, R.attr.positiveColor) & 0xFFFFFF), + Integer.toHexString(ThemeHelper.getThemedColor(ctx, android.R.attr.colorBackground) & 0xFFFFFF), subaddress.getDisplayLabel())); tvAccount.setText(label); tvAccount.setOnClickListener(v -> activityCallback.showSubaddress(v, info.addressIndex)); @@ -266,13 +265,13 @@ public class TxFragment extends Fragment { if (info.isFailed) { tvTxAmount.setText(getString(R.string.tx_list_amount_failed, Wallet.getDisplayAmount(info.amount))); tvTxFee.setText(getString(R.string.tx_list_failed_text)); - setTxColour(ContextCompat.getColor(getContext(), R.color.tx_failed)); + setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor)); } else if (info.isPending) { - setTxColour(ContextCompat.getColor(getContext(), R.color.tx_pending)); + setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor)); } else if (info.direction == TransactionInfo.Direction.Direction_In) { - setTxColour(ContextCompat.getColor(getContext(), R.color.tx_plus)); + setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.positiveColor)); } else { - setTxColour(ContextCompat.getColor(getContext(), R.color.tx_minus)); + setTxColour(ThemeHelper.getThemedColor(getContext(), R.attr.negativeColor)); } Set destinations = new HashSet<>(); StringBuilder sb = new StringBuilder(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java index 0ff49ee4..e4ae88ed 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java @@ -356,6 +356,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste @Override protected void onCreate(Bundle savedInstanceState) { Timber.d("onCreate()"); + ThemeHelper.setPreferred(this); super.onCreate(savedInstanceState); if (savedInstanceState != null) { // activity restarted @@ -385,7 +386,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste case Toolbar.BUTTON_CLOSE: finish(); break; - case Toolbar.BUTTON_CREDITS: + case Toolbar.BUTTON_SETTINGS: Toast.makeText(WalletActivity.this, getString(R.string.label_credits), Toast.LENGTH_SHORT).show(); case Toolbar.BUTTON_NONE: default: @@ -940,6 +941,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { Timber.d("onRequestPermissionsResult()"); + super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == Helper.PERMISSIONS_REQUEST_CAMERA) { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java index 58566144..c271ec0f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java @@ -52,6 +52,7 @@ import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback; import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.ServiceHelper; +import com.m2049r.xmrwallet.util.ThemeHelper; import com.m2049r.xmrwallet.widget.Toolbar; import java.text.NumberFormat; @@ -111,7 +112,8 @@ public class WalletFragment extends Fragment llBalance = view.findViewById(R.id.llBalance); flExchange = view.findViewById(R.id.flExchange); ((ProgressBar) view.findViewById(R.id.pbExchange)).getIndeterminateDrawable(). - setColorFilter(getResources().getColor(R.color.progress_circle), + setColorFilter( + ThemeHelper.getThemedColor(getContext(), R.attr.colorPrimaryVariant), android.graphics.PorterDuff.Mode.MULTIPLY); tvProgress = view.findViewById(R.id.tvProgress); diff --git a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java index 5257f141..3762fb18 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java +++ b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java @@ -22,6 +22,7 @@ import android.content.res.Configuration; import android.os.Build; import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentManager; import com.m2049r.xmrwallet.model.NetworkType; import com.m2049r.xmrwallet.util.LocaleHelper; @@ -35,7 +36,7 @@ public class XmrWalletApplication extends Application { @Override public void onCreate() { super.onCreate(); - + FragmentManager.enableNewStateManager(false); if (BuildConfig.DEBUG) { Timber.plant(new Timber.DebugTree()); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java b/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java index bab0b7ee..351e7941 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java @@ -267,14 +267,14 @@ public class NodeInfo extends Node { public void showInfo(TextView view, String info, boolean isError) { final Context ctx = view.getContext(); final Spanned text = Html.fromHtml(ctx.getString(R.string.status, - Integer.toHexString(ContextCompat.getColor(ctx, R.color.monerujoGreen) & 0xFFFFFF), - Integer.toHexString(ContextCompat.getColor(ctx, R.color.monerujoBackground) & 0xFFFFFF), + Integer.toHexString(ThemeHelper.getThemedColor(ctx, R.attr.positiveColor) & 0xFFFFFF), + Integer.toHexString(ThemeHelper.getThemedColor(ctx, android.R.attr.colorBackground) & 0xFFFFFF), (hostAddress.isOnion() ? " .onion  " : ""), " " + info)); view.setText(text); if (isError) view.setTextColor(ThemeHelper.getThemedColor(ctx, R.attr.colorError)); else - view.setTextColor(ThemeHelper.getThemedColor(ctx, R.attr.colorPrimary)); + view.setTextColor(ThemeHelper.getThemedColor(ctx, android.R.attr.textColorSecondary)); } public void showInfo(TextView view) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java index 6c0faf14..41c13db8 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendBtcSuccessWizardFragment.java @@ -40,6 +40,7 @@ import com.m2049r.xmrwallet.service.shift.sideshift.api.SideShiftApi; import com.m2049r.xmrwallet.service.shift.sideshift.network.SideShiftApiImpl; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.ServiceHelper; +import com.m2049r.xmrwallet.util.ThemeHelper; import java.text.NumberFormat; import java.util.Locale; @@ -212,19 +213,27 @@ public class SendBtcSuccessWizardFragment extends SendWizardFragment { if (status.isError()) { tvXmrToStatus.setText(getString(R.string.info_send_xmrto_error, status.toString())); statusResource = R.drawable.ic_error_red_24dp; - pbXmrto.getIndeterminateDrawable().setColorFilter(0xff8b0000, android.graphics.PorterDuff.Mode.MULTIPLY); + pbXmrto.getIndeterminateDrawable().setColorFilter( + ThemeHelper.getThemedColor(getContext(), android.R.attr.colorError), + android.graphics.PorterDuff.Mode.MULTIPLY); } else if (status.isSent() || status.isPaid()) { tvXmrToStatus.setText(getString(R.string.info_send_xmrto_sent, btcData.getBtcSymbol())); - statusResource = R.drawable.ic_success_green_24dp; - pbXmrto.getIndeterminateDrawable().setColorFilter(0xFF417505, android.graphics.PorterDuff.Mode.MULTIPLY); + statusResource = R.drawable.ic_success; + pbXmrto.getIndeterminateDrawable().setColorFilter( + ThemeHelper.getThemedColor(getContext(), R.attr.positiveColor), + android.graphics.PorterDuff.Mode.MULTIPLY); } else if (status.isWaiting()) { tvXmrToStatus.setText(getString(R.string.info_send_xmrto_unpaid)); - statusResource = R.drawable.ic_pending_orange_24dp; - pbXmrto.getIndeterminateDrawable().setColorFilter(0xFFFF6105, android.graphics.PorterDuff.Mode.MULTIPLY); + statusResource = R.drawable.ic_pending; + pbXmrto.getIndeterminateDrawable().setColorFilter( + ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor), + android.graphics.PorterDuff.Mode.MULTIPLY); } else if (status.isPending()) { tvXmrToStatus.setText(getString(R.string.info_send_xmrto_paid)); - statusResource = R.drawable.ic_pending_orange_24dp; - pbXmrto.getIndeterminateDrawable().setColorFilter(0xFFFF6105, android.graphics.PorterDuff.Mode.MULTIPLY); + statusResource = R.drawable.ic_pending; + pbXmrto.getIndeterminateDrawable().setColorFilter( + ThemeHelper.getThemedColor(getContext(), R.attr.neutralColor), + android.graphics.PorterDuff.Mode.MULTIPLY); } else { throw new IllegalStateException("status is broken: " + status.toString()); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java index 14203c1f..ce82795b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/send/SendFragment.java @@ -55,7 +55,6 @@ import com.m2049r.xmrwallet.widget.DotBar; import com.m2049r.xmrwallet.widget.Toolbar; import java.lang.ref.WeakReference; -import java.util.Objects; import timber.log.Timber; @@ -202,14 +201,14 @@ public class SendFragment extends Fragment CharSequence nextLabel = pagerAdapter.getPageTitle(position + 1); bNext.setText(nextLabel); if (nextLabel != null) { - bNext.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_navigate_next_white_24dp, 0); + bNext.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_navigate_next, 0); } else { bNext.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); } CharSequence prevLabel = pagerAdapter.getPageTitle(position - 1); bPrev.setText(prevLabel); if (prevLabel != null) { - bPrev.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_navigate_prev_white_24dp, 0, 0, 0); + bPrev.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_navigate_prev, 0, 0, 0); } else { bPrev.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java index 57f02850..baae49e1 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java @@ -23,7 +23,6 @@ import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; @@ -230,21 +229,21 @@ public class NodeInfoAdapter extends RecyclerView.Adapter(); this.listener = listener; Calendar cal = Calendar.getInstance(); @@ -253,8 +254,8 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter= Build.VERSION_CODES.M ? PendingIntent.FLAG_IMMUTABLE : 0); String channelId = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? createNotificationChannel() : ""; Notification notification = new NotificationCompat.Builder(this, channelId) diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java index c5c6c5bf..4cd90cfc 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java @@ -395,7 +395,7 @@ public class Helper { final TextView tvOpenPrompt = promptsView.findViewById(R.id.tvOpenPrompt); final Drawable icFingerprint = context.getDrawable(R.drawable.ic_fingerprint); final Drawable icError = context.getDrawable(R.drawable.ic_error_red_36dp); - final Drawable icInfo = context.getDrawable(R.drawable.ic_info_green_36dp); + final Drawable icInfo = context.getDrawable(R.drawable.ic_info_white_24dp); final boolean fingerprintAuthCheck = FingerprintHelper.isFingerPassValid(context, wallet); diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/LocaleHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/LocaleHelper.java index b98e5da3..fb79cf98 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/LocaleHelper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/LocaleHelper.java @@ -27,7 +27,6 @@ import java.util.ArrayList; import java.util.Locale; public class LocaleHelper { - private static final String PREFERRED_LOCALE_KEY = "preferred_locale"; private static Locale SYSTEM_DEFAULT_LOCALE = Locale.getDefault(); public static ArrayList getAvailableLocales(Context context) { @@ -93,12 +92,13 @@ public class LocaleHelper { public static String getPreferredLanguageTag(Context context) { return PreferenceManager.getDefaultSharedPreferences(context) - .getString(PREFERRED_LOCALE_KEY, ""); + .getString("preferred_locale", ""); + // cannot access getString here as it's done BEFORE string locale is set } @SuppressLint("ApplySharedPref") private static void savePreferredLangaugeTag(Context context, String locale) { PreferenceManager.getDefaultSharedPreferences(context).edit() - .putString(PREFERRED_LOCALE_KEY, locale).commit(); + .putString(context.getString(R.string.preferred_locale), locale).commit(); } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/NightmodeHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/NightmodeHelper.java index e80b8589..afe4ce4f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/NightmodeHelper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/NightmodeHelper.java @@ -16,32 +16,37 @@ package com.m2049r.xmrwallet.util; +import android.annotation.SuppressLint; import android.content.Context; +import android.content.SharedPreferences; import android.preference.PreferenceManager; import androidx.appcompat.app.AppCompatDelegate; -public class NightmodeHelper { - private static final String PREFERRED_NIGHTMODE_KEY = "preferred_nightmode"; +import com.m2049r.xmrwallet.R; +public class NightmodeHelper { public static DayNightMode getPreferredNightmode(Context context) { return DayNightMode.valueOf(PreferenceManager.getDefaultSharedPreferences(context) - .getString(PREFERRED_NIGHTMODE_KEY, "UNKNOWN")); + .getString(context.getString(R.string.preferred_nightmode), "UNKNOWN")); } public static void setPreferredNightmode(Context context) { final DayNightMode mode = DayNightMode.valueOf(PreferenceManager.getDefaultSharedPreferences(context) - .getString(PREFERRED_NIGHTMODE_KEY, "UNKNOWN")); - if (mode == DayNightMode.UNKNOWN) setAndSavePreferredNightmode(context, DayNightMode.AUTO); - setNightMode(mode); + .getString(context.getString(R.string.preferred_nightmode), "UNKNOWN")); + if (mode == DayNightMode.UNKNOWN) + setAndSavePreferredNightmode(context, DayNightMode.AUTO); + else + setNightMode(mode); } public static void setAndSavePreferredNightmode(Context context, DayNightMode mode) { PreferenceManager.getDefaultSharedPreferences(context).edit() - .putString(PREFERRED_NIGHTMODE_KEY, mode.name()).apply(); + .putString(context.getString(R.string.preferred_nightmode), mode.name()).apply(); setNightMode(mode); } + @SuppressLint("WrongConstant") public static void setNightMode(DayNightMode mode) { AppCompatDelegate.setDefaultNightMode(mode.getNightMode()); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Notice.java b/app/src/main/java/com/m2049r/xmrwallet/util/Notice.java index 673e37a2..727c3959 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/Notice.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/Notice.java @@ -98,12 +98,7 @@ public class Notice { final FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager(); - ll.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - HelpFragment.display(fragmentManager, helpResId); - } - }); + ll.setOnClickListener(v -> HelpFragment.display(fragmentManager, helpResId)); ImageButton ib = ll.findViewById(R.id.ibClose); ib.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/RestoreHeight.java b/app/src/main/java/com/m2049r/xmrwallet/util/RestoreHeight.java index 1619bf26..00e59521 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/RestoreHeight.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/RestoreHeight.java @@ -127,6 +127,18 @@ public class RestoreHeight { blockheight.put("2021-01-01", 2264584L); blockheight.put("2021-02-01", 2286892L); blockheight.put("2021-03-01", 2307079L); + blockheight.put("2021-04-01", 2329385L); + blockheight.put("2021-05-01", 2351004L); + blockheight.put("2021-06-01", 2373306L); + blockheight.put("2021-07-01", 2394882L); + blockheight.put("2021-08-01", 2417162L); + blockheight.put("2021-09-01", 2439490L); + blockheight.put("2021-10-01", 2461020L); + blockheight.put("2021-11-01", 2483377L); + blockheight.put("2021-12-01", 2504932L); + blockheight.put("2022-01-01", 2527316L); + blockheight.put("2022-02-01", 2549605L); + blockheight.put("2022-03-01", 2569711L); } public long getHeight(String date) { diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/ThemeHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/ThemeHelper.java index 20f8c484..21ff7330 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/ThemeHelper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/ThemeHelper.java @@ -16,11 +16,16 @@ package com.m2049r.xmrwallet.util; +import android.app.Activity; import android.content.Context; import android.graphics.Color; +import android.preference.PreferenceManager; import android.util.TypedValue; import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; + +import com.m2049r.xmrwallet.R; public class ThemeHelper { static public int getThemedResourceId(Context ctx, int attrId) { @@ -39,4 +44,22 @@ public class ThemeHelper { else return Color.BLACK; } + + public static void setTheme(@NonNull Activity activity, @NonNull String theme) { + switch (theme) { + case "Classic": + activity.setTheme(R.style.MyMaterialThemeClassic); + break; + case "Oled": + activity.setTheme(R.style.MyMaterialThemeOled); + break; + } + } + + public static void setPreferred(Activity activity) { + final String theme = PreferenceManager.getDefaultSharedPreferences(activity) + .getString(activity.getString(R.string.preferred_theme), "Classic"); + setTheme(activity, theme); + } + } diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java index 26ff14b7..00b1b19b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/ExchangeEditText.java @@ -41,6 +41,7 @@ import com.m2049r.xmrwallet.service.exchange.api.ExchangeCallback; import com.m2049r.xmrwallet.service.exchange.api.ExchangeRate; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.ServiceHelper; +import com.m2049r.xmrwallet.util.ThemeHelper; import java.util.ArrayList; import java.util.Arrays; @@ -224,7 +225,7 @@ public class ExchangeEditText extends LinearLayout { // make progress circle gray pbExchange.getIndeterminateDrawable(). - setColorFilter(getResources().getColor(R.color.progress_circle), + setColorFilter(ThemeHelper.getThemedColor(getContext(), R.attr.colorPrimaryVariant), android.graphics.PorterDuff.Mode.MULTIPLY); sCurrencyA.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { diff --git a/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java b/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java index c7f4d90e..768f8a8f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java +++ b/app/src/main/java/com/m2049r/xmrwallet/widget/Toolbar.java @@ -46,7 +46,7 @@ public class Toolbar extends MaterialToolbar { ImageView toolbarImage; TextView toolbarTitle; TextView toolbarSubtitle; - ImageButton bCredits; + ImageButton bSettings; public Toolbar(Context context) { super(context); @@ -88,12 +88,10 @@ public class Toolbar extends MaterialToolbar { toolbarTitle = findViewById(R.id.toolbarTitle); toolbarSubtitle = findViewById(R.id.toolbarSubtitle); - bCredits = findViewById(R.id.bCredits); - bCredits.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - if (onButtonListener != null) { - onButtonListener.onButton(buttonType); - } + bSettings = findViewById(R.id.bSettings); + bSettings.setOnClickListener(v -> { + if (onButtonListener != null) { + onButtonListener.onButton(buttonType); } }); } @@ -117,37 +115,37 @@ public class Toolbar extends MaterialToolbar { public final static int BUTTON_NONE = 0; public final static int BUTTON_BACK = 1; public final static int BUTTON_CLOSE = 2; - public final static int BUTTON_CREDITS = 3; + public final static int BUTTON_SETTINGS = 3; public final static int BUTTON_CANCEL = 4; - int buttonType = BUTTON_CREDITS; + int buttonType = BUTTON_SETTINGS; public void setButton(int type) { switch (type) { case BUTTON_BACK: Timber.d("BUTTON_BACK"); - bCredits.setImageResource(R.drawable.ic_arrow_back_white_24dp); - bCredits.setVisibility(View.VISIBLE); + bSettings.setImageResource(R.drawable.ic_arrow_back); + bSettings.setVisibility(View.VISIBLE); break; case BUTTON_CLOSE: Timber.d("BUTTON_CLOSE"); - bCredits.setImageResource(R.drawable.ic_close_white_24dp); - bCredits.setVisibility(View.VISIBLE); + bSettings.setImageResource(R.drawable.ic_close_white_24dp); + bSettings.setVisibility(View.VISIBLE); break; - case BUTTON_CREDITS: - Timber.d("BUTTON_CREDITS"); - bCredits.setImageResource(R.drawable.ic_favorite_white_24dp); - bCredits.setVisibility(View.VISIBLE); + case BUTTON_SETTINGS: + Timber.d("BUTTON_SETTINGS"); + bSettings.setImageResource(R.drawable.ic_settings); + bSettings.setVisibility(View.VISIBLE); break; case BUTTON_CANCEL: Timber.d("BUTTON_CANCEL"); - bCredits.setImageResource(R.drawable.ic_close_white_24dp); - bCredits.setVisibility(View.VISIBLE); + bSettings.setImageResource(R.drawable.ic_close_white_24dp); + bSettings.setVisibility(View.VISIBLE); break; case BUTTON_NONE: default: Timber.d("BUTTON_NONE"); - bCredits.setVisibility(View.INVISIBLE); + bSettings.setVisibility(View.INVISIBLE); } buttonType = type; } diff --git a/app/src/main/res/color/btn_color_selector.xml b/app/src/main/res/color/btn_color_selector.xml index 3a736463..a863d40b 100644 --- a/app/src/main/res/color/btn_color_selector.xml +++ b/app/src/main/res/color/btn_color_selector.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable-v24/ic_check_circle.xml b/app/src/main/res/drawable-v24/ic_check_circle.xml index 5be895b4..7c0c48e0 100644 --- a/app/src/main/res/drawable-v24/ic_check_circle.xml +++ b/app/src/main/res/drawable-v24/ic_check_circle.xml @@ -13,10 +13,10 @@ android:startY="74.0" android:type="linear"> diff --git a/app/src/main/res/drawable-v24/ic_check_circle_xmr.xml b/app/src/main/res/drawable-v24/ic_check_circle_xmr.xml index 311c65a4..342a70b2 100644 --- a/app/src/main/res/drawable-v24/ic_check_circle_xmr.xml +++ b/app/src/main/res/drawable-v24/ic_check_circle_xmr.xml @@ -17,10 +17,10 @@ android:startY="58.0" android:type="linear"> diff --git a/app/src/main/res/drawable-v24/ic_xmrto_btc_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_btc_off.xml new file mode 100644 index 00000000..bacf2e4a --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_xmrto_btc_off.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable-v24/ic_xmrto_dash_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_dash_off.xml new file mode 100644 index 00000000..8d52acf7 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_xmrto_dash_off.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable-v24/ic_xmrto_doge_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_doge_off.xml new file mode 100644 index 00000000..dc12f6b4 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_xmrto_doge_off.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable-v24/ic_xmrto_eth_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_eth_off.xml new file mode 100644 index 00000000..8e58eca1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_xmrto_eth_off.xml @@ -0,0 +1,38 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable-v24/ic_xmrto_ltc_off.xml b/app/src/main/res/drawable-v24/ic_xmrto_ltc_off.xml new file mode 100644 index 00000000..ffdc3bbc --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_xmrto_ltc_off.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/backgound_seed.xml b/app/src/main/res/drawable/backgound_seed.xml index 5bd552a3..b15241e3 100644 --- a/app/src/main/res/drawable/backgound_seed.xml +++ b/app/src/main/res/drawable/backgound_seed.xml @@ -1,7 +1,6 @@ - diff --git a/app/src/main/res/drawable/backgound_toolbar_mainnet.xml b/app/src/main/res/drawable/backgound_toolbar_mainnet.xml index 5d19b551..87168c36 100644 --- a/app/src/main/res/drawable/backgound_toolbar_mainnet.xml +++ b/app/src/main/res/drawable/backgound_toolbar_mainnet.xml @@ -1,7 +1,4 @@ - \ No newline at end of file diff --git a/app/src/main/res/drawable/backgound_toolbar_streetmode.xml b/app/src/main/res/drawable/backgound_toolbar_streetmode.xml index 9d8cf866..d354b603 100644 --- a/app/src/main/res/drawable/backgound_toolbar_streetmode.xml +++ b/app/src/main/res/drawable/backgound_toolbar_streetmode.xml @@ -1,7 +1,4 @@ - \ No newline at end of file diff --git a/app/src/main/res/drawable/button_green.xml b/app/src/main/res/drawable/button_green.xml index ce3d520f..7bcc5944 100644 --- a/app/src/main/res/drawable/button_green.xml +++ b/app/src/main/res/drawable/button_green.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_all.xml b/app/src/main/res/drawable/gradient_all.xml index 64fe882c..0c1e5371 100644 --- a/app/src/main/res/drawable/gradient_all.xml +++ b/app/src/main/res/drawable/gradient_all.xml @@ -3,7 +3,7 @@ android:shape="rectangle"> diff --git a/app/src/main/res/drawable/gradient_oval.xml b/app/src/main/res/drawable/gradient_oval.xml index c9b7c53d..a2ec4b7e 100644 --- a/app/src/main/res/drawable/gradient_oval.xml +++ b/app/src/main/res/drawable/gradient_oval.xml @@ -3,7 +3,7 @@ android:shape="oval"> \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_street.xml b/app/src/main/res/drawable/gradient_street.xml index ea15a5c6..13d38c7e 100644 --- a/app/src/main/res/drawable/gradient_street.xml +++ b/app/src/main/res/drawable/gradient_street.xml @@ -3,7 +3,7 @@ android:shape="rectangle"> diff --git a/app/src/main/res/drawable/gradient_street_efab.xml b/app/src/main/res/drawable/gradient_street_efab.xml index 4f5b0728..fecef8c0 100644 --- a/app/src/main/res/drawable/gradient_street_efab.xml +++ b/app/src/main/res/drawable/gradient_street_efab.xml @@ -3,8 +3,8 @@ android:shape="rectangle"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml b/app/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml index 9f5c21cb..23c3e5d2 100644 --- a/app/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml +++ b/app/src/main/res/drawable/ic_account_balance_wallet_black_24dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable/ic_add.xml similarity index 65% rename from app/src/main/res/drawable/ic_add_white_24dp.xml rename to app/src/main/res/drawable/ic_add.xml index ba7fc6e4..e249c3e0 100644 --- a/app/src/main/res/drawable/ic_add_white_24dp.xml +++ b/app/src/main/res/drawable/ic_add.xml @@ -1,9 +1,9 @@ + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_add_circle_outline.xml b/app/src/main/res/drawable/ic_add_circle.xml similarity index 90% rename from app/src/main/res/drawable/ic_add_circle_outline.xml rename to app/src/main/res/drawable/ic_add_circle.xml index e0be2e8e..2c0d372e 100644 --- a/app/src/main/res/drawable/ic_add_circle_outline.xml +++ b/app/src/main/res/drawable/ic_add_circle.xml @@ -4,6 +4,6 @@ android:viewportWidth="20.0" android:viewportHeight="20.0"> diff --git a/app/src/main/res/drawable/ic_add_circle_white.xml b/app/src/main/res/drawable/ic_add_circle_white.xml deleted file mode 100644 index ef7dc50f..00000000 --- a/app/src/main/res/drawable/ic_add_circle_white.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_all_inclusive_24dp.xml b/app/src/main/res/drawable/ic_all_inclusive.xml similarity index 94% rename from app/src/main/res/drawable/ic_all_inclusive_24dp.xml rename to app/src/main/res/drawable/ic_all_inclusive.xml index d21f7dd1..92f9867f 100644 --- a/app/src/main/res/drawable/ic_all_inclusive_24dp.xml +++ b/app/src/main/res/drawable/ic_all_inclusive.xml @@ -4,6 +4,6 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> diff --git a/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml b/app/src/main/res/drawable/ic_arrow_back.xml similarity index 58% rename from app/src/main/res/drawable/ic_arrow_back_white_24dp.xml rename to app/src/main/res/drawable/ic_arrow_back.xml index eb28317c..858c605e 100644 --- a/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml +++ b/app/src/main/res/drawable/ic_arrow_back.xml @@ -1,9 +1,10 @@ + android:tint="?attr/colorControlNormal" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_baseline_cancel_24.xml b/app/src/main/res/drawable/ic_baseline_cancel_24.xml deleted file mode 100644 index 583a772b..00000000 --- a/app/src/main/res/drawable/ic_baseline_cancel_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_baseline_launch_24.xml b/app/src/main/res/drawable/ic_baseline_launch_24.xml deleted file mode 100644 index 455b503a..00000000 --- a/app/src/main/res/drawable/ic_baseline_launch_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_check_circle.xml b/app/src/main/res/drawable/ic_check_circle.xml index d59e8e7f..d820d9bd 100644 --- a/app/src/main/res/drawable/ic_check_circle.xml +++ b/app/src/main/res/drawable/ic_check_circle.xml @@ -4,6 +4,6 @@ android:viewportHeight="74.0" android:viewportWidth="74.0"> diff --git a/app/src/main/res/drawable/ic_check_circle_xmr.xml b/app/src/main/res/drawable/ic_check_circle_xmr.xml index b90fbff9..645bdf10 100644 --- a/app/src/main/res/drawable/ic_check_circle_xmr.xml +++ b/app/src/main/res/drawable/ic_check_circle_xmr.xml @@ -4,7 +4,7 @@ android:viewportHeight="58.0" android:viewportWidth="58.0"> diff --git a/app/src/main/res/drawable/ic_check_gray_24dp.xml b/app/src/main/res/drawable/ic_check_gray_24dp.xml deleted file mode 100644 index d1d3bbbd..00000000 --- a/app/src/main/res/drawable/ic_check_gray_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_close_white_24dp.xml b/app/src/main/res/drawable/ic_close_white_24dp.xml index 2b2a1aaf..927a9426 100644 --- a/app/src/main/res/drawable/ic_close_white_24dp.xml +++ b/app/src/main/res/drawable/ic_close_white_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_done_all.xml b/app/src/main/res/drawable/ic_done_all.xml index a3152b05..80c1ad86 100644 --- a/app/src/main/res/drawable/ic_done_all.xml +++ b/app/src/main/res/drawable/ic_done_all.xml @@ -7,7 +7,7 @@ android:translateX="0.000000" android:translateY="+7.000000"> diff --git a/app/src/main/res/drawable/ic_error_red_24dp.xml b/app/src/main/res/drawable/ic_error_red_24dp.xml index 5b0e5c83..70e38a93 100644 --- a/app/src/main/res/drawable/ic_error_red_24dp.xml +++ b/app/src/main/res/drawable/ic_error_red_24dp.xml @@ -4,6 +4,6 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> diff --git a/app/src/main/res/drawable/ic_eye.xml b/app/src/main/res/drawable/ic_eye.xml index 43559d34..c7f3ef75 100644 --- a/app/src/main/res/drawable/ic_eye.xml +++ b/app/src/main/res/drawable/ic_eye.xml @@ -2,18 +2,11 @@ - - - - + - - + android:strokeWidth="1" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_favorite_24dp.xml b/app/src/main/res/drawable/ic_favorite_24dp.xml index 8cf1412c..933147e9 100644 --- a/app/src/main/res/drawable/ic_favorite_24dp.xml +++ b/app/src/main/res/drawable/ic_favorite_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_favorite_border_24dp.xml b/app/src/main/res/drawable/ic_favorite_border_24dp.xml index 4710d95a..a26a6bab 100644 --- a/app/src/main/res/drawable/ic_favorite_border_24dp.xml +++ b/app/src/main/res/drawable/ic_favorite_border_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_favorite_white_24dp.xml b/app/src/main/res/drawable/ic_favorite_white_24dp.xml deleted file mode 100644 index 3c8ccd17..00000000 --- a/app/src/main/res/drawable/ic_favorite_white_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_fingerprint.xml b/app/src/main/res/drawable/ic_fingerprint.xml index 9c51b700..30d9186d 100644 --- a/app/src/main/res/drawable/ic_fingerprint.xml +++ b/app/src/main/res/drawable/ic_fingerprint.xml @@ -5,21 +5,21 @@ android:viewportHeight="36.0"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_help_white_24dp.xml b/app/src/main/res/drawable/ic_help_white_24dp.xml index db59fe78..1f732001 100644 --- a/app/src/main/res/drawable/ic_help_white_24dp.xml +++ b/app/src/main/res/drawable/ic_help_white_24dp.xml @@ -1,9 +1,10 @@ diff --git a/app/src/main/res/drawable/ic_import.xml b/app/src/main/res/drawable/ic_import.xml new file mode 100644 index 00000000..62c1d5e9 --- /dev/null +++ b/app/src/main/res/drawable/ic_import.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_info_green_36dp.xml b/app/src/main/res/drawable/ic_info_green_36dp.xml deleted file mode 100644 index 230b5963..00000000 --- a/app/src/main/res/drawable/ic_info_green_36dp.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_info_white_24dp.xml b/app/src/main/res/drawable/ic_info_white_24dp.xml index c9f33b31..9f60ef94 100644 --- a/app/src/main/res/drawable/ic_info_white_24dp.xml +++ b/app/src/main/res/drawable/ic_info_white_24dp.xml @@ -4,6 +4,6 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> diff --git a/app/src/main/res/drawable/ic_key.xml b/app/src/main/res/drawable/ic_key.xml index ac50e393..6252c725 100644 --- a/app/src/main/res/drawable/ic_key.xml +++ b/app/src/main/res/drawable/ic_key.xml @@ -12,7 +12,7 @@ android:translateX="219.000000" android:translateY="136.000000"> + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index ed893783..85c122df 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -4,23 +4,26 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - - - - - - - - - + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index ec890349..2c2fd4b4 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -3,10 +3,10 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - - + + diff --git a/app/src/main/res/drawable/ic_ledger_restore.xml b/app/src/main/res/drawable/ic_ledger_restore.xml index 6dc023fe..be8b6913 100644 --- a/app/src/main/res/drawable/ic_ledger_restore.xml +++ b/app/src/main/res/drawable/ic_ledger_restore.xml @@ -1,8 +1,8 @@ + android:viewportWidth="529.82" + android:viewportHeight="184.59"> diff --git a/app/src/main/res/drawable/ic_logo_horizontol_xmrujo.xml b/app/src/main/res/drawable/ic_logo_horizontol_xmrujo.xml index 0486b492..ec2cdd42 100644 --- a/app/src/main/res/drawable/ic_logo_horizontol_xmrujo.xml +++ b/app/src/main/res/drawable/ic_logo_horizontol_xmrujo.xml @@ -1,33 +1,34 @@ diff --git a/app/src/main/res/drawable/ic_monero_bw.xml b/app/src/main/res/drawable/ic_monero_bw.xml index 1b4cef11..29100129 100644 --- a/app/src/main/res/drawable/ic_monero_bw.xml +++ b/app/src/main/res/drawable/ic_monero_bw.xml @@ -4,9 +4,9 @@ android:viewportWidth="256" android:viewportHeight="256"> diff --git a/app/src/main/res/drawable/ic_monerujo.xml b/app/src/main/res/drawable/ic_monerujo.xml index b700071d..88d43061 100644 --- a/app/src/main/res/drawable/ic_monerujo.xml +++ b/app/src/main/res/drawable/ic_monerujo.xml @@ -2,18 +2,12 @@ + android:viewportWidth="1270" + android:viewportHeight="1270"> - diff --git a/app/src/main/res/drawable/ic_navigate_next_white_24dp.xml b/app/src/main/res/drawable/ic_navigate_next.xml similarity index 79% rename from app/src/main/res/drawable/ic_navigate_next_white_24dp.xml rename to app/src/main/res/drawable/ic_navigate_next.xml index e15024dc..435fc04d 100644 --- a/app/src/main/res/drawable/ic_navigate_next_white_24dp.xml +++ b/app/src/main/res/drawable/ic_navigate_next.xml @@ -1,8 +1,8 @@ + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_navigate_next_black_24dp.xml b/app/src/main/res/drawable/ic_navigate_next_black_24dp.xml deleted file mode 100644 index e15024dc..00000000 --- a/app/src/main/res/drawable/ic_navigate_next_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_navigate_prev_white_24dp.xml b/app/src/main/res/drawable/ic_navigate_prev.xml similarity index 100% rename from app/src/main/res/drawable/ic_navigate_prev_white_24dp.xml rename to app/src/main/res/drawable/ic_navigate_prev.xml diff --git a/app/src/main/res/drawable/ic_new.xml b/app/src/main/res/drawable/ic_new.xml index eb0b47bb..0c861aee 100644 --- a/app/src/main/res/drawable/ic_new.xml +++ b/app/src/main/res/drawable/ic_new.xml @@ -2,18 +2,11 @@ - - - - + - - + android:strokeWidth="1" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_nfc_black_24dp.xml b/app/src/main/res/drawable/ic_nfc.xml similarity index 78% rename from app/src/main/res/drawable/ic_nfc_black_24dp.xml rename to app/src/main/res/drawable/ic_nfc.xml index 6acbf783..2821ae80 100644 --- a/app/src/main/res/drawable/ic_nfc_black_24dp.xml +++ b/app/src/main/res/drawable/ic_nfc.xml @@ -1,9 +1,9 @@ + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_pending_orange_24dp.xml b/app/src/main/res/drawable/ic_pending.xml similarity index 73% rename from app/src/main/res/drawable/ic_pending_orange_24dp.xml rename to app/src/main/res/drawable/ic_pending.xml index 5f748fdb..bca0e0af 100644 --- a/app/src/main/res/drawable/ic_pending_orange_24dp.xml +++ b/app/src/main/res/drawable/ic_pending.xml @@ -1,9 +1,9 @@ + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_refresh_24dp.xml b/app/src/main/res/drawable/ic_refresh_24dp.xml deleted file mode 100644 index 2184bbfd..00000000 --- a/app/src/main/res/drawable/ic_refresh_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_refresh_black_24dp.xml b/app/src/main/res/drawable/ic_refresh_black_24dp.xml deleted file mode 100644 index c5ae344f..00000000 --- a/app/src/main/res/drawable/ic_refresh_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_renew_24dp.xml b/app/src/main/res/drawable/ic_renew.xml similarity index 100% rename from app/src/main/res/drawable/ic_renew_24dp.xml rename to app/src/main/res/drawable/ic_renew.xml diff --git a/app/src/main/res/drawable/ic_seed.xml b/app/src/main/res/drawable/ic_seed.xml index ba295044..6d714f63 100644 --- a/app/src/main/res/drawable/ic_seed.xml +++ b/app/src/main/res/drawable/ic_seed.xml @@ -5,17 +5,17 @@ android:viewportHeight="6.3500004"> + android:fillColor="#000"/> + android:fillColor="#000"/> + android:fillColor="#000"/> + android:fillColor="#000"/> + android:fillColor="#000"/> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 00000000..a7c7678d --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_share_white_24dp.xml b/app/src/main/res/drawable/ic_share.xml similarity index 87% rename from app/src/main/res/drawable/ic_share_white_24dp.xml rename to app/src/main/res/drawable/ic_share.xml index a918453f..c2a49267 100644 --- a/app/src/main/res/drawable/ic_share_white_24dp.xml +++ b/app/src/main/res/drawable/ic_share.xml @@ -1,9 +1,10 @@ diff --git a/app/src/main/res/drawable/ic_sideshift_circle.xml b/app/src/main/res/drawable/ic_sideshift_circle.xml index 366f959d..f894205f 100644 --- a/app/src/main/res/drawable/ic_sideshift_circle.xml +++ b/app/src/main/res/drawable/ic_sideshift_circle.xml @@ -4,9 +4,9 @@ android:viewportWidth="80.52" android:viewportHeight="80.46"> > + android:fillColor="?colorPrimary" + android:pathData="M66.07,9.67A40,40 0,0 0,9.69 66.11Z" /> diff --git a/app/src/main/res/drawable/ic_sideshift_white.xml b/app/src/main/res/drawable/ic_sideshift_white.xml index 76d8891b..549c445f 100644 --- a/app/src/main/res/drawable/ic_sideshift_white.xml +++ b/app/src/main/res/drawable/ic_sideshift_white.xml @@ -4,45 +4,45 @@ android:viewportWidth="648" android:viewportHeight="80"> diff --git a/app/src/main/res/drawable/ic_smiley_ecstatic_filled.xml b/app/src/main/res/drawable/ic_smiley_ecstatic_filled.xml index 5599f408..d6361528 100644 --- a/app/src/main/res/drawable/ic_smiley_ecstatic_filled.xml +++ b/app/src/main/res/drawable/ic_smiley_ecstatic_filled.xml @@ -4,6 +4,6 @@ android:viewportWidth="85.43" android:viewportHeight="85.43"> diff --git a/app/src/main/res/drawable/ic_smiley_gunther_filled.xml b/app/src/main/res/drawable/ic_smiley_gunther_filled.xml index b984c882..73a1202b 100644 --- a/app/src/main/res/drawable/ic_smiley_gunther_filled.xml +++ b/app/src/main/res/drawable/ic_smiley_gunther_filled.xml @@ -4,9 +4,9 @@ android:viewportWidth="85.43" android:viewportHeight="85.43"> diff --git a/app/src/main/res/drawable/ic_smiley_happy_filled.xml b/app/src/main/res/drawable/ic_smiley_happy_filled.xml index 2a90da42..ebd638d8 100644 --- a/app/src/main/res/drawable/ic_smiley_happy_filled.xml +++ b/app/src/main/res/drawable/ic_smiley_happy_filled.xml @@ -4,6 +4,6 @@ android:viewportWidth="85.43" android:viewportHeight="85.43"> diff --git a/app/src/main/res/drawable/ic_smiley_meh_filled.xml b/app/src/main/res/drawable/ic_smiley_meh_filled.xml index 057e41e8..6936876b 100644 --- a/app/src/main/res/drawable/ic_smiley_meh_filled.xml +++ b/app/src/main/res/drawable/ic_smiley_meh_filled.xml @@ -4,6 +4,6 @@ android:viewportWidth="85.43" android:viewportHeight="85.43"> diff --git a/app/src/main/res/drawable/ic_smiley_neutral_filled.xml b/app/src/main/res/drawable/ic_smiley_neutral_filled.xml index 13cff5b6..ca1b805a 100644 --- a/app/src/main/res/drawable/ic_smiley_neutral_filled.xml +++ b/app/src/main/res/drawable/ic_smiley_neutral_filled.xml @@ -4,6 +4,6 @@ android:viewportWidth="85.43" android:viewportHeight="85.43"> diff --git a/app/src/main/res/drawable/ic_smiley_sad_filled.xml b/app/src/main/res/drawable/ic_smiley_sad_filled.xml index db30f3ef..1f7a4983 100644 --- a/app/src/main/res/drawable/ic_smiley_sad_filled.xml +++ b/app/src/main/res/drawable/ic_smiley_sad_filled.xml @@ -4,6 +4,6 @@ android:viewportWidth="85.43" android:viewportHeight="85.43"> diff --git a/app/src/main/res/drawable/ic_success_green_24dp.xml b/app/src/main/res/drawable/ic_success.xml similarity index 87% rename from app/src/main/res/drawable/ic_success_green_24dp.xml rename to app/src/main/res/drawable/ic_success.xml index a8300b8c..0bc71eef 100644 --- a/app/src/main/res/drawable/ic_success_green_24dp.xml +++ b/app/src/main/res/drawable/ic_success.xml @@ -4,6 +4,6 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> diff --git a/app/src/main/res/drawable/ic_signal_wifi_1_bar_24dp.xml b/app/src/main/res/drawable/ic_wifi_1_bar.xml similarity index 85% rename from app/src/main/res/drawable/ic_signal_wifi_1_bar_24dp.xml rename to app/src/main/res/drawable/ic_wifi_1_bar.xml index a6aab842..fa525ec8 100644 --- a/app/src/main/res/drawable/ic_signal_wifi_1_bar_24dp.xml +++ b/app/src/main/res/drawable/ic_wifi_1_bar.xml @@ -5,9 +5,9 @@ android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_signal_wifi_2_bar_24dp.xml b/app/src/main/res/drawable/ic_wifi_2_bar.xml similarity index 85% rename from app/src/main/res/drawable/ic_signal_wifi_2_bar_24dp.xml rename to app/src/main/res/drawable/ic_wifi_2_bar.xml index 3b180880..9a967097 100644 --- a/app/src/main/res/drawable/ic_signal_wifi_2_bar_24dp.xml +++ b/app/src/main/res/drawable/ic_wifi_2_bar.xml @@ -5,9 +5,9 @@ android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_signal_wifi_3_bar_24dp.xml b/app/src/main/res/drawable/ic_wifi_3_bar.xml similarity index 86% rename from app/src/main/res/drawable/ic_signal_wifi_3_bar_24dp.xml rename to app/src/main/res/drawable/ic_wifi_3_bar.xml index 0252ebcf..40872576 100644 --- a/app/src/main/res/drawable/ic_signal_wifi_3_bar_24dp.xml +++ b/app/src/main/res/drawable/ic_wifi_3_bar.xml @@ -5,9 +5,9 @@ android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_signal_wifi_4_bar_24dp.xml b/app/src/main/res/drawable/ic_wifi_4_bar.xml similarity index 89% rename from app/src/main/res/drawable/ic_signal_wifi_4_bar_24dp.xml rename to app/src/main/res/drawable/ic_wifi_4_bar.xml index 645e9fff..0277e813 100644 --- a/app/src/main/res/drawable/ic_signal_wifi_4_bar_24dp.xml +++ b/app/src/main/res/drawable/ic_wifi_4_bar.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_wifi_lock_black_24dp.xml b/app/src/main/res/drawable/ic_wifi_lock.xml similarity index 93% rename from app/src/main/res/drawable/ic_wifi_lock_black_24dp.xml rename to app/src/main/res/drawable/ic_wifi_lock.xml index a12c2c7b..63f47c93 100644 --- a/app/src/main/res/drawable/ic_wifi_lock_black_24dp.xml +++ b/app/src/main/res/drawable/ic_wifi_lock.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_signal_wifi_off_24dp.xml b/app/src/main/res/drawable/ic_wifi_off.xml similarity index 91% rename from app/src/main/res/drawable/ic_signal_wifi_off_24dp.xml rename to app/src/main/res/drawable/ic_wifi_off.xml index 9ef5e210..a4905df4 100644 --- a/app/src/main/res/drawable/ic_signal_wifi_off_24dp.xml +++ b/app/src/main/res/drawable/ic_wifi_off.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_xmrto_btc_off.xml b/app/src/main/res/drawable/ic_xmrto_btc_off.xml index 5a49d3da..a0d67147 100644 --- a/app/src/main/res/drawable/ic_xmrto_btc_off.xml +++ b/app/src/main/res/drawable/ic_xmrto_btc_off.xml @@ -4,11 +4,11 @@ android:viewportWidth="32" android:viewportHeight="32"> diff --git a/app/src/main/res/drawable/ic_xmrto_dash_off.xml b/app/src/main/res/drawable/ic_xmrto_dash_off.xml index 28a712fd..e1836260 100644 --- a/app/src/main/res/drawable/ic_xmrto_dash_off.xml +++ b/app/src/main/res/drawable/ic_xmrto_dash_off.xml @@ -4,12 +4,12 @@ android:viewportWidth="32" android:viewportHeight="32"> diff --git a/app/src/main/res/drawable/ic_xmrto_doge_off.xml b/app/src/main/res/drawable/ic_xmrto_doge_off.xml index 51f0639a..c6c6a3b5 100644 --- a/app/src/main/res/drawable/ic_xmrto_doge_off.xml +++ b/app/src/main/res/drawable/ic_xmrto_doge_off.xml @@ -4,11 +4,11 @@ android:viewportWidth="32" android:viewportHeight="32"> diff --git a/app/src/main/res/drawable/ic_xmrto_eth_off.xml b/app/src/main/res/drawable/ic_xmrto_eth_off.xml index 04da5f01..55c71619 100644 --- a/app/src/main/res/drawable/ic_xmrto_eth_off.xml +++ b/app/src/main/res/drawable/ic_xmrto_eth_off.xml @@ -4,35 +4,35 @@ android:viewportWidth="32" android:viewportHeight="32"> diff --git a/app/src/main/res/drawable/ic_xmrto_logo.xml b/app/src/main/res/drawable/ic_xmrto_logo.xml index b4bc3f29..17058e2d 100644 --- a/app/src/main/res/drawable/ic_xmrto_logo.xml +++ b/app/src/main/res/drawable/ic_xmrto_logo.xml @@ -4,48 +4,48 @@ android:viewportWidth="404.08" android:viewportHeight="115"> diff --git a/app/src/main/res/drawable/ic_xmrto_ltc_off.xml b/app/src/main/res/drawable/ic_xmrto_ltc_off.xml index 663c2476..a78f33f0 100644 --- a/app/src/main/res/drawable/ic_xmrto_ltc_off.xml +++ b/app/src/main/res/drawable/ic_xmrto_ltc_off.xml @@ -4,11 +4,11 @@ android:viewportWidth="32" android:viewportHeight="32"> diff --git a/app/src/main/res/drawable/selector_login.xml b/app/src/main/res/drawable/selector_login.xml index 668fd24f..b62ad953 100644 --- a/app/src/main/res/drawable/selector_login.xml +++ b/app/src/main/res/drawable/selector_login.xml @@ -2,13 +2,13 @@ - + - + diff --git a/app/src/main/res/drawable/texture_cash.png b/app/src/main/res/drawable/texture_cash.png deleted file mode 100644 index bcd550b09b860c1e4014c126a47dc5b71c44d51c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49327 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 diff --git a/app/src/main/res/layout/fragment_generate.xml b/app/src/main/res/layout/fragment_generate.xml index 8b2a2a99..cf6e4a8f 100644 --- a/app/src/main/res/layout/fragment_generate.xml +++ b/app/src/main/res/layout/fragment_generate.xml @@ -33,12 +33,12 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/header_top_first" - app:boxStrokeErrorColor="@color/monerujoPrimary" + android:layout_marginBottom="@dimen/header_top_first" + app:boxStrokeErrorColor="?colorPrimary" app:errorEnabled="true" app:errorIconDrawable="@drawable/ic_smiley_gunther_filled" - app:errorIconTint="@color/monerujoPrimary" - app:errorTextColor="@color/monerujoPrimary"> + app:errorIconTint="?colorPrimary" + app:errorTextColor="?colorPrimary"> + app:icon="@drawable/ic_keyboard_arrow_down" /> + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp"> + android:src="@drawable/ic_renew" /> + app:drawableStartCompat="@drawable/ic_nfc" /> diff --git a/app/src/main/res/layout/fragment_review.xml b/app/src/main/res/layout/fragment_review.xml index 6c1ac1b6..29af8dd2 100644 --- a/app/src/main/res/layout/fragment_review.xml +++ b/app/src/main/res/layout/fragment_review.xml @@ -89,7 +89,7 @@ android:layout_gravity="center" android:background="?android:selectableItemBackground" android:text="@string/label_seed_offset_encrypt" - app:icon="@drawable/ic_baseline_keyboard_arrow_down_24" /> + app:icon="@drawable/ic_keyboard_arrow_down" /> + app:icon="@drawable/ic_keyboard_arrow_down" /> diff --git a/app/src/main/res/layout/fragment_send_address.xml b/app/src/main/res/layout/fragment_send_address.xml index 8a857278..375e0f0e 100644 --- a/app/src/main/res/layout/fragment_send_address.xml +++ b/app/src/main/res/layout/fragment_send_address.xml @@ -214,7 +214,7 @@ android:gravity="center" android:text="@string/nfc_tag_tap" android:visibility="visible" - app:drawableStartCompat="@drawable/ic_nfc_black_24dp" /> + app:drawableStartCompat="@drawable/ic_nfc" /> diff --git a/app/src/main/res/layout/fragment_send_amount.xml b/app/src/main/res/layout/fragment_send_amount.xml index 7d70d95e..94d4a967 100644 --- a/app/src/main/res/layout/fragment_send_amount.xml +++ b/app/src/main/res/layout/fragment_send_amount.xml @@ -29,7 +29,7 @@ android:layout_alignParentEnd="true" android:paddingStart="12dp" android:paddingEnd="12dp" - android:src="@drawable/ic_all_inclusive_24dp" + android:src="@drawable/ic_all_inclusive" android:visibility="visible" /> @@ -45,7 +45,7 @@ android:id="@+id/rlSweep" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="gone"> + android:visibility="visible"> + android:src="@drawable/ic_all_inclusive" /> + card_view:drawableEndCompat="@drawable/ic_launch_external" /> diff --git a/app/src/main/res/layout/fragment_subaddress.xml b/app/src/main/res/layout/fragment_subaddress.xml index ef34160e..e526d150 100644 --- a/app/src/main/res/layout/fragment_subaddress.xml +++ b/app/src/main/res/layout/fragment_subaddress.xml @@ -65,7 +65,7 @@ android:layout_gravity="bottom|end" android:backgroundTint="@android:color/transparent" android:backgroundTintMode="src_in" - android:src="@drawable/ic_add_white_24dp" + android:src="@drawable/ic_add" app:borderWidth="0dp" app:elevation="0dp" app:fabSize="normal" diff --git a/app/src/main/res/layout/fragment_tx_info.xml b/app/src/main/res/layout/fragment_tx_info.xml index 95a256fa..22963177 100644 --- a/app/src/main/res/layout/fragment_tx_info.xml +++ b/app/src/main/res/layout/fragment_tx_info.xml @@ -100,7 +100,6 @@ android:gravity="start" android:padding="8dp" android:selectAllOnFocus="true" - android:textColor="@color/gradientLeft" android:textIsSelectable="true" tools:text="1.008 BTC" /> @@ -171,7 +170,7 @@ android:drawablePadding="8dp" android:gravity="center" android:text="@string/label_send_btc_xmrto_info" - card_view:drawableEndCompat="@drawable/ic_baseline_launch_24" /> + card_view:drawableEndCompat="@drawable/ic_launch_external" /> diff --git a/app/src/main/res/layout/fragment_wallet.xml b/app/src/main/res/layout/fragment_wallet.xml index ad58b2c7..668f3b31 100644 --- a/app/src/main/res/layout/fragment_wallet.xml +++ b/app/src/main/res/layout/fragment_wallet.xml @@ -11,14 +11,16 @@ android:layout_gravity="bottom" android:scaleType="centerCrop" /> - @@ -126,33 +128,42 @@ android:layout_height="wrap_content" android:indeterminate="true" android:visibility="invisible" /> - - + android:layout_marginRight="8dp" + android:clipToPadding="false" + android:transitionGroup="true" + app:layoutManager="LinearLayoutManager" + tools:listitem="@layout/item_transaction" /> - + + + android:layout_height="1dp" + android:background="?android:attr/listDivider" /> @@ -161,7 +172,8 @@ style="@style/MoneroButton.Wallet" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_margin="8dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" android:layout_weight="1" android:enabled="false" android:text="@string/label_wallet_receive" @@ -173,14 +185,16 @@ style="@style/MoneroButton.Wallet" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_margin="8dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" android:layout_weight="1" android:enabled="false" android:text="@string/label_wallet_send" android:transitionName="@string/send_btn_transition_name" app:icon="@drawable/ic_send" /> - - - + + + + diff --git a/app/src/main/res/layout/item_node.xml b/app/src/main/res/layout/item_node.xml index e3ac81f5..873d1b6e 100644 --- a/app/src/main/res/layout/item_node.xml +++ b/app/src/main/res/layout/item_node.xml @@ -67,5 +67,5 @@ android:layout_alignParentEnd="true" android:layout_centerInParent="true" android:layout_marginEnd="8dp" - android:src="@drawable/ic_signal_wifi_4_bar_24dp" /> + android:src="@drawable/ic_wifi_4_bar" /> diff --git a/app/src/main/res/layout/item_subaddress.xml b/app/src/main/res/layout/item_subaddress.xml index 059f11dc..5348a287 100644 --- a/app/src/main/res/layout/item_subaddress.xml +++ b/app/src/main/res/layout/item_subaddress.xml @@ -39,7 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/tvAddress" - android:textColor="@color/tx_plus" + android:textColor="?attr/positiveColor" app:layout_constraintBottom_toBottomOf="@id/tvName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/item_transaction.xml b/app/src/main/res/layout/item_transaction.xml index f0075658..9edf678d 100644 --- a/app/src/main/res/layout/item_transaction.xml +++ b/app/src/main/res/layout/item_transaction.xml @@ -11,7 +11,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:padding="8dp"> + android:paddingTop="12dp" + android:paddingBottom="12dp" + android:paddingLeft="8dp" + android:paddingRight="8dp"> + android:src="@drawable/ic_navigate_next" /> diff --git a/app/src/main/res/layout/item_wallet.xml b/app/src/main/res/layout/item_wallet.xml index 0b918a14..4d18aef9 100644 --- a/app/src/main/res/layout/item_wallet.xml +++ b/app/src/main/res/layout/item_wallet.xml @@ -9,7 +9,9 @@ + android:background="@drawable/selector_login" + android:paddingTop="8dp" + android:paddingBottom="8dp"> - - + android:layout_above="@id/fabViewL" + android:layout_alignEnd="@id/fabImportL"> + android:layout_above="@id/fabKeyL" + android:layout_alignEnd="@id/fabImportL"> + android:layout_above="@id/fabSeedL" + android:layout_alignEnd="@id/fabImportL"> + android:layout_above="@id/fabImportL" + android:layout_alignEnd="@id/fabImportL"> + + + + + + + + - + @@ -190,11 +221,12 @@ android:layout_gravity="bottom|end" android:backgroundTint="@android:color/transparent" android:backgroundTintMode="src_in" - android:src="@drawable/ic_add_white_24dp" + android:src="@drawable/ic_add" app:borderWidth="0dp" app:elevation="0dp" app:fabSize="normal" - app:pressedTranslationZ="0dp" /> + app:pressedTranslationZ="0dp" + app:tint="?attr/toolbarTextColor" /> - + diff --git a/app/src/main/res/layout/prompt_changepw.xml b/app/src/main/res/layout/prompt_changepw.xml index c533024e..7d8e8f7f 100644 --- a/app/src/main/res/layout/prompt_changepw.xml +++ b/app/src/main/res/layout/prompt_changepw.xml @@ -15,11 +15,11 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="match_parent" android:layout_height="wrap_content" - app:boxStrokeErrorColor="@color/monerujoPrimary" + app:boxStrokeErrorColor="?colorPrimary" app:errorEnabled="true" app:errorIconDrawable="@drawable/ic_smiley_gunther_filled" - app:errorIconTint="@color/monerujoPrimary" - app:errorTextColor="@color/monerujoPrimary"> + app:errorIconTint="?colorPrimary" + app:errorTextColor="?colorPrimary"> + android:src="@drawable/ic_close_white_24dp" + app:tint="?colorOnSecondary" /> diff --git a/app/src/main/res/layout/view_toolbar.xml b/app/src/main/res/layout/view_toolbar.xml index a40209f8..0c16bbde 100644 --- a/app/src/main/res/layout/view_toolbar.xml +++ b/app/src/main/res/layout/view_toolbar.xml @@ -1,14 +1,16 @@ + android:background="?android:attr/selectableItemBackgroundBorderless" + android:padding="2dp" + android:src="@drawable/ic_settings" + app:tint="?attr/toolbarTextColor" /> + android:visibility="visible" + app:tint="?attr/toolbarTextColor" /> \ No newline at end of file diff --git a/app/src/main/res/menu/list_menu.xml b/app/src/main/res/menu/list_menu.xml index 33e2f6b6..f660304a 100644 --- a/app/src/main/res/menu/list_menu.xml +++ b/app/src/main/res/menu/list_menu.xml @@ -2,40 +2,10 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/receive_menu.xml b/app/src/main/res/menu/receive_menu.xml index 51c92c7e..e3ece5c4 100644 --- a/app/src/main/res/menu/receive_menu.xml +++ b/app/src/main/res/menu/receive_menu.xml @@ -4,8 +4,9 @@ + app:showAsAction="always" /> \ No newline at end of file diff --git a/app/src/main/res/menu/tx_info_menu.xml b/app/src/main/res/menu/tx_info_menu.xml index 0587eed9..710ac36a 100644 --- a/app/src/main/res/menu/tx_info_menu.xml +++ b/app/src/main/res/menu/tx_info_menu.xml @@ -4,7 +4,7 @@ diff --git a/app/src/main/res/values-cat/strings.xml b/app/src/main/res/values-cat/strings.xml index 48c3fab9..bad25c1e 100644 --- a/app/src/main/res/values-cat/strings.xml +++ b/app/src/main/res/values-cat/strings.xml @@ -434,4 +434,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index adbfbe18..0e6ce4aa 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -435,4 +435,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 78542466..be5074b9 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -436,4 +436,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 6db51898..f6469732 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -436,4 +436,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 067eb577..4881b1e5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -427,4 +427,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 1bddbd91..59116af4 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -434,4 +434,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c0d7b00d..1a1c4f94 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -440,4 +440,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 877d0457..8d3b1638 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -438,4 +438,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index b65a7e71..607a48fc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -439,4 +439,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ad491ad7..379034eb 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -439,4 +439,17 @@ タッチして詳細情報を見る Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 7760a570..4ff22222 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -436,4 +436,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-night-v23/styles.xml b/app/src/main/res/values-night-v23/styles.xml new file mode 100644 index 00000000..331c4506 --- /dev/null +++ b/app/src/main/res/values-night-v23/styles.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night-v27/styles.xml b/app/src/main/res/values-night-v27/styles.xml new file mode 100644 index 00000000..01650499 --- /dev/null +++ b/app/src/main/res/values-night-v27/styles.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 54d5cbc5..8216c428 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -1,17 +1,63 @@ - #430078 - @color/monerujoBackground + + #ffffff + @color/oled_textColorPrimary + @color/oled_gradientTopColor + @color/oled_colorBackground + @color/oled_colorOnBackground + @color/oled_gradientTopColor + @color/oled_gradientBottomColor + #F4F4F4 + @color/oled_negativeColor + #FF104E + #3FF3A5 + #FF104E + #838383 + #7E37F1 + @color/oled_colorBackground + #000000 + #1B1B1B + #070707 + #7E7E7E + #E0E0E0 + #B6B6B6 + #090909 + @color/oled_favouriteColor + @color/oled_colorPrimaryVariant + @color/oled_colorOnPrimary + @color/oled_favouriteColor + #ffffff - @color/monerujoPrimary - - #200C22 - #FFF6EF - #CCC3BD - #FF6252 - #27C79C - #FF1A80 - #20FF1A80 - #2D1A2E + + #ffffff + #FFF6EF + @color/classic_gradientTopColor + @color/classic_colorBackground + #430078 + #4E018A + #87009F + #ffffff + @color/classic_negativeColor + @color/classic_negativeColor + #27C79C + #FF1A80 + #ffffff + #FFAB1A + @color/classic_colorBackground + #200C22 + #ffffff + @color/classic_colorBackground + @color/classic_textColorPrimary + #FFF6EF + #CCC3BD + @color/classic_colorBackground + @color/classic_negativeColor + #F6FFEF + @color/classic_colorBackground + @color/classic_negativeColor + #FFF6EF + #FFF6EF + #2A142C diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 74ce628b..f8995194 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -1,34 +1,13 @@ - - \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0743afc1..36faf705 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -436,4 +436,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ce28cbeb..67688cda 100755 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -429,4 +429,17 @@ aqui. Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 90d44934..a71b0967 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -440,4 +440,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1ae3c8bb..a5529888 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -436,4 +436,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 867abdbb..fb9e1285 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -440,4 +440,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index bbf75676..e1bf73c4 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -437,4 +437,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index b6eedda2..8e8b44a2 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -435,4 +435,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 694c3753..8bfc334a 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -428,4 +428,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 93665d75..ad6796f5 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -440,4 +440,17 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml new file mode 100644 index 00000000..2706f119 --- /dev/null +++ b/app/src/main/res/values-v23/styles.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v27/styles.xml b/app/src/main/res/values-v27/styles.xml new file mode 100644 index 00000000..798a43da --- /dev/null +++ b/app/src/main/res/values-v27/styles.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index aafeac1a..36c80792 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -360,4 +360,17 @@ 点击以查看详情 Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a6003f1e..32f5f27a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -435,4 +435,17 @@ 點選以獲得詳細資訊 Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 00000000..ec8b9ad5 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,13 @@ + + + AUTO + DAY + NIGHT + + + + Classic + Oled + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index faaca86f..4d0e9b43 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -10,4 +10,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bb315d09..708f928a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,35 +1,63 @@ - #FF006B - #FF6105 + + #000000 + @color/oled_textColorPrimary + @color/oled_gradientTopColor + @color/oled_colorBackground + #eeeeee + @color/oled_gradientTopColor + @color/oled_colorBackground + @color/oled_colorOnBackground + #FFDB72 + @color/oled_favouriteColor + #27C79C + #FF3C79 + #171717 + #3DC2FF + #000000 + #ffffff + #232323 + @color/oled_colorBackground + @color/oled_colorOnBackground + #2E2E2E + #6A6A6A + #ffffff + @color/oled_negativeColor + @color/oled_colorBackground + @color/oled_colorOnBackground + @color/oled_negativeColor + @color/oled_colorBackground - @color/monerujoOrange - @color/monerujoPink - - @color/monerujoBackground - - #FFF6EF - #2D1A2E - #CCC3BD - #FA5544 - #00C691 - #F0006B - #20F0006B - #FFFDFB - - @color/monerujoGreen - @color/monerujoOrange - #D81F0759 - #D819001E - - @color/monerujoPrimary - @color/monerujoPrimaryVariant - - @color/monerujoPrimaryVariant - @color/monerujoPrimaryVariant - @color/monerujoGreen - @color/monerujoOrange - - #1f4e97 + + #0C080C + #392F39 + @color/classic_gradientTopColor + #FF6105 + #FF006B + #D81F0759 + #D819001E + #FFF6EF + @color/classic_gradientBottomColor + @color/classic_gradientBottomColor + #00C691 + @color/classic_gradientBottomColor + @color/classic_positiveColor + #1f4e97 + @color/classic_colorOnBackground + #FFF6EF + #0C080C + #FFF6EF + #2D1A2E + #2D1A2E + #825985 + #FFF6EF + @color/classic_gradientBottomColor + #BC0050 + #FFF6EF + @color/classic_gradientBottomColor + #FFF6EF + #573059 + #FFF6EF diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a9534970..efd5f4ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -510,4 +510,24 @@ Seed encryption (EXPERIMENTAL) Seed Offset Phrase (optional) + + preferred_theme + preferred_nightmode + preferred_locale + about_info + privacy_info + credits_info + + Settings + Interface + Information + Day / Night + + Style + + Classic + Baldaŭ + + + Failed to create QR for sharing! diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f1427dc0..11639113 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,27 +4,68 @@ + + +