From 1ce5dd92fe9597f30b7a4f56461aaf33e83d4dc7 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 13 Aug 2019 14:07:28 +0200 Subject: [PATCH 1/8] android: Update Gradle plugin --- src/frontends/android/build.gradle | 2 +- .../android/gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/frontends/android/build.gradle b/src/frontends/android/build.gradle index 970bc062c..f5a685070 100644 --- a/src/frontends/android/build.gradle +++ b/src/frontends/android/build.gradle @@ -4,7 +4,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:3.4.2' } } diff --git a/src/frontends/android/gradle/wrapper/gradle-wrapper.properties b/src/frontends/android/gradle/wrapper/gradle-wrapper.properties index a0a4bbe2b..54bc74adb 100644 --- a/src/frontends/android/gradle/wrapper/gradle-wrapper.properties +++ b/src/frontends/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Mar 04 17:15:25 CET 2019 +#Tue Aug 13 13:47:52 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip From ef57913d3735f32b4bb9bea76443475a8da9a978 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 13 Aug 2019 14:16:11 +0200 Subject: [PATCH 2/8] android: Set compile-/targetSdkVersion to 28 This is mandatory for new apps since August 1, 2019 and will be for existing apps in November 1, 2019. --- src/frontends/android/app/build.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/frontends/android/app/build.gradle b/src/frontends/android/app/build.gradle index f37ece867..3ac62d937 100644 --- a/src/frontends/android/app/build.gradle +++ b/src/frontends/android/app/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 26 + compileSdkVersion 28 defaultConfig { applicationId "org.strongswan.android" minSdkVersion 15 - targetSdkVersion 26 + targetSdkVersion 28 versionCode 64 versionName "2.1.1" } @@ -46,9 +46,9 @@ android { } dependencies { - implementation 'com.android.support:appcompat-v7:26.0.2' - implementation 'com.android.support:design:26.0.2' - implementation 'com.android.support:preference-v7:26.0.2' - implementation 'com.android.support:support-v4:26.0.2' + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support:design:28.0.0' + implementation 'com.android.support:preference-v7:28.0.0' + implementation 'com.android.support:support-v4:28.0.0' testImplementation 'junit:junit:4.12' } From d59158df7bfa0923d0d41e548ca0299d17057b1b Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 13 Aug 2019 14:28:31 +0200 Subject: [PATCH 3/8] android: Switch to Loaders from the support library They are officially deprecated as of API 28 (recommended replacement is a combination of ViewModels and LiveData, maybe something to look into later). --- .../ui/SelectedApplicationsListFragment.java | 2 +- .../android/ui/TrustedCertificateListFragment.java | 3 ++- .../android/ui/VpnProfileImportActivity.java | 14 +++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsListFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsListFragment.java index 38c7494d5..1f0b693e4 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsListFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsListFragment.java @@ -74,7 +74,7 @@ public class SelectedApplicationsListFragment extends ListFragment implements Lo } mSelection = new TreeSet<>(selection); - getLoaderManager().initLoader(0, null, this); + LoaderManager.getInstance(this).initLoader(0, null, this); } @Override diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateListFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateListFragment.java index ae48ba2ba..4d4beafa8 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateListFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateListFragment.java @@ -18,6 +18,7 @@ package org.strongswan.android.ui; import android.content.Context; import android.os.Bundle; import android.support.v4.app.ListFragment; +import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.Loader; @@ -79,7 +80,7 @@ public class TrustedCertificateListFragment extends ListFragment implements Load mSource = (TrustedCertificateSource)arguments.getSerializable(EXTRA_CERTIFICATE_SOURCE); } - getLoaderManager().initLoader(0, null, this); + LoaderManager.getInstance(this).initLoader(0, null, this); } @Override diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java index 221840be8..eda51a006 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java @@ -16,19 +16,19 @@ package org.strongswan.android.ui; import android.app.Activity; -import android.app.LoaderManager; import android.content.ActivityNotFoundException; -import android.content.AsyncTaskLoader; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.content.Loader; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.security.KeyChain; import android.security.KeyChainAliasCallback; import android.security.KeyChainException; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.AsyncTaskLoader; +import android.support.v4.content.Loader; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; @@ -229,7 +229,7 @@ public class VpnProfileImportActivity extends AppCompatActivity mUserCertLoading = savedInstanceState.getString(VpnProfileDataSource.KEY_USER_CERTIFICATE); if (mUserCertLoading != null) { - getLoaderManager().initLoader(USER_CERT_LOADER, null, mUserCertificateLoaderCallbacks); + LoaderManager.getInstance(this).initLoader(USER_CERT_LOADER, null, mUserCertificateLoaderCallbacks); } mImportUserCert.setEnabled(!savedInstanceState.getBoolean(PKCS12_INSTALLED)); } @@ -312,7 +312,7 @@ public class VpnProfileImportActivity extends AppCompatActivity Bundle args = new Bundle(); args.putParcelable(PROFILE_URI, uri); - getLoaderManager().initLoader(PROFILE_LOADER, args, mProfileLoaderCallbacks); + LoaderManager.getInstance(this).initLoader(PROFILE_LOADER, args, mProfileLoaderCallbacks); } public void handleProfile(ProfileLoadResult data) @@ -400,7 +400,7 @@ public class VpnProfileImportActivity extends AppCompatActivity if (mUserCertLoading == null) { mUserCertLoading = getString(R.string.profile_cert_alias, mProfile.getName()); - getLoaderManager().initLoader(USER_CERT_LOADER, null, mUserCertificateLoaderCallbacks); + LoaderManager.getInstance(this).initLoader(USER_CERT_LOADER, null, mUserCertificateLoaderCallbacks); } updateUserCertView(); } @@ -902,7 +902,7 @@ public class VpnProfileImportActivity extends AppCompatActivity updateUserCertView(); if (alias != null) { /* otherwise the dialog was canceled, the request denied */ - getLoaderManager().restartLoader(USER_CERT_LOADER, null, mUserCertificateLoaderCallbacks); + LoaderManager.getInstance(VpnProfileImportActivity.this).restartLoader(USER_CERT_LOADER, null, mUserCertificateLoaderCallbacks); } } }); From 07a7d842f13bda3e12c70d23fde2ea0c9e3eae8b Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 13 Aug 2019 14:42:39 +0200 Subject: [PATCH 4/8] android: Request FOREGROUND_SERVICE permission This is required since API 28 to call Service.startForeground. --- src/frontends/android/app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontends/android/app/src/main/AndroidManifest.xml b/src/frontends/android/app/src/main/AndroidManifest.xml index 2a75d05ab..35fe4ca3f 100644 --- a/src/frontends/android/app/src/main/AndroidManifest.xml +++ b/src/frontends/android/app/src/main/AndroidManifest.xml @@ -20,6 +20,7 @@ + Date: Tue, 13 Aug 2019 15:01:31 +0200 Subject: [PATCH 5/8] android: Migrate from support libraries to AndroidX The support libraries will not be developed further. --- src/frontends/android/app/build.gradle | 8 ++++---- .../android/logic/CharonVpnService.java | 5 +++-- .../android/logic/SimpleFetcher.java | 4 ++-- .../android/logic/VpnStateService.java | 3 ++- .../CertificateDeleteConfirmationDialog.java | 5 +++-- .../android/ui/ImcStateFragment.java | 9 +++++---- .../strongswan/android/ui/LogActivity.java | 3 ++- .../strongswan/android/ui/LogFragment.java | 5 +++-- .../strongswan/android/ui/MainActivity.java | 15 +++++++------- .../ui/RemediationInstructionFragment.java | 3 ++- .../ui/RemediationInstructionsActivity.java | 2 +- .../ui/RemediationInstructionsFragment.java | 3 ++- .../ui/SelectedApplicationsActivity.java | 9 +++++---- .../ui/SelectedApplicationsListFragment.java | 13 ++++++------ .../android/ui/SettingsActivity.java | 3 ++- .../android/ui/SettingsFragment.java | 9 +++++---- .../ui/TrustedCertificateImportActivity.java | 9 +++++---- .../ui/TrustedCertificateListFragment.java | 11 +++++----- .../ui/TrustedCertificatesActivity.java | 16 ++++++++------- .../android/ui/VpnProfileControlActivity.java | 13 ++++++------ .../android/ui/VpnProfileDetailActivity.java | 9 +++++---- .../android/ui/VpnProfileImportActivity.java | 13 ++++++------ .../android/ui/VpnProfileListFragment.java | 5 +++-- .../android/ui/VpnProfileSelectActivity.java | 9 +++++---- .../android/ui/VpnStateFragment.java | 5 +++-- .../ui/adapter/SelectedApplicationEntry.java | 3 ++- .../ui/widget/CheckableLinearLayout.java | 3 ++- .../ui/widget/TextInputLayoutHelper.java | 12 ++++++----- .../org/strongswan/android/utils/IPRange.java | 4 ++-- .../app/src/main/res/layout/login_dialog.xml | 12 +++++------ .../main/res/layout/profile_detail_view.xml | 20 +++++++++---------- .../main/res/layout/profile_import_view.xml | 6 +++--- .../layout/trusted_certificates_activity.xml | 4 ++-- src/frontends/android/gradle.properties | 2 ++ 34 files changed, 142 insertions(+), 113 deletions(-) create mode 100644 src/frontends/android/gradle.properties diff --git a/src/frontends/android/app/build.gradle b/src/frontends/android/app/build.gradle index 3ac62d937..b2d8c0b95 100644 --- a/src/frontends/android/app/build.gradle +++ b/src/frontends/android/app/build.gradle @@ -46,9 +46,9 @@ android { } dependencies { - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support:design:28.0.0' - implementation 'com.android.support:preference-v7:28.0.0' - implementation 'com.android.support:support-v4:28.0.0' + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'androidx.preference:preference:1.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'com.google.android.material:material:1.0.0' testImplementation 'junit:junit:4.12' } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java index 367248039..3e4305845 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/CharonVpnService.java @@ -38,8 +38,6 @@ import android.os.ParcelFileDescriptor; import android.preference.PreferenceManager; import android.security.KeyChain; import android.security.KeyChainException; -import android.support.v4.app.NotificationCompat; -import android.support.v4.content.ContextCompat; import android.system.OsConstants; import android.util.Log; @@ -77,6 +75,9 @@ import java.util.List; import java.util.Locale; import java.util.SortedSet; +import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; + public class CharonVpnService extends VpnService implements Runnable, VpnStateService.VpnStateListener { private static final String TAG = CharonVpnService.class.getSimpleName(); diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/SimpleFetcher.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/SimpleFetcher.java index 6eaccc4d8..de0ae97fe 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/SimpleFetcher.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/SimpleFetcher.java @@ -15,8 +15,6 @@ package org.strongswan.android.logic; -import android.support.annotation.Keep; - import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -34,6 +32,8 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import androidx.annotation.Keep; + @Keep public class SimpleFetcher { diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/VpnStateService.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/VpnStateService.java index 588929361..551aff60b 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/VpnStateService.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/VpnStateService.java @@ -24,7 +24,6 @@ import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.SystemClock; -import android.support.v4.content.ContextCompat; import org.strongswan.android.R; import org.strongswan.android.data.VpnProfile; @@ -41,6 +40,8 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; +import androidx.core.content.ContextCompat; + public class VpnStateService extends Service { private final HashSet mListeners = new HashSet(); diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/CertificateDeleteConfirmationDialog.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/CertificateDeleteConfirmationDialog.java index 5e36b11ff..e1a087277 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/CertificateDeleteConfirmationDialog.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/CertificateDeleteConfirmationDialog.java @@ -19,11 +19,12 @@ import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatDialogFragment; import org.strongswan.android.R; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatDialogFragment; + /** * Class that displays a confirmation dialog to delete a selected local * certificate. diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/ImcStateFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/ImcStateFragment.java index a3cb245e8..fe8e770db 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/ImcStateFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/ImcStateFragment.java @@ -22,10 +22,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.content.ContextCompat; import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -45,6 +41,11 @@ import org.strongswan.android.logic.imc.RemediationInstruction; import java.util.ArrayList; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + public class ImcStateFragment extends Fragment implements VpnStateListener { private int mColorIsolate; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogActivity.java index c67017bb2..adcd83228 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogActivity.java @@ -18,7 +18,6 @@ package org.strongswan.android.ui; import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; @@ -29,6 +28,8 @@ import org.strongswan.android.logic.CharonVpnService; import java.io.File; +import androidx.appcompat.app.AppCompatActivity; + public class LogActivity extends AppCompatActivity { @Override diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogFragment.java index 625940fd4..2882740d5 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogFragment.java @@ -19,8 +19,6 @@ import android.content.Context; import android.os.Bundle; import android.os.FileObserver; import android.os.Handler; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,6 +35,9 @@ import java.io.FileReader; import java.io.StringReader; import java.util.ArrayList; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + public class LogFragment extends Fragment { private static String SCROLL_POSITION = "SCROLL_POSITION"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java index bfef8e98c..b00f3b205 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/MainActivity.java @@ -23,13 +23,6 @@ import android.content.Intent; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDialogFragment; import android.text.format.Formatter; import android.view.Menu; import android.view.MenuItem; @@ -44,6 +37,14 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + public class MainActivity extends AppCompatActivity implements OnVpnProfileSelectedListener { public static final String CONTACT_EMAIL = "android@strongswan.org"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionFragment.java index d5d901b14..aa1f4729a 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionFragment.java @@ -16,7 +16,6 @@ package org.strongswan.android.ui; import android.os.Bundle; -import android.support.v4.app.ListFragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,6 +26,8 @@ import android.widget.TextView; import org.strongswan.android.R; import org.strongswan.android.logic.imc.RemediationInstruction; +import androidx.fragment.app.ListFragment; + public class RemediationInstructionFragment extends ListFragment { public static final String ARG_REMEDIATION_INSTRUCTION = "instruction"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsActivity.java index 7f5542745..66ea9e580 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsActivity.java @@ -16,7 +16,7 @@ package org.strongswan.android.ui; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.MenuItem; import org.strongswan.android.R; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsFragment.java index 32605e99c..d00f561e0 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsFragment.java @@ -17,7 +17,6 @@ package org.strongswan.android.ui; import android.content.Context; import android.os.Bundle; -import android.support.v4.app.ListFragment; import android.view.View; import android.widget.ListView; @@ -27,6 +26,8 @@ import org.strongswan.android.ui.adapter.RemediationInstructionAdapter; import java.util.ArrayList; +import androidx.fragment.app.ListFragment; + public class RemediationInstructionsFragment extends ListFragment { public static final String EXTRA_REMEDIATION_INSTRUCTIONS = "instructions"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsActivity.java index db2e56655..6e9a95767 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsActivity.java @@ -17,14 +17,15 @@ package org.strongswan.android.ui; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentManager; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import org.strongswan.android.data.VpnProfileDataSource; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentManager; + public class SelectedApplicationsActivity extends AppCompatActivity { private static final String LIST_TAG = "ApplicationList"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsListFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsListFragment.java index 1f0b693e4..2b041efa7 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsListFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsListFragment.java @@ -20,12 +20,6 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.ListFragment; -import android.support.v4.app.LoaderManager; -import android.support.v4.content.AsyncTaskLoader; -import android.support.v4.content.Loader; -import android.support.v7.widget.SearchView; import android.text.TextUtils; import android.util.Pair; import android.view.Menu; @@ -46,6 +40,13 @@ import java.util.List; import java.util.SortedSet; import java.util.TreeSet; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.SearchView; +import androidx.fragment.app.ListFragment; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.AsyncTaskLoader; +import androidx.loader.content.Loader; + public class SelectedApplicationsListFragment extends ListFragment implements LoaderManager.LoaderCallbacks, List>>, SearchView.OnQueryTextListener { private SelectedApplicationsAdapter mAdapter; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SettingsActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SettingsActivity.java index ad28529f8..f70d46151 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SettingsActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SettingsActivity.java @@ -16,9 +16,10 @@ package org.strongswan.android.ui; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; +import androidx.appcompat.app.AppCompatActivity; + public class SettingsActivity extends AppCompatActivity { diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SettingsFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SettingsFragment.java index b710c828c..654f57485 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SettingsFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SettingsFragment.java @@ -18,10 +18,6 @@ package org.strongswan.android.ui; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; -import android.support.v7.preference.ListPreference; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceFragmentCompat; -import android.support.v7.preference.PreferenceManager; import org.strongswan.android.R; import org.strongswan.android.data.VpnProfile; @@ -32,6 +28,11 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.PreferenceManager; + import static org.strongswan.android.utils.Constants.PREF_DEFAULT_VPN_PROFILE; import static org.strongswan.android.utils.Constants.PREF_DEFAULT_VPN_PROFILE_MRU; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateImportActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateImportActivity.java index 9cfecf348..4581d4427 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateImportActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateImportActivity.java @@ -24,10 +24,6 @@ import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDialogFragment; import android.widget.Toast; import org.strongswan.android.R; @@ -41,6 +37,11 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.fragment.app.FragmentTransaction; + public class TrustedCertificateImportActivity extends AppCompatActivity { private static final int OPEN_DOCUMENT = 0; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateListFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateListFragment.java index 4d4beafa8..b89386a86 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateListFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificateListFragment.java @@ -17,11 +17,6 @@ package org.strongswan.android.ui; import android.content.Context; import android.os.Bundle; -import android.support.v4.app.ListFragment; -import android.support.v4.app.LoaderManager; -import android.support.v4.app.LoaderManager.LoaderCallbacks; -import android.support.v4.content.AsyncTaskLoader; -import android.support.v4.content.Loader; import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; @@ -46,6 +41,12 @@ import java.util.Map.Entry; import java.util.Observable; import java.util.Observer; +import androidx.fragment.app.ListFragment; +import androidx.loader.app.LoaderManager; +import androidx.loader.app.LoaderManager.LoaderCallbacks; +import androidx.loader.content.AsyncTaskLoader; +import androidx.loader.content.Loader; + public class TrustedCertificateListFragment extends ListFragment implements LoaderCallbacks>, OnQueryTextListener { public static final String EXTRA_CERTIFICATE_SOURCE = "certificate_source"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificatesActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificatesActivity.java index 0110b63c8..295379023 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificatesActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/TrustedCertificatesActivity.java @@ -20,16 +20,11 @@ import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.support.design.widget.TabLayout; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; +import com.google.android.material.tabs.TabLayout; + import org.strongswan.android.R; import org.strongswan.android.data.VpnProfileDataSource; import org.strongswan.android.logic.TrustedCertificateManager; @@ -39,6 +34,13 @@ import org.strongswan.android.ui.CertificateDeleteConfirmationDialog.OnCertifica import java.security.KeyStore; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.viewpager.widget.ViewPager; + public class TrustedCertificatesActivity extends AppCompatActivity implements TrustedCertificateListFragment.OnTrustedCertificateSelectedListener, OnCertificateDeleteListener { public static final String SELECT_CERTIFICATE = "org.strongswan.android.action.SELECT_CERTIFICATE"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileControlActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileControlActivity.java index 78cbebfae..813afbb94 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileControlActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileControlActivity.java @@ -25,12 +25,6 @@ import android.content.ServiceConnection; import android.net.VpnService; import android.os.Bundle; import android.os.IBinder; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDialogFragment; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; @@ -43,6 +37,13 @@ import org.strongswan.android.data.VpnType.VpnTypeFeature; import org.strongswan.android.logic.VpnStateService; import org.strongswan.android.logic.VpnStateService.State; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + public class VpnProfileControlActivity extends AppCompatActivity { public static final String START_PROFILE = "org.strongswan.android.action.START_PROFILE"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java index e0965873c..03adc1ce5 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java @@ -27,10 +27,6 @@ import android.os.Bundle; import android.security.KeyChain; import android.security.KeyChainAliasCallback; import android.security.KeyChainException; -import android.support.v4.content.LocalBroadcastManager; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDialogFragment; import android.text.Editable; import android.text.Html; import android.text.SpannableString; @@ -79,6 +75,11 @@ import java.util.SortedSet; import java.util.TreeSet; import java.util.UUID; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + public class VpnProfileDetailActivity extends AppCompatActivity { private static final int SELECT_TRUSTED_CERTIFICATE = 0; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java index eda51a006..eae768378 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileImportActivity.java @@ -26,11 +26,6 @@ import android.os.Bundle; import android.security.KeyChain; import android.security.KeyChainAliasCallback; import android.security.KeyChainException; -import android.support.v4.app.LoaderManager; -import android.support.v4.content.AsyncTaskLoader; -import android.support.v4.content.Loader; -import android.support.v4.content.LocalBroadcastManager; -import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Base64; import android.view.Menu; @@ -79,6 +74,12 @@ import java.util.UUID; import javax.net.ssl.SSLHandshakeException; +import androidx.appcompat.app.AppCompatActivity; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.AsyncTaskLoader; +import androidx.loader.content.Loader; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + public class VpnProfileImportActivity extends AppCompatActivity { private static final String PKCS12_INSTALLED = "PKCS12_INSTALLED"; @@ -95,7 +96,7 @@ public class VpnProfileImportActivity extends AppCompatActivity private TrustedCertificateEntry mUserCertEntry; private String mUserCertLoading; private boolean mHideImport; - private android.support.v4.widget.ContentLoadingProgressBar mProgressBar; + private androidx.core.widget.ContentLoadingProgressBar mProgressBar; private TextView mExistsWarning; private ViewGroup mBasicDataGroup; private TextView mName; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileListFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileListFragment.java index 904b4341c..c6d430f36 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileListFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileListFragment.java @@ -23,8 +23,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.TypedArray; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.content.LocalBroadcastManager; import android.util.AttributeSet; import android.view.ActionMode; import android.view.LayoutInflater; @@ -51,6 +49,9 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; +import androidx.fragment.app.Fragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + public class VpnProfileListFragment extends Fragment { private static final String SELECTED_KEY = "SELECTED"; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileSelectActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileSelectActivity.java index fe3d01322..0b1e61187 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileSelectActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileSelectActivity.java @@ -17,15 +17,16 @@ package org.strongswan.android.ui; import android.content.Intent; import android.os.Bundle; -import android.support.v4.content.pm.ShortcutInfoCompat; -import android.support.v4.content.pm.ShortcutManagerCompat; -import android.support.v4.graphics.drawable.IconCompat; -import android.support.v7.app.AppCompatActivity; import org.strongswan.android.R; import org.strongswan.android.data.VpnProfile; import org.strongswan.android.ui.VpnProfileListFragment.OnVpnProfileSelectedListener; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.pm.ShortcutInfoCompat; +import androidx.core.content.pm.ShortcutManagerCompat; +import androidx.core.graphics.drawable.IconCompat; + public class VpnProfileSelectActivity extends AppCompatActivity implements OnVpnProfileSelectedListener { @Override diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnStateFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnStateFragment.java index edc70fa96..1214b1247 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnStateFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnStateFragment.java @@ -24,8 +24,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; -import android.support.v4.app.Fragment; -import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -41,6 +39,9 @@ import org.strongswan.android.logic.VpnStateService.ErrorState; import org.strongswan.android.logic.VpnStateService.State; import org.strongswan.android.logic.VpnStateService.VpnStateListener; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; + public class VpnStateFragment extends Fragment implements VpnStateListener { private boolean mVisible; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/adapter/SelectedApplicationEntry.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/adapter/SelectedApplicationEntry.java index 0bfbbcfa5..df6753db5 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/adapter/SelectedApplicationEntry.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/adapter/SelectedApplicationEntry.java @@ -18,10 +18,11 @@ package org.strongswan.android.ui.adapter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; -import android.support.annotation.NonNull; import java.text.Collator; +import androidx.annotation.NonNull; + public class SelectedApplicationEntry implements Comparable { private final ApplicationInfo mInfo; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/CheckableLinearLayout.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/CheckableLinearLayout.java index fb5e85b0d..48e942ff8 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/CheckableLinearLayout.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/CheckableLinearLayout.java @@ -16,11 +16,12 @@ package org.strongswan.android.ui.widget; import android.content.Context; -import android.support.annotation.Nullable; import android.util.AttributeSet; import android.widget.Checkable; import android.widget.LinearLayout; +import androidx.annotation.Nullable; + public class CheckableLinearLayout extends LinearLayout implements Checkable { private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked}; diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/TextInputLayoutHelper.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/TextInputLayoutHelper.java index 45b0ae592..4897933d9 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/TextInputLayoutHelper.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/TextInputLayoutHelper.java @@ -17,10 +17,6 @@ package org.strongswan.android.ui.widget; import android.content.Context; import android.content.res.TypedArray; -import android.support.annotation.Nullable; -import android.support.design.widget.TextInputLayout; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; @@ -31,10 +27,16 @@ import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; +import com.google.android.material.textfield.TextInputLayout; + import org.strongswan.android.R; +import androidx.annotation.Nullable; +import androidx.core.view.ViewCompat; +import androidx.core.view.ViewPropertyAnimatorListenerAdapter; + /** - * Layout that extends {@link android.support.design.widget.TextInputLayout} with a helper text + * Layout that extends {@link TextInputLayout} with a helper text * displayed below the text field when it receives the focus. Also, any error message shown with * {@link #setError(CharSequence)} is hidden when the text field is changed (this mirrors the * behavior of {@link android.widget.EditText}). diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/utils/IPRange.java b/src/frontends/android/app/src/main/java/org/strongswan/android/utils/IPRange.java index e8397707a..64e0bab23 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/utils/IPRange.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/utils/IPRange.java @@ -15,8 +15,6 @@ package org.strongswan.android.utils; -import android.support.annotation.NonNull; - import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; @@ -24,6 +22,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import androidx.annotation.NonNull; + /** * Class that represents a range of IP addresses. This range could be a proper subnet, but that's * not necessarily the case (see {@code getPrefix} and {@code toSubnets}). diff --git a/src/frontends/android/app/src/main/res/layout/login_dialog.xml b/src/frontends/android/app/src/main/res/layout/login_dialog.xml index 32892da16..0f6937846 100644 --- a/src/frontends/android/app/src/main/res/layout/login_dialog.xml +++ b/src/frontends/android/app/src/main/res/layout/login_dialog.xml @@ -21,12 +21,12 @@ android:orientation="vertical" android:padding="10dp" > - - - + - - - + diff --git a/src/frontends/android/app/src/main/res/layout/profile_detail_view.xml b/src/frontends/android/app/src/main/res/layout/profile_detail_view.xml index 671c58d67..0bdbc1d68 100644 --- a/src/frontends/android/app/src/main/res/layout/profile_detail_view.xml +++ b/src/frontends/android/app/src/main/res/layout/profile_detail_view.xml @@ -35,7 +35,7 @@ android:hint="@string/profile_gateway_label" app:helper_text="@string/profile_gateway_hint" > - - - - - - - - - - - - - - - Date: Tue, 13 Aug 2019 15:37:05 +0200 Subject: [PATCH 6/8] android: Replace deprecated Html.fromHtml with version from AndroidX --- .../org/strongswan/android/ui/VpnProfileDetailActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java index 03adc1ce5..9674b7d41 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java @@ -78,6 +78,7 @@ import java.util.UUID; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.core.text.HtmlCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; public class VpnProfileDetailActivity extends AppCompatActivity @@ -1036,7 +1037,7 @@ public class VpnProfileDetailActivity extends AppCompatActivity { return new AlertDialog.Builder(getActivity()) .setTitle(R.string.tnc_notice_title) - .setMessage(Html.fromHtml(getString(R.string.tnc_notice_details))) + .setMessage(HtmlCompat.fromHtml(getString(R.string.tnc_notice_details), HtmlCompat.FROM_HTML_MODE_LEGACY)) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) From 8af50736e12431da4bf7254c4f70ad5823b65364 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 13 Aug 2019 15:26:22 +0200 Subject: [PATCH 7/8] android: Fix null pointer dereference in TextInputLayoutHelper The AndroidX/Material version of TextInputLayout actually supports a helper text, but it is always shown, so we continue to use our version. --- .../strongswan/android/ui/widget/TextInputLayoutHelper.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/TextInputLayoutHelper.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/TextInputLayoutHelper.java index 4897933d9..f5390620f 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/TextInputLayoutHelper.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/widget/TextInputLayoutHelper.java @@ -143,7 +143,10 @@ public class TextInputLayoutHelper extends TextInputLayout */ public void setHelperText(CharSequence text) { - mHelperText.setText(text); + if (mHelperText != null) + { + mHelperText.setText(text); + } } private void showHelper(boolean show) From 3716af079e2133d04ba569d2d8e07838874d0414 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 16 Aug 2019 17:04:28 +0200 Subject: [PATCH 8/8] android: Avoid crash related to TileService on Huawei devices No idea when exactly this happens but on many Huawei devices (and only on them) it seems that onStartListening is sometimes called after onDestroy i.e. when the database was already closed. This caused an InvalidStateException in getProfile via updateTile when retrieving the current profile. It's possible that it happens during shutdown (there have been similar reports related to TileService implementations) so users might not even notice, but it pollutes the Play Console, so this workaround now makes sure the database is open when updateTile is called. --- .../strongswan/android/ui/VpnTileService.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnTileService.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnTileService.java index 623a80f22..e754fe151 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnTileService.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnTileService.java @@ -39,7 +39,6 @@ import org.strongswan.android.utils.Constants; @TargetApi(Build.VERSION_CODES.N) public class VpnTileService extends TileService implements VpnStateService.VpnStateListener { - private boolean mListening; private VpnProfileDataSource mDataSource; private VpnStateService mService; private final ServiceConnection mServiceConnection = new ServiceConnection() @@ -54,7 +53,7 @@ public class VpnTileService extends TileService implements VpnStateService.VpnSt public void onServiceConnected(ComponentName name, IBinder service) { mService = ((VpnStateService.LocalBinder)service).getService(); - if (mListening) + if (mDataSource != null) { mService.registerListener(VpnTileService.this); updateTile(); @@ -70,27 +69,27 @@ public class VpnTileService extends TileService implements VpnStateService.VpnSt Context context = getApplicationContext(); context.bindService(new Intent(context, VpnStateService.class), mServiceConnection, Service.BIND_AUTO_CREATE); - - mDataSource = new VpnProfileDataSource(this); - mDataSource.open(); } @Override public void onDestroy() { super.onDestroy(); + if (mService != null) { getApplicationContext().unbindService(mServiceConnection); } - mDataSource.close(); } @Override public void onStartListening() { super.onStartListening(); - mListening = true; + + mDataSource = new VpnProfileDataSource(this); + mDataSource.open(); + if (mService != null) { mService.registerListener(this); @@ -102,11 +101,14 @@ public class VpnTileService extends TileService implements VpnStateService.VpnSt public void onStopListening() { super.onStopListening(); - mListening = false; + if (mService != null) { mService.unregisterListener(this); } + + mDataSource.close(); + mDataSource = null; } private VpnProfile getProfile()