diff --git a/bramble-android/build.gradle b/bramble-android/build.gradle index 372798c72..4768979e2 100644 --- a/bramble-android/build.gradle +++ b/bramble-android/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'witness' apply from: 'witness.gradle' android { - compileSdkVersion 33 - buildToolsVersion '33.0.0' + compileSdkVersion 34 + buildToolsVersion '34.0.0' packagingOptions { doNotStrip '**/*.so' diff --git a/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryManager.java b/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryManager.java index df659e625..2f3a2dde5 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryManager.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryManager.java @@ -30,6 +30,7 @@ import static android.os.PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED; import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGED; import static java.util.logging.Level.INFO; import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.AndroidUtils.registerReceiver; class AndroidBatteryManager implements BatteryManager, Service { @@ -52,7 +53,7 @@ class AndroidBatteryManager implements BatteryManager, Service { public boolean isCharging() { // Get the sticky intent for ACTION_BATTERY_CHANGED IntentFilter filter = new IntentFilter(ACTION_BATTERY_CHANGED); - Intent i = appContext.registerReceiver(null, filter); + Intent i = registerReceiver(appContext, null, filter); if (i == null) return false; int status = i.getIntExtra(EXTRA_PLUGGED, 0); return status != 0; @@ -71,7 +72,7 @@ class AndroidBatteryManager implements BatteryManager, Service { filter.addAction(ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED); filter.addAction(ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED); } - appContext.registerReceiver(batteryReceiver, filter); + registerReceiver(appContext, batteryReceiver, filter); } @Override diff --git a/bramble-android/src/main/java/org/briarproject/bramble/network/AndroidNetworkManager.java b/bramble-android/src/main/java/org/briarproject/bramble/network/AndroidNetworkManager.java index b19b1feb6..38f76bd13 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/network/AndroidNetworkManager.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/network/AndroidNetworkManager.java @@ -55,6 +55,7 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.AndroidUtils.registerReceiver; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.nullsafety.NullSafety.requireNonNull; @@ -103,7 +104,7 @@ class AndroidNetworkManager implements NetworkManager, Service { filter.addAction(WIFI_AP_STATE_CHANGED_ACTION); filter.addAction(WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); if (SDK_INT >= 23) filter.addAction(ACTION_DEVICE_IDLE_MODE_CHANGED); - app.registerReceiver(networkStateReceiver, filter); + registerReceiver(app, networkStateReceiver, filter); } @Override diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java index 536c6cc47..f1f2f498d 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java @@ -56,6 +56,7 @@ import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.AndroidUtils.hasBtConnectPermission; +import static org.briarproject.bramble.util.AndroidUtils.registerReceiver; import static org.briarproject.bramble.util.PrivacyUtils.scrubMacAddress; @MethodsNotNullByDefault @@ -112,7 +113,7 @@ class AndroidBluetoothPlugin extends filter.addAction(ACTION_STATE_CHANGED); filter.addAction(ACTION_SCAN_MODE_CHANGED); receiver = new BluetoothStateReceiver(); - app.registerReceiver(receiver, filter); + registerReceiver(app, receiver, filter); } @Override @@ -237,7 +238,7 @@ class AndroidBluetoothPlugin extends filter.addAction(ACTION_DISCOVERY_STARTED); filter.addAction(ACTION_DISCOVERY_FINISHED); filter.addAction(ACTION_FOUND); - app.registerReceiver(receiver, filter); + registerReceiver(app, receiver, filter); try { if (adapter.startDiscovery()) { long now = clock.currentTimeMillis(); diff --git a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java index f3431fe38..1e4c103f4 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java @@ -2,7 +2,10 @@ package org.briarproject.bramble.util; import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.Build; import android.os.Looper; import android.provider.Settings; @@ -21,6 +24,7 @@ import javax.annotation.Nullable; import static android.Manifest.permission.BLUETOOTH_CONNECT; import static android.app.PendingIntent.FLAG_IMMUTABLE; import static android.content.Context.MODE_PRIVATE; +import static android.content.Context.RECEIVER_NOT_EXPORTED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Build.VERSION.SDK_INT; import static android.os.Process.myPid; @@ -141,4 +145,20 @@ public class AndroidUtils { } return flags; } + + /** + * Could be replaced to a similar call in ContextCompat once we + * use and upgrade to version 1.9.0 or higher of the AndroidX Core library. + */ + @Nullable + @SuppressLint("UnspecifiedRegisterReceiverFlag") // we specify where needed + public static Intent registerReceiver(Context ctx, + @Nullable BroadcastReceiver receiver, IntentFilter filter) { + if (SDK_INT >= 33) { + return ctx.registerReceiver(receiver, filter, + RECEIVER_NOT_EXPORTED); + } else { + return ctx.registerReceiver(receiver, filter); + } + } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/AbstractBluetoothPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/AbstractBluetoothPlugin.java index b9eb6665d..981c5ea5b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/AbstractBluetoothPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/AbstractBluetoothPlugin.java @@ -388,7 +388,6 @@ abstract class AbstractBluetoothPlugin implements BluetoothPlugin, } // Validate the UUID try { - //noinspection ResultOfMethodCallIgnored UUID.fromString(uuid); } catch (IllegalArgumentException e) { if (LOG.isLoggable(WARNING)) LOG.warning("Invalid UUID " + uuid); diff --git a/briar-android/build.gradle b/briar-android/build.gradle index bb42ece7d..b593307d0 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -16,8 +16,8 @@ def getStdout = { command, defaultValue -> } android { - compileSdk 33 - buildToolsVersion '33.0.0' + compileSdk 34 + buildToolsVersion '34.0.0' packagingOptions { doNotStrip '**/*.so' @@ -25,7 +25,7 @@ android { defaultConfig { minSdkVersion 21 - targetSdkVersion 33 + targetSdkVersion 34 versionCode 10513 versionName "1.5.13" applicationId "org.briarproject.briar.android" diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml index dbec1d89e..c9fd876a5 100644 --- a/briar-android/src/main/AndroidManifest.xml +++ b/briar-android/src/main/AndroidManifest.xml @@ -39,6 +39,8 @@ + + + android:exported="false" + android:foregroundServiceType="connectedDevice|dataSync"> diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java index 87f866021..6fe6df44c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java @@ -22,6 +22,7 @@ import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager.StartResult; import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.util.AndroidUtils; import org.briarproject.briar.R; import org.briarproject.briar.android.logout.HideUiActivity; import org.briarproject.briar.api.android.AndroidNotificationManager; @@ -174,7 +175,8 @@ public class BriarService extends Service { filter.addAction(ACTION_SHUTDOWN); filter.addAction("android.intent.action.QUICKBOOT_POWEROFF"); filter.addAction("com.htc.intent.action.QUICKBOOT_POWEROFF"); - registerReceiver(receiver, filter); + AndroidUtils.registerReceiver(getApplicationContext(), receiver, + filter); }, "LifecycleStartup"); } @@ -220,7 +222,9 @@ public class BriarService extends Service { super.onDestroy(); LOG.info("Destroyed"); stopForeground(true); - if (receiver != null) unregisterReceiver(receiver); + if (receiver != null) { + getApplicationContext().unregisterReceiver(receiver); + } // Stop the services in a background thread wakeLockManager.executeWakefully(() -> { if (started) lifecycleManager.stopServices(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/DozeWatchdogImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/DozeWatchdogImpl.java index 01e406d82..fdf68d780 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/DozeWatchdogImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/DozeWatchdogImpl.java @@ -21,6 +21,7 @@ import static android.os.PowerManager.ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED; import static android.os.PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.AndroidUtils.registerReceiver; class DozeWatchdogImpl implements DozeWatchdog, Service { @@ -48,7 +49,7 @@ class DozeWatchdogImpl implements DozeWatchdog, Service { filter.addAction(ACTION_DEVICE_LIGHT_IDLE_MODE_CHANGED); filter.addAction(ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED); } - appContext.registerReceiver(receiver, filter); + registerReceiver(appContext, receiver, filter); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java index be7ea75bb..0dae58818 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/ScreenFilterMonitorImpl.java @@ -49,6 +49,7 @@ import static android.content.pm.PackageManager.GET_PERMISSIONS; import static android.content.pm.PackageManager.GET_SIGNATURES; import static android.os.Build.VERSION.SDK_INT; import static java.util.logging.Level.WARNING; +import static org.briarproject.bramble.util.AndroidUtils.registerReceiver; import static org.briarproject.bramble.util.LogUtils.logException; @NotNullByDefault @@ -207,7 +208,7 @@ class ScreenFilterMonitorImpl implements ScreenFilterMonitor, Service { filter.addAction(ACTION_PACKAGE_REPLACED); filter.addDataScheme("package"); receiver = new PackageBroadcastReceiver(); - app.registerReceiver(receiver, filter); + registerReceiver(app, receiver, filter); cachedApps = null; }); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java index de8148bd6..3bfa1d5e4 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java @@ -88,6 +88,7 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING; +import static org.briarproject.bramble.util.AndroidUtils.registerReceiver; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.StringUtils.ISO_8859_1; import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactPermissionManager.areEssentialPermissionsGranted; @@ -208,7 +209,7 @@ class AddNearbyContactViewModel extends AndroidViewModel qrCodeDecoder = new QrCodeDecoder(androidExecutor, ioExecutor, this); eventBus.addListener(this); IntentFilter filter = new IntentFilter(ACTION_SCAN_MODE_CHANGED); - getApplication().registerReceiver(bluetoothReceiver, filter); + registerReceiver(getApplication(), bluetoothReceiver, filter); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java index 5d0c48bcd..8f41a4b5c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java @@ -48,6 +48,7 @@ import static java.util.logging.Level.INFO; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE; import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING; +import static org.briarproject.bramble.util.AndroidUtils.registerReceiver; import static org.briarproject.bramble.util.LogUtils.logDuration; import static org.briarproject.bramble.util.LogUtils.now; @@ -96,7 +97,7 @@ public class PluginViewModel extends DbViewModel implements EventListener { this.eventBus = eventBus; eventBus.addListener(this); receiver = new BluetoothStateReceiver(); - app.registerReceiver(receiver, new IntentFilter(ACTION_STATE_CHANGED)); + registerReceiver(app, receiver, new IntentFilter(ACTION_STATE_CHANGED)); networkStatus.setValue(networkManager.getNetworkStatus()); torPluginState.setValue(getTransportState(TorConstants.ID)); wifiPluginState.setValue(getTransportState(LanTcpConstants.ID)); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java index a601feeac..2b8e2837f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java @@ -398,8 +398,8 @@ public class UiUtils { public static void startDevReportActivity(Context ctx, Class activity, @Nullable Throwable t, - @Nullable Long appStartTime, @Nullable byte[] logKey, @Nullable - String initialComment) { + @Nullable Long appStartTime, @Nullable byte[] logKey, + @Nullable String initialComment) { // Collect memory stats from the current process, not the crash // reporter process ActivityManager am =