From 6536e1caf77c30be138458af927b7b86df47552d Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Tue, 9 Jul 2024 11:54:24 -0700 Subject: [PATCH 1/8] chore: update checkpoints --- wallet/assets/checkpoints-testnet.txt | 221 +++++++++++++++++++++++++- wallet/assets/checkpoints.txt | 19 ++- 2 files changed, 238 insertions(+), 2 deletions(-) diff --git a/wallet/assets/checkpoints-testnet.txt b/wallet/assets/checkpoints-testnet.txt index f72e7d24ed..a053055bae 100644 --- a/wallet/assets/checkpoints-testnet.txt +++ b/wallet/assets/checkpoints-testnet.txt @@ -1,6 +1,6 @@ TXT CHECKPOINTS 1 0 -1576 +1795 AAAAAAAAAAAkECOYAAACQAIAAAC2vSBlF+IPfT99SBfBEbKlchhK3afBQPjYS9KqDAgAABE5bCPb4Xjjx3Gzp7s/CezmJlWPYawKPXVKt9/lIy/754vXVP//Dx4QcwEA AAAAAAAAAABIQCXnAAAEgAIAAACawFgULuwvdEP4oo4cVUCbItDd/zHYV2j0GgTfFwcAAIazSWKA2SoCbNJR3AqymqvWS9x6Ahsmd9McS5pQk6w23pTXVP//Ax68GQoA AAAAAAAAAADZAErXAAAGwAIAAAADyAGIUUymlSwxz+Kn1VWKDgT/31Nmomb5tsx0aAMAAOzHCNcqCWULtDmL4vMjNlvFgwfCDixx4kSCOB3xH8ZU3qXXVP//AB5amgAA @@ -1577,3 +1577,222 @@ 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 diff --git a/wallet/assets/checkpoints.txt b/wallet/assets/checkpoints.txt index 293a84516f..32a63796f1 100644 --- a/wallet/assets/checkpoints.txt +++ b/wallet/assets/checkpoints.txt @@ -1,6 +1,6 @@ TXT CHECKPOINTS 1 0 -3590 +3607 AAAAAAAAAAAkQCRAAAACQAIAAAAVH6nAAsNe/Kh1ihi+qsNyRhKz5QGUAyybpU/1KQIAADKEYBnXENihFvOEAHUsytpbQJf7QFGTQ3pFVWiHHeQnSlDbUvz/Ax7nQAIA AAAAAAAAAAC1ALUAAAAEgAIAAACPa0nYq+iMh51WsXwHxbWdw7esglfgOjOuEwrcgAIAACtgKaPRFHJ2L5fqDdPmUkCemb3cyIOqM23tbAGNYbkFjlrbUv//AB6YIQEA AAAAAAAAAAL4AvgAAAAGwAIAAAB8a2OpvV2j+WYn2Yyknb5gxQk+BlaGM2E/Sash6wAAAM2CiycIZqtxwBQJoBUSohXNRj+SoILtbjzEaFoHJvUD5WfbUsD/Px028AMA @@ -3591,3 +3591,20 @@ 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 From bdca845df696712f5a004689f000198ece704c88 Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Fri, 12 Jul 2024 11:12:20 -0700 Subject: [PATCH 2/8] chore: use dashj 21.0.0-SNAPSHOT --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d7ad867c24..71ff48b42b 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { kotlin_version = '1.9.23' coroutinesVersion = '1.6.4' ok_http_version = '4.9.1' - dashjVersion = '20.0.5' + dashjVersion = '21.0.0-SNAPSHOT' hiltVersion = '2.51' hiltCompilerVersion = '1.2.0' hiltWorkVersion = '1.0.0' From db47aecf603af3fcb487e204373e24032608612d Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Fri, 2 Aug 2024 09:55:06 -0700 Subject: [PATCH 3/8] chore: target Android 14 --- common/build.gradle | 4 ++-- features/exploredash/build.gradle | 4 ++-- integrations/coinbase/build.gradle | 4 ++-- integrations/crowdnode/build.gradle | 4 ++-- integrations/uphold/build.gradle | 4 ++-- sample-integration-android/build.gradle | 4 ++-- wallet/build.gradle | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index b1d67f689e..b7b6cafb13 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -7,9 +7,9 @@ apply plugin: 'dagger.hilt.android.plugin' android { defaultConfig { - compileSdk 33 + compileSdk 34 minSdkVersion 24 - targetSdkVersion 33 + targetSdkVersion 34 vectorDrawables.useSupportLibrary = true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/features/exploredash/build.gradle b/features/exploredash/build.gradle index 200c486a66..5bd00737a8 100644 --- a/features/exploredash/build.gradle +++ b/features/exploredash/build.gradle @@ -10,9 +10,9 @@ plugins { android { defaultConfig { - compileSdk 33 + compileSdk 34 minSdkVersion 24 - targetSdkVersion 33 + targetSdkVersion 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" javaCompileOptions { diff --git a/integrations/coinbase/build.gradle b/integrations/coinbase/build.gradle index 5b7f5afe21..36188c3452 100644 --- a/integrations/coinbase/build.gradle +++ b/integrations/coinbase/build.gradle @@ -10,9 +10,9 @@ plugins { android { defaultConfig { - compileSdk 33 + compileSdk 34 minSdkVersion 24 - targetSdkVersion 33 + targetSdkVersion 34 vectorDrawables.useSupportLibrary = true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" diff --git a/integrations/crowdnode/build.gradle b/integrations/crowdnode/build.gradle index f61244b6d3..14f28ad80a 100644 --- a/integrations/crowdnode/build.gradle +++ b/integrations/crowdnode/build.gradle @@ -10,9 +10,9 @@ plugins { android { defaultConfig { - compileSdk 33 + compileSdk 34 minSdkVersion 24 - targetSdkVersion 33 + targetSdkVersion 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" } diff --git a/integrations/uphold/build.gradle b/integrations/uphold/build.gradle index b2cd751bf8..26be0fd8a6 100644 --- a/integrations/uphold/build.gradle +++ b/integrations/uphold/build.gradle @@ -9,9 +9,9 @@ plugins { android { defaultConfig { - compileSdk 33 + compileSdk 34 minSdkVersion 24 - targetSdkVersion 33 + targetSdkVersion 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/sample-integration-android/build.gradle b/sample-integration-android/build.gradle index 26723b640f..5aaa279088 100644 --- a/sample-integration-android/build.gradle +++ b/sample-integration-android/build.gradle @@ -38,9 +38,9 @@ android { } defaultConfig { - compileSdk 33 + compileSdk 34 minSdkVersion 24 - targetSdkVersion 33 + targetSdkVersion 34 multiDexEnabled true } compileOptions { diff --git a/wallet/build.gradle b/wallet/build.gradle index 7b67f8117b..a900d1c989 100644 --- a/wallet/build.gradle +++ b/wallet/build.gradle @@ -189,9 +189,9 @@ android { android.ndkVersion '21.3.6528147' defaultConfig { - compileSdk 33 + compileSdk 34 minSdkVersion 24 - targetSdkVersion 33 + targetSdkVersion 34 versionCode project.hasProperty('versionCode') ? project.property('versionCode') as int : 101010 versionName project.hasProperty('versionName') ? project.property('versionName') : "10.1.1" multiDexEnabled true From 54e0060ee32c5928ad744ab6d2ab38591c65f49b Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Tue, 6 Aug 2024 10:13:33 -0700 Subject: [PATCH 4/8] feat: update NFC based on Bitcoin Wallet --- .../wallet/ui/WalletAddressFragment.java | 13 +++--- wallet/src/de/schildbach/wallet/util/Nfc.java | 42 +++++++++++++------ 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/wallet/src/de/schildbach/wallet/ui/WalletAddressFragment.java b/wallet/src/de/schildbach/wallet/ui/WalletAddressFragment.java index 701a547bf3..bbad2d0857 100644 --- a/wallet/src/de/schildbach/wallet/ui/WalletAddressFragment.java +++ b/wallet/src/de/schildbach/wallet/ui/WalletAddressFragment.java @@ -33,6 +33,7 @@ import org.dash.wallet.common.Configuration; import de.schildbach.wallet.Constants; import de.schildbach.wallet.WalletApplication; +import de.schildbach.wallet.util.Nfc; import de.schildbach.wallet.util.ThrottlingWalletChangeListener; import de.schildbach.wallet_test.R; @@ -61,7 +62,7 @@ /** * @author Andreas Schildbach */ -public final class WalletAddressFragment extends Fragment implements NfcAdapter.CreateNdefMessageCallback { +public final class WalletAddressFragment extends Fragment { private Activity activity; private WalletApplication application; private Configuration config; @@ -91,9 +92,6 @@ public void onAttach(final Activity activity) { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - if (nfcAdapter != null && nfcAdapter.isEnabled()) - nfcAdapter.setNdefPushMessageCallback(this, activity); } @Override @@ -234,6 +232,9 @@ public void onLoadFinished(final Loader
loader, final Address currentAd currentAddressQrBitmap = Qr.INSTANCE.themeAwareDrawable(addressStr, getResources()); currentAddressUriRef.set(addressStr); + + Nfc.setNdefPushMessage(nfcAdapter, createNdefMessage(addressStr), activity); + updateView(); } } @@ -243,9 +244,7 @@ public void onLoaderReset(final Loader
loader) { } }; - @Override - public NdefMessage createNdefMessage(final NfcEvent event) { - final String uri = currentAddressUriRef.get(); + private static NdefMessage createNdefMessage(final String uri) { if (uri != null) return new NdefMessage(new NdefRecord[] { NdefRecord.createUri(uri) }); else diff --git a/wallet/src/de/schildbach/wallet/util/Nfc.java b/wallet/src/de/schildbach/wallet/util/Nfc.java index 24f8ed5c6d..c3369efcbc 100644 --- a/wallet/src/de/schildbach/wallet/util/Nfc.java +++ b/wallet/src/de/schildbach/wallet/util/Nfc.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2015 the original author or authors. + * Copyright the original author or authors. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -12,33 +12,37 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ package de.schildbach.wallet.util; -import java.util.Arrays; - -import javax.annotation.Nullable; - -import com.google.common.base.Charsets; - +import android.app.Activity; import android.nfc.NdefMessage; import android.nfc.NdefRecord; +import android.nfc.NfcAdapter; +import androidx.annotation.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; /** * @author Andreas Schildbach */ public class Nfc { + private static final Logger log = LoggerFactory.getLogger(Nfc.class); + public static NdefRecord createMime(final String mimeType, final byte[] payload) { - final byte[] mimeBytes = mimeType.getBytes(Charsets.US_ASCII); - final NdefRecord mimeRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload); - return mimeRecord; + final byte[] mimeBytes = mimeType.getBytes(StandardCharsets.US_ASCII); + return new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload); } @Nullable public static byte[] extractMimePayload(final String mimeType, final NdefMessage message) { - final byte[] mimeBytes = mimeType.getBytes(Charsets.US_ASCII); + final byte[] mimeBytes = mimeType.getBytes(StandardCharsets.US_ASCII); for (final NdefRecord record : message.getRecords()) { if (record.getTnf() == NdefRecord.TNF_MIME_MEDIA && Arrays.equals(record.getType(), mimeBytes)) @@ -47,4 +51,18 @@ public static byte[] extractMimePayload(final String mimeType, final NdefMessage return null; } + + public static void setNdefPushMessage(final NfcAdapter adapter, final NdefMessage message, + final Activity activity) { + try { + // reflection hack needed for Android 14 and above + final Method setNdefPushMessage = adapter.getClass().getMethod("setNdefPushMessage", + NdefMessage.class, Activity.class, Activity[].class); + setNdefPushMessage.invoke(adapter, message, activity, new Activity[0]); + } catch (final ReflectiveOperationException x) { + log.info("problem setting NDEF push message", x); + } catch (final Exception x) { + throw new RuntimeException(x); + } + } } From 8921cfe88446ca9e5ba3344e91c8b94e0c089a0e Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Tue, 6 Aug 2024 10:14:39 -0700 Subject: [PATCH 5/8] feat: satisfy Android 14 requirements for services --- wallet/AndroidManifest.xml | 11 +- .../src/de/schildbach/wallet/Constants.java | 1 + .../offline/AcceptBluetoothService.java | 123 ++++++++++-------- .../wallet/offline/AcceptBluetoothThread.java | 98 +++----------- .../wallet/service/BlockchainServiceImpl.java | 7 +- 5 files changed, 104 insertions(+), 136 deletions(-) diff --git a/wallet/AndroidManifest.xml b/wallet/AndroidManifest.xml index dbadd27fe7..a51370b5e5 100644 --- a/wallet/AndroidManifest.xml +++ b/wallet/AndroidManifest.xml @@ -8,12 +8,14 @@ - + + + @@ -21,6 +23,7 @@ + + android:exported="false" + android:foregroundServiceType="dataSync" /> + android:exported="false" + android:foregroundServiceType="connectedDevice" /> . + * along with this program. If not, see . */ package de.schildbach.wallet.offline; -import java.io.IOException; - -import org.bitcoinj.core.Transaction; -import org.bitcoinj.core.VerificationException; -import org.bitcoinj.wallet.Wallet; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static com.google.common.base.Preconditions.checkNotNull; -import dagger.hilt.android.AndroidEntryPoint; -import de.schildbach.wallet.WalletApplication; -import de.schildbach.wallet.service.PackageInfoProvider; -import de.schildbach.wallet.util.CrashReporter; -import de.schildbach.wallet.util.Toast; -import de.schildbach.wallet_test.R; - -import android.app.Service; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ServiceInfo; +import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.text.format.DateUtils; +import androidx.annotation.WorkerThread; +import androidx.core.app.NotificationCompat; +import androidx.lifecycle.LifecycleService; + +import org.bitcoinj.core.Transaction; +import org.bitcoinj.core.VerificationException; +import org.bitcoinj.wallet.Wallet; +import org.dash.wallet.common.WalletDataProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + import javax.inject.Inject; +import dagger.hilt.android.AndroidEntryPoint; +import de.schildbach.wallet.Constants; +import de.schildbach.wallet.service.PackageInfoProvider; +import de.schildbach.wallet_test.R; +import de.schildbach.wallet.WalletApplication; +import de.schildbach.wallet.util.CrashReporter; +import de.schildbach.wallet.util.Toast; + /** * @author Andreas Schildbach */ @AndroidEntryPoint -public final class AcceptBluetoothService extends Service { - private WalletApplication application; - private Wallet wallet; +public final class AcceptBluetoothService extends LifecycleService { + @Inject + protected WalletApplication application; + @Inject + protected WalletDataProvider walletDataProvider; + + @Inject + protected PackageInfoProvider packageInfoProvider; private WakeLock wakeLock; private AcceptBluetoothThread classicThread; private AcceptBluetoothThread paymentProtocolThread; @@ -65,16 +80,16 @@ public final class AcceptBluetoothService extends Service { private static final Logger log = LoggerFactory.getLogger(AcceptBluetoothService.class); - @Inject - PackageInfoProvider packageInfoProvider; - @Override public IBinder onBind(final Intent intent) { + super.onBind(intent); return null; } @Override public int onStartCommand(final Intent intent, final int flags, final int startId) { + super.onStartCommand(intent, flags, startId); + handler.removeCallbacks(timeoutRunnable); handler.postDelayed(timeoutRunnable, TIMEOUT_MS); @@ -87,17 +102,27 @@ public void onCreate() { log.debug(".onCreate()"); super.onCreate(); + final BluetoothManager bluetoothManager = getSystemService(BluetoothManager.class); + final BluetoothAdapter bluetoothAdapter = checkNotNull(bluetoothManager.getAdapter()); + final PowerManager pm = getSystemService(PowerManager.class); - this.application = (WalletApplication) getApplication(); - this.wallet = application.getWallet(); - - final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - - final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, - getPackageName() + " bluetooth transaction submission"); + wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); wakeLock.acquire(); + final NotificationCompat.Builder notification = new NotificationCompat.Builder(this, + Constants.NOTIFICATION_CHANNEL_ID_ONGOING); + notification.setColor(getColor(R.color.fg_network_significant)); + notification.setSmallIcon(R.drawable.stat_notify_bluetooth_24dp); + notification.setContentTitle(getString(R.string.notification_bluetooth_service_listening)); + notification.setWhen(System.currentTimeMillis()); + notification.setOngoing(true); + notification.setPriority(NotificationCompat.PRIORITY_LOW); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + startForeground(Constants.NOTIFICATION_ID_BLUETOOTH, notification.build(), + ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE); + else + startForeground(Constants.NOTIFICATION_ID_BLUETOOTH, notification.build()); + registerReceiver(bluetoothStateChangeReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); try { @@ -113,35 +138,30 @@ public boolean handleTx(final Transaction tx) { return AcceptBluetoothService.this.handleTx(tx); } }; - - classicThread.start(); - paymentProtocolThread.start(); } catch (final IOException x) { new Toast(this).longToast(R.string.error_bluetooth, x.getMessage()); + log.warn("problem with listening, stopping service", x); CrashReporter.saveBackgroundTrace(x, packageInfoProvider.getPackageInfo()); + stopSelf(); } } + @WorkerThread private boolean handleTx(final Transaction tx) { - log.info("tx " + tx.getHashAsString() + " arrived via blueooth"); + log.info("tx {} arrived via blueooth", tx.getTxId()); + final Wallet wallet = walletDataProvider.getWallet(); try { if (wallet.isTransactionRelevant(tx)) { wallet.receivePending(tx, null); - - handler.post(new Runnable() { - @Override - public void run() { - application.broadcastTransaction(tx); - } - }); + handler.post(() -> application.broadcastTransaction(tx)); } else { - log.info("tx " + tx.getHashAsString() + " irrelevant"); + log.info("tx {} irrelevant", tx.getTxId()); } return true; } catch (final VerificationException x) { - log.info("cannot verify tx " + tx.getHashAsString() + " received via bluetooth", x); + log.info("cannot verify tx " + tx.getTxId() + " received via bluetooth", x); } return false; @@ -149,8 +169,10 @@ public void run() { @Override public void onDestroy() { - paymentProtocolThread.stopAccepting(); - classicThread.stopAccepting(); + if (paymentProtocolThread != null) + paymentProtocolThread.stopAccepting(); + if (classicThread != null) + classicThread.stopAccepting(); unregisterReceiver(bluetoothStateChangeReceiver); @@ -176,12 +198,9 @@ public void onReceive(final Context context, final Intent intent) { } }; - private final Runnable timeoutRunnable = new Runnable() { - @Override - public void run() { - log.info("timeout expired, stopping service"); + private final Runnable timeoutRunnable = () -> { + log.info("timeout expired, stopping service"); - stopSelf(); - } + stopSelf(); }; } diff --git a/wallet/src/de/schildbach/wallet/offline/AcceptBluetoothThread.java b/wallet/src/de/schildbach/wallet/offline/AcceptBluetoothThread.java index da7a7702f5..8d6f5be8b6 100644 --- a/wallet/src/de/schildbach/wallet/offline/AcceptBluetoothThread.java +++ b/wallet/src/de/schildbach/wallet/offline/AcceptBluetoothThread.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright the original author or authors. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -12,15 +12,14 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ package de.schildbach.wallet.offline; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.util.concurrent.atomic.AtomicBoolean; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothServerSocket; +import android.bluetooth.BluetoothSocket; import org.bitcoin.protocols.payments.Protos; import org.bitcoin.protocols.payments.Protos.PaymentACK; @@ -30,13 +29,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; + import de.schildbach.wallet.Constants; import de.schildbach.wallet.util.Bluetooth; -import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothServerSocket; -import android.bluetooth.BluetoothSocket; - /** * @author Shahar Livne * @author Andreas Schildbach @@ -62,19 +62,12 @@ public void run() { org.bitcoinj.core.Context.propagate(Constants.CONTEXT); while (running.get()) { - BluetoothSocket socket = null; - DataInputStream is = null; - DataOutputStream os = null; - - try { - // start a blocking call, and return only on success or exception - socket = listeningSocket.accept(); - + try ( // start a blocking call, and return only on success or exception + final BluetoothSocket socket = listeningSocket.accept(); + final DataInputStream is = new DataInputStream(socket.getInputStream()); + final DataOutputStream os = new DataOutputStream(socket.getOutputStream())) { log.info("accepted classic bluetooth connection"); - is = new DataInputStream(socket.getInputStream()); - os = new DataOutputStream(socket.getOutputStream()); - boolean ack = true; final int numMessages = is.readInt(); @@ -98,30 +91,6 @@ public void run() { os.writeBoolean(ack); } catch (final IOException x) { log.info("exception in bluetooth accept loop", x); - } finally { - if (os != null) { - try { - os.close(); - } catch (final IOException x) { - // swallow - } - } - - if (is != null) { - try { - is.close(); - } catch (final IOException x) { - // swallow - } - } - - if (socket != null) { - try { - socket.close(); - } catch (final IOException x) { - // swallow - } - } } } } @@ -138,19 +107,12 @@ public void run() { org.bitcoinj.core.Context.propagate(Constants.CONTEXT); while (running.get()) { - BluetoothSocket socket = null; - DataInputStream is = null; - DataOutputStream os = null; - - try { - // start a blocking call, and return only on success or exception - socket = listeningSocket.accept(); - + try ( // start a blocking call, and return only on success or exception + final BluetoothSocket socket = listeningSocket.accept(); + final DataInputStream is = new DataInputStream(socket.getInputStream()); + final DataOutputStream os = new DataOutputStream(socket.getOutputStream())) { log.info("accepted payment protocol bluetooth connection"); - is = new DataInputStream(socket.getInputStream()); - os = new DataOutputStream(socket.getOutputStream()); - boolean ack = true; final Protos.Payment payment = Protos.Payment.parseDelimitedFrom(is); @@ -171,30 +133,6 @@ public void run() { paymentAck.writeDelimitedTo(os); } catch (final IOException x) { log.info("exception in bluetooth accept loop", x); - } finally { - if (os != null) { - try { - os.close(); - } catch (final IOException x) { - // swallow - } - } - - if (is != null) { - try { - is.close(); - } catch (final IOException x) { - // swallow - } - } - - if (socket != null) { - try { - socket.close(); - } catch (final IOException x) { - // swallow - } - } } } } diff --git a/wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.java b/wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.java index 98036b7b23..273edcf240 100644 --- a/wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.java +++ b/wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.java @@ -28,6 +28,7 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.content.pm.ServiceInfo; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; @@ -1074,7 +1075,11 @@ private void startForeground() { //Shows ongoing notification promoting service to foreground service and //preventing it from being killed in Android 26 or later Notification notification = createNetworkSyncNotification(null); - startForeground(Constants.NOTIFICATION_ID_BLOCKCHAIN_SYNC, notification); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) + startForeground(Constants.NOTIFICATION_ID_BLOCKCHAIN_SYNC, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); + else + startForeground(Constants.NOTIFICATION_ID_BLOCKCHAIN_SYNC, notification); } @Override From b180d416fc65f4314c2793a6a752bfb448286bdf Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Tue, 6 Aug 2024 10:15:06 -0700 Subject: [PATCH 6/8] feat: update Bluetooth services based on Bitcoin Wallet --- .../drawable-anydpi/stat_notify_bluetooth_24dp.xml | 12 ++++++++++++ wallet/res/values/strings.xml | 1 + .../schildbach/wallet/ui/payments/ReceiveFragment.kt | 1 + 3 files changed, 14 insertions(+) create mode 100644 wallet/res/drawable-anydpi/stat_notify_bluetooth_24dp.xml diff --git a/wallet/res/drawable-anydpi/stat_notify_bluetooth_24dp.xml b/wallet/res/drawable-anydpi/stat_notify_bluetooth_24dp.xml new file mode 100644 index 0000000000..12e734d0f3 --- /dev/null +++ b/wallet/res/drawable-anydpi/stat_notify_bluetooth_24dp.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/wallet/res/values/strings.xml b/wallet/res/values/strings.xml index eb9c16aa2a..b3ae515ac8 100644 --- a/wallet/res/values/strings.xml +++ b/wallet/res/values/strings.xml @@ -331,6 +331,7 @@ You still have Dash on this device! Please be sure to write down your recovery phrase before you uninstall the Dash Wallet or you will lose your balance of %s. Remind me later Don\'t remind me + Ready to receive payments via Bluetooth Dash balance diff --git a/wallet/src/de/schildbach/wallet/ui/payments/ReceiveFragment.kt b/wallet/src/de/schildbach/wallet/ui/payments/ReceiveFragment.kt index 383f6c3d05..cb36dff9cd 100644 --- a/wallet/src/de/schildbach/wallet/ui/payments/ReceiveFragment.kt +++ b/wallet/src/de/schildbach/wallet/ui/payments/ReceiveFragment.kt @@ -37,6 +37,7 @@ import org.dash.wallet.common.ui.enter_amount.EnterAmountViewModel import org.dash.wallet.common.ui.viewBinding import javax.inject.Inject +// RequestCoinsFragment in Bitcoin Wallet has the code for Bluetooth support (sharing addresses) @AndroidEntryPoint class ReceiveFragment : Fragment(R.layout.fragment_receive) { private val enterAmountViewModel by activityViewModels() From 2fdb187d580d327aab24e057cd5bd8174b1dbde3 Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Tue, 6 Aug 2024 10:16:13 -0700 Subject: [PATCH 7/8] fix: update InteractionAwareActivity receiver (not exported) --- .../org/dash/wallet/common/InteractionAwareActivity.java | 8 +++++++- .../src/de/schildbach/wallet/ui/WalletBalanceLoader.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/dash/wallet/common/InteractionAwareActivity.java b/common/src/main/java/org/dash/wallet/common/InteractionAwareActivity.java index 52752b78be..2992f18cbe 100644 --- a/common/src/main/java/org/dash/wallet/common/InteractionAwareActivity.java +++ b/common/src/main/java/org/dash/wallet/common/InteractionAwareActivity.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.Build; import android.os.Bundle; import androidx.annotation.Nullable; @@ -33,7 +34,12 @@ public class InteractionAwareActivity extends SecureActivity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter filter = new IntentFilter(FORCE_FINISH_ACTION); - registerReceiver(forceFinishReceiver, filter); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + registerReceiver(forceFinishReceiver, filter, Context.RECEIVER_NOT_EXPORTED); + } else { + registerReceiver(forceFinishReceiver, filter); + } } @Override diff --git a/wallet/src/de/schildbach/wallet/ui/WalletBalanceLoader.java b/wallet/src/de/schildbach/wallet/ui/WalletBalanceLoader.java index 0ec2a3366f..16f7e6d81b 100644 --- a/wallet/src/de/schildbach/wallet/ui/WalletBalanceLoader.java +++ b/wallet/src/de/schildbach/wallet/ui/WalletBalanceLoader.java @@ -41,7 +41,7 @@ * @author Andreas Schildbach */ public final class WalletBalanceLoader extends AsyncTaskLoader { - private LocalBroadcastManager broadcastManager; + private final LocalBroadcastManager broadcastManager; private final Wallet wallet; private static final Logger log = LoggerFactory.getLogger(WalletBalanceLoader.class); From 95fa92c73d3e3bba7e953e7ef34381cec1734a9a Mon Sep 17 00:00:00 2001 From: HashEngineering Date: Wed, 7 Aug 2024 14:48:56 -0700 Subject: [PATCH 8/8] fix(exploredash): use robolectric 4.13 (supports Android SDK 34) --- features/exploredash/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/exploredash/build.gradle b/features/exploredash/build.gradle index 5bd00737a8..04a47c034d 100644 --- a/features/exploredash/build.gradle +++ b/features/exploredash/build.gradle @@ -115,7 +115,7 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion" testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoVersion" testImplementation "androidx.arch.core:core-testing:$coreTestingVersion" - testImplementation "org.robolectric:robolectric:4.9.2" + testImplementation "org.robolectric:robolectric:4.13" testImplementation "androidx.room:room-testing:$roomVersion" androidTestImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoVersion"