From f83412f1a501a4e523965544a5c0a07f98a6ad69 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 13 Jul 2024 10:58:34 +0200 Subject: [PATCH 01/43] README.md: update Ubuntu recommendation to 24.04 LTS (Noble Numbat) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 85f5f4b49c..bba97e6bf0 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This project contains several sub-projects: ### PREREQUISITES FOR BUILDING -You'll need git, a Java 11 SDK and Gradle between 4.4 and 6.9.x for this. We'll assume Ubuntu 22.04 LTS (Jammy Jellyfish) +You'll need git, a Java 11 SDK and Gradle between 4.4 and 6.9.x for this. We'll assume Ubuntu 24.04 LTS (Noble Numbat) for the package installs, which comes with OpenJDK 11 and Gradle 4.4.1 out of the box. # first time only From 6d7c71b5991f9db963c6378afbad7627e4d581c0 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 13 Jul 2024 11:25:34 +0200 Subject: [PATCH 02/43] README.recover.md: update to wallet-tool from bitcoinj 0.16 --- wallet/README.recover.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/wallet/README.recover.md b/wallet/README.recover.md index 9f7f8d7016..c9f66c7be3 100644 --- a/wallet/README.recover.md +++ b/wallet/README.recover.md @@ -37,7 +37,7 @@ requiring your Ubuntu user password. On your PC, within your Linux shell, install the following Ubuntu packages: - sudo apt install openjdk-8-jdk android-tools-adb openssl git gradle + sudo apt install openjdk-11-jdk android-tools-adb openssl git gradle On your Android device, go to Settings > Developer options and enable "USB debugging". On most recent devices you need to go to Settings > About first and tap on "Build number" multiple times @@ -81,27 +81,26 @@ password. We need wallet-tool from bitcoinj. First, in a working directory, let's get bitcoinj: - git clone -b release-0.15 https://github.com/bitcoinj/bitcoinj.git + git clone -b release-0.16 https://github.com/bitcoinj/bitcoinj.git Make sure everything is compiled and ready to go by using once: - cd bitcoinj/tools - ./wallet-tool + gradle clean bitcoinj-tools:installDist Now use wallet-tool to sync the wallet from your backup: - ./wallet-tool reset --wallet=/tmp/bitcoin-wallet-decrypted-backup - ./wallet-tool sync --wallet=/tmp/bitcoin-wallet-decrypted-backup --debuglog + tools/build/install/wallet-tool/bin/wallet-tool reset --wallet=/tmp/bitcoin-wallet-decrypted-backup + tools/build/install/wallet-tool/bin/wallet-tool sync --wallet=/tmp/bitcoin-wallet-decrypted-backup --debuglog The sync process will take anywhere from a few minutes to hours. Wallet-tool will return to the shell prompt if its finished syncing. Have a look at the wallet: - ./wallet-tool dump --wallet=/tmp/bitcoin-wallet-decrypted-backup + tools/build/install/wallet-tool/bin/wallet-tool dump --wallet=/tmp/bitcoin-wallet-decrypted-backup Does the balance look right? You can see all transactions that ever touched your wallet. Now empty your entire wallet to the desired destination wallet if that's what you want: - ./wallet-tool send --wallet=/tmp/bitcoin-wallet-decrypted-backup --output=:ALL + tools/build/install/wallet-tool/bin/wallet-tool send --wallet=/tmp/bitcoin-wallet-decrypted-backup --output=:ALL If your wallet was protected by a spending PIN, you need to supply that PIN using the `--password=` option. @@ -112,7 +111,7 @@ are confirmed, you're done and you can skip the next paragraph to EPILOGUE. You can also get a list of your private keys, e.g. to claim coins other than Bitcoin which may sit on the same keys. To dump the private keys use: - ./wallet-tool dump --wallet=/tmp/bitcoin-wallet-decrypted-backup --dump-privkeys + tools/build/install/wallet-tool/bin/wallet-tool dump --wallet=/tmp/bitcoin-wallet-decrypted-backup --dump-privkeys Again, if your wallet was protected by a spending PIN, you need to supply that PIN using the `--password=` option. From 89bab239571f13c54866d3cd949465fbaf0adb4d Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 13 Jul 2024 11:27:50 +0200 Subject: [PATCH 03/43] README.recover.md: extend WSL instructions to Windows 11 --- wallet/README.recover.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/README.recover.md b/wallet/README.recover.md index c9f66c7be3..c80bf10403 100644 --- a/wallet/README.recover.md +++ b/wallet/README.recover.md @@ -24,7 +24,7 @@ refrain from sending your coins to a temporary wallet created in that environmen lost e.g. on a power outage or computer failure. Your desired destination wallet should already be set up and you should have one of its receiving addresses or a QR code at hand. -Alternatively, you can also use Ubuntu on Windows 10 64-bit, if you've fully upgraded to the Fall Creators Update (version 1709 or later). Open the Windows Start Menu, search for and start `Turn Windows features on or off`. Scroll down and tick the `Windows Subsystem for Linux` feature. Restart your computer when prompted. Next, install `Ubuntu` from the Windows Store. Once the download has completed, select `Launch`. It will prompt you to pick a username and complete the installation. From now on, you can start into a Linux shell by selecting `Ubuntu` from the Windows Start Menu. +Alternatively, you can also use Ubuntu on Windows 10/11 64-bit (fully upgraded). Open the Windows Start Menu, search for and start `Turn Windows features on or off`. Scroll down and tick the `Windows Subsystem for Linux` feature. Restart your computer when prompted. Next, install `Ubuntu` from the Windows Store. Once the download has completed, select `Launch`. It will prompt you to pick a username and complete the installation. From now on, you can start into a Linux shell by selecting `Ubuntu` from the Windows Start Menu. You should be at least a bit familiar with the Linux shell. Commands `in fixed-width font like this` are meant to be executed as a shell command. Before you execute each command by pressing return, From 7862404736fd5eabf22bdb2c662c09a87ffc771f Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 13 Jul 2024 11:42:54 +0200 Subject: [PATCH 04/43] README.recover.md: add missing directory change --- wallet/README.recover.md | 1 + 1 file changed, 1 insertion(+) diff --git a/wallet/README.recover.md b/wallet/README.recover.md index c80bf10403..88adc115de 100644 --- a/wallet/README.recover.md +++ b/wallet/README.recover.md @@ -82,6 +82,7 @@ password. We need wallet-tool from bitcoinj. First, in a working directory, let's get bitcoinj: git clone -b release-0.16 https://github.com/bitcoinj/bitcoinj.git + cd bitcoinj Make sure everything is compiled and ready to go by using once: From 241c3593503dc615e7f82ed95453300275acbcd7 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 12 Jul 2024 16:37:26 +0200 Subject: [PATCH 05/43] AndroidManifest.xml: use flag `android:showWhenLocked` to show activities in front of lock screen Previously, it was setting `FLAG_SHOW_WHEN_LOCKED` in code. --- wallet/AndroidManifest.xml | 6 ++++-- .../wallet/ui/AbstractWalletActivity.java | 13 ------------- .../schildbach/wallet/ui/RequestCoinsActivity.java | 5 ----- .../de/schildbach/wallet/ui/scan/ScanActivity.java | 5 ----- 4 files changed, 4 insertions(+), 25 deletions(-) diff --git a/wallet/AndroidManifest.xml b/wallet/AndroidManifest.xml index 87c2dedeaa..dd387990ed 100644 --- a/wallet/AndroidManifest.xml +++ b/wallet/AndroidManifest.xml @@ -155,7 +155,8 @@ android:configChanges="keyboard|keyboardHidden" android:label="@string/request_coins_activity_title" android:theme="@style/My.Theme.ChildActivity" - android:windowSoftInputMode="adjustResize" /> + android:windowSoftInputMode="adjustResize" + android:showWhenLocked="true" /> + android:windowSoftInputMode="stateAlwaysHidden" + android:showWhenLocked="true" /> = Build.VERSION_CODES.O_MR1) - super.setShowWhenLocked(showWhenLocked); - else if (showWhenLocked) - getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); - else - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); - } - public void startExternalDocument(final Uri url) { try { startActivity(new Intent(Intent.ACTION_VIEW, url)); diff --git a/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java b/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java index 0c5a472926..00b70815f7 100644 --- a/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java @@ -86,9 +86,4 @@ public boolean onMenuItemSelected(final MenuItem item) { } }); } - - @Override - public void onAttachedToWindow() { - setShowWhenLocked(true); - } } diff --git a/wallet/src/de/schildbach/wallet/ui/scan/ScanActivity.java b/wallet/src/de/schildbach/wallet/ui/scan/ScanActivity.java index d1b65cb531..6e789e744f 100644 --- a/wallet/src/de/schildbach/wallet/ui/scan/ScanActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/scan/ScanActivity.java @@ -216,11 +216,6 @@ public void onSurfaceTextureSizeChanged(final SurfaceTexture surface, final int public void onSurfaceTextureUpdated(final SurfaceTexture surface) { } - @Override - public void onAttachedToWindow() { - setShowWhenLocked(true); - } - @Override public void onBackPressed() { scannerView.setVisibility(View.GONE); From 7389d4f3b1943e05b509b5ce0472b55125d66010 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 12 Jul 2024 18:34:05 +0200 Subject: [PATCH 06/43] WalletActivity: simplify initialization of enter animation --- wallet/src/de/schildbach/wallet/ui/WalletActivity.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/wallet/src/de/schildbach/wallet/ui/WalletActivity.java b/wallet/src/de/schildbach/wallet/ui/WalletActivity.java index b5aafc30ef..36f5d6e70d 100644 --- a/wallet/src/de/schildbach/wallet/ui/WalletActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/WalletActivity.java @@ -193,9 +193,7 @@ protected void onEvent(final Void v) { }); viewModel.enterAnimation.observe(this, state -> { if (state == WalletActivityViewModel.EnterAnimationState.WAITING) { - // API level 26: enterAnimation.setCurrentPlayTime(0); - for (final Animator animation : enterAnimation.getChildAnimations()) - ((ValueAnimator) animation).setCurrentPlayTime(0); + enterAnimation.setCurrentPlayTime(0); } else if (state == WalletActivityViewModel.EnterAnimationState.ANIMATING) { reportFullyDrawn(); enterAnimation.start(); From e4feb3965aef06fce8b28fa6a4d593c240a26407 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 12 Jul 2024 18:40:15 +0200 Subject: [PATCH 07/43] AndroidManifest.xml, shortcuts.xml, shortcut_send_coins.xml, shortcut_request_coins.xml, shortcut_scan_qr.xml: remove obsolete `tools:targetApi` --- wallet/AndroidManifest.xml | 3 +-- wallet/res-prod/xml/shortcuts.xml | 4 +--- wallet/res/drawable/shortcut_request_coins.xml | 4 +--- wallet/res/drawable/shortcut_scan_qr.xml | 4 +--- wallet/res/drawable/shortcut_send_coins.xml | 4 +--- wallet/res/xml/shortcuts.xml | 4 +--- 6 files changed, 6 insertions(+), 17 deletions(-) diff --git a/wallet/AndroidManifest.xml b/wallet/AndroidManifest.xml index dd387990ed..9ede16916f 100644 --- a/wallet/AndroidManifest.xml +++ b/wallet/AndroidManifest.xml @@ -86,8 +86,7 @@ android:icon="@drawable/ic_app_color" android:label="@string/app_name" android:localeConfig="@xml/locale_config" - android:networkSecurityConfig="@xml/network_security_config" - tools:targetApi="24"> + android:networkSecurityConfig="@xml/network_security_config"> + xmlns:android="http://schemas.android.com/apk/res/android"> + xmlns:android="http://schemas.android.com/apk/res/android"> + xmlns:android="http://schemas.android.com/apk/res/android"> + xmlns:android="http://schemas.android.com/apk/res/android"> + xmlns:android="http://schemas.android.com/apk/res/android"> Date: Thu, 29 Aug 2024 12:48:09 +0200 Subject: [PATCH 08/43] Constants: start deprecation of Android versions below 9.0 (Pie) --- wallet/src/de/schildbach/wallet/Constants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/src/de/schildbach/wallet/Constants.java b/wallet/src/de/schildbach/wallet/Constants.java index ca90dd5980..c194a6081a 100644 --- a/wallet/src/de/schildbach/wallet/Constants.java +++ b/wallet/src/de/schildbach/wallet/Constants.java @@ -190,7 +190,7 @@ public final static class Files { /** Values less than this are considered not spendable in an economic way */ public static final Coin MIN_NONDUST = Coin.valueOf(546); // satoshis - public static final int SDK_DEPRECATED_BELOW = Build.VERSION_CODES.O; + public static final int SDK_DEPRECATED_BELOW = Build.VERSION_CODES.P; public static final String SECURITY_PATCH_INSECURE_BELOW = "2021-07-01"; public static final int NOTIFICATION_ID_CONNECTIVITY = 1; From 9bd1fd7b92fefdbbbda0a0ec02edd12f51d5f1e2 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 29 Aug 2024 12:49:49 +0200 Subject: [PATCH 09/43] Constants: update recommended minimum Android security patch level --- wallet/src/de/schildbach/wallet/Constants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/src/de/schildbach/wallet/Constants.java b/wallet/src/de/schildbach/wallet/Constants.java index c194a6081a..1256233b8d 100644 --- a/wallet/src/de/schildbach/wallet/Constants.java +++ b/wallet/src/de/schildbach/wallet/Constants.java @@ -191,7 +191,7 @@ public final static class Files { public static final Coin MIN_NONDUST = Coin.valueOf(546); // satoshis public static final int SDK_DEPRECATED_BELOW = Build.VERSION_CODES.P; - public static final String SECURITY_PATCH_INSECURE_BELOW = "2021-07-01"; + public static final String SECURITY_PATCH_INSECURE_BELOW = "2024-01-01"; public static final int NOTIFICATION_ID_CONNECTIVITY = 1; public static final int NOTIFICATION_ID_COINS_RECEIVED = 2; From 230c113112ff3da628e2f0b068b0728bf0a6717c Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 29 Aug 2024 23:45:56 +0200 Subject: [PATCH 10/43] build.gradle: update SDK Build Tools to 35.0.0 --- wallet/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/build.gradle b/wallet/build.gradle index b84db89840..5f07eb29a6 100644 --- a/wallet/build.gradle +++ b/wallet/build.gradle @@ -42,7 +42,7 @@ ext { android { compileSdkVersion 'android-34' - buildToolsVersion '34.0.0' + buildToolsVersion '35.0.0' defaultConfig { applicationId 'de.schildbach' From a2847d29b372f653f4fd108956d6dbbdb410787e Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 29 Aug 2024 23:48:00 +0200 Subject: [PATCH 11/43] build.gradle: update AndroidX Annotation to 1.8.2 --- wallet/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/build.gradle b/wallet/build.gradle index 5f07eb29a6..27d778df31 100644 --- a/wallet/build.gradle +++ b/wallet/build.gradle @@ -10,7 +10,7 @@ configurations { } dependencies { - implementation 'androidx.annotation:annotation:1.8.0' + implementation 'androidx.annotation:annotation:1.8.2' implementation 'androidx.core:core:1.13.1' implementation 'androidx.activity:activity:1.9.0' implementation 'androidx.fragment:fragment:1.7.1' From 51154c9d498aec80bb7ea923ffd370fa54277812 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 29 Aug 2024 23:49:51 +0200 Subject: [PATCH 12/43] build.gradle: update AndroidX Activity to 1.9.1 --- wallet/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/build.gradle b/wallet/build.gradle index 27d778df31..4e64c1e0c0 100644 --- a/wallet/build.gradle +++ b/wallet/build.gradle @@ -12,7 +12,7 @@ configurations { dependencies { implementation 'androidx.annotation:annotation:1.8.2' implementation 'androidx.core:core:1.13.1' - implementation 'androidx.activity:activity:1.9.0' + implementation 'androidx.activity:activity:1.9.1' implementation 'androidx.fragment:fragment:1.7.1' implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'androidx.cardview:cardview:1.0.0' From 7bceab1a969c171544394630e386025e08d11954 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 29 Aug 2024 23:53:19 +0200 Subject: [PATCH 13/43] build.gradle: update ZXing to 3.5.3 --- wallet/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/build.gradle b/wallet/build.gradle index 4e64c1e0c0..c0ae289d75 100644 --- a/wallet/build.gradle +++ b/wallet/build.gradle @@ -25,7 +25,7 @@ dependencies { annotationProcessor "androidx.room:room-compiler:2.6.1" implementation 'org.bitcoinj:bitcoinj-core:0.16.3' implementation 'com.google.guava:guava:33.1.0-android' - implementation 'com.google.zxing:core:3.5.2' + implementation 'com.google.zxing:core:3.5.3' //noinspection GradleDependency implementation 'com.squareup.okhttp3:okhttp:3.14.9' //noinspection GradleDependency From f810547f48f5dab0c7b2b550983649b1b1f55e67 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 30 Aug 2024 00:12:47 +0200 Subject: [PATCH 14/43] checkpoints.txt: add recent checkpoints --- wallet/assets-prod/checkpoints.txt | 14 ++- wallet/assets/checkpoints.txt | 147 ++++++++++++++++++++++++++++- 2 files changed, 159 insertions(+), 2 deletions(-) diff --git a/wallet/assets-prod/checkpoints.txt b/wallet/assets-prod/checkpoints.txt index 5c779db545..8418f0e5de 100644 --- a/wallet/assets-prod/checkpoints.txt +++ b/wallet/assets-prod/checkpoints.txt @@ -1,6 +1,6 @@ TXT CHECKPOINTS 1 0 -413 +425 AAAAAAAAB+EH4QfhAAAH4AEAAABjl7tqvU/FIcDT9gcbVlA4nwtFUbxAtOawZzBpAAAAAKzkcK7NqciBjI/ldojNKncrWleVSgDfBCCn3VRrbSxXaw5/Sf//AB0z8Bkv AAAAAAAAD8EPwQ/BAAAPwAEAAADfP83Sx8MZ9RsrnZCvqzAwqB2Ma+ZesNAJrTfwAAAAACwESaNKhvRgz6WuE7UFdFk1xwzfRY/OIdIOPzX5yaAdjnWUSf//AB0GrNq5 AAAAAAAAF6EXoRehAAAXoAEAAADonWzAaUAKd30XT3NnHKobZMnLOuHdzm/xtehsAAAAAD8cUJA6NBIHHcqPHLc4IrfHw+6mjCGu3e+wRO81EvpnMVqrSf//AB1ffy8G @@ -414,3 +414,15 @@ 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 diff --git a/wallet/assets/checkpoints.txt b/wallet/assets/checkpoints.txt index 0815b830cb..312605ad1c 100644 --- a/wallet/assets/checkpoints.txt +++ b/wallet/assets/checkpoints.txt @@ -1,6 +1,6 @@ TXT CHECKPOINTS 1 0 -1280 +1425 AAAAAAAAB+EH4QfhAAAH4AEAAAApmwX6UCEnJcYIKTa7HO3pFkqqNhAzJVBMdEuGAAAAAPSAvVCBUypCbBW/OqU0oIF7ISF84h2spOqHrFCWN9Zw6r6/T///AB0E5oOO AAAAAAAAD8QPxA/EAAAPwAEAAADHtJ8Nq3z30grJ9lTH6bLhKSHX+MxmkZn8z5wuAAAAAK0gXcQFtYSj/IB2KZ38+itS1Da0Dn/3XosOFJntz7A8OsC/T8D/Pxwf0no+ AAAAAAAALUAtQC1AAAAXoAEAAABwvpBfmfp76xvcOzhdR+OPnJ2aLD5znGpD8LkJAAAAALkv0fxOJYZ1dMLCyDV+3AB0y+BW8lP5/8xBMMqLbX7u+gPDT/D/DxwDvhrh @@ -1281,3 +1281,148 @@ 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 From 941a3d9bd5abbc80557e9dafe0eb9204f363bf66 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 30 Aug 2024 00:19:46 +0200 Subject: [PATCH 15/43] 10.16 --- wallet/AndroidManifest.xml | 4 ++-- wallet/CHANGES | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wallet/AndroidManifest.xml b/wallet/AndroidManifest.xml index 9ede16916f..bcfd0241ac 100644 --- a/wallet/AndroidManifest.xml +++ b/wallet/AndroidManifest.xml @@ -4,8 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" package="de.schildbach.wallet" android:installLocation="internalOnly" - android:versionCode="101500" - android:versionName="10.15"> + android:versionCode="101600" + android:versionName="10.16"> Date: Wed, 16 Oct 2024 11:36:50 +0200 Subject: [PATCH 16/43] build.gradle: update AndroidX Activity to 1.9.2 --- wallet/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/build.gradle b/wallet/build.gradle index c0ae289d75..0d3aeee964 100644 --- a/wallet/build.gradle +++ b/wallet/build.gradle @@ -12,7 +12,7 @@ configurations { dependencies { implementation 'androidx.annotation:annotation:1.8.2' implementation 'androidx.core:core:1.13.1' - implementation 'androidx.activity:activity:1.9.1' + implementation 'androidx.activity:activity:1.9.2' implementation 'androidx.fragment:fragment:1.7.1' implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'androidx.cardview:cardview:1.0.0' From d395106a4a857b1d898da25e110c67005587ad27 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 18 Oct 2024 15:14:35 +0200 Subject: [PATCH 17/43] BlockchainService: swallow ForegroundServiceStartNotAllowedException when starting blockchain sync However, the exception is logged. --- .../wallet/service/BlockchainService.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/wallet/src/de/schildbach/wallet/service/BlockchainService.java b/wallet/src/de/schildbach/wallet/service/BlockchainService.java index 4a27e3c3f1..7c8cdea1d3 100644 --- a/wallet/src/de/schildbach/wallet/service/BlockchainService.java +++ b/wallet/src/de/schildbach/wallet/service/BlockchainService.java @@ -859,20 +859,28 @@ private void startForeground(final int numPeers) { connectivityNotification.setSmallIcon(R.drawable.stat_notify_peers, Math.min(numPeers, 4)); connectivityNotification.setContentText(getString(R.string.notification_peers_connected_msg, numPeers)); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) - startForeground(Constants.NOTIFICATION_ID_CONNECTIVITY, connectivityNotification.build(), - ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); - else - startForeground(Constants.NOTIFICATION_ID_CONNECTIVITY, connectivityNotification.build()); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + startForeground(Constants.NOTIFICATION_ID_CONNECTIVITY, connectivityNotification.build(), + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); + else + startForeground(Constants.NOTIFICATION_ID_CONNECTIVITY, connectivityNotification.build()); + } catch (final ForegroundServiceStartNotAllowedException x) { + log.warn("exception when starting blockchain sync", x); + } } private void startForegroundProgress(final int blocksToDownload, final int blocksLeft) { connectivityNotification.setProgress(blocksToDownload, blocksToDownload - blocksLeft, false); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) - startForeground(Constants.NOTIFICATION_ID_CONNECTIVITY, connectivityNotification.build(), - ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); - else - startForeground(Constants.NOTIFICATION_ID_CONNECTIVITY, connectivityNotification.build()); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + startForeground(Constants.NOTIFICATION_ID_CONNECTIVITY, connectivityNotification.build(), + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); + else + startForeground(Constants.NOTIFICATION_ID_CONNECTIVITY, connectivityNotification.build()); + } catch (final ForegroundServiceStartNotAllowedException x) { + log.warn("exception when starting blockchain sync", x); + } } @MainThread From 2bc2ec986f197bffd0eda54aa5371f22d4c49c03 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 18 Oct 2024 15:26:32 +0200 Subject: [PATCH 18/43] BlockchainService: stop self if system indicates a time-out --- .../src/de/schildbach/wallet/service/BlockchainService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wallet/src/de/schildbach/wallet/service/BlockchainService.java b/wallet/src/de/schildbach/wallet/service/BlockchainService.java index 7c8cdea1d3..a25edb9b63 100644 --- a/wallet/src/de/schildbach/wallet/service/BlockchainService.java +++ b/wallet/src/de/schildbach/wallet/service/BlockchainService.java @@ -791,6 +791,12 @@ public void onTrimMemory(final int level) { } } + @Override + public void onTimeout(final int startId) { + log.info("onTimeout({}) called, trying to stop", startId); + stopSelf(); + } + @Nullable public TransactionBroadcast broadcastTransaction(final Transaction tx) { if (peerGroup != null) { From dca209edec6341c3a1e620e14a19ed8f9b322aa3 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 19 Oct 2024 17:17:55 +0200 Subject: [PATCH 19/43] request_coins_fragment.xml: fix layout of QR code bar --- .../layout-land/request_coins_fragment.xml | 10 ++++---- wallet/res/layout/request_coins_fragment.xml | 23 +++++++------------ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/wallet/res/layout-land/request_coins_fragment.xml b/wallet/res/layout-land/request_coins_fragment.xml index 267f25c604..2d27477b2c 100644 --- a/wallet/res/layout-land/request_coins_fragment.xml +++ b/wallet/res/layout-land/request_coins_fragment.xml @@ -16,10 +16,8 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@color/bg_level0" - android:paddingBottom="@dimen/list_entry_padding_vertical" - android:paddingLeft="@dimen/list_entry_padding_horizontal" - android:paddingRight="@dimen/list_entry_padding_horizontal" - android:paddingTop="@dimen/list_entry_padding_vertical" + android:paddingLeft="@dimen/list_entry_padding_horizontal_lax" + android:paddingRight="@dimen/list_entry_padding_horizontal_lax" android:orientation="vertical"> diff --git a/wallet/res/layout/request_coins_fragment.xml b/wallet/res/layout/request_coins_fragment.xml index 47b4c2d460..8ec197fdba 100644 --- a/wallet/res/layout/request_coins_fragment.xml +++ b/wallet/res/layout/request_coins_fragment.xml @@ -17,31 +17,24 @@ android:background="@color/bg_level0" android:baselineAligned="false" android:orientation="horizontal" - android:paddingBottom="@dimen/list_entry_padding_vertical_lax" - android:paddingLeft="@dimen/list_entry_padding_horizontal_lax" - android:paddingRight="@dimen/list_entry_padding_horizontal" - android:paddingTop="@dimen/list_entry_padding_vertical_lax"> + android:paddingLeft="@dimen/list_entry_padding_horizontal" + android:paddingRight="@dimen/list_entry_padding_horizontal"> - - - - + android:paddingTop="@dimen/list_entry_padding_vertical_lax" /> From 6f17e425ef8028cc716328848f49a3ccb85b58a3 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 19 Oct 2024 14:30:27 +0200 Subject: [PATCH 20/43] AbstractWalletActivity: support edge-to-edge layout Enable by default, also for Android 14 and below. --- wallet/res/layout/address_book_content.xml | 1 + wallet/res/layout/block_list_fragment.xml | 3 ++- wallet/res/layout/exchange_rates_fragment.xml | 3 ++- wallet/res/layout/network_monitor_content.xml | 1 + wallet/res/layout/peer_list_fragment.xml | 3 ++- wallet/res/layout/sending_addresses_fragment.xml | 3 ++- .../res/layout/wallet_activity_onepane_horizontal.xml | 3 ++- .../res/layout/wallet_activity_onepane_vertical.xml | 3 ++- wallet/res/layout/wallet_activity_twopanes.xml | 3 ++- wallet/res/layout/wallet_addresses_fragment.xml | 3 ++- .../schildbach/wallet/ui/AbstractWalletActivity.java | 4 ++++ .../de/schildbach/wallet/ui/AddressBookActivity.java | 8 +++++++- .../schildbach/wallet/ui/ExchangeRatesFragment.java | 5 +++++ .../de/schildbach/wallet/ui/RequestCoinsFragment.java | 5 +++++ .../wallet/ui/SendingAddressesFragment.java | 5 +++++ .../src/de/schildbach/wallet/ui/WalletActivity.java | 8 ++++++++ .../schildbach/wallet/ui/WalletAddressesFragment.java | 5 +++++ .../wallet/ui/WalletTransactionsFragment.java | 6 ++++++ .../wallet/ui/monitor/BlockListFragment.java | 5 +++++ .../wallet/ui/monitor/NetworkMonitorActivity.java | 7 ++++++- .../wallet/ui/monitor/PeerListFragment.java | 5 +++++ .../wallet/ui/preference/PreferenceActivity.java | 11 +++++++++++ .../schildbach/wallet/ui/send/SendCoinsFragment.java | 5 +++++ .../wallet/ui/send/SweepWalletFragment.java | 5 +++++ 24 files changed, 100 insertions(+), 10 deletions(-) diff --git a/wallet/res/layout/address_book_content.xml b/wallet/res/layout/address_book_content.xml index 25885629ac..56aea1f943 100644 --- a/wallet/res/layout/address_book_content.xml +++ b/wallet/res/layout/address_book_content.xml @@ -1,6 +1,7 @@ + android:scrollbars="vertical" + android:clipToPadding="false" /> diff --git a/wallet/res/layout/exchange_rates_fragment.xml b/wallet/res/layout/exchange_rates_fragment.xml index da4d6710b9..cd8e684cfe 100644 --- a/wallet/res/layout/exchange_rates_fragment.xml +++ b/wallet/res/layout/exchange_rates_fragment.xml @@ -23,5 +23,6 @@ android:id="@+id/exchange_rates_list" android:layout_width="match_parent" android:layout_height="match_parent" - android:scrollbars="vertical" /> + android:scrollbars="vertical" + android:clipToPadding="false" /> diff --git a/wallet/res/layout/network_monitor_content.xml b/wallet/res/layout/network_monitor_content.xml index a603acd188..a2c85c5f4a 100644 --- a/wallet/res/layout/network_monitor_content.xml +++ b/wallet/res/layout/network_monitor_content.xml @@ -1,6 +1,7 @@ + android:scrollbars="vertical" + android:clipToPadding="false" /> diff --git a/wallet/res/layout/sending_addresses_fragment.xml b/wallet/res/layout/sending_addresses_fragment.xml index 932cdcd1b8..bcb136d798 100644 --- a/wallet/res/layout/sending_addresses_fragment.xml +++ b/wallet/res/layout/sending_addresses_fragment.xml @@ -23,5 +23,6 @@ android:id="@+id/sending_addresses_list" android:layout_width="match_parent" android:layout_height="match_parent" - android:scrollbars="vertical" /> + android:scrollbars="vertical" + android:clipToPadding="false" /> diff --git a/wallet/res/layout/wallet_activity_onepane_horizontal.xml b/wallet/res/layout/wallet_activity_onepane_horizontal.xml index 70d9214171..76b4bb9129 100644 --- a/wallet/res/layout/wallet_activity_onepane_horizontal.xml +++ b/wallet/res/layout/wallet_activity_onepane_horizontal.xml @@ -3,7 +3,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical"> + android:orientation="vertical" + android:tag="inset_top"> + android:orientation="vertical" + android:tag="inset_top"> + android:orientation="vertical" + android:tag="inset_top"> + android:scrollbars="vertical" + android:clipToPadding="false" /> diff --git a/wallet/src/de/schildbach/wallet/ui/AbstractWalletActivity.java b/wallet/src/de/schildbach/wallet/ui/AbstractWalletActivity.java index 8285d0b0f1..0c3b59e471 100644 --- a/wallet/src/de/schildbach/wallet/ui/AbstractWalletActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/AbstractWalletActivity.java @@ -20,9 +20,12 @@ import android.app.ActivityManager.TaskDescription; import android.content.ActivityNotFoundException; import android.content.Intent; +import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.view.MenuItem; +import androidx.activity.EdgeToEdge; +import androidx.activity.SystemBarStyle; import androidx.fragment.app.FragmentActivity; import de.schildbach.wallet.R; import de.schildbach.wallet.WalletApplication; @@ -41,6 +44,7 @@ public abstract class AbstractWalletActivity extends FragmentActivity { @Override protected void onCreate(final Bundle savedInstanceState) { application = (WalletApplication) getApplication(); + EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT)); setTaskDescription(new TaskDescription(null, null, getColor(R.color.bg_action_bar))); super.onCreate(savedInstanceState); } diff --git a/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java b/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java index 68b5e69aa0..76aacd9d5d 100644 --- a/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java @@ -98,6 +98,11 @@ protected void onCreate(final Bundle savedInstanceState) { setContentView(R.layout.address_book_content); final ViewPager2 pager = findViewById(R.id.address_book_pager); final ViewPagerTabs pagerTabs = findViewById(R.id.address_book_pager_tabs); + findViewById(R.id.address_book_group).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), insets.getSystemWindowInsetTop(), v.getPaddingRight(), + v.getPaddingBottom()); + return insets; + }); pagerTabs.addTabLabels(TAB_LABELS); @@ -141,9 +146,10 @@ protected void onEvent(final Void v) { if (twoPanes) { final RecyclerView recyclerView = (RecyclerView) pager.getChildAt(0); recyclerView.setClipToPadding(false); + recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { final int width = recyclerView.getWidth(); - recyclerView.setPadding(0, 0, width / 2, 0); + recyclerView.setPadding(0, recyclerView.getPaddingTop(), width / 2, recyclerView.getPaddingBottom()); pager.setCurrentItem(0); }); pager.setUserInputEnabled(false); diff --git a/wallet/src/de/schildbach/wallet/ui/ExchangeRatesFragment.java b/wallet/src/de/schildbach/wallet/ui/ExchangeRatesFragment.java index 135b59562e..c37242f857 100644 --- a/wallet/src/de/schildbach/wallet/ui/ExchangeRatesFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/ExchangeRatesFragment.java @@ -163,6 +163,11 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(activity)); recyclerView.setAdapter(adapter); + recyclerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), + insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()); + return insets; + }); return view; } diff --git a/wallet/src/de/schildbach/wallet/ui/RequestCoinsFragment.java b/wallet/src/de/schildbach/wallet/ui/RequestCoinsFragment.java index f7d3d8a2f2..3c295ccac4 100644 --- a/wallet/src/de/schildbach/wallet/ui/RequestCoinsFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/RequestCoinsFragment.java @@ -203,6 +203,11 @@ public boolean onMenuItemSelected(final MenuItem item) { public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.request_coins_fragment, container, false); + view.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), + insets.getSystemWindowInsetRight(), v.getPaddingBottom()); + return insets; + }); qrView = view.findViewById(R.id.request_coins_qr); diff --git a/wallet/src/de/schildbach/wallet/ui/SendingAddressesFragment.java b/wallet/src/de/schildbach/wallet/ui/SendingAddressesFragment.java index 0bfe49f9dd..1c9dac6356 100644 --- a/wallet/src/de/schildbach/wallet/ui/SendingAddressesFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/SendingAddressesFragment.java @@ -124,6 +124,11 @@ public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(activity)); recyclerView.setAdapter(adapter); + recyclerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), + insets.getSystemWindowInsetBottom()); + return insets; + }); return view; } diff --git a/wallet/src/de/schildbach/wallet/ui/WalletActivity.java b/wallet/src/de/schildbach/wallet/ui/WalletActivity.java index 36f5d6e70d..5c379dd59b 100644 --- a/wallet/src/de/schildbach/wallet/ui/WalletActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/WalletActivity.java @@ -128,6 +128,14 @@ protected void onCreate(final Bundle savedInstanceState) { setContentView(R.layout.wallet_content); contentView = findViewById(android.R.id.content); + final View insetTopView = contentView.findViewWithTag("inset_top"); + if (insetTopView != null) { + insetTopView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), insets.getSystemWindowInsetTop(), + v.getPaddingRight(), v.getPaddingBottom()); + return insets; + }); + } exchangeRatesFragment = findViewById(R.id.wallet_main_twopanes_exchange_rates); levitateView = contentView.findViewWithTag("levitate"); diff --git a/wallet/src/de/schildbach/wallet/ui/WalletAddressesFragment.java b/wallet/src/de/schildbach/wallet/ui/WalletAddressesFragment.java index f641b8915e..f231f7fb8a 100644 --- a/wallet/src/de/schildbach/wallet/ui/WalletAddressesFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/WalletAddressesFragment.java @@ -132,6 +132,11 @@ public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(activity)); recyclerView.setAdapter(adapter); + recyclerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), + insets.getSystemWindowInsetBottom()); + return insets; + }); return view; } diff --git a/wallet/src/de/schildbach/wallet/ui/WalletTransactionsFragment.java b/wallet/src/de/schildbach/wallet/ui/WalletTransactionsFragment.java index 78a2e379c5..ab7ad1fd7a 100644 --- a/wallet/src/de/schildbach/wallet/ui/WalletTransactionsFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/WalletTransactionsFragment.java @@ -233,6 +233,12 @@ else if (position == parent.getAdapter().getItemCount() - 1) outRect.bottom += PADDING; } }); + recyclerView.setOnApplyWindowInsetsListener((v, insets) -> { + final boolean hasBottomBar = !getResources().getBoolean(R.bool.wallet_actions_top); + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), + hasBottomBar ? v.getPaddingBottom() : insets.getSystemWindowInsetBottom()); + return insets; + }); return view; } diff --git a/wallet/src/de/schildbach/wallet/ui/monitor/BlockListFragment.java b/wallet/src/de/schildbach/wallet/ui/monitor/BlockListFragment.java index f057b87fb2..1b7cde808e 100644 --- a/wallet/src/de/schildbach/wallet/ui/monitor/BlockListFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/monitor/BlockListFragment.java @@ -112,6 +112,11 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new StickToTopLinearLayoutManager(activity)); recyclerView.setAdapter(adapter); + recyclerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), + insets.getSystemWindowInsetBottom()); + return insets; + }); return view; } diff --git a/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java b/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java index 0df864a11c..6cc5ff5d6c 100644 --- a/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java @@ -44,6 +44,11 @@ protected void onCreate(final Bundle savedInstanceState) { setContentView(R.layout.network_monitor_content); final ViewPager2 pager = findViewById(R.id.network_monitor_pager); final ViewPagerTabs pagerTabs = findViewById(R.id.network_monitor_pager_tabs); + findViewById(R.id.network_monitor_group).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), insets.getSystemWindowInsetTop(), v.getPaddingRight(), + v.getPaddingBottom()); + return insets; + }); pagerTabs.addTabLabels(TAB_LABELS); @@ -54,7 +59,7 @@ protected void onCreate(final Bundle savedInstanceState) { recyclerView.setClipToPadding(false); recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { final int width = recyclerView.getWidth(); - recyclerView.setPadding(0, 0, width / 2, 0); + recyclerView.setPadding(0, recyclerView.getPaddingTop(), width / 2, recyclerView.getPaddingBottom()); pager.setCurrentItem(0); }); pager.setUserInputEnabled(false); diff --git a/wallet/src/de/schildbach/wallet/ui/monitor/PeerListFragment.java b/wallet/src/de/schildbach/wallet/ui/monitor/PeerListFragment.java index d0068e0022..612d8b27cb 100644 --- a/wallet/src/de/schildbach/wallet/ui/monitor/PeerListFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/monitor/PeerListFragment.java @@ -90,6 +90,11 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(activity)); recyclerView.setAdapter(adapter); + recyclerView.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), v.getPaddingRight(), + insets.getSystemWindowInsetBottom()); + return insets; + }); return view; } diff --git a/wallet/src/de/schildbach/wallet/ui/preference/PreferenceActivity.java b/wallet/src/de/schildbach/wallet/ui/preference/PreferenceActivity.java index c51ac0222b..7c531317d4 100644 --- a/wallet/src/de/schildbach/wallet/ui/preference/PreferenceActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/preference/PreferenceActivity.java @@ -17,6 +17,7 @@ package de.schildbach.wallet.ui.preference; +import android.os.Bundle; import android.view.MenuItem; import de.schildbach.wallet.R; @@ -26,6 +27,16 @@ * @author Andreas Schildbach */ public final class PreferenceActivity extends android.preference.PreferenceActivity { + @Override + public void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + findViewById(android.R.id.content).setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(v.getPaddingLeft(), insets.getSystemWindowInsetTop(), v.getPaddingRight(), + v.getPaddingBottom()); + return insets; + }); + } + @Override public void onBuildHeaders(final List
target) { loadHeadersFromResource(R.xml.preference_headers, target); diff --git a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java index 7ff65863a7..83852bb8fa 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java @@ -479,6 +479,11 @@ else if (paymentRequest != null) public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.send_coins_fragment, container, false); + view.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), + insets.getSystemWindowInsetRight(), v.getPaddingBottom()); + return insets; + }); payeeGroup = view.findViewById(R.id.send_coins_payee_group); diff --git a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java index fe7fa92593..f09c63ea2d 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java @@ -268,6 +268,11 @@ public boolean onMenuItemSelected(final MenuItem item) { public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.sweep_wallet_fragment, container, false); + view.setOnApplyWindowInsetsListener((v, insets) -> { + v.setPadding(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), + insets.getSystemWindowInsetRight(), v.getPaddingBottom()); + return insets; + }); messageView = view.findViewById(R.id.sweep_wallet_fragment_message); From 65b4f96f3f6b629516afd3d9267641e751692751 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 19 Oct 2024 21:41:33 +0200 Subject: [PATCH 21/43] 10.17 --- wallet/AndroidManifest.xml | 4 ++-- wallet/CHANGES | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/wallet/AndroidManifest.xml b/wallet/AndroidManifest.xml index bcfd0241ac..fe0264354a 100644 --- a/wallet/AndroidManifest.xml +++ b/wallet/AndroidManifest.xml @@ -4,8 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" package="de.schildbach.wallet" android:installLocation="internalOnly" - android:versionCode="101600" - android:versionName="10.16"> + android:versionCode="101700" + android:versionName="10.17"> Date: Sun, 20 Oct 2024 14:22:10 +0200 Subject: [PATCH 22/43] AbstractWalletActivity, WalletActivity: set navigation bar theme Set all activities to light navigation bar theme, except for main wallet which is dark. --- .../src/de/schildbach/wallet/ui/AbstractWalletActivity.java | 3 ++- wallet/src/de/schildbach/wallet/ui/WalletActivity.java | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/wallet/src/de/schildbach/wallet/ui/AbstractWalletActivity.java b/wallet/src/de/schildbach/wallet/ui/AbstractWalletActivity.java index 0c3b59e471..252f99cb5c 100644 --- a/wallet/src/de/schildbach/wallet/ui/AbstractWalletActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/AbstractWalletActivity.java @@ -44,7 +44,8 @@ public abstract class AbstractWalletActivity extends FragmentActivity { @Override protected void onCreate(final Bundle savedInstanceState) { application = (WalletApplication) getApplication(); - EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT)); + EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT), SystemBarStyle.light(Color.TRANSPARENT, + Color.TRANSPARENT)); setTaskDescription(new TaskDescription(null, null, getColor(R.color.bg_action_bar))); super.onCreate(savedInstanceState); } diff --git a/wallet/src/de/schildbach/wallet/ui/WalletActivity.java b/wallet/src/de/schildbach/wallet/ui/WalletActivity.java index 5c379dd59b..711addbc1b 100644 --- a/wallet/src/de/schildbach/wallet/ui/WalletActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/WalletActivity.java @@ -25,6 +25,7 @@ import android.animation.ValueAnimator; import android.content.Intent; import android.content.res.Resources; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.nfc.NdefMessage; @@ -37,6 +38,8 @@ import android.view.MenuItem; import android.view.View; import android.view.animation.DecelerateInterpolator; +import androidx.activity.EdgeToEdge; +import androidx.activity.SystemBarStyle; import androidx.activity.result.ActivityResultLauncher; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.app.ActivityOptionsCompat; @@ -119,6 +122,7 @@ protected void error(final int messageResId, final Object... messageArgs) { @Override protected void onCreate(final Bundle savedInstanceState) { + EdgeToEdge.enable(this, SystemBarStyle.dark(Color.TRANSPARENT), SystemBarStyle.dark(Color.TRANSPARENT)); super.onCreate(savedInstanceState); this.application = getWalletApplication(); this.config = application.getConfiguration(); From f524954ca8c75ea1482f5981ea0c90d2f848801d Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sun, 20 Oct 2024 16:14:38 +0200 Subject: [PATCH 23/43] divider_dark.xml: make a bit darker It matches better with system provided dividers. --- wallet/res/drawable/divider_dark.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wallet/res/drawable/divider_dark.xml b/wallet/res/drawable/divider_dark.xml index 9fc439d2a0..6adc680d87 100644 --- a/wallet/res/drawable/divider_dark.xml +++ b/wallet/res/drawable/divider_dark.xml @@ -6,5 +6,5 @@ android:height="1dp" android:width="1dp" /> + android:color="#2fff" /> From 0fc0d974efb90a56b76debb192c89eadaa7acef1 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sun, 20 Oct 2024 15:51:46 +0200 Subject: [PATCH 24/43] WalletActivity: fix insets to account for system navigation --- .../res/layout/wallet_activity_bottom_include.xml | 3 ++- .../de/schildbach/wallet/ui/WalletActivity.java | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/wallet/res/layout/wallet_activity_bottom_include.xml b/wallet/res/layout/wallet_activity_bottom_include.xml index bcdfcb8ee9..b63e331d61 100644 --- a/wallet/res/layout/wallet_activity_bottom_include.xml +++ b/wallet/res/layout/wallet_activity_bottom_include.xml @@ -7,7 +7,8 @@ android:divider="@drawable/divider_dark" android:animateLayoutChanges="true" android:orientation="vertical" - android:showDividers="middle"> + android:showDividers="middle" + android:tag="inset_bottom"> { + final int insetBottom = insets.getSystemWindowInsetBottom(); + if (insetBottom > 0 && v instanceof LinearLayout) { + final LinearLayout layout = (LinearLayout) v; + layout.setShowDividers(layout.getShowDividers() | LinearLayout.SHOW_DIVIDER_END); + } + v.setPadding(v.getPaddingLeft(), v.getPaddingTop(), + v.getPaddingRight(), insets.getSystemWindowInsetBottom()); + return insets; + }); + } + exchangeRatesFragment = findViewById(R.id.wallet_main_twopanes_exchange_rates); levitateView = contentView.findViewWithTag("levitate"); From 8bb3db0bef880878082f7adb3cf7cf2ad2b55bba Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sun, 20 Oct 2024 16:10:07 +0200 Subject: [PATCH 25/43] SendCoinsFragment: fix insets to account for system navigation --- .../de/schildbach/wallet/ui/send/SendCoinsFragment.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java index 83852bb8fa..ba7e3a6eb1 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java @@ -52,6 +52,7 @@ import android.widget.CheckBox; import android.widget.EditText; import android.widget.Filter; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; @@ -480,8 +481,13 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.send_coins_fragment, container, false); view.setOnApplyWindowInsetsListener((v, insets) -> { + final int insetBottom = insets.getSystemWindowInsetBottom(); + if (insetBottom > 0) { + final LinearLayout layout = (LinearLayout) v; + layout.setShowDividers(layout.getShowDividers() | LinearLayout.SHOW_DIVIDER_END); + } v.setPadding(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), - insets.getSystemWindowInsetRight(), v.getPaddingBottom()); + insets.getSystemWindowInsetRight(), insetBottom); return insets; }); From 637740101a2585228f6448e2a21322d07e2dbf0e Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sun, 20 Oct 2024 16:10:32 +0200 Subject: [PATCH 26/43] SweepWalletFragment: fix insets to account for system navigation --- .../de/schildbach/wallet/ui/send/SweepWalletFragment.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java index f09c63ea2d..8de102ffaf 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java @@ -34,6 +34,7 @@ import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.EditText; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.Nullable; @@ -269,8 +270,13 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.sweep_wallet_fragment, container, false); view.setOnApplyWindowInsetsListener((v, insets) -> { + final int insetBottom = insets.getSystemWindowInsetBottom(); + if (insetBottom > 0) { + final LinearLayout layout = (LinearLayout) v; + layout.setShowDividers(layout.getShowDividers() | LinearLayout.SHOW_DIVIDER_END); + } v.setPadding(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), - insets.getSystemWindowInsetRight(), v.getPaddingBottom()); + insets.getSystemWindowInsetRight(), insetBottom); return insets; }); From 98249fe18d84c75caa0b800e2b66c0dbd247e937 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sun, 20 Oct 2024 17:25:19 +0200 Subject: [PATCH 27/43] styles.xml: fix press animation for buttons in the wallet actions bar --- wallet/res/values/styles.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/wallet/res/values/styles.xml b/wallet/res/values/styles.xml index 765528ac40..5aa9e97d68 100644 --- a/wallet/res/values/styles.xml +++ b/wallet/res/values/styles.xml @@ -70,6 +70,7 @@ @color/fg_on_dark_bg_network @dimen/font_size_tiny bold + ?android:attr/selectableItemBackground - - - - - - - - - - - diff --git a/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java b/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java index 56c5c5de23..8f45e263e6 100644 --- a/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java @@ -104,6 +104,7 @@ protected void onCreate(final Bundle savedInstanceState) { final FragmentManager fragmentManager = getSupportFragmentManager(); setContentView(R.layout.address_book_content); + setActionBar(findViewById(R.id.address_book_appbar)); getActionBar().setDisplayHomeAsUpEnabled(true); final ViewPager2 pager = findViewById(R.id.address_book_pager); diff --git a/wallet/src/de/schildbach/wallet/ui/ExchangeRatesActivity.java b/wallet/src/de/schildbach/wallet/ui/ExchangeRatesActivity.java index a2531e1273..45106e669d 100644 --- a/wallet/src/de/schildbach/wallet/ui/ExchangeRatesActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/ExchangeRatesActivity.java @@ -21,6 +21,9 @@ import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import de.schildbach.wallet.R; /** @@ -34,6 +37,12 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.exchange_rates_content); + setActionBar(findViewById(R.id.exchange_rates_appbar)); getActionBar().setDisplayHomeAsUpEnabled(true); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { + final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(v.getPaddingLeft(), insets.top, v.getPaddingRight(), v.getPaddingBottom()); + return windowInsets; + }); } } diff --git a/wallet/src/de/schildbach/wallet/ui/ExchangeRatesFragment.java b/wallet/src/de/schildbach/wallet/ui/ExchangeRatesFragment.java index 6f492719c0..7b89bd96fd 100644 --- a/wallet/src/de/schildbach/wallet/ui/ExchangeRatesFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/ExchangeRatesFragment.java @@ -168,7 +168,7 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe recyclerView.setAdapter(adapter); ViewCompat.setOnApplyWindowInsetsListener(recyclerView, (v, windowInsets) -> { final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, insets.top, insets.right, insets.bottom); + v.setPadding(insets.left, v.getPaddingTop(), insets.right, insets.bottom); return windowInsets; }); return view; diff --git a/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java b/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java index 7c139e1f7a..276c6032a0 100644 --- a/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java @@ -27,7 +27,10 @@ import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; import androidx.annotation.Nullable; +import androidx.core.graphics.Insets; import androidx.core.view.MenuProvider; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.lifecycle.ViewModelProvider; import de.schildbach.wallet.R; import org.bitcoinj.script.Script; @@ -62,7 +65,13 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); log.info("Referrer: {}", getReferrer()); setContentView(R.layout.request_coins_content); + setActionBar(findViewById(R.id.request_coins_appbar)); getActionBar().setDisplayHomeAsUpEnabled(true); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { + final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(v.getPaddingLeft(), insets.top, v.getPaddingRight(), v.getPaddingBottom()); + return windowInsets; + }); viewModel = new ViewModelProvider(this).get(RequestCoinsActivityViewModel.class); viewModel.showHelpDialog.observe(this, new Event.Observer() { diff --git a/wallet/src/de/schildbach/wallet/ui/RequestCoinsFragment.java b/wallet/src/de/schildbach/wallet/ui/RequestCoinsFragment.java index b5182970c8..f7d3d8a2f2 100644 --- a/wallet/src/de/schildbach/wallet/ui/RequestCoinsFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/RequestCoinsFragment.java @@ -52,10 +52,7 @@ import androidx.cardview.widget.CardView; import androidx.core.app.ShareCompat; import androidx.core.content.ContextCompat; -import androidx.core.graphics.Insets; import androidx.core.view.MenuProvider; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProvider; @@ -206,11 +203,6 @@ public boolean onMenuItemSelected(final MenuItem item) { public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.request_coins_fragment, container, false); - ViewCompat.setOnApplyWindowInsetsListener(view, (v, windowInsets) -> { - final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(insets.left, insets.top, insets.right, v.getPaddingBottom()); - return windowInsets; - }); qrView = view.findViewById(R.id.request_coins_qr); diff --git a/wallet/src/de/schildbach/wallet/ui/WalletActivity.java b/wallet/src/de/schildbach/wallet/ui/WalletActivity.java index 286b700031..ba243ad558 100644 --- a/wallet/src/de/schildbach/wallet/ui/WalletActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/WalletActivity.java @@ -135,6 +135,7 @@ protected void onCreate(final Bundle savedInstanceState) { viewModel = new ViewModelProvider(this).get(WalletActivityViewModel.class); setContentView(R.layout.wallet_content); + setActionBar(findViewById(R.id.wallet_appbar)); getActionBar().setDisplayHomeAsUpEnabled(false); contentView = findViewById(android.R.id.content); final View insetTopView = contentView.findViewWithTag("inset_top"); diff --git a/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java b/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java index 406e7431fb..7c1d65552d 100644 --- a/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java @@ -50,6 +50,7 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.network_monitor_content); + setActionBar(findViewById(R.id.network_monitor_appbar)); getActionBar().setDisplayHomeAsUpEnabled(true); final ViewPager2 pager = findViewById(R.id.network_monitor_pager); diff --git a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsActivity.java b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsActivity.java index 3f08f50010..38cb07869f 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsActivity.java @@ -27,7 +27,10 @@ import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; import androidx.annotation.Nullable; +import androidx.core.graphics.Insets; import androidx.core.view.MenuProvider; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.lifecycle.ViewModelProvider; import de.schildbach.wallet.Constants; import de.schildbach.wallet.R; @@ -85,7 +88,13 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); log.info("Referrer: {}", getReferrer()); setContentView(R.layout.send_coins_content); + setActionBar(findViewById(R.id.send_coins_appbar)); getActionBar().setDisplayHomeAsUpEnabled(true); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { + final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(v.getPaddingLeft(), insets.top, v.getPaddingRight(), v.getPaddingBottom()); + return windowInsets; + }); viewModel = new ViewModelProvider(this).get(SendCoinsActivityViewModel.class); viewModel.showHelpDialog.observe(this, new Event.Observer() { diff --git a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java index 73bfa85da6..21360ca7ff 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java @@ -489,7 +489,7 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe final LinearLayout layout = (LinearLayout) v; layout.setShowDividers(layout.getShowDividers() | LinearLayout.SHOW_DIVIDER_END); } - v.setPadding(insets.left, insets.top, insets.right, insets.bottom); + v.setPadding(insets.left, v.getPaddingTop(), insets.right, insets.bottom); return windowInsets; }); diff --git a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletActivity.java b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletActivity.java index 1e33326003..c291a674d6 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletActivity.java @@ -23,6 +23,9 @@ import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import de.schildbach.wallet.R; import de.schildbach.wallet.service.BlockchainService; import de.schildbach.wallet.ui.AbstractWalletActivity; @@ -51,7 +54,13 @@ public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sweep_wallet_content); + setActionBar(findViewById(R.id.sweep_wallet_appbar)); getActionBar().setDisplayHomeAsUpEnabled(true); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { + final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(v.getPaddingLeft(), insets.top, v.getPaddingRight(), v.getPaddingBottom()); + return windowInsets; + }); BlockchainService.start(this, false); } diff --git a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java index 1d07eaf091..edca2e730b 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletFragment.java @@ -278,7 +278,7 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe final LinearLayout layout = (LinearLayout) v; layout.setShowDividers(layout.getShowDividers() | LinearLayout.SHOW_DIVIDER_END); } - v.setPadding(insets.left, insets.top, insets.right, insets.bottom); + v.setPadding(insets.left, v.getPaddingTop(), insets.right, insets.bottom); return windowInsets; }); From 07bc0386def0c309d3c1f7f50448b5dd9bcbafa5 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 31 Oct 2024 01:52:42 +0100 Subject: [PATCH 38/43] 10.19 --- wallet/AndroidManifest.xml | 4 ++-- wallet/CHANGES | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wallet/AndroidManifest.xml b/wallet/AndroidManifest.xml index fe8b104331..9a74350ff1 100644 --- a/wallet/AndroidManifest.xml +++ b/wallet/AndroidManifest.xml @@ -4,8 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" package="de.schildbach.wallet" android:installLocation="internalOnly" - android:versionCode="101800" - android:versionName="10.18"> + android:versionCode="101900" + android:versionName="10.19"> Date: Thu, 31 Oct 2024 18:22:40 +0100 Subject: [PATCH 39/43] SendCoinsFragment: fix bottom action buttons obscured by the IME --- .../wallet/ui/send/SendCoinsFragment.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java index 21360ca7ff..c57c4edd00 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsFragment.java @@ -485,11 +485,18 @@ public View onCreateView(final LayoutInflater inflater, final ViewGroup containe final View view = inflater.inflate(R.layout.send_coins_fragment, container, false); ViewCompat.setOnApplyWindowInsetsListener(view, (v, windowInsets) -> { final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - if (insets.bottom > 0) { - final LinearLayout layout = (LinearLayout) v; - layout.setShowDividers(layout.getShowDividers() | LinearLayout.SHOW_DIVIDER_END); + final boolean imeVisible = windowInsets.isVisible(WindowInsetsCompat.Type.ime()); + if (imeVisible) { + final Insets ime = windowInsets.getInsets(WindowInsetsCompat.Type.ime()); + v.setPadding(insets.left, v.getPaddingTop(), insets.right, ime.bottom); + } else { + v.setPadding(insets.left, v.getPaddingTop(), insets.right, insets.bottom); } - v.setPadding(insets.left, v.getPaddingTop(), insets.right, insets.bottom); + final LinearLayout layout = (LinearLayout) v; + if (insets.bottom > 0 && !imeVisible) + layout.setShowDividers(layout.getShowDividers() | LinearLayout.SHOW_DIVIDER_END); + else + layout.setShowDividers(layout.getShowDividers() & ~LinearLayout.SHOW_DIVIDER_END); return windowInsets; }); From bd7e8ad7021fc87d532c83494ec6259bfee3b34a Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Thu, 31 Oct 2024 18:31:30 +0100 Subject: [PATCH 40/43] RequestCoinsActivity: fix bottom part of UI obscured by the IME --- wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java b/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java index 276c6032a0..c0ff5de976 100644 --- a/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java @@ -69,7 +69,9 @@ protected void onCreate(final Bundle savedInstanceState) { getActionBar().setDisplayHomeAsUpEnabled(true); ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(v.getPaddingLeft(), insets.top, v.getPaddingRight(), v.getPaddingBottom()); + final boolean imeVisible = windowInsets.isVisible(WindowInsetsCompat.Type.ime()); + v.setPadding(v.getPaddingLeft(), insets.top, v.getPaddingRight(), + imeVisible ? windowInsets.getInsets(WindowInsetsCompat.Type.ime()).bottom : 0); return windowInsets; }); From f6ebe0ae3542fb5858b9a16de3d3f49c9c52c6bb Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 1 Nov 2024 16:06:30 +0100 Subject: [PATCH 41/43] AddressBookActivity, ExchangeRatesActivity, RequestCoinsActivity, NetworkMonitorActivity, SendCoinsActivity, SweepWalletActivity: fix appbar `up` affordance isn't tinted with network color --- wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java | 5 ++++- .../src/de/schildbach/wallet/ui/ExchangeRatesActivity.java | 5 ++++- wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java | 5 ++++- .../schildbach/wallet/ui/monitor/NetworkMonitorActivity.java | 5 ++++- .../src/de/schildbach/wallet/ui/send/SendCoinsActivity.java | 5 ++++- .../de/schildbach/wallet/ui/send/SweepWalletActivity.java | 5 ++++- 6 files changed, 24 insertions(+), 6 deletions(-) diff --git a/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java b/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java index 8f45e263e6..27129528f0 100644 --- a/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/AddressBookActivity.java @@ -25,6 +25,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.widget.Toolbar; import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; import androidx.activity.result.ActivityResultLauncher; @@ -104,7 +105,9 @@ protected void onCreate(final Bundle savedInstanceState) { final FragmentManager fragmentManager = getSupportFragmentManager(); setContentView(R.layout.address_book_content); - setActionBar(findViewById(R.id.address_book_appbar)); + final Toolbar appbar = findViewById(R.id.address_book_appbar); + appbar.getNavigationIcon().setTint(getColor(R.color.fg_on_dark_bg_network_significant)); + setActionBar(appbar); getActionBar().setDisplayHomeAsUpEnabled(true); final ViewPager2 pager = findViewById(R.id.address_book_pager); diff --git a/wallet/src/de/schildbach/wallet/ui/ExchangeRatesActivity.java b/wallet/src/de/schildbach/wallet/ui/ExchangeRatesActivity.java index 45106e669d..b121ec446a 100644 --- a/wallet/src/de/schildbach/wallet/ui/ExchangeRatesActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/ExchangeRatesActivity.java @@ -19,6 +19,7 @@ import android.graphics.Color; import android.os.Bundle; +import android.widget.Toolbar; import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; import androidx.core.graphics.Insets; @@ -37,7 +38,9 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.exchange_rates_content); - setActionBar(findViewById(R.id.exchange_rates_appbar)); + final Toolbar appbar = findViewById(R.id.exchange_rates_appbar); + appbar.getNavigationIcon().setTint(getColor(R.color.fg_on_dark_bg_network_significant)); + setActionBar(appbar); getActionBar().setDisplayHomeAsUpEnabled(true); ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); diff --git a/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java b/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java index c0ff5de976..28b740a1dc 100644 --- a/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/RequestCoinsActivity.java @@ -24,6 +24,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.widget.Toolbar; import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; import androidx.annotation.Nullable; @@ -65,7 +66,9 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); log.info("Referrer: {}", getReferrer()); setContentView(R.layout.request_coins_content); - setActionBar(findViewById(R.id.request_coins_appbar)); + final Toolbar appbar = findViewById(R.id.request_coins_appbar); + appbar.getNavigationIcon().setTint(getColor(R.color.fg_on_dark_bg_network_significant)); + setActionBar(appbar); getActionBar().setDisplayHomeAsUpEnabled(true); ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); diff --git a/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java b/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java index 7c1d65552d..d37c0ddea1 100644 --- a/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/monitor/NetworkMonitorActivity.java @@ -19,6 +19,7 @@ import android.graphics.Color; import android.os.Bundle; +import android.widget.Toolbar; import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; import androidx.annotation.NonNull; @@ -50,7 +51,9 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.network_monitor_content); - setActionBar(findViewById(R.id.network_monitor_appbar)); + final Toolbar appbar = findViewById(R.id.network_monitor_appbar); + appbar.getNavigationIcon().setTint(getColor(R.color.fg_on_dark_bg_network_significant)); + setActionBar(appbar); getActionBar().setDisplayHomeAsUpEnabled(true); final ViewPager2 pager = findViewById(R.id.network_monitor_pager); diff --git a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsActivity.java b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsActivity.java index 38cb07869f..bd01945606 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SendCoinsActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SendCoinsActivity.java @@ -24,6 +24,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.widget.Toolbar; import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; import androidx.annotation.Nullable; @@ -88,7 +89,9 @@ protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); log.info("Referrer: {}", getReferrer()); setContentView(R.layout.send_coins_content); - setActionBar(findViewById(R.id.send_coins_appbar)); + final Toolbar appbar = findViewById(R.id.send_coins_appbar); + appbar.getNavigationIcon().setTint(getColor(R.color.fg_on_dark_bg_network_significant)); + setActionBar(appbar); getActionBar().setDisplayHomeAsUpEnabled(true); ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); diff --git a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletActivity.java b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletActivity.java index c291a674d6..3527065a6c 100644 --- a/wallet/src/de/schildbach/wallet/ui/send/SweepWalletActivity.java +++ b/wallet/src/de/schildbach/wallet/ui/send/SweepWalletActivity.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.graphics.Color; import android.os.Bundle; +import android.widget.Toolbar; import androidx.activity.EdgeToEdge; import androidx.activity.SystemBarStyle; import androidx.core.graphics.Insets; @@ -54,7 +55,9 @@ public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sweep_wallet_content); - setActionBar(findViewById(R.id.sweep_wallet_appbar)); + final Toolbar appbar = findViewById(R.id.sweep_wallet_appbar); + appbar.getNavigationIcon().setTint(getColor(R.color.fg_on_dark_bg_network_significant)); + setActionBar(appbar); getActionBar().setDisplayHomeAsUpEnabled(true); ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content), (v, windowInsets) -> { final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); From f37e8013acdb75091b0e161149851972a026a24e Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Sat, 2 Nov 2024 12:27:52 +0100 Subject: [PATCH 42/43] 10.20 --- wallet/AndroidManifest.xml | 4 ++-- wallet/CHANGES | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wallet/AndroidManifest.xml b/wallet/AndroidManifest.xml index 9a74350ff1..99acbf82b5 100644 --- a/wallet/AndroidManifest.xml +++ b/wallet/AndroidManifest.xml @@ -4,8 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" package="de.schildbach.wallet" android:installLocation="internalOnly" - android:versionCode="101900" - android:versionName="10.19"> + android:versionCode="102000" + android:versionName="10.20"> Date: Tue, 26 Nov 2024 23:30:45 +0100 Subject: [PATCH 43/43] Try fixing github action --- .github/workflows/gradle6.yml | 57 ----------------------------------- .github/workflows/gradle7.yml | 14 ++++----- 2 files changed, 7 insertions(+), 64 deletions(-) delete mode 100644 .github/workflows/gradle6.yml diff --git a/.github/workflows/gradle6.yml b/.github/workflows/gradle6.yml deleted file mode 100644 index 8162039edc..0000000000 --- a/.github/workflows/gradle6.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Gradle6 - -on: [push, pull_request] - -jobs: - build: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macos-latest] - java: ['11'] - distribution: ['temurin'] - gradle: ['6.7.1'] - fail-fast: false - name: JAVA ${{ matrix.java }} OS ${{ matrix.os }} Gradle ${{ matrix.gradle }} - steps: - - uses: actions/checkout@v3 - - - name: Downgrade Android plugin from 7.4.1 to 4.2.0 - run: sed -i -e "s|7.4.1|4.2.0|g" build.gradle - - - name: Downgrade DistributionUrl from Gradle 7.5.1 to Gradle 6.7.1 - run: sed -i -e "s|7.5.1|6.7.1|g" gradle/wrapper/gradle-wrapper.properties - - - name: Set up JDK - uses: actions/setup-java@v3 - with: - distribution: ${{ matrix.distribution }} - java-version: ${{ matrix.java }} - - - name: Setup Android SDK - uses: android-actions/setup-android@v2.0.10 - - - name: Install build-tools 33.0.2, platformtools and platform android-33 - run: sdkmanager --install "build-tools;33.0.2" "platform-tools" "platforms;android-33" - - - name: Fix build tools 33.0.2 issue - run: | - ln -s ${ANDROID_HOME}/build-tools/33.0.2/d8 ${ANDROID_HOME}/build-tools/33.0.2/dx - ln -s ${ANDROID_HOME}/build-tools/33.0.2/lib/d8.jar ${ANDROID_HOME}/build-tools/33.0.2/lib/dx.jar - - - name: Build with Gradle - run: | - ./gradlew wrapper --gradle-version=${{ matrix.gradle }} - ./gradlew clean build --stacktrace - - - name: Upload artifacts - uses: actions/upload-artifact@v3 - with: - name: groestlcoin-wallet-JAVA${{ matrix.java }}-${{ matrix.os }}-${{ matrix.gradle }} - path: | - wallet/build/outputs/apk/ - - - name: Download artifacts - uses: actions/download-artifact@v3 - with: - name: groestlcoin-wallet-JAVA${{ matrix.java }}-${{ matrix.os }}-${{ matrix.gradle }} diff --git a/.github/workflows/gradle7.yml b/.github/workflows/gradle7.yml index e4c40c02fc..6c8e6223da 100644 --- a/.github/workflows/gradle7.yml +++ b/.github/workflows/gradle7.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - java: ['11', '17'] + java: ['17', '18'] distribution: ['temurin'] gradle: ['7.5.1'] fail-fast: false @@ -17,16 +17,16 @@ jobs: - uses: actions/checkout@v3 - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: ${{ matrix.distribution }} java-version: ${{ matrix.java }} - name: Setup Android SDK - uses: android-actions/setup-android@v2.0.10 + uses: android-actions/setup-android@v3 - - name: Install build-tools 33.0.2, platformtools and platform android-33 - run: sdkmanager --install "build-tools;33.0.2" "platform-tools" "platforms;android-33" + - name: Install build-tools 35.0.0, platformtools and platform android-33 + run: sdkmanager --install "build-tools;35.0.0" "platform-tools" "platforms;android-35" - name: Build with Gradle run: | @@ -34,13 +34,13 @@ jobs: ./gradlew clean build --stacktrace - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: groestlcoin-wallet-JAVA${{ matrix.java }}-${{ matrix.os }}-${{ matrix.gradle }} path: | wallet/build/outputs/apk/ - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: groestlcoin-wallet-JAVA${{ matrix.java }}-${{ matrix.os }}-${{ matrix.gradle }}