From e544282169db8b8e90867bbb087133621bde35ca Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 21 Aug 2022 17:21:46 +0200 Subject: Log exit reason on start in log This should help finding out why the process suddenly dies. --- main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java | 1 + 1 file changed, 1 insertion(+) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java index 5bc0bbb1..6d4d2968 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java @@ -104,6 +104,7 @@ public class SendDumpFragment extends Fragment { Pair ldump = getLastestDump(getActivity()); if (ldump == null) { VpnStatus.logError("No Minidump found!"); + return; } uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.first.getName())); -- cgit v1.2.3 From 017b3f39c2368a41012c0c6a1f000858b305b1d3 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 21 Aug 2022 20:08:44 +0200 Subject: Implement querying for notification permission (API 33) --- .../blinkt/openvpn/fragments/VPNProfileList.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java index c7ee5df1..e833e81f 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java @@ -5,12 +5,14 @@ package de.blinkt.openvpn.fragments; +import android.Manifest; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; import android.graphics.drawable.Drawable; @@ -20,6 +22,7 @@ import android.os.Build; import android.os.Bundle; import android.os.PersistableBundle; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.fragment.app.ListFragment; @@ -76,6 +79,7 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn private static final int SELECT_PROFILE = 43; private static final int IMPORT_PROFILE = 231; private static final int FILE_PICKER_RESULT_KITKAT = 392; + private static final int RESULT_PERMISSION = 395; private static final int MENU_IMPORT_PROFILE = Menu.FIRST + 1; private static final int MENU_CHANGE_SORTING = Menu.FIRST + 2; private static final int MENU_IMPORT_AS = Menu.FIRST + 3; @@ -85,6 +89,7 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn private ArrayAdapter mArrayadapter; private Intent mLastIntent; private VpnProfile defaultVPN; + private View mPermissionView; @Override public void updateState(String state, String logmessage, final int localizedResId, ConnectionStatus level, Intent intent) { @@ -278,10 +283,24 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn if (fab_import != null) fab_import.setOnClickListener(this); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) + checkForNotificationPermission(v); + + return v; } + private void checkForNotificationPermission(View v) { + mPermissionView = v.findViewById(R.id.notification_permission); + boolean permissionGranted = (requireActivity().checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED); + mPermissionView.setVisibility(permissionGranted ? View.GONE : View.VISIBLE); + + mPermissionView.setOnClickListener((view) -> { + requireActivity().requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, RESULT_PERMISSION); + }); + } + private void setListAdapter() { if (mArrayadapter == null) { mArrayadapter = new VPNArrayAdapter(getActivity(), R.layout.vpn_list_item, R.id.vpn_item_title); @@ -483,9 +502,12 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn VpnProfile profile = ProfileManager.get(getActivity(), profileUUID); if (profile != null) onAddOrDuplicateProfile(profile); + } else if (resultCode == RESULT_PERMISSION) { + checkForNotificationPermission(requireView()); } + if (resultCode != Activity.RESULT_OK) return; -- cgit v1.2.3 From ffa1cca8544a224eef7fb89dc8dd3bef9ecc8e5c Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 21 Aug 2022 20:49:07 +0200 Subject: Replace system standard bitmap drawables with vector drawables --- .../java/de/blinkt/openvpn/fragments/FileSelectionFragment.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/FileSelectionFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/FileSelectionFragment.java index 121cf324..59607fd2 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/FileSelectionFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/FileSelectionFragment.java @@ -186,11 +186,11 @@ public class FileSelectionFragment extends ListFragment { if (!currentPath.equals(ROOT)) { item.add(ROOT); - addItem(ROOT, R.drawable.ic_root_folder_am); + addItem(ROOT, R.drawable.ic_baseline_folder_24); path.add(ROOT); item.add("../"); - addItem("../", R.drawable.ic_root_folder_am); + addItem("../", R.drawable.ic_baseline_folder_24); path.add(f.getParent()); parentPath = f.getParent(); @@ -248,11 +248,11 @@ public class FileSelectionFragment extends ListFragment { ITEM_KEY, ITEM_IMAGE}, new int[]{R.id.fdrowtext, R.id.fdrowimage}); for (String dir : dirsMap.tailMap("").values()) { - addItem(dir, R.drawable.ic_root_folder_am); + addItem(dir, R.drawable.ic_baseline_folder_24); } for (String file : filesMap.tailMap("").values()) { - addItem(file, R.drawable.ic_doc_generic_am); + addItem(file, R.drawable.ic_baseline_file_present_24); } fileList.notifyDataSetChanged(); -- cgit v1.2.3 From 203e6f179b39bc83f3af8c363122d225fa98d125 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Thu, 25 Aug 2022 18:01:04 +0200 Subject: Fix notifcation request not going away after granted. --- .../de/blinkt/openvpn/fragments/VPNProfileList.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java index e833e81f..8c84a913 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java @@ -22,6 +22,8 @@ import android.os.Build; import android.os.Bundle; import android.os.PersistableBundle; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; @@ -79,7 +81,6 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn private static final int SELECT_PROFILE = 43; private static final int IMPORT_PROFILE = 231; private static final int FILE_PICKER_RESULT_KITKAT = 392; - private static final int RESULT_PERMISSION = 395; private static final int MENU_IMPORT_PROFILE = Menu.FIRST + 1; private static final int MENU_CHANGE_SORTING = Menu.FIRST + 2; private static final int MENU_IMPORT_AS = Menu.FIRST + 3; @@ -90,6 +91,7 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn private Intent mLastIntent; private VpnProfile defaultVPN; private View mPermissionView; + private ActivityResultLauncher mPermReceiver; @Override public void updateState(String state, String logmessage, final int localizedResId, ConnectionStatus level, Intent intent) { @@ -135,6 +137,13 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn super.onCreate(savedInstanceState); setHasOptionsMenu(true); setListAdapter(); + + registerPermissionReceiver(); + } + + private void registerPermissionReceiver() { + mPermReceiver = registerForActivityResult(new ActivityResultContracts.RequestPermission(), + result -> checkForNotificationPermission(requireView())); } @RequiresApi(api = Build.VERSION_CODES.N_MR1) @@ -297,7 +306,7 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn mPermissionView.setVisibility(permissionGranted ? View.GONE : View.VISIBLE); mPermissionView.setOnClickListener((view) -> { - requireActivity().requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, RESULT_PERMISSION); + mPermReceiver.launch(Manifest.permission.POST_NOTIFICATIONS); }); } @@ -502,16 +511,11 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn VpnProfile profile = ProfileManager.get(getActivity(), profileUUID); if (profile != null) onAddOrDuplicateProfile(profile); - } else if (resultCode == RESULT_PERMISSION) { - checkForNotificationPermission(requireView()); } - - if (resultCode != Activity.RESULT_OK) return; - if (requestCode == START_VPN_CONFIG) { String configuredVPN = data.getStringExtra(VpnProfile.EXTRA_PROFILEUUID); -- cgit v1.2.3 From ea13917b41ed161f8a385ed438ee8fd3742f557b Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 1 Nov 2022 18:35:16 +0100 Subject: Add OpenSSL version in about screen --- main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java index 240fbe06..182c1a56 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java @@ -83,9 +83,13 @@ public class AboutFragment extends Fragment implements View.OnClickListener { TextView verO2 = v.findViewById(R.id.version_ovpn2); TextView verO3 = v.findViewById(R.id.version_ovpn3); + TextView osslVer = v.findViewById(R.id.openssl_version); verO2.setText(String.format(Locale.US, "OpenVPN version: %s", NativeUtils.getOpenVPN2GitVersion())); verO3.setText(String.format(Locale.US, "OpenVPN3 core version: %s", NativeUtils.getOpenVPN3GitVersion())); + osslVer.setText(String.format(Locale.US, "OpenSSL version: %s", NativeUtils.getOpenSSLVersion())); + + /* recreating view without onCreate/onDestroy cycle */ TextView translation = (TextView) v.findViewById(R.id.translation); -- cgit v1.2.3 From 8dd69e81d589d787210a58bff8629eaf068908b6 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 1 Nov 2022 18:36:03 +0100 Subject: Log reason why a VPN process was started --- main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java | 1 + main/src/ui/java/de/blinkt/openvpn/activities/CreateShortcuts.java | 6 ++---- main/src/ui/java/de/blinkt/openvpn/fragments/LogFragment.java | 1 + main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java | 4 +++- 4 files changed, 7 insertions(+), 5 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java b/main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java index 1c5dd0e5..9cb69a3d 100644 --- a/main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java +++ b/main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java @@ -88,6 +88,7 @@ public class OpenVPNTileService extends TileService implements VpnStatus.StateLi Intent startVpnIntent = new Intent(Intent.ACTION_MAIN); startVpnIntent.setClass(context, LaunchVPN.class); startVpnIntent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString()); + startVpnIntent.putExtra(LaunchVPN.EXTRA_START_REASON, "QuickTile"); startVpnIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startVpnIntent.putExtra(LaunchVPN.EXTRA_HIDELOG, true); diff --git a/main/src/ui/java/de/blinkt/openvpn/activities/CreateShortcuts.java b/main/src/ui/java/de/blinkt/openvpn/activities/CreateShortcuts.java index e1cb8862..82455895 100644 --- a/main/src/ui/java/de/blinkt/openvpn/activities/CreateShortcuts.java +++ b/main/src/ui/java/de/blinkt/openvpn/activities/CreateShortcuts.java @@ -51,9 +51,6 @@ import java.util.Vector; public class CreateShortcuts extends ListActivity implements OnItemClickListener { - private static final int START_VPN_PROFILE= 70; - - private ProfileManager mPM; private VpnProfile mSelectedProfile; @@ -128,7 +125,8 @@ public class CreateShortcuts extends ListActivity implements OnItemClickListener Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); shortcutIntent.setClass(this, LaunchVPN.class); - shortcutIntent.putExtra(LaunchVPN.EXTRA_KEY,profile.getUUID().toString()); + shortcutIntent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUID().toString()); + shortcutIntent.putExtra(LaunchVPN.EXTRA_START_REASON, "shortcut"); // Then, set up the container intent (the response to the caller) diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/LogFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/LogFragment.java index 611e10e9..c5c48b0e 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/LogFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/LogFragment.java @@ -538,6 +538,7 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar. (dialog1, which) -> { Intent intent = new Intent(getActivity(), LaunchVPN.class); intent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString()); + intent.putExtra(LaunchVPN.EXTRA_START_REASON, "restart from logwindow"); intent.setAction(Intent.ACTION_MAIN); startActivity(intent); }); diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java index 8c84a913..32ae0093 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java @@ -239,9 +239,10 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn @RequiresApi(Build.VERSION_CODES.N_MR1) ShortcutInfo createShortcut(VpnProfile profile) { Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); - shortcutIntent.setClass(getActivity(), LaunchVPN.class); + shortcutIntent.setClass(requireContext(), LaunchVPN.class); shortcutIntent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUID().toString()); shortcutIntent.setAction(Intent.ACTION_MAIN); + shortcutIntent.putExtra(LaunchVPN.EXTRA_START_REASON, "shortcut"); shortcutIntent.putExtra("EXTRA_HIDELOG", true); PersistableBundle versionExtras = new PersistableBundle(); @@ -562,6 +563,7 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn Intent intent = new Intent(getActivity(), LaunchVPN.class); intent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUID().toString()); + intent.putExtra(LaunchVPN.EXTRA_START_REASON, "main profile list"); intent.setAction(Intent.ACTION_MAIN); startActivity(intent); } -- cgit v1.2.3 From c2924c6da1bbac9a29d2d276165f28dd399971ba Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 14 Dec 2022 13:47:53 +0100 Subject: Update dependencies --- main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt | 1 + 1 file changed, 1 insertion(+) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt index 4fdd50ba..8db487e7 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt @@ -90,6 +90,7 @@ object Utils { i.type = "text/plain" supportedMimeTypes.add("text/plain") } + else -> null } val mtm = MimeTypeMap.getSingleton() for (ext in extensions) { -- cgit v1.2.3 From d9ef18f4fa02e56d013fec9ef918d66073b7b99a Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 14 Dec 2022 13:49:07 +0100 Subject: Warn more explicit about file:/// URLs --- main/src/ui/java/de/blinkt/openvpn/activities/ConfigConverter.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/activities/ConfigConverter.kt b/main/src/ui/java/de/blinkt/openvpn/activities/ConfigConverter.kt index fa786dcb..b85eaa26 100644 --- a/main/src/ui/java/de/blinkt/openvpn/activities/ConfigConverter.kt +++ b/main/src/ui/java/de/blinkt/openvpn/activities/ConfigConverter.kt @@ -811,8 +811,10 @@ class ConfigConverter : BaseActivity(), FileSelectCallback, View.OnClickListener // We got a file:/// URL and have no permission to read it. Technically an error of the calling app since // it makes an assumption about other apps being able to read the url but well ... - if (data != null && "file" == data.scheme) + if (data != null && "file" == data.scheme) { + log("An external app instructed OpenVPN for Android to open a file:// URI. This kind of URI have been deprecated since Android 7 and no longer work on modern Android versions at all.") doRequestSDCardPermission(PERMISSION_REQUEST_READ_URL) + } } -- cgit v1.2.3 From f07066d047562f1fae9618ffc5af1f940d733967 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 14 Dec 2022 13:51:10 +0100 Subject: Update OpenVPN 2 and 3 This changes the OpenVPN version number to 2.7 since we branched off 2.6 from master. --- main/src/ui/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java | 2 ++ 1 file changed, 2 insertions(+) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java b/main/src/ui/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java index 75093e14..ad7a7c28 100644 --- a/main/src/ui/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java +++ b/main/src/ui/java/de/blinkt/openvpn/core/OpenVPNThreadv3.java @@ -189,12 +189,14 @@ public class OpenVPNThreadv3 extends ClientAPI_OpenVPNClient implements Runnable config.setExternalPkiAlias("extpki"); config.setCompressionMode("asym"); + config.setHwAddrOverride(NetworkUtils.getFakeMacAddrFromSAAID(mService)); config.setInfo(true); config.setAllowLocalLanAccess(mVp.mAllowLocalLAN); boolean retryOnAuthFailed = mVp.mAuthRetry == AUTH_RETRY_NOINTERACT; config.setRetryOnAuthFailed(retryOnAuthFailed); config.setEnableLegacyAlgorithms(mVp.mUseLegacyProvider); + /* We want the same app internal route emulation for OpenVPN 2 and OpenVPN 3 */ config.setEnableRouteEmulation(false); if (mVp.mCompatMode > 0 && mVp.mCompatMode < 20500) config.setEnableNonPreferredDCAlgorithms(true); -- cgit v1.2.3 From e3d7059bc3305f27bf95ea730fe4e01aa7415c87 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Thu, 6 Apr 2023 10:00:20 +0200 Subject: Convert MainActivity to Kotlin --- .../de/blinkt/openvpn/activities/MainActivity.java | 141 --------------------- .../de/blinkt/openvpn/activities/MainActivity.kt | 100 +++++++++++++++ 2 files changed, 100 insertions(+), 141 deletions(-) delete mode 100644 main/src/ui/java/de/blinkt/openvpn/activities/MainActivity.java create mode 100644 main/src/ui/java/de/blinkt/openvpn/activities/MainActivity.kt (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/activities/MainActivity.java b/main/src/ui/java/de/blinkt/openvpn/activities/MainActivity.java deleted file mode 100644 index a6d5ecc4..00000000 --- a/main/src/ui/java/de/blinkt/openvpn/activities/MainActivity.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2012-2016 Arne Schwabe - * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt - */ - -package de.blinkt.openvpn.activities; - -import android.content.Intent; -import android.net.Uri; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.Toast; - -import androidx.appcompat.app.ActionBar; -import androidx.viewpager.widget.ViewPager; - -import com.google.android.material.tabs.TabLayout; - -import de.blinkt.openvpn.R; -import de.blinkt.openvpn.fragments.AboutFragment; -import de.blinkt.openvpn.fragments.FaqFragment; -import de.blinkt.openvpn.fragments.GeneralSettings; -import de.blinkt.openvpn.fragments.GraphFragment; -import de.blinkt.openvpn.fragments.ImportRemoteConfig; -import de.blinkt.openvpn.fragments.LogFragment; -import de.blinkt.openvpn.fragments.SendDumpFragment; -import de.blinkt.openvpn.fragments.VPNProfileList; -import de.blinkt.openvpn.views.ScreenSlidePagerAdapter; - - -public class MainActivity extends BaseActivity { - - private static final String FEATURE_TELEVISION = "android.hardware.type.television"; - private static final String FEATURE_LEANBACK = "android.software.leanback"; - private TabLayout mTabs; - private ViewPager mPager; - private ScreenSlidePagerAdapter mPagerAdapter; - - protected void onCreate(android.os.Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.main_activity); - - - // Instantiate a ViewPager and a PagerAdapter. - mPager = findViewById(R.id.pager); - mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), this); - - /* Toolbar and slider should have the same elevation */ - disableToolbarElevation(); - - - mPagerAdapter.addTab(R.string.vpn_list_title, VPNProfileList.class); - mPagerAdapter.addTab(R.string.graph, GraphFragment.class); - - mPagerAdapter.addTab(R.string.generalsettings, GeneralSettings.class); - mPagerAdapter.addTab(R.string.faq, FaqFragment.class); - - if (SendDumpFragment.getLastestDump(this) != null) { - mPagerAdapter.addTab(R.string.crashdump, SendDumpFragment.class); - } - - - if (isAndroidTV()) - mPagerAdapter.addTab(R.string.openvpn_log, LogFragment.class); - - mPagerAdapter.addTab(R.string.about, AboutFragment.class); - mPager.setAdapter(mPagerAdapter); - } - - - private void disableToolbarElevation() { - ActionBar toolbar = getSupportActionBar(); - toolbar.setElevation(0); - } - - @Override - protected void onResume() { - super.onResume(); - Intent intent = getIntent(); - if (intent != null) { - String action = intent.getAction(); - if (Intent.ACTION_VIEW.equals(action)) - { - Uri uri = intent.getData(); - if (uri != null) - checkUriForProfileImport(uri); - } - String page = intent.getStringExtra("PAGE"); - if ("graph".equals(page)) { - mPager.setCurrentItem(1); - } - setIntent(null); - } - } - - private void checkUriForProfileImport(Uri uri) { - if ("openvpn".equals(uri.getScheme()) && "import-profile".equals(uri.getHost())) - { - String realUrl = uri.getEncodedPath() + "?" + uri.getEncodedQuery(); - if (!realUrl.startsWith("/https://")) - { - Toast.makeText(this, "Cannot use openvpn://import-profile/ URL that does not use https://", Toast.LENGTH_LONG).show(); - return; - } - realUrl = realUrl.substring(1); - startOpenVPNUrlImport(realUrl); - } - } - - private void startOpenVPNUrlImport(String url) { - ImportRemoteConfig asImportFrag = ImportRemoteConfig.newInstance(url); - asImportFrag.show(getSupportFragmentManager(), "dialog"); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.main_menu, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.show_log) { - Intent showLog = new Intent(this, LogWindow.class); - startActivity(showLog); - } - return super.onOptionsItemSelected(item); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - System.out.println(data); - - - } - - -} diff --git a/main/src/ui/java/de/blinkt/openvpn/activities/MainActivity.kt b/main/src/ui/java/de/blinkt/openvpn/activities/MainActivity.kt new file mode 100644 index 00000000..68117b52 --- /dev/null +++ b/main/src/ui/java/de/blinkt/openvpn/activities/MainActivity.kt @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2012-2016 Arne Schwabe + * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt + */ +package de.blinkt.openvpn.activities + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.Menu +import android.view.MenuItem +import android.widget.Toast +import androidx.viewpager.widget.ViewPager +import com.google.android.material.tabs.TabLayout +import de.blinkt.openvpn.R +import de.blinkt.openvpn.fragments.* +import de.blinkt.openvpn.fragments.ImportRemoteConfig.Companion.newInstance +import de.blinkt.openvpn.views.ScreenSlidePagerAdapter + +class MainActivity : BaseActivity() { + private lateinit var mPager: ViewPager + private lateinit var mPagerAdapter: ScreenSlidePagerAdapter + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.main_activity) + + + // Instantiate a ViewPager and a PagerAdapter. + mPager = findViewById(R.id.pager) + mPagerAdapter = ScreenSlidePagerAdapter(supportFragmentManager, this) + + /* Toolbar and slider should have the same elevation */disableToolbarElevation() + mPagerAdapter.addTab(R.string.vpn_list_title, VPNProfileList::class.java) + mPagerAdapter.addTab(R.string.graph, GraphFragment::class.java) + mPagerAdapter.addTab(R.string.generalsettings, GeneralSettings::class.java) + mPagerAdapter.addTab(R.string.faq, FaqFragment::class.java) + if (SendDumpFragment.getLastestDump(this) != null) { + mPagerAdapter.addTab(R.string.crashdump, SendDumpFragment::class.java) + } + if (isAndroidTV) + mPagerAdapter.addTab(R.string.openvpn_log, LogFragment::class.java) + mPagerAdapter.addTab(R.string.about, AboutFragment::class.java) + mPager.setAdapter(mPagerAdapter) + } + + private fun disableToolbarElevation() { + supportActionBar?.elevation = 0f + } + + override fun onResume() { + super.onResume() + val intent = intent + if (intent != null) { + val action = intent.action + if (Intent.ACTION_VIEW == action) { + val uri = intent.data + uri?.let { checkUriForProfileImport(it) } + } + val page = intent.getStringExtra("PAGE") + if ("graph" == page) { + mPager.currentItem = 1 + } + setIntent(null) + } + } + + private fun checkUriForProfileImport(uri: Uri) { + if ("openvpn" == uri.scheme && "import-profile" == uri.host) { + var realUrl = uri.encodedPath + "?" + uri.encodedQuery + if (!realUrl.startsWith("/https://")) { + Toast.makeText( + this, + "Cannot use openvpn://import-profile/ URL that does not use https://", + Toast.LENGTH_LONG + ).show() + return + } + realUrl = realUrl.substring(1) + startOpenVPNUrlImport(realUrl) + } + } + + private fun startOpenVPNUrlImport(url: String) { + val asImportFrag = newInstance(url) + asImportFrag.show(supportFragmentManager, "dialog") + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.main_menu, menu) + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == R.id.show_log) { + val showLog = Intent(this, LogWindow::class.java) + startActivity(showLog) + } + return super.onOptionsItemSelected(item) + } +} \ No newline at end of file -- cgit v1.2.3 From 9e5986073c9b7636572fecdb56231d4b484345a1 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Thu, 6 Apr 2023 10:00:51 +0200 Subject: Silence warning when running with UpsideDownCake beta --- main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java index 32ae0093..fa9438cb 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java @@ -668,9 +668,9 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn public Drawable getDrawable(String source) { Drawable d = null; if ("ic_menu_add".equals(source)) - d = requireActivity().getResources().getDrawable(R.drawable.ic_menu_add_grey); + d = requireActivity().getResources().getDrawable(R.drawable.ic_menu_add_grey, requireActivity().getTheme()); else if ("ic_menu_archive".equals(source)) - d = requireActivity().getResources().getDrawable(R.drawable.ic_menu_import_grey); + d = requireActivity().getResources().getDrawable(R.drawable.ic_menu_import_grey, requireActivity().getTheme()); if (d != null) { -- cgit v1.2.3 From 8cb30f32e8f8bad8de720513dc0fe986abec90b5 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 19 Apr 2023 12:35:44 +0200 Subject: Do not show expection of CN parsing in log --- main/src/ui/java/de/blinkt/openvpn/fragments/KeyChainSettingsFragment.kt | 1 + 1 file changed, 1 insertion(+) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/KeyChainSettingsFragment.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/KeyChainSettingsFragment.kt index 2444fb25..8430d788 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/KeyChainSettingsFragment.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/KeyChainSettingsFragment.kt @@ -128,6 +128,7 @@ internal abstract class KeyChainSettingsFragment : Settings_Fragment(), View.OnC } if (cert != null) { certstr += X509Utils.getCertificateValidityString(cert, resources) + certstr += ", " certstr += X509Utils.getCertificateFriendlyName(cert) } -- cgit v1.2.3 From 2bb04a1f0cad2570845a96db4d1e30c441b16d09 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 8 May 2023 22:45:38 +0200 Subject: Allow setting remote control apps via managed configuration Closes ##1610 Signed-off-by: Arne Schwabe --- main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt index 7db8cba6..3c878d4d 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt @@ -176,6 +176,10 @@ class GeneralSettings : PreferenceFragmentCompat(), Preference.OnPreferenceClick File("/system/lib/modules/tun.ko").length() > 10 override fun onPreferenceClick(preference: Preference): Boolean { + if (!mExtapp.checkAllowingModifyingRemoteControl(requireContext())) + { + return false; + } if (preference.key == "clearapi") { val builder = AlertDialog.Builder( requireContext() -- cgit v1.2.3 From a688889a1e54cee8439f8a61c3162f7913530b37 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 17 May 2023 15:32:34 +0200 Subject: Allow to build a UI variant with OpenVPN 2.x only --- main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java index 182c1a56..de6c83d8 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java @@ -31,6 +31,7 @@ import androidx.fragment.app.Fragment; import com.android.vending.billing.IInAppBillingService; +import de.blinkt.openvpn.BuildConfig; import de.blinkt.openvpn.core.NativeUtils; import org.json.JSONException; import org.json.JSONObject; @@ -86,7 +87,12 @@ public class AboutFragment extends Fragment implements View.OnClickListener { TextView osslVer = v.findViewById(R.id.openssl_version); verO2.setText(String.format(Locale.US, "OpenVPN version: %s", NativeUtils.getOpenVPN2GitVersion())); - verO3.setText(String.format(Locale.US, "OpenVPN3 core version: %s", NativeUtils.getOpenVPN3GitVersion())); + if (BuildConfig.openvpn3) + verO3.setText(String.format(Locale.US, "OpenVPN3 core version: %s", NativeUtils.getOpenVPN3GitVersion())); + else + verO3.setText("(OpenVPN 2.x only build. No OpenVPN 3.x core in this app)"); + + osslVer.setText(String.format(Locale.US, "OpenSSL version: %s", NativeUtils.getOpenSSLVersion())); -- cgit v1.2.3 From 720f8271c1a15b57ebd5b66091a462fa0daa56a4 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Thu, 1 Jun 2023 11:31:03 +0200 Subject: Fix deprecations and other warnings reported by coverity --- main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt index 8db487e7..55056424 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Utils.kt @@ -306,12 +306,12 @@ object Utils { if ("insecure".equals(vp.mTlSCertProfile)) warnings.add("low security (TLS security profile 'insecure' selected)"); - var cipher= vp.mCipher?.toUpperCase(Locale.ROOT) - if (cipher.isNullOrEmpty()) + var cipher= vp.mCipher.uppercase(Locale.ROOT) + if (cipher.isEmpty()) cipher = "BF-CBC"; for (weakCipher in weakCiphers) { - if ((vp.mDataCiphers != null && vp.mDataCiphers.toUpperCase(Locale.ROOT) + if ((vp.mDataCiphers != null && vp.mDataCiphers.uppercase(Locale.ROOT) .contains(weakCipher)) || (vp.mCompatMode in 1..20399 && (cipher == weakCipher)) ) -- cgit v1.2.3 From d73ff892bd4966d51a78f8d3835f7999e61de6b3 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 5 Jun 2023 13:21:01 +0200 Subject: Rename Onboot to always active Also try to keep that connection always active --- main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt | 6 ++++-- main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt index 3c878d4d..6ba7c6fd 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt @@ -73,8 +73,10 @@ class GeneralSettings : PreferenceFragmentCompat(), Preference.OnPreferenceClick findPreference("restartvpnonboot") as CheckBoxPreference if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val vpn:VpnService = VpnService() - startOnBoot.isChecked = vpn.isAlwaysOn + val vpn = VpnService() + if (vpn.isAlwaysOn) + /* This is not reliable when the VPN is not active */ + startOnBoot.isChecked } startOnBoot.onPreferenceChangeListener = diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java index 6d4d2968..ae90f3d5 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java @@ -36,7 +36,12 @@ public class SendDumpFragment extends Fragment { if (c.getCacheDir() == null) return null; - for (File f : c.getCacheDir().listFiles()) { + File[] filesList = c.getCacheDir().listFiles(); + + if (filesList == null) + return null; + + for (File f : filesList) { if (!f.getName().endsWith(".dmp")) continue; -- cgit v1.2.3 From 242b90fa52ccb863c3ea001fa4e7ce5a21939a0b Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 6 Jun 2023 17:13:35 +0200 Subject: COrrectly fall back to no encryption if there is an erro with encryption --- .../java/de/blinkt/openvpn/core/ProfileEncryption.kt | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/core/ProfileEncryption.kt b/main/src/ui/java/de/blinkt/openvpn/core/ProfileEncryption.kt index ad22460f..fa61e733 100644 --- a/main/src/ui/java/de/blinkt/openvpn/core/ProfileEncryption.kt +++ b/main/src/ui/java/de/blinkt/openvpn/core/ProfileEncryption.kt @@ -7,7 +7,7 @@ package de.blinkt.openvpn.core import android.content.Context import android.os.Build import androidx.security.crypto.EncryptedFile -import androidx.security.crypto.MasterKeys +import androidx.security.crypto.MasterKey import java.io.File import java.io.FileInputStream import java.io.FileOutputStream @@ -19,16 +19,18 @@ internal class ProfileEncryption { companion object { @JvmStatic fun encryptionEnabled(): Boolean { - return mMasterKeyAlias != null + return mMasterKey != null } - private var mMasterKeyAlias: String? = null + private var mMasterKey: MasterKey? = null @JvmStatic - fun initMasterCryptAlias() { + fun initMasterCryptAlias(context:Context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return try { - mMasterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) + mMasterKey = MasterKey.Builder(context) + .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) + .build() } catch (e: GeneralSecurityException) { VpnStatus.logException("Could not initialise file encryption key.", e) } catch (e: IOException) { @@ -40,9 +42,9 @@ internal class ProfileEncryption { @Throws(GeneralSecurityException::class, IOException::class) fun getEncryptedVpInput(context: Context, file: File): FileInputStream { val encryptedFile = EncryptedFile.Builder( - file, context, - mMasterKeyAlias!!, + file, + mMasterKey!!, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build() return encryptedFile.openFileInput() @@ -52,9 +54,9 @@ internal class ProfileEncryption { @Throws(GeneralSecurityException::class, IOException::class) fun getEncryptedVpOutput(context: Context, file: File): FileOutputStream { val encryptedFile = EncryptedFile.Builder( - file, context, - mMasterKeyAlias!!, + file, + mMasterKey!!, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build() return encryptedFile.openFileOutput() -- cgit v1.2.3 From 40eb1a83cdcde7c0178428ecb0ad880a363a97a3 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 11 Jul 2023 16:59:30 +0200 Subject: Fix some ANRs --- .../openvpn/fragments/OpenVpnPreferencesFragment.java | 1 - .../ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/OpenVpnPreferencesFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/OpenVpnPreferencesFragment.java index a3c19955..802e0b49 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/OpenVpnPreferencesFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/OpenVpnPreferencesFragment.java @@ -46,7 +46,6 @@ public abstract class OpenVpnPreferencesFragment extends PreferenceFragmentCompa String profileUUID = savedInstanceState.getString(VpnProfile.EXTRA_PROFILEUUID); mProfile = ProfileManager.get(getActivity(), profileUUID); loadSettings(); - } } diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt index 27e6854f..fa7e6f55 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt @@ -5,6 +5,7 @@ package de.blinkt.openvpn.fragments import android.os.Bundle +import android.view.View import androidx.preference.* import de.blinkt.openvpn.R import de.blinkt.openvpn.fragments.OpenVpnPreferencesFragment @@ -33,6 +34,19 @@ class Settings_IP : OpenVpnPreferencesFragment(), Preference.OnPreferenceChangeL // Load the preferences from an XML resource addPreferencesFromResource(R.xml.vpn_ipsettings) + bindPreferences() + loadSettings() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + /* Bind the preferences early to avoid loadingSetting which is called + * from the superclass to access an uninitialised earlyinit property + */ + bindPreferences() + super.onViewCreated(view, savedInstanceState) + } + + private fun bindPreferences() { mIPv4 = findPreference("ipv4_address")!! mIPv6 = findPreference("ipv6_address")!! mUsePull = findPreference("usePull")!! @@ -45,7 +59,6 @@ class Settings_IP : OpenVpnPreferencesFragment(), Preference.OnPreferenceChangeL mNobind = findPreference("nobind")!! mUsePull.onPreferenceChangeListener = this mOverrideDNS.onPreferenceChangeListener = this - loadSettings() } -- cgit v1.2.3 From 1fc6b17afa9423fc05e66fa4159aa4a229e32625 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 16 Jul 2023 16:54:26 +0200 Subject: Fix crash on showing Routing tab [closes #1624] --- main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt index fa7e6f55..ef69f3f4 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.kt @@ -34,18 +34,21 @@ class Settings_IP : OpenVpnPreferencesFragment(), Preference.OnPreferenceChangeL // Load the preferences from an XML resource addPreferencesFromResource(R.xml.vpn_ipsettings) - bindPreferences() - loadSettings() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { /* Bind the preferences early to avoid loadingSetting which is called * from the superclass to access an uninitialised earlyinit property */ - bindPreferences() super.onViewCreated(view, savedInstanceState) } + override fun onBindPreferences() { + super.onBindPreferences() + bindPreferences() + loadSettings() + } + private fun bindPreferences() { mIPv4 = findPreference("ipv4_address")!! mIPv6 = findPreference("ipv6_address")!! -- cgit v1.2.3 From c53c6853dc819b0a9caa574c13806f5d091d6da8 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 10 Oct 2023 19:38:44 +0200 Subject: Fix OpenVPN not starting from Quick in upsidedown cake (closes #1652) --- main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'main/src/ui/java/de/blinkt/openvpn') diff --git a/main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java b/main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java index 9cb69a3d..94c1f1db 100644 --- a/main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java +++ b/main/src/ui/java/de/blinkt/openvpn/OpenVPNTileService.java @@ -7,7 +7,6 @@ package de.blinkt.openvpn; import android.annotation.SuppressLint; import android.annotation.TargetApi; -import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -23,6 +22,7 @@ import de.blinkt.openvpn.core.ConnectionStatus; import de.blinkt.openvpn.core.IOpenVPNServiceInternal; import de.blinkt.openvpn.core.OpenVPNService; import de.blinkt.openvpn.core.ProfileManager; +import de.blinkt.openvpn.core.VPNLaunchHelper; import de.blinkt.openvpn.core.VpnStatus; @@ -85,14 +85,7 @@ public class OpenVPNTileService extends TileService implements VpnStatus.StateLi @SuppressLint("Override") @TargetApi(Build.VERSION_CODES.N) void launchVPN(VpnProfile profile, Context context) { - Intent startVpnIntent = new Intent(Intent.ACTION_MAIN); - startVpnIntent.setClass(context, LaunchVPN.class); - startVpnIntent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString()); - startVpnIntent.putExtra(LaunchVPN.EXTRA_START_REASON, "QuickTile"); - startVpnIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startVpnIntent.putExtra(LaunchVPN.EXTRA_HIDELOG, true); - - context.startActivity(startVpnIntent); + VPNLaunchHelper.startOpenVpn(profile, getBaseContext(), "QuickTile"); } @TargetApi(Build.VERSION_CODES.N) -- cgit v1.2.3