diff options
Diffstat (limited to 'main/src/ui/java/de/blinkt/openvpn/fragments')
16 files changed, 475 insertions, 462 deletions
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 540f4a9a..6ab6e2cc 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/AboutFragment.java @@ -5,7 +5,6 @@ package de.blinkt.openvpn.fragments; -import android.app.Fragment; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Intent; @@ -28,6 +27,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.fragment.app.Fragment; + import com.android.vending.billing.IInAppBillingService; import de.blinkt.openvpn.core.NativeUtils; @@ -47,8 +48,8 @@ import de.blinkt.openvpn.core.VpnStatus; public class AboutFragment extends Fragment implements View.OnClickListener { - public static final String INAPPITEM_TYPE_INAPP = "inapp"; - public static final String RESPONSE_CODE = "RESPONSE_CODE"; + private static final String INAPPITEM_TYPE_INAPP = "inapp"; + private static final String RESPONSE_CODE = "RESPONSE_CODE"; private static final int DONATION_CODE = 12; private static final int BILLING_RESPONSE_RESULT_OK = 0; private static final String RESPONSE_BUY_INTENT = "BUY_INTENT"; diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/FaqFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/FaqFragment.java index f9d2d47c..f40c6825 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/FaqFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/FaqFragment.java @@ -5,10 +5,11 @@ package de.blinkt.openvpn.fragments; -import android.app.Fragment; import android.content.Context; import android.os.Build; import android.os.Bundle; + +import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.StaggeredGridLayoutManager; import android.util.DisplayMetrics; @@ -184,7 +185,7 @@ public class FaqFragment extends Fragment { columns = Math.max(1, columns); - mRecyclerView = (RecyclerView) v.findViewById(R.id.faq_recycler_view); + mRecyclerView = v.findViewById(R.id.faq_recycler_view); // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.java b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.java index 34d37823..1d8b5f77 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.java @@ -4,8 +4,8 @@ */ package de.blinkt.openvpn.fragments; + import java.io.File; -import java.util.Collection; import android.app.AlertDialog; import android.app.AlertDialog.Builder; @@ -18,13 +18,13 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Build; import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceCategory; -import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; + + +import androidx.preference.CheckBoxPreference; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceFragmentCompat; import de.blinkt.openvpn.BuildConfig; import de.blinkt.openvpn.R; @@ -34,28 +34,28 @@ import de.blinkt.openvpn.api.ExternalAppDatabase; import de.blinkt.openvpn.core.ProfileManager; -public class GeneralSettings extends PreferenceFragment implements OnPreferenceClickListener, OnClickListener, Preference.OnPreferenceChangeListener { +public class GeneralSettings extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener, OnClickListener, Preference.OnPreferenceChangeListener { - private ExternalAppDatabase mExtapp; - private ListPreference mAlwaysOnVPN; + private ExternalAppDatabase mExtapp; + private ListPreference mAlwaysOnVPN; - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - // Load the preferences from an XML resource - addPreferencesFromResource(R.xml.general_settings); + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.general_settings); - PreferenceCategory devHacks = (PreferenceCategory) findPreference("device_hacks"); - mAlwaysOnVPN = (ListPreference) findPreference("alwaysOnVpn"); + + PreferenceCategory devHacks = findPreference("device_hacks"); + mAlwaysOnVPN = findPreference("alwaysOnVpn"); mAlwaysOnVPN.setOnPreferenceChangeListener(this); Preference loadtun = findPreference("loadTunModule"); - if(!isTunModuleAvailable()) { - loadtun.setEnabled(false); + if (!isTunModuleAvailable()) { + loadtun.setEnabled(false); devHacks.removePreference(loadtun); } @@ -65,59 +65,56 @@ public class GeneralSettings extends PreferenceFragment implements OnPreferenceC } CheckBoxPreference useInternalFS = (CheckBoxPreference) findPreference("useInternalFileSelector"); - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) - { - devHacks.removePreference(useInternalFS); - } + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { + devHacks.removePreference(useInternalFS); + } - /* Android P does not allow access to the file storage anymore */ - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) - { - Preference useInternalFileSelector = findPreference("useInternalFileSelector"); - devHacks.removePreference(useInternalFileSelector); - } + /* Android P does not allow access to the file storage anymore */ + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { + Preference useInternalFileSelector = findPreference("useInternalFileSelector"); + devHacks.removePreference(useInternalFileSelector); + } - mExtapp = new ExternalAppDatabase(getActivity()); - Preference clearapi = findPreference("clearapi"); - clearapi.setOnPreferenceClickListener(this); + mExtapp = new ExternalAppDatabase(getActivity()); + Preference clearapi = findPreference("clearapi"); + clearapi.setOnPreferenceClickListener(this); - findPreference("osslspeed").setOnPreferenceClickListener(this); + findPreference("osslspeed").setOnPreferenceClickListener(this); - if(devHacks.getPreferenceCount()==0) + if (devHacks.getPreferenceCount() == 0) getPreferenceScreen().removePreference(devHacks); if (!BuildConfig.openvpn3) { PreferenceCategory appBehaviour = (PreferenceCategory) findPreference("app_behaviour"); - CheckBoxPreference ovpn3 = (CheckBoxPreference) findPreference("ovpn3"); - ovpn3.setEnabled(false); - ovpn3.setChecked(false); + CheckBoxPreference ovpn3 = (CheckBoxPreference) findPreference("ovpn3"); + ovpn3.setEnabled(false); + ovpn3.setChecked(false); } - setClearApiSummary(); - } - - @Override - public void onResume() { - super.onResume(); + setClearApiSummary(); + } + @Override + public void onResume() { + super.onResume(); VpnProfile vpn = ProfileManager.getAlwaysOnVPN(getActivity()); - StringBuffer sb = new StringBuffer(getString(R.string.defaultvpnsummary)); - sb.append('\n'); - if (vpn== null) + StringBuffer sb = new StringBuffer(getString(R.string.defaultvpnsummary)); + sb.append('\n'); + if (vpn == null) sb.append(getString(R.string.novpn_selected)); else - sb.append(getString(R.string.vpnselected, vpn.getName())); - mAlwaysOnVPN.setSummary(sb.toString()); + sb.append(getString(R.string.vpnselected, vpn.getName())); + mAlwaysOnVPN.setSummary(sb.toString()); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - if (preference== mAlwaysOnVPN) { + if (preference == mAlwaysOnVPN) { VpnProfile vpn = ProfileManager.get(getActivity(), (String) newValue); mAlwaysOnVPN.setSummary(vpn.getName()); } @@ -125,66 +122,65 @@ public class GeneralSettings extends PreferenceFragment implements OnPreferenceC } private void setClearApiSummary() { - Preference clearapi = findPreference("clearapi"); - - if(mExtapp.getExtAppList().isEmpty()) { - clearapi.setEnabled(false); - clearapi.setSummary(R.string.no_external_app_allowed); - } else { - clearapi.setEnabled(true); - clearapi.setSummary(getString(R.string.allowed_apps, getExtAppList(", "))); - } - } - - private String getExtAppList(String delim) { - ApplicationInfo app; - PackageManager pm = getActivity().getPackageManager(); - - StringBuilder applist = new StringBuilder(); - for (String packagename : mExtapp.getExtAppList()) { - try { - app = pm.getApplicationInfo(packagename, 0); - if (applist.length() != 0) - applist.append(delim); - applist.append(app.loadLabel(pm)); - - } catch (NameNotFoundException e) { - // App not found. Remove it from the list - mExtapp.removeApp(packagename); - } - } - - return applist.toString(); - } - - private boolean isTunModuleAvailable() { - // Check if the tun module exists on the file system + Preference clearapi = findPreference("clearapi"); + + if (mExtapp.getExtAppList().isEmpty()) { + clearapi.setEnabled(false); + clearapi.setSummary(R.string.no_external_app_allowed); + } else { + clearapi.setEnabled(true); + clearapi.setSummary(getString(R.string.allowed_apps, getExtAppList(", "))); + } + } + + private String getExtAppList(String delim) { + ApplicationInfo app; + PackageManager pm = getActivity().getPackageManager(); + + StringBuilder applist = new StringBuilder(); + for (String packagename : mExtapp.getExtAppList()) { + try { + app = pm.getApplicationInfo(packagename, 0); + if (applist.length() != 0) + applist.append(delim); + applist.append(app.loadLabel(pm)); + + } catch (NameNotFoundException e) { + // App not found. Remove it from the list + mExtapp.removeApp(packagename); + } + } + + return applist.toString(); + } + + private boolean isTunModuleAvailable() { + // Check if the tun module exists on the file system return new File("/system/lib/modules/tun.ko").length() > 10; } - @Override - public boolean onPreferenceClick(Preference preference) { - if(preference.getKey().equals("clearapi")){ - Builder builder = new AlertDialog.Builder(getActivity()); - builder.setPositiveButton(R.string.clear, this); - builder.setNegativeButton(android.R.string.cancel, null); - builder.setMessage(getString(R.string.clearappsdialog,getExtAppList("\n"))); - builder.show(); - } else if (preference.getKey().equals("osslspeed")) { - startActivity(new Intent(getActivity(), OpenSSLSpeed.class)); - } - - return true; - } - - @Override - public void onClick(DialogInterface dialog, int which) { - if( which == Dialog.BUTTON_POSITIVE){ - mExtapp.clearAllApiApps(); - setClearApiSummary(); - } - } + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference.getKey().equals("clearapi")) { + Builder builder = new AlertDialog.Builder(getActivity()); + builder.setPositiveButton(R.string.clear, this); + builder.setNegativeButton(android.R.string.cancel, null); + builder.setMessage(getString(R.string.clearappsdialog, getExtAppList("\n"))); + builder.show(); + } else if (preference.getKey().equals("osslspeed")) { + startActivity(new Intent(getActivity(), OpenSSLSpeed.class)); + } + + return true; + } + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == Dialog.BUTTON_POSITIVE) { + mExtapp.clearAllApiApps(); + setClearApiSummary(); + } + } }
\ No newline at end of file diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/GraphFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/GraphFragment.java index 4ddf90c4..5d83b8fc 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/GraphFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/GraphFragment.java @@ -5,7 +5,6 @@ package de.blinkt.openvpn.fragments; -import android.app.Fragment; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -22,6 +21,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.components.XAxis; @@ -102,13 +102,10 @@ public class GraphFragment extends Fragment implements VpnStatus.ByteCountListen break; } - logScaleView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - mLogScale = isChecked; - mChartAdapter.notifyDataSetChanged(); - getActivity().getPreferences(MODE_PRIVATE).edit().putBoolean(PREF_USE_LOG, isChecked).apply(); - } + logScaleView.setOnCheckedChangeListener((buttonView, isChecked) -> { + mLogScale = isChecked; + mChartAdapter.notifyDataSetChanged(); + getActivity().getPreferences(MODE_PRIVATE).edit().putBoolean(PREF_USE_LOG, isChecked).apply(); }); mHandler = new Handler(); 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 5008fe00..ef6eae69 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/KeyChainSettingsFragment.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/KeyChainSettingsFragment.kt @@ -46,7 +46,7 @@ internal abstract class KeyChainSettingsFragment : Settings_Fragment(), View.OnC @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) @Throws(KeyChainException::class, InterruptedException::class) get() { - val key: PrivateKey = KeyChain.getPrivateKey(activity.applicationContext, mProfile.mAlias) ?: return false + val key: PrivateKey = KeyChain.getPrivateKey(activity!!.applicationContext, mProfile.mAlias) ?: return false if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) { val keyFactory = KeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore") @@ -86,9 +86,9 @@ internal abstract class KeyChainSettingsFragment : Settings_Fragment(), View.OnC object : Thread() { override fun run() { try { - val b = ExtAuthHelper.getCertificateMetaData(activity, mProfile.mExternalAuthenticator, mProfile.mAlias) + val b = ExtAuthHelper.getCertificateMetaData(context!!, mProfile.mExternalAuthenticator, mProfile.mAlias) mProfile.mAlias = b.getString(ExtAuthHelper.EXTRA_ALIAS) - activity.runOnUiThread { setAlias() } + activity!!.runOnUiThread { setAlias() } } catch (e: KeyChainException) { e.printStackTrace() } @@ -108,14 +108,14 @@ internal abstract class KeyChainSettingsFragment : Settings_Fragment(), View.OnC if (external) { if (!TextUtils.isEmpty(mProfile.mExternalAuthenticator) && !TextUtils.isEmpty(mProfile.mAlias)) { - cert = ExtAuthHelper.getCertificateChain(activity, mProfile.mExternalAuthenticator, mProfile.mAlias)!![0] - metadata = ExtAuthHelper.getCertificateMetaData(activity, mProfile.mExternalAuthenticator, mProfile.mAlias) + cert = ExtAuthHelper.getCertificateChain(context!!, mProfile.mExternalAuthenticator, mProfile.mAlias)!![0] + metadata = ExtAuthHelper.getCertificateMetaData(context!!, mProfile.mExternalAuthenticator, mProfile.mAlias) } else { cert = null certstr = getString(R.string.extauth_not_configured) } } else { - val certChain = KeyChain.getCertificateChain(activity.applicationContext, mProfile.mAlias) + val certChain = KeyChain.getCertificateChain(activity!!.applicationContext, mProfile.mAlias) if (certChain != null) { cert = certChain[0] if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { @@ -137,7 +137,7 @@ internal abstract class KeyChainSettingsFragment : Settings_Fragment(), View.OnC val certStringCopy = certstr val finalMetadata = metadata - activity.runOnUiThread { + activity!!.runOnUiThread { mAliasCertificate.text = certStringCopy if (finalMetadata != null) mExtAliasName.text = finalMetadata.getString(ExtAuthHelper.EXTRA_DESCRIPTION) @@ -210,7 +210,7 @@ internal abstract class KeyChainSettingsFragment : Settings_Fragment(), View.OnC fun showCertDialog() { try { - KeyChain.choosePrivateKeyAlias(activity, + KeyChain.choosePrivateKeyAlias(activity!!, { alias -> // Credential alias selected. Remember the alias selection for future use. mProfile.mAlias = alias @@ -248,10 +248,10 @@ internal abstract class KeyChainSettingsFragment : Settings_Fragment(), View.OnC return true } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (requestCode == UPDATEE_EXT_ALIAS && resultCode == Activity.RESULT_OK) { + if (data != null && requestCode == UPDATEE_EXT_ALIAS && resultCode == Activity.RESULT_OK) { mProfile.mAlias = data.getStringExtra(ExtAuthHelper.EXTRA_ALIAS) mExtAliasName.text = data.getStringExtra(ExtAuthHelper.EXTRA_DESCRIPTION) } 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 32da0ac5..be2007e5 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/LogFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/LogFragment.java @@ -9,8 +9,6 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.app.Activity; -import android.app.AlertDialog; -import android.app.ListFragment; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -25,6 +23,9 @@ import android.os.Handler.Callback; import android.os.Message; import android.preference.PreferenceManager; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.ListFragment; + import android.text.SpannableString; import android.text.format.DateFormat; import android.text.style.ImageSpan; @@ -529,16 +530,11 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar. dialog.setPositiveButton(R.string.restart, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(getActivity(), LaunchVPN.class); - intent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString()); - intent.setAction(Intent.ACTION_MAIN); - startActivity(intent); - } - - + (dialog1, which) -> { + Intent intent = new Intent(getActivity(), LaunchVPN.class); + intent.putExtra(LaunchVPN.EXTRA_KEY, profile.getUUIDString()); + intent.setAction(Intent.ACTION_MAIN); + startActivity(intent); }); dialog.setNegativeButton(R.string.ignore, null); dialog.create().show(); @@ -564,18 +560,13 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar. super.onActivityCreated(savedInstanceState); ListView lv = getListView(); - lv.setOnItemLongClickListener(new OnItemLongClickListener() { - - @Override - public boolean onItemLongClick(AdapterView<?> parent, View view, - int position, long id) { - ClipboardManager clipboard = (ClipboardManager) - getActivity().getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("Log Entry", ((TextView) view).getText()); - clipboard.setPrimaryClip(clip); - Toast.makeText(getActivity(), R.string.copied_entry, Toast.LENGTH_SHORT).show(); - return true; - } + lv.setOnItemLongClickListener((parent, view, position, id) -> { + ClipboardManager clipboard = (ClipboardManager) + getActivity().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("Log Entry", ((TextView) view).getText()); + clipboard.setPrimaryClip(clip); + Toast.makeText(getActivity(), R.string.copied_entry, Toast.LENGTH_SHORT).show(); + return true; }); } 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 9ac8bebb..212c5e71 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/OpenVpnPreferencesFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/OpenVpnPreferencesFragment.java @@ -6,12 +6,14 @@ package de.blinkt.openvpn.fragments; import android.os.Bundle; -import android.preference.PreferenceFragment; + +import androidx.preference.PreferenceFragmentCompat; + import de.blinkt.openvpn.R; import de.blinkt.openvpn.VpnProfile; import de.blinkt.openvpn.core.ProfileManager; -public abstract class OpenVpnPreferencesFragment extends PreferenceFragment { +public abstract class OpenVpnPreferencesFragment extends PreferenceFragmentCompat { protected VpnProfile mProfile; 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 0fe40905..5bc0bbb1 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java @@ -9,7 +9,6 @@ import java.io.File; import java.util.ArrayList; import java.util.Date; -import android.app.Fragment; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; @@ -23,106 +22,95 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.TextView; +import androidx.fragment.app.Fragment; + import de.blinkt.openvpn.R; import de.blinkt.openvpn.core.VpnStatus; -public class SendDumpFragment extends Fragment { - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - final View v = inflater.inflate(R.layout.fragment_senddump, container, false); - v.findViewById(R.id.senddump).setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - emailMiniDumps(); - } - }); - - new Thread(new Runnable() { - @Override - public void run() { - final Pair<File, Long> ldump = getLastestDump(getActivity()); - if (ldump==null) - return; - // Do in background since it does I/O - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - TextView dumpDateText = (TextView) v.findViewById(R.id.dumpdate); - String datestr = (new Date(ldump.second)).toString(); - long timediff = System.currentTimeMillis() - ldump.second; - long minutes = timediff / 1000 / 60 % 60; - long hours = timediff / 1000 / 60 / 60; - dumpDateText.setText(getString(R.string.lastdumpdate, hours, minutes, datestr)); - - } - }); - } - }).start(); - return v; - } - - public void emailMiniDumps() - { - //need to "send multiple" to get more than one attachment - final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); - emailIntent.setType("*/*"); - emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, - new String[]{"Arne Schwabe <arne@rfc2549.org>"}); - - String version; - String name="ics-openvpn"; - try { - PackageInfo packageinfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); - version = packageinfo.versionName; - name = packageinfo.applicationInfo.name; - } catch (NameNotFoundException e) { - version = "error fetching version"; - } - - - emailIntent.putExtra(Intent.EXTRA_SUBJECT, String.format("%s(%s) %s Minidump",name, getActivity().getPackageName(), version)); - - emailIntent.putExtra(Intent.EXTRA_TEXT, "Please describe the issue you have experienced"); - - ArrayList<Uri> uris = new ArrayList<>(); - - Pair<File, Long> ldump = getLastestDump(getActivity()); - if(ldump==null) { - VpnStatus.logError("No Minidump found!"); - } - - uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.first.getName())); - uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.first.getName() + ".log")); - - emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); - startActivity(emailIntent); - } - - static public Pair<File,Long> getLastestDump(Context c) { - long newestDumpTime=0; - File newestDumpFile=null; - - if (c.getCacheDir() ==null) +public class SendDumpFragment extends Fragment { + + static public Pair<File, Long> getLastestDump(Context c) { + long newestDumpTime = 0; + File newestDumpFile = null; + + if (c.getCacheDir() == null) + return null; + + for (File f : c.getCacheDir().listFiles()) { + if (!f.getName().endsWith(".dmp")) + continue; + + if (newestDumpTime < f.lastModified()) { + newestDumpTime = f.lastModified(); + newestDumpFile = f; + } + } + // Ignore old dumps + if (System.currentTimeMillis() - 48 * 60 * 1000 > newestDumpTime) return null; - for(File f:c.getCacheDir().listFiles()) { - if(!f.getName().endsWith(".dmp")) - continue; - - if (newestDumpTime < f.lastModified()) { - newestDumpTime = f.lastModified(); - newestDumpFile=f; - } - } - // Ignore old dumps - if(System.currentTimeMillis() - 48 * 60 * 1000 > newestDumpTime ) - return null; - - return Pair.create(newestDumpFile, newestDumpTime); - } + return Pair.create(newestDumpFile, newestDumpTime); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + final View v = inflater.inflate(R.layout.fragment_senddump, container, false); + v.findViewById(R.id.senddump).setOnClickListener(v1 -> emailMiniDumps()); + + new Thread(() -> { + final Pair<File, Long> ldump = getLastestDump(getActivity()); + if (ldump == null) + return; + // Do in background since it does I/O + getActivity().runOnUiThread(() -> { + TextView dumpDateText = (TextView) v.findViewById(R.id.dumpdate); + String datestr = (new Date(ldump.second)).toString(); + long timediff = System.currentTimeMillis() - ldump.second; + long minutes = timediff / 1000 / 60 % 60; + long hours = timediff / 1000 / 60 / 60; + dumpDateText.setText(getString(R.string.lastdumpdate, hours, minutes, datestr)); + + }); + }).start(); + return v; + } + + public void emailMiniDumps() { + //need to "send multiple" to get more than one attachment + final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); + emailIntent.setType("*/*"); + emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, + new String[]{"Arne Schwabe <arne@rfc2549.org>"}); + + String version; + String name = "ics-openvpn"; + try { + PackageInfo packageinfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); + version = packageinfo.versionName; + name = packageinfo.applicationInfo.name; + } catch (NameNotFoundException e) { + version = "error fetching version"; + } + + + emailIntent.putExtra(Intent.EXTRA_SUBJECT, String.format("%s(%s) %s Minidump", name, getActivity().getPackageName(), version)); + + emailIntent.putExtra(Intent.EXTRA_TEXT, "Please describe the issue you have experienced"); + + ArrayList<Uri> uris = new ArrayList<>(); + + Pair<File, Long> ldump = getLastestDump(getActivity()); + if (ldump == null) { + VpnStatus.logError("No Minidump found!"); + } + + uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.first.getName())); + uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.first.getName() + ".log")); + + emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + startActivity(emailIntent); + } } diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Allowed_Apps.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Allowed_Apps.kt index dd2aa3b7..e3879775 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Allowed_Apps.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Allowed_Apps.kt @@ -6,8 +6,6 @@ package de.blinkt.openvpn.fragments import android.Manifest -import android.app.Activity -import android.app.Fragment import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageManager @@ -29,6 +27,7 @@ import android.widget.ListView import android.widget.SearchView import android.widget.Switch import android.widget.TextView +import androidx.fragment.app.Fragment import java.util.Collections import java.util.Locale @@ -37,6 +36,7 @@ import java.util.Vector import de.blinkt.openvpn.R import de.blinkt.openvpn.VpnProfile import de.blinkt.openvpn.core.ProfileManager +import org.jetbrains.anko.runOnUiThread /** * Created by arne on 16.11.14. @@ -75,9 +75,9 @@ class Settings_Allowed_Apps : Fragment(), AdapterView.OnItemClickListener, Compo override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val profileUuid = arguments.getString(activity.packageName + ".profileUUID") + val profileUuid = requireArguments().getString(activity!!.packageName + ".profileUUID") mProfile = ProfileManager.get(activity, profileUuid) - activity.title = getString(R.string.edit_profile_title, mProfile.name) + activity!!.title = getString(R.string.edit_profile_title, mProfile.name) setHasOptionsMenu(true) } @@ -116,7 +116,7 @@ class Settings_Allowed_Apps : Fragment(), AdapterView.OnItemClickListener, Compo val vpnOnDefaultSwitch = mSettingsView.findViewById<View>(R.id.default_allow) as Switch - vpnOnDefaultSwitch.setOnCheckedChangeListener { buttonView, isChecked -> + vpnOnDefaultSwitch.setOnCheckedChangeListener { _, isChecked -> changeDisallowText(isChecked) mProfile.mAllowedAppsVpnAreDisallowed = isChecked } @@ -125,19 +125,19 @@ class Settings_Allowed_Apps : Fragment(), AdapterView.OnItemClickListener, Compo val vpnAllowBypassSwitch = mSettingsView.findViewById<View>(R.id.allow_bypass) as Switch - vpnAllowBypassSwitch.setOnCheckedChangeListener { buttonView, isChecked -> mProfile.mAllowAppVpnBypass = isChecked } + vpnAllowBypassSwitch.setOnCheckedChangeListener { _, isChecked -> mProfile.mAllowAppVpnBypass = isChecked } vpnAllowBypassSwitch.isChecked = mProfile.mAllowAppVpnBypass mListView = v.findViewById<View>(android.R.id.list) as ListView - mListAdapter = PackageAdapter(activity, mProfile) + mListAdapter = PackageAdapter(requireContext(), mProfile) mListView.adapter = mListAdapter mListView.onItemClickListener = this mListView.emptyView = v.findViewById(R.id.loading_container) - Thread(Runnable { mListAdapter.populateList(activity) }).start() + Thread(Runnable { mListAdapter.populateList(requireContext()) }).start() return v } @@ -197,7 +197,7 @@ class Settings_Allowed_Apps : Fragment(), AdapterView.OnItemClickListener, Compo private val mProfile = vp - fun populateList(c: Activity) { + fun populateList(c: Context) { val installedPackages = mPm.getInstalledApplications(PackageManager.GET_META_DATA) // Remove apps not using Internet @@ -282,11 +282,11 @@ class Settings_Allowed_Apps : Fragment(), AdapterView.OnItemClickListener, Compo } private inner class ItemFilter : Filter() { - override fun performFiltering(constraint: CharSequence): Filter.FilterResults { + override fun performFiltering(constraint: CharSequence): FilterResults { val filterString = constraint.toString().toLowerCase(Locale.getDefault()) - val results = Filter.FilterResults() + val results = FilterResults() val count = mPackages.size @@ -313,7 +313,7 @@ class Settings_Allowed_Apps : Fragment(), AdapterView.OnItemClickListener, Compo return results } - override fun publishResults(constraint: CharSequence, results: Filter.FilterResults) { + override fun publishResults(constraint: CharSequence, results: FilterResults) { mFilteredData = results.values as Vector<ApplicationInfo> notifyDataSetChanged() } diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Authentication.java b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Authentication.java index 8fd6aa98..b58db81a 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Authentication.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Authentication.java @@ -9,91 +9,98 @@ import android.app.Activity; import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.SwitchPreference; import android.text.TextUtils; import android.util.Pair; + +import androidx.fragment.app.DialogFragment; +import androidx.preference.CheckBoxPreference; +import androidx.preference.EditTextPreference; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.SwitchPreference; + import de.blinkt.openvpn.activities.FileSelect; import de.blinkt.openvpn.R; import de.blinkt.openvpn.core.VpnStatus; import de.blinkt.openvpn.views.RemoteCNPreference; import de.blinkt.openvpn.VpnProfile; +import de.blinkt.openvpn.views.RemoteCNPreferenceDialog; import java.io.IOException; -public class Settings_Authentication extends OpenVpnPreferencesFragment implements OnPreferenceChangeListener, OnPreferenceClickListener { - private static final int SELECT_TLS_FILE_LEGACY_DIALOG = 23223232; - private static final int SELECT_TLS_FILE_KITKAT = SELECT_TLS_FILE_LEGACY_DIALOG +1; +public class Settings_Authentication extends OpenVpnPreferencesFragment implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener { + private static final int SELECT_TLS_FILE_LEGACY_DIALOG = 23223232; + private static final int SELECT_TLS_FILE_KITKAT = SELECT_TLS_FILE_LEGACY_DIALOG + 1; private CheckBoxPreference mExpectTLSCert; - private CheckBoxPreference mCheckRemoteCN; - private RemoteCNPreference mRemoteCN; - private ListPreference mTLSAuthDirection; - private Preference mTLSAuthFile; - private SwitchPreference mUseTLSAuth; - private EditTextPreference mCipher; - private String mTlsAuthFileData; - private EditTextPreference mAuth; + private CheckBoxPreference mCheckRemoteCN; + private RemoteCNPreference mRemoteCN; + private ListPreference mTLSAuthDirection; + private Preference mTLSAuthFile; + private SwitchPreference mUseTLSAuth; + private EditTextPreference mCipher; + private String mTlsAuthFileData; + private EditTextPreference mAuth; private EditTextPreference mRemoteX509Name; @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - // Load the preferences from an XML resource - addPreferencesFromResource(R.xml.vpn_authentification); + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.vpn_authentification); - mExpectTLSCert = (CheckBoxPreference) findPreference("remoteServerTLS"); - mCheckRemoteCN = (CheckBoxPreference) findPreference("checkRemoteCN"); - mRemoteCN = (RemoteCNPreference) findPreference("remotecn"); - mRemoteCN.setOnPreferenceChangeListener(this); + mExpectTLSCert = findPreference("remoteServerTLS"); + mCheckRemoteCN = (CheckBoxPreference) findPreference("checkRemoteCN"); + mRemoteCN = (RemoteCNPreference) findPreference("remotecn"); + mRemoteCN.setOnPreferenceChangeListener(this); - mRemoteX509Name = (EditTextPreference) findPreference("remotex509name"); + mRemoteX509Name = (EditTextPreference) findPreference("remotex509name"); mRemoteX509Name.setOnPreferenceChangeListener(this); - mUseTLSAuth = (SwitchPreference) findPreference("useTLSAuth" ); - mTLSAuthFile = findPreference("tlsAuthFile"); - mTLSAuthDirection = (ListPreference) findPreference("tls_direction"); + mUseTLSAuth = (SwitchPreference) findPreference("useTLSAuth"); + mTLSAuthFile = findPreference("tlsAuthFile"); + mTLSAuthDirection = (ListPreference) findPreference("tls_direction"); + + + mTLSAuthFile.setOnPreferenceClickListener(this); + mCipher = (EditTextPreference) findPreference("cipher"); + mCipher.setOnPreferenceChangeListener(this); - mTLSAuthFile.setOnPreferenceClickListener(this); + mAuth = (EditTextPreference) findPreference("auth"); + mAuth.setOnPreferenceChangeListener(this); - mCipher =(EditTextPreference) findPreference("cipher"); - mCipher.setOnPreferenceChangeListener(this); + loadSettings(); - mAuth =(EditTextPreference) findPreference("auth"); - mAuth.setOnPreferenceChangeListener(this); + } - loadSettings(); + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - } + } - @Override - protected void loadSettings() { + @Override + protected void loadSettings() { - mExpectTLSCert.setChecked(mProfile.mExpectTLSCert); - mCheckRemoteCN.setChecked(mProfile.mCheckRemoteCN); - mRemoteCN.setDN(mProfile.mRemoteCN); - mRemoteCN.setAuthType(mProfile.mX509AuthType); - onPreferenceChange(mRemoteCN, - new Pair<Integer, String>(mProfile.mX509AuthType, mProfile.mRemoteCN)); + mExpectTLSCert.setChecked(mProfile.mExpectTLSCert); + mCheckRemoteCN.setChecked(mProfile.mCheckRemoteCN); + mRemoteCN.setDN(mProfile.mRemoteCN); + mRemoteCN.setAuthType(mProfile.mX509AuthType); + onPreferenceChange(mRemoteCN, + new Pair<Integer, String>(mProfile.mX509AuthType, mProfile.mRemoteCN)); mRemoteX509Name.setText(mProfile.mx509UsernameField); onPreferenceChange(mRemoteX509Name, mProfile.mx509UsernameField); - mUseTLSAuth.setChecked(mProfile.mUseTLSAuth); - mTlsAuthFileData= mProfile.mTLSAuthFilename; - setTlsAuthSummary(mTlsAuthFileData); - mTLSAuthDirection.setValue(mProfile.mTLSAuthDirection); - mCipher.setText(mProfile.mCipher); - onPreferenceChange(mCipher, mProfile.mCipher); - mAuth.setText(mProfile.mAuth); - onPreferenceChange(mAuth, mProfile.mAuth); + mUseTLSAuth.setChecked(mProfile.mUseTLSAuth); + mTlsAuthFileData = mProfile.mTLSAuthFilename; + setTlsAuthSummary(mTlsAuthFileData); + mTLSAuthDirection.setValue(mProfile.mTLSAuthDirection); + mCipher.setText(mProfile.mCipher); + onPreferenceChange(mCipher, mProfile.mCipher); + mAuth.setText(mProfile.mAuth); + onPreferenceChange(mAuth, mProfile.mAuth); if (mProfile.mAuthenticationType == VpnProfile.TYPE_STATICKEYS) { mExpectTLSCert.setEnabled(false); @@ -104,47 +111,46 @@ public class Settings_Authentication extends OpenVpnPreferencesFragment implemen mCheckRemoteCN.setEnabled(true); } - } - - @Override - protected void saveSettings() { - mProfile.mExpectTLSCert=mExpectTLSCert.isChecked(); - mProfile.mCheckRemoteCN=mCheckRemoteCN.isChecked(); - mProfile.mRemoteCN=mRemoteCN.getCNText(); - mProfile.mX509AuthType=mRemoteCN.getAuthtype(); + } - mProfile.mUseTLSAuth = mUseTLSAuth.isChecked(); - mProfile.mTLSAuthFilename = mTlsAuthFileData; + @Override + protected void saveSettings() { + mProfile.mExpectTLSCert = mExpectTLSCert.isChecked(); + mProfile.mCheckRemoteCN = mCheckRemoteCN.isChecked(); + mProfile.mRemoteCN = mRemoteCN.getCNText(); + mProfile.mX509AuthType = mRemoteCN.getAuthtype(); + + mProfile.mUseTLSAuth = mUseTLSAuth.isChecked(); + mProfile.mTLSAuthFilename = mTlsAuthFileData; mProfile.mx509UsernameField = mRemoteX509Name.getText(); - if(mTLSAuthDirection.getValue()==null) - mProfile.mTLSAuthDirection=null; - else - mProfile.mTLSAuthDirection = mTLSAuthDirection.getValue(); - - if(mCipher.getText()==null) - mProfile.mCipher=null; - else - mProfile.mCipher = mCipher.getText(); + if (mTLSAuthDirection.getValue() == null) + mProfile.mTLSAuthDirection = null; + else + mProfile.mTLSAuthDirection = mTLSAuthDirection.getValue(); - if(mAuth.getText()==null) - mProfile.mAuth = null; - else - mProfile.mAuth = mAuth.getText(); - - } + if (mCipher.getText() == null) + mProfile.mCipher = null; + else + mProfile.mCipher = mCipher.getText(); + if (mAuth.getText() == null) + mProfile.mAuth = null; + else + mProfile.mAuth = mAuth.getText(); + } - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if(preference==mRemoteCN) { - @SuppressWarnings("unchecked") - int authtype = ((Pair<Integer, String>) newValue).first; - @SuppressWarnings("unchecked") - String dn = ((Pair<Integer, String>) newValue).second; - if ("".equals(dn)) { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mRemoteCN) { + @SuppressWarnings("unchecked") + int authtype = ((Pair<Integer, String>) newValue).first; + @SuppressWarnings("unchecked") + String dn = ((Pair<Integer, String>) newValue).second; + + if ("".equals(dn)) { if (mProfile.mConnections.length > 0) { preference.setSummary(getX509String(VpnProfile.X509_VERIFY_TLSREMOTE_RDN, mProfile.mConnections[0].mServerName)); } else { @@ -154,39 +160,40 @@ public class Settings_Authentication extends OpenVpnPreferencesFragment implemen preference.setSummary(getX509String(authtype, dn)); } - } else if (preference == mCipher || preference == mAuth) { - preference.setSummary((CharSequence) newValue); - } else if (preference == mRemoteX509Name) { - preference.setSummary(TextUtils.isEmpty((CharSequence) newValue) ? "CN (default)" : (CharSequence)newValue); + } else if (preference == mCipher || preference == mAuth) { + preference.setSummary((CharSequence) newValue); + } else if (preference == mRemoteX509Name) { + preference.setSummary(TextUtils.isEmpty((CharSequence) newValue) ? "CN (default)" : (CharSequence) newValue); + } + return true; + } + + private CharSequence getX509String(int authtype, String dn) { + String ret = ""; + switch (authtype) { + case VpnProfile.X509_VERIFY_TLSREMOTE: + case VpnProfile.X509_VERIFY_TLSREMOTE_COMPAT_NOREMAPPING: + ret += "tls-remote "; + break; + + case VpnProfile.X509_VERIFY_TLSREMOTE_DN: + ret = "dn: "; + break; + + case VpnProfile.X509_VERIFY_TLSREMOTE_RDN: + ret = "rdn: "; + break; + + case VpnProfile.X509_VERIFY_TLSREMOTE_RDN_PREFIX: + ret = "rdn prefix: "; + break; } - return true; - } - private CharSequence getX509String(int authtype, String dn) { - String ret =""; - switch (authtype) { - case VpnProfile.X509_VERIFY_TLSREMOTE: - case VpnProfile.X509_VERIFY_TLSREMOTE_COMPAT_NOREMAPPING: - ret+="tls-remote "; - break; - - case VpnProfile.X509_VERIFY_TLSREMOTE_DN: - ret="dn: "; - break; - - case VpnProfile.X509_VERIFY_TLSREMOTE_RDN: - ret="rdn: "; - break; - - case VpnProfile.X509_VERIFY_TLSREMOTE_RDN_PREFIX: - ret="rdn prefix: "; - break; - } - return ret + dn; - } + return ret + dn; + } void startFileDialog() { Intent startFC = null; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && ! Utils.alwaysUseOldFileChooser(getActivity())) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && !Utils.alwaysUseOldFileChooser(getActivity())) { startFC = Utils.getFilePickerIntent(getActivity(), Utils.FileType.TLS_AUTH_FILE); startActivityForResult(startFC, SELECT_TLS_FILE_KITKAT); } @@ -200,22 +207,22 @@ public class Settings_Authentication extends OpenVpnPreferencesFragment implemen } @Override - public boolean onPreferenceClick(Preference preference) { - startFileDialog(); - return true; - - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if(requestCode == SELECT_TLS_FILE_LEGACY_DIALOG && resultCode == Activity.RESULT_OK){ - String result = data.getStringExtra(FileSelect.RESULT_DATA); - mTlsAuthFileData=result; - setTlsAuthSummary(result); - } else if (requestCode == SELECT_TLS_FILE_KITKAT && resultCode == Activity.RESULT_OK) { + public boolean onPreferenceClick(Preference preference) { + startFileDialog(); + return true; + + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == SELECT_TLS_FILE_LEGACY_DIALOG && resultCode == Activity.RESULT_OK) { + String result = data.getStringExtra(FileSelect.RESULT_DATA); + mTlsAuthFileData = result; + setTlsAuthSummary(result); + } else if (requestCode == SELECT_TLS_FILE_KITKAT && resultCode == Activity.RESULT_OK) { try { - mTlsAuthFileData= Utils.getFilePickerResult(Utils.FileType.TLS_AUTH_FILE,data,getActivity()); + mTlsAuthFileData = Utils.getFilePickerResult(Utils.FileType.TLS_AUTH_FILE, data, getActivity()); setTlsAuthSummary(mTlsAuthFileData); } catch (IOException e) { VpnStatus.logException(e); @@ -223,16 +230,31 @@ public class Settings_Authentication extends OpenVpnPreferencesFragment implemen VpnStatus.logException(se); } } - } + } - private void setTlsAuthSummary(String result) { - if(result==null) + private void setTlsAuthSummary(String result) { + if (result == null) result = getString(R.string.no_certificate); - if(result.startsWith(VpnProfile.INLINE_TAG)) - mTLSAuthFile.setSummary(R.string.inline_file_data); + if (result.startsWith(VpnProfile.INLINE_TAG)) + mTLSAuthFile.setSummary(R.string.inline_file_data); else if (result.startsWith(VpnProfile.DISPLAYNAME_TAG)) - mTLSAuthFile.setSummary(getString(R.string.imported_from_file, VpnProfile.getDisplayName(result))); - else - mTLSAuthFile.setSummary(result); - } + mTLSAuthFile.setSummary(getString(R.string.imported_from_file, VpnProfile.getDisplayName(result))); + else + mTLSAuthFile.setSummary(result); + } + + @Override + public void onDisplayPreferenceDialog(Preference preference) { + DialogFragment dialogFragment = null; + if (preference instanceof RemoteCNPreference) { + dialogFragment = RemoteCNPreferenceDialog.newInstance(preference.getKey()); + } + + if (dialogFragment != null) { + dialogFragment.setTargetFragment(this, 0); + dialogFragment.show(requireFragmentManager(), "RemoteCNDialog"); + } else { + super.onDisplayPreferenceDialog(preference); + } + } }
\ No newline at end of file diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Fragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Fragment.java index 738bd0e9..f29f2063 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Fragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Fragment.java @@ -5,9 +5,10 @@ package de.blinkt.openvpn.fragments; -import android.app.Fragment; import android.os.Bundle; +import androidx.fragment.app.Fragment; + import de.blinkt.openvpn.R; import de.blinkt.openvpn.VpnProfile; import de.blinkt.openvpn.core.ProfileManager; diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.java b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.java index bd2ad5f2..843ff750 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_IP.java @@ -4,17 +4,19 @@ */ package de.blinkt.openvpn.fragments; + import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceManager; -import android.preference.SwitchPreference; + +import androidx.preference.CheckBoxPreference; +import androidx.preference.EditTextPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceManager; +import androidx.preference.SwitchPreference; + import de.blinkt.openvpn.R; import de.blinkt.openvpn.VpnProfile; -public class Settings_IP extends OpenVpnPreferencesFragment implements OnPreferenceChangeListener { +public class Settings_IP extends OpenVpnPreferencesFragment implements Preference.OnPreferenceChangeListener { private EditTextPreference mIPv4; private EditTextPreference mIPv6; private SwitchPreference mUsePull; @@ -33,19 +35,19 @@ public class Settings_IP extends OpenVpnPreferencesFragment implements OnPrefere // Make sure default values are applied. In a real app, you would // want this in a shared function that is used to retrieve the // SharedPreferences wherever they are needed. - PreferenceManager.setDefaultValues(getActivity(), + PreferenceManager.setDefaultValues(requireActivity(), R.xml.vpn_ipsettings, false); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.vpn_ipsettings); - mIPv4 = (EditTextPreference) findPreference("ipv4_address"); - mIPv6 = (EditTextPreference) findPreference("ipv6_address"); - mUsePull = (SwitchPreference) findPreference("usePull"); - mOverrideDNS = (CheckBoxPreference) findPreference("overrideDNS"); - mSearchdomain =(EditTextPreference) findPreference("searchdomain"); - mDNS1 = (EditTextPreference) findPreference("dns1"); - mDNS2 = (EditTextPreference) findPreference("dns2"); - mNobind = (CheckBoxPreference) findPreference("nobind"); + mIPv4 = findPreference("ipv4_address"); + mIPv6 = findPreference("ipv6_address"); + mUsePull = findPreference("usePull"); + mOverrideDNS = findPreference("overrideDNS"); + mSearchdomain = findPreference("searchdomain"); + mDNS1 = findPreference("dns1"); + mDNS2 = findPreference("dns2"); + mNobind = findPreference("nobind"); mIPv4.setOnPreferenceChangeListener(this); mIPv6.setOnPreferenceChangeListener(this); @@ -141,4 +143,8 @@ public class Settings_IP extends OpenVpnPreferencesFragment implements OnPrefere } - }
\ No newline at end of file + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + + } +}
\ No newline at end of file diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Obscure.java b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Obscure.java index 6674599d..4b1db582 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Obscure.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Obscure.java @@ -6,19 +6,20 @@ package de.blinkt.openvpn.fragments; import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; import android.widget.Toast; + +import androidx.preference.CheckBoxPreference; +import androidx.preference.EditTextPreference; +import androidx.preference.ListPreference; +import androidx.preference.Preference; + import java.util.Locale; import de.blinkt.openvpn.R; import de.blinkt.openvpn.VpnProfile; -public class Settings_Obscure extends OpenVpnPreferencesFragment implements OnPreferenceChangeListener { +public class Settings_Obscure extends OpenVpnPreferencesFragment implements Preference.OnPreferenceChangeListener { private CheckBoxPreference mUseRandomHostName; private CheckBoxPreference mUseFloat; private CheckBoxPreference mUseCustomConfig; @@ -126,6 +127,11 @@ public class Settings_Obscure extends OpenVpnPreferencesFragment implements OnPr } + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + + } + protected void loadSettings() { mUseRandomHostName.setChecked(mProfile.mUseRandomHostname); mUseFloat.setChecked(mProfile.mUseFloat); diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Routing.java b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Routing.java index 91a41ef3..6b963bb8 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Routing.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/Settings_Routing.java @@ -6,14 +6,15 @@ package de.blinkt.openvpn.fragments; import android.os.Build; import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; + +import androidx.preference.CheckBoxPreference; +import androidx.preference.EditTextPreference; +import androidx.preference.Preference; + import de.blinkt.openvpn.R; -public class Settings_Routing extends OpenVpnPreferencesFragment implements OnPreferenceChangeListener { +public class Settings_Routing extends OpenVpnPreferencesFragment implements Preference.OnPreferenceChangeListener { private EditTextPreference mCustomRoutes; private CheckBoxPreference mUseDefaultRoute; private EditTextPreference mCustomRoutesv6; @@ -30,17 +31,17 @@ public class Settings_Routing extends OpenVpnPreferencesFragment implements OnPr // Load the preferences from an XML resource addPreferencesFromResource(R.xml.vpn_routing); - mCustomRoutes = (EditTextPreference) findPreference("customRoutes"); - mUseDefaultRoute = (CheckBoxPreference) findPreference("useDefaultRoute"); - mCustomRoutesv6 = (EditTextPreference) findPreference("customRoutesv6"); - mUseDefaultRoutev6 = (CheckBoxPreference) findPreference("useDefaultRoutev6"); - mExcludedRoutes = (EditTextPreference) findPreference("excludedRoutes"); - mExcludedRoutesv6 = (EditTextPreference) findPreference("excludedRoutesv6"); + mCustomRoutes = findPreference("customRoutes"); + mUseDefaultRoute = findPreference("useDefaultRoute"); + mCustomRoutesv6 = findPreference("customRoutesv6"); + mUseDefaultRoutev6 = findPreference("useDefaultRoutev6"); + mExcludedRoutes = findPreference("excludedRoutes"); + mExcludedRoutesv6 = findPreference("excludedRoutesv6"); - mRouteNoPull = (CheckBoxPreference) findPreference("routenopull"); - mLocalVPNAccess = (CheckBoxPreference) findPreference("unblockLocal"); + mRouteNoPull = findPreference("routenopull"); + mLocalVPNAccess = findPreference("unblockLocal"); - mBlockUnusedAF = (CheckBoxPreference) findPreference("blockUnusedAF"); + mBlockUnusedAF = findPreference("blockUnusedAF"); mCustomRoutes.setOnPreferenceChangeListener(this); mCustomRoutesv6.setOnPreferenceChangeListener(this); @@ -55,6 +56,11 @@ public class Settings_Routing extends OpenVpnPreferencesFragment implements OnPr } @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + + } + + @Override protected void loadSettings() { mUseDefaultRoute.setChecked(mProfile.mUseDefaultRoute); diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/ShowConfigFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/ShowConfigFragment.java index f5c1750a..d69b4581 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/ShowConfigFragment.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/ShowConfigFragment.java @@ -5,7 +5,6 @@ package de.blinkt.openvpn.fragments; -import android.app.Fragment; import android.content.Intent; import android.os.Build; import android.os.Bundle; @@ -17,6 +16,10 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + import de.blinkt.openvpn.R; import de.blinkt.openvpn.VpnProfile; import de.blinkt.openvpn.core.ProfileManager; @@ -30,17 +33,12 @@ public class ShowConfigFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v=inflater.inflate(R.layout.viewconfig, container,false); - mConfigView = (TextView) v.findViewById(R.id.configview); + mConfigView = v.findViewById(R.id.configview); - mfabButton = (ImageButton) v.findViewById(R.id.share_config); + mfabButton = v.findViewById(R.id.share_config); if (mfabButton!=null) { - mfabButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - shareConfig(); - } - }); + mfabButton.setOnClickListener(v1 -> shareConfig()); mfabButton.setVisibility(View.INVISIBLE); } return v; @@ -53,12 +51,12 @@ public class ShowConfigFragment extends Fragment { /* Add a few newlines to make the textview scrollable past the FAB */ try { - configtext = vp.getConfigFile(getActivity(), VpnProfile.doUseOpenVPN3(getActivity())) + "\n\n\n"; + configtext = vp.getConfigFile(requireContext(), VpnProfile.doUseOpenVPN3(getActivity())) + "\n\n\n"; } catch (Exception e) { e.printStackTrace(); configtext = "Error generating config file: " + e.getLocalizedMessage(); } - getActivity().runOnUiThread(() -> { + requireActivity().runOnUiThread(() -> { cv.setText(configtext); if (mfabButton!=null) mfabButton.setVisibility(View.VISIBLE); @@ -76,7 +74,7 @@ public class ShowConfigFragment extends Fragment { } @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) inflater.inflate(R.menu.configmenu, menu); } @@ -108,7 +106,7 @@ public class ShowConfigFragment extends Fragment { } private void populateConfigText() { - String profileUUID = getArguments().getString(getActivity().getPackageName() + ".profileUUID"); + String profileUUID = requireArguments().getString(requireActivity().getPackageName() + ".profileUUID"); final VpnProfile vp = ProfileManager.get(getActivity(),profileUUID); int check=vp.checkProfile(getActivity()); 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 c1aadb7e..eaccd201 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/VPNProfileList.java @@ -8,7 +8,6 @@ package de.blinkt.openvpn.fragments; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; -import android.app.ListFragment; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -21,6 +20,8 @@ import android.os.Build; import android.os.Bundle; import android.os.PersistableBundle; import androidx.annotation.RequiresApi; +import androidx.fragment.app.ListFragment; + import android.text.Html; import android.text.Html.ImageGetter; import android.view.LayoutInflater; @@ -76,12 +77,9 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn @Override public void updateState(String state, String logmessage, final int localizedResId, ConnectionStatus level) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - mLastStatusMessage = VpnStatus.getLastCleanLogMessage(getActivity()); - mArrayadapter.notifyDataSetChanged(); - } + getActivity().runOnUiThread(() -> { + mLastStatusMessage = VpnStatus.getLastCleanLogMessage(getActivity()); + mArrayadapter.notifyDataSetChanged(); }); } |