diff --git a/src/frontends/android/app/build.gradle b/src/frontends/android/app/build.gradle index f37ece867..b2d8c0b95 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 '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/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 @@ + 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 38c7494d5..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; @@ -74,7 +75,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/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 ae48ba2ba..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,10 +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.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; @@ -45,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"; @@ -79,7 +81,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/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..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 @@ -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,12 @@ 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.core.text.HtmlCompat; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + public class VpnProfileDetailActivity extends AppCompatActivity { private static final int SELECT_TRUSTED_CERTIFICATE = 0; @@ -1035,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) 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..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 @@ -16,21 +16,16 @@ 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.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; @@ -229,7 +230,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 +313,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 +401,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 +903,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); } } }); 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/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() 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..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 @@ -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}). @@ -141,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) 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" > - - - - - - - - - - - - - - -