summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/build.gradle36
-rw-r--r--app/src/fatweb/java/se.leap.bitmaskclient/appUpdate/DownloadNotificationManager.java6
-rw-r--r--app/src/main/AndroidManifest.xml7
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java3
-rw-r--r--app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java46
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java30
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java9
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/VpnNotificationManager.java11
9 files changed, 64 insertions, 86 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 9bfade34..239190fd 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -4,9 +4,9 @@ import java.util.regex.Pattern
apply plugin: 'com.android.application'
android {
- compileSdkVersion 30
+ compileSdkVersion 31
ndkVersion "21.4.7075529"
- buildToolsVersion '30.0.3'
+ buildToolsVersion '31.0.0'
compileOptions {
targetCompatibility 1.8
@@ -25,7 +25,7 @@ android {
versionCode 164000
versionName "1.1.5RC2"
minSdkVersion 16
- targetSdkVersion 30
+ targetSdkVersion 31
vectorDrawables.useSupportLibrary = true
buildConfigField 'boolean', 'openvpn3', 'false'
@@ -404,9 +404,7 @@ dependencies {
//TODO: remove that library
androidTestImplementation 'com.jayway.android.robotium:robotium-solo:5.6.3'
testImplementation 'org.json:json:20180813'
- debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2'
- releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2'
- betaImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2'
+ debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
annotationProcessor 'com.squareup.dagger:dagger-compiler:1.2.2'
implementation 'com.jakewharton:butterknife:10.2.1'
@@ -416,15 +414,15 @@ dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.okhttp3:okhttp:3.12.12'
implementation 'androidx.legacy:legacy-support-core-utils:1.0.0'
- implementation 'androidx.annotation:annotation:1.1.0'
+ implementation 'androidx.annotation:annotation:1.4.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'com.google.android.material:material:1.2.1'
- implementation 'androidx.fragment:fragment:1.2.5'
- implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ implementation 'androidx.appcompat:appcompat:1.4.2'
+ implementation 'com.google.android.material:material:1.6.1'
+ implementation 'androidx.fragment:fragment:1.5.1'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.cardview:cardview:1.0.0'
- implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
+ implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
@@ -486,23 +484,11 @@ android.applicationVariants.all { variant ->
}
}
-
-// Ensure the no-op dependency is always used in JVM tests.
-configurations.all { config ->
- if (config.name.contains('UnitTest')) {
- config.resolutionStrategy.eachDependency { details ->
- if (details.requested.group == 'com.squareup.leakcanary' && details.requested.name == 'leakcanary-android') {
- details.useTarget(group: details.requested.group, name: 'leakcanary-android-no-op', version: details.requested.version)
- }
- }
- }
-}
-
subprojects {
afterEvaluate {project ->
if (project.hasProperty("android")) {
android {
- compileSdkVersion 30
+ compileSdkVersion 31
}
}
}
diff --git a/app/src/fatweb/java/se.leap.bitmaskclient/appUpdate/DownloadNotificationManager.java b/app/src/fatweb/java/se.leap.bitmaskclient/appUpdate/DownloadNotificationManager.java
index 336802c6..687fc66a 100644
--- a/app/src/fatweb/java/se.leap.bitmaskclient/appUpdate/DownloadNotificationManager.java
+++ b/app/src/fatweb/java/se.leap.bitmaskclient/appUpdate/DownloadNotificationManager.java
@@ -33,6 +33,7 @@ import se.leap.bitmaskclient.R;
import static android.content.Intent.CATEGORY_DEFAULT;
import static se.leap.bitmaskclient.appUpdate.DownloadBroadcastReceiver.ACTION_DOWNLOAD;
+import static se.leap.bitmaskclient.base.utils.ConfigHelper.getPendingIntentFlags;
public class DownloadNotificationManager {
private Context context;
@@ -130,12 +131,13 @@ public class DownloadNotificationManager {
private PendingIntent getDownloadIntent() {
Intent downloadIntent = new Intent(context, DownloadBroadcastReceiver.class);
downloadIntent.setAction(ACTION_DOWNLOAD);
- return PendingIntent.getBroadcast(context, 0, downloadIntent, PendingIntent.FLAG_CANCEL_CURRENT);
+
+ return PendingIntent.getBroadcast(context, 0, downloadIntent, getPendingIntentFlags());
}
private PendingIntent getInstallIntent() {
Intent installIntent = new Intent(context, InstallActivity.class);
- return PendingIntent.getActivity(context, 0, installIntent, PendingIntent.FLAG_CANCEL_CURRENT);
+ return PendingIntent.getActivity(context, 0, installIntent, getPendingIntentFlags());
}
public void cancelNotifications() {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 75b166d9..6a9de68d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -41,6 +41,7 @@
android:theme="@style/BitmaskTheme">
<service
android:name="de.blinkt.openvpn.core.OpenVPNService"
+ android:exported="false"
android:permission="android.permission.BIND_VPN_SERVICE">
<intent-filter>
<action android:name="android.net.VpnService" />
@@ -48,6 +49,7 @@
</service>
<service
android:name=".eip.VoidVpnService"
+ android:exported="false"
android:permission="android.permission.BIND_VPN_SERVICE">
<intent-filter>
<action android:name="android.net.VpnService" />
@@ -62,7 +64,8 @@
<receiver
android:name=".base.OnBootReceiver"
android:enabled="true"
- android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
+ android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
+ android:exported="true">
<intent-filter android:priority="999">
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
@@ -79,6 +82,7 @@
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/SplashTheme"
+ android:exported="true"
>
<intent-filter android:label="@string/app_name">
@@ -126,6 +130,7 @@
android:icon="@drawable/vpn_disconnected"
android:label="@string/qs_title"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
+ android:exported="true"
android:value="true">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
diff --git a/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java b/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java
index 2b0c785e..219c1394 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/DeviceStateReceiver.java
@@ -13,6 +13,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.os.Handler;
+import android.os.Looper;
import android.preference.PreferenceManager;
import se.leap.bitmaskclient.R;
@@ -133,7 +134,7 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
trafficdata = new LinkedList<>();
mManagement = management;
mManagement.setPauseCallback(this);
- mDisconnectHandler = new Handler();
+ mDisconnectHandler = new Handler(Looper.getMainLooper());
}
diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java
index 00147828..0edfeaeb 100644
--- a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java
+++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnManagementThread.java
@@ -457,7 +457,7 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement {
}
// atuo detection of proxy
- if (proxyType == Connection.ProxyType.NONE) {
+ if (proxyType == Connection.ProxyType.NONE && mProfile != null) {
SocketAddress proxyaddr = ProxyDetection.detectProxy(mProfile);
if (proxyaddr instanceof InetSocketAddress) {
InetSocketAddress isa = (InetSocketAddress) proxyaddr;
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java b/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java
index 3f73e49d..828ef27d 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/BitmaskApp.java
@@ -17,6 +17,15 @@
package se.leap.bitmaskclient.base;
+import static android.content.Intent.CATEGORY_DEFAULT;
+import static se.leap.bitmaskclient.appUpdate.DownloadBroadcastReceiver.ACTION_DOWNLOAD;
+import static se.leap.bitmaskclient.appUpdate.DownloadServiceCommand.CHECK_VERSION_FILE;
+import static se.leap.bitmaskclient.appUpdate.DownloadServiceCommand.DOWNLOAD_UPDATE;
+import static se.leap.bitmaskclient.base.models.Constants.BROADCAST_DOWNLOAD_SERVICE_EVENT;
+import static se.leap.bitmaskclient.base.models.Constants.SHARED_PREFERENCES;
+import static se.leap.bitmaskclient.base.utils.ConfigHelper.isCalyxOSWithTetheringSupport;
+import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSavedProviderFromSharedPreferences;
+
import android.content.Context;
import android.content.IntentFilter;
import android.content.SharedPreferences;
@@ -25,27 +34,14 @@ import androidx.appcompat.app.AppCompatDelegate;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.multidex.MultiDexApplication;
-import com.squareup.leakcanary.LeakCanary;
-import com.squareup.leakcanary.RefWatcher;
-
import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.appUpdate.DownloadBroadcastReceiver;
-import se.leap.bitmaskclient.eip.EipSetupObserver;
import se.leap.bitmaskclient.base.models.ProviderObservable;
-import se.leap.bitmaskclient.tethering.TetheringStateManager;
import se.leap.bitmaskclient.base.utils.PRNGFixes;
-import se.leap.bitmaskclient.tor.TorNotificationManager;
+import se.leap.bitmaskclient.eip.EipSetupObserver;
+import se.leap.bitmaskclient.tethering.TetheringStateManager;
import se.leap.bitmaskclient.tor.TorStatusObservable;
-import static android.content.Intent.CATEGORY_DEFAULT;
-import static se.leap.bitmaskclient.base.models.Constants.BROADCAST_DOWNLOAD_SERVICE_EVENT;
-import static se.leap.bitmaskclient.base.models.Constants.SHARED_PREFERENCES;
-import static se.leap.bitmaskclient.appUpdate.DownloadBroadcastReceiver.ACTION_DOWNLOAD;
-import static se.leap.bitmaskclient.appUpdate.DownloadServiceCommand.CHECK_VERSION_FILE;
-import static se.leap.bitmaskclient.appUpdate.DownloadServiceCommand.DOWNLOAD_UPDATE;
-import static se.leap.bitmaskclient.base.utils.ConfigHelper.isCalyxOSWithTetheringSupport;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSavedProviderFromSharedPreferences;
-
/**
* Created by cyberta on 24.10.17.
*/
@@ -53,7 +49,6 @@ import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSavedProvider
public class BitmaskApp extends MultiDexApplication {
private final static String TAG = BitmaskApp.class.getSimpleName();
- private RefWatcher refWatcher;
private ProviderObservable providerObservable;
private DownloadBroadcastReceiver downloadBroadcastReceiver;
private TorStatusObservable torStatusObservable;
@@ -62,12 +57,6 @@ public class BitmaskApp extends MultiDexApplication {
@Override
public void onCreate() {
super.onCreate();
- if (LeakCanary.isInAnalyzerProcess(this)) {
- // This process is dedicated to LeakCanary for heap analysis.
- // You should not init your app in this process.
- return;
- }
- refWatcher = LeakCanary.install(this);
// Normal app init code...*/
PRNGFixes.apply();
SharedPreferences preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE);
@@ -89,17 +78,4 @@ public class BitmaskApp extends MultiDexApplication {
LocalBroadcastManager.getInstance(this.getApplicationContext()).registerReceiver(downloadBroadcastReceiver, intentFilter);
}
}
-
- /**
- * Use this method to get a RefWatcher object that checks for memory leaks in the given context.
- * Call refWatcher.watch(this) to check if all references get garbage collected.
- * @param context
- * @return the RefWatcher object
- */
- public static RefWatcher getRefWatcher(Context context) {
- BitmaskApp application = (BitmaskApp) context.getApplicationContext();
- return application.refWatcher;
- }
-
-
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
index c5593bf7..cdfee7b2 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
@@ -17,6 +17,20 @@
package se.leap.bitmaskclient.base.fragments;
+import static android.content.Context.MODE_PRIVATE;
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+import static se.leap.bitmaskclient.base.models.Constants.DONATION_URL;
+import static se.leap.bitmaskclient.base.models.Constants.ENABLE_DONATION;
+import static se.leap.bitmaskclient.base.models.Constants.PREFERRED_CITY;
+import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_KEY;
+import static se.leap.bitmaskclient.base.models.Constants.REQUEST_CODE_SWITCH_PROVIDER;
+import static se.leap.bitmaskclient.base.models.Constants.SHARED_PREFERENCES;
+import static se.leap.bitmaskclient.base.utils.ConfigHelper.isDefaultBitmask;
+import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getPreferredCity;
+import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSaveBattery;
+import static se.leap.bitmaskclient.base.utils.PreferenceHelper.saveBattery;
+
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -56,21 +70,6 @@ import se.leap.bitmaskclient.eip.EipStatus;
import se.leap.bitmaskclient.providersetup.ProviderListActivity;
import se.leap.bitmaskclient.tethering.TetheringObservable;
-import static android.content.Context.MODE_PRIVATE;
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-import static se.leap.bitmaskclient.base.BitmaskApp.getRefWatcher;
-import static se.leap.bitmaskclient.base.models.Constants.DONATION_URL;
-import static se.leap.bitmaskclient.base.models.Constants.ENABLE_DONATION;
-import static se.leap.bitmaskclient.base.models.Constants.PREFERRED_CITY;
-import static se.leap.bitmaskclient.base.models.Constants.PROVIDER_KEY;
-import static se.leap.bitmaskclient.base.models.Constants.REQUEST_CODE_SWITCH_PROVIDER;
-import static se.leap.bitmaskclient.base.models.Constants.SHARED_PREFERENCES;
-import static se.leap.bitmaskclient.base.utils.ConfigHelper.isDefaultBitmask;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getPreferredCity;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getSaveBattery;
-import static se.leap.bitmaskclient.base.utils.PreferenceHelper.saveBattery;
-
/**
* Fragment used for managing interactions for and presentation of a navigation drawer.
* See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction">
@@ -433,7 +432,6 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
@Override
public void onDestroy() {
super.onDestroy();
- getRefWatcher(getActivity()).watch(this);
preferences.unregisterOnSharedPreferenceChangeListener(this);
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java
index dbcb55b0..d65f6b52 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/ConfigHelper.java
@@ -18,6 +18,7 @@ package se.leap.bitmaskclient.base.utils;
import static se.leap.bitmaskclient.base.models.Constants.DEFAULT_BITMASK;
+import android.app.PendingIntent;
import android.content.Context;
import android.content.res.Resources;
import android.os.Build;
@@ -312,4 +313,12 @@ public class ConfigHelper {
return BuildConfig.obfsvpn_use_kcp;
}
}
+
+ public static int getPendingIntentFlags() {
+ int flags = PendingIntent.FLAG_CANCEL_CURRENT;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ flags |= PendingIntent.FLAG_IMMUTABLE;
+ }
+ return flags;
+ }
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/VpnNotificationManager.java b/app/src/main/java/se/leap/bitmaskclient/eip/VpnNotificationManager.java
index a869210e..31893fb1 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/VpnNotificationManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/VpnNotificationManager.java
@@ -55,6 +55,7 @@ import static se.leap.bitmaskclient.base.MainActivity.ACTION_SHOW_VPN_FRAGMENT;
import static se.leap.bitmaskclient.base.models.Constants.ASK_TO_CANCEL_VPN;
import static se.leap.bitmaskclient.base.models.Constants.EIP_ACTION_START;
import static se.leap.bitmaskclient.base.models.Constants.EIP_ACTION_STOP_BLOCKING_VPN;
+import static se.leap.bitmaskclient.base.utils.ConfigHelper.getPendingIntentFlags;
/**
* Created by cyberta on 14.01.18.
@@ -305,19 +306,19 @@ public class VpnNotificationManager {
private PendingIntent getMainActivityIntent() {
Intent startActivity = new Intent(context, StartActivity.class);
- return PendingIntent.getActivity(context, 0, startActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+ return PendingIntent.getActivity(context, 0, startActivity, getPendingIntentFlags());
}
private PendingIntent getStartOpenvpnIntent() {
Intent startIntent = new Intent(context, EIP.class);
startIntent.setAction(EIP_ACTION_START);
- return PendingIntent.getService(context, 0, startIntent, PendingIntent.FLAG_CANCEL_CURRENT);
+ return PendingIntent.getService(context, 0, startIntent, getPendingIntentFlags());
}
private PendingIntent getStopVoidVpnIntent() {
Intent stopVoidVpnIntent = new Intent (context, VoidVpnService.class);
stopVoidVpnIntent.setAction(EIP_ACTION_STOP_BLOCKING_VPN);
- return PendingIntent.getService(context, 0, stopVoidVpnIntent, PendingIntent.FLAG_CANCEL_CURRENT);
+ return PendingIntent.getService(context, 0, stopVoidVpnIntent, getPendingIntentFlags());
}
private PendingIntent getDisconnectIntent() {
@@ -325,7 +326,7 @@ public class VpnNotificationManager {
disconnectVPN.setAction(ACTION_SHOW_VPN_FRAGMENT);
disconnectVPN.putExtra(ASK_TO_CANCEL_VPN, true);
disconnectVPN.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- return PendingIntent.getActivity(context, 0, disconnectVPN, PendingIntent.FLAG_CANCEL_CURRENT);
+ return PendingIntent.getActivity(context, 0, disconnectVPN, getPendingIntentFlags());
}
private PendingIntent getUserInputIntent(String needed) {
@@ -334,7 +335,7 @@ public class VpnNotificationManager {
intent.putExtra("need", needed);
Bundle b = new Bundle();
b.putString("need", needed);
- PendingIntent pIntent = PendingIntent.getActivity(context, 12, intent, 0);
+ PendingIntent pIntent = PendingIntent.getActivity(context, 12, intent, getPendingIntentFlags());
return pIntent;
}