/* * Copyright 2017 rootkiwi * * AN2Linux-client is licensed under GNU General Public License 3. * * See LICENSE for more details. */ package kiwi.root.an2linuxclient.activities; import android.app.Dialog; import android.app.DialogFragment; import android.app.NotificationManager; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import java.util.List; import kiwi.root.an2linuxclient.R; import kiwi.root.an2linuxclient.crypto.KeyGeneratorService; import kiwi.root.an2linuxclient.data.MobileServer; import kiwi.root.an2linuxclient.data.ServerDatabaseHandler; import kiwi.root.an2linuxclient.data.WifiServer; import kiwi.root.an2linuxclient.utils.ConnectionHelper; public class MainSettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PreferenceManager.setDefaultValues(this, R.xml.main_preferences, false); getFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); } public static class SettingsFragment extends PreferenceFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); view.setBackgroundColor(getResources().getColor(R.color.gray_dark)); return view; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.main_preferences); getActivity().setTheme(R.style.PreferenceFragmentTheme); generateKeyIfNotExists(); showChangeLogIfNotSeen(); findPreference(getString(R.string.preference_enable_an2linux)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if ((boolean) newValue){ boolean isNotificationAccessEnabled = NotificationManagerCompat .getEnabledListenerPackages(getActivity()) .contains(getActivity().getPackageName()); if (!isNotificationAccessEnabled){ new AskNotificationAccessDialogFragment().show(getFragmentManager(), "AskNotificationAccessDialogFragment"); } } return true; } }); final SharedPreferences sharedPrefsDefault = PreferenceManager.getDefaultSharedPreferences(getActivity()); findPreference(getString(R.string.main_display_test_notification_key)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { boolean isNotificationAccessEnabled = NotificationManagerCompat .getEnabledListenerPackages(getActivity()) .contains(getActivity().getPackageName()); if (isNotificationAccessEnabled){ boolean globalEnabled = sharedPrefsDefault.getBoolean(getString(R.string.preference_enable_an2linux), false); if (globalEnabled){ SharedPreferences sharedPrefsEnabledApplications = getActivity() .getSharedPreferences(getString(R.string.enabled_applications), MODE_PRIVATE); boolean appEnabled = sharedPrefsEnabledApplications.getBoolean(getActivity().getPackageName(), false); if (appEnabled){ ServerDatabaseHandler dbHandler = ServerDatabaseHandler.getInstance(getActivity()); ConnectivityManager connMgr = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); boolean displayTestNotif = false; if (networkInfo != null && networkInfo.isConnected()){ if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { List<WifiServer> enabledWifiServers = dbHandler.getAllEnabledWifiServers(); if (enabledWifiServers.size() == 0){ Toast.makeText(getActivity(), getString(R.string.test_notif_found_no_enabled, getString(R.string.connection_type_wifi)), Toast.LENGTH_SHORT).show(); } else { boolean found = false; for(WifiServer wifiServer : enabledWifiServers) { if (ConnectionHelper.checkIfSsidIsAllowed(wifiServer.getSsidWhitelist(), getActivity())){ found = true; break; } } if (found){ Toast.makeText(getActivity(), getString(R.string.test_notif_testing, getString(R.string.connection_type_wifi)), Toast.LENGTH_SHORT).show(); displayTestNotif = true; } else { Toast.makeText(getActivity(), R.string.disallowed_ssid, Toast.LENGTH_SHORT).show(); } } } else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) { List<MobileServer> enabledMobileServers = dbHandler.getAllEnabledMobileServers(); if (enabledMobileServers.size() == 0){ Toast.makeText(getActivity(), getString(R.string.test_notif_found_no_enabled, getString(R.string.connection_type_mobile)), Toast.LENGTH_SHORT).show(); } else { boolean found = false; for(MobileServer mobileServer : enabledMobileServers){ if (!networkInfo.isRoaming() || mobileServer.isRoamingAllowed()){ found = true; break; } } if (found){ Toast.makeText(getActivity(), getString(R.string.test_notif_testing, getString(R.string.connection_type_mobile)), Toast.LENGTH_SHORT).show(); displayTestNotif = true; } else { Toast.makeText(getActivity(), R.string.you_are_roaming, Toast.LENGTH_SHORT).show(); } } } } if (BluetoothAdapter.getDefaultAdapter() != null && BluetoothAdapter.getDefaultAdapter().isEnabled()){ if (dbHandler.getAllEnabledBluetoothServers().size() == 0){ Toast.makeText(getActivity(), getString(R.string.test_notif_found_no_enabled, getString(R.string.connection_type_bluetooth)), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getActivity(), getString(R.string.test_notif_testing, getString(R.string.connection_type_bluetooth)), Toast.LENGTH_SHORT).show(); displayTestNotif = true; } } dbHandler.close(); if (displayTestNotif){ final int NOTIFICATION_ID = 1; NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity().getApplicationContext()); builder.setSmallIcon(R.drawable.ic_stat_tux); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)); builder.setContentTitle(getString(R.string.test_notif_title)); builder.setContentText(getString(R.string.test_notif_message)); builder.setSubText(getString(R.string.test_notif_message_line_two)); NotificationManager notificationManager = (NotificationManager) getActivity(). getApplicationContext().getSystemService(NOTIFICATION_SERVICE); for (int i = 0; i < 1; i++){ notificationManager.notify(NOTIFICATION_ID, builder.build()); } } } else { Toast.makeText(getActivity(), R.string.test_notif_an2linux_not_enabled_in_applications, Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getActivity(), R.string.test_notif_an2linux_not_enabled, Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getActivity(), R.string.test_notif_need_access, Toast.LENGTH_SHORT).show(); } return true; } }); findPreference(getString(R.string.main_license_key)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { new LicenseDialogFragment().show(getFragmentManager(), "LicenseDialogFragment"); return true; } }); findPreference(getString(R.string.main_changelog_key)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { new ChangelogDialogFragment().show(getFragmentManager(), "ChangelogDialogFragment"); return true; } }); try { PackageInfo packageInfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); findPreference(getString(R.string.main_changelog_key)).setSummary(String.format("%s (%d)", packageInfo.versionName, packageInfo.versionCode)); } catch (PackageManager.NameNotFoundException e){} } private void showChangeLogIfNotSeen(){ PackageInfo packageInfo; try { packageInfo = getActivity().getPackageManager().getPackageInfo(getActivity().getPackageName(), 0); } catch (PackageManager.NameNotFoundException e){ return; } int versionCode = packageInfo.versionCode; SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); if (sp.getInt(getString(R.string.version_code_seen), 0) < versionCode) { sp.edit().putInt(getString(R.string.version_code_seen), versionCode).apply(); new ChangelogDialogFragment().show(getFragmentManager(), "ChangelogDialogFragment"); } } private void generateKeyIfNotExists(){ SharedPreferences sp = getActivity().getSharedPreferences(getString(R.string.device_key_and_cert), MODE_PRIVATE); boolean certExists = sp.contains(getString(R.string.certificate)); boolean keyExists = sp.contains(getString(R.string.privatekey)); boolean certOrKeyNotExists = !certExists || !keyExists; if (certOrKeyNotExists && !KeyGeneratorService.currentlyGenerating){ KeyGeneratorService.startGenerate(getActivity()); } } public static class AskNotificationAccessDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogCustom); builder.setMessage(R.string.main_dialog_ask_notification_access) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { getActivity().startActivity((new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"))); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); return builder.create(); } } public static class LicenseDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogCustom); builder.setMessage(R.string.general_public_license_3) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); return builder.create(); } } public static class ChangelogDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogCustom); builder.setMessage(Html.fromHtml(getString(R.string.changelog))) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }); return builder.create(); } } } }