diff options
6 files changed, 143 insertions, 5 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java index f07a2a23..aaff9ebc 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java +++ b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java @@ -58,12 +58,14 @@ import java.util.Map;  import java.util.Set;  import static android.R.attr.name; +import static se.leap.bitmaskclient.Constants.ALWAYS_ON_SHOW_DIALOG;  import static se.leap.bitmaskclient.Constants.DEFAULT_SHARED_PREFS_BATTERY_SAVER;  import static se.leap.bitmaskclient.Constants.PREFERENCES_APP_VERSION;  import static se.leap.bitmaskclient.Constants.PROVIDER_CONFIGURED;  import static se.leap.bitmaskclient.Constants.PROVIDER_EIP_DEFINITION;  import static se.leap.bitmaskclient.Constants.PROVIDER_PRIVATE_KEY;  import static se.leap.bitmaskclient.Constants.PROVIDER_VPN_CERTIFICATE; +import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;  /**   * Stores constants, and implements auxiliary methods used across all Bitmask Android classes. @@ -417,9 +419,27 @@ public class ConfigHelper {          preferences.edit().putBoolean(DEFAULT_SHARED_PREFS_BATTERY_SAVER, isEnabled).apply();      } -    public static boolean getSaveBattery(@NonNull Context context) { +    public static boolean getSaveBattery(Context context) { +        if (context == null) { +            return false; +        }          SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);          return preferences.getBoolean(DEFAULT_SHARED_PREFS_BATTERY_SAVER, false);      } +    public static void saveShowAlwaysOnDialog(Context context, boolean showAlwaysOnDialog) { +        if (context == null) { +            return; +        } +        SharedPreferences preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE); +        preferences.edit().putBoolean(ALWAYS_ON_SHOW_DIALOG, showAlwaysOnDialog).apply(); +    } + +    public static boolean getShowAlwaysOnDialog(Context context) { +        if (context == null) { +            return true; +        } +        SharedPreferences preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE); +        return preferences.getBoolean(ALWAYS_ON_SHOW_DIALOG, true); +    }  } diff --git a/app/src/main/java/se/leap/bitmaskclient/Constants.java b/app/src/main/java/se/leap/bitmaskclient/Constants.java index 58145015..d719e8d3 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Constants.java +++ b/app/src/main/java/se/leap/bitmaskclient/Constants.java @@ -8,6 +8,7 @@ public interface Constants {      String SHARED_PREFERENCES = "LEAPPreferences";      String PREFERENCES_APP_VERSION = "bitmask version"; +    String ALWAYS_ON_SHOW_DIALOG = "DIALOG.ALWAYS_ON_SHOW_DIALOG";       ////////////////////////////////////////////// diff --git a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java index 2a7d8def..6102e7e5 100644 --- a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java @@ -24,8 +24,10 @@ import android.content.SharedPreferences;  import android.content.res.Configuration;  import android.os.Build;  import android.os.Bundle; +import android.support.v4.app.DialogFragment;  import android.support.v4.app.Fragment;  import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction;  import android.support.v4.view.GravityCompat;  import android.support.v4.widget.DrawerLayout;  import android.support.v7.app.ActionBar; @@ -49,6 +51,8 @@ import android.widget.Toast;  import se.leap.bitmaskclient.ConfigHelper;  import se.leap.bitmaskclient.DrawerSettingsAdapter;  import se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem; +import se.leap.bitmaskclient.FragmentManagerEnhanced; +import se.leap.bitmaskclient.fragments.AlwaysOnDialog;  import se.leap.bitmaskclient.EipFragment;  import se.leap.bitmaskclient.Provider;  import se.leap.bitmaskclient.ProviderListActivity; @@ -59,6 +63,7 @@ import se.leap.bitmaskclient.fragments.LogFragment;  import static android.content.Context.MODE_PRIVATE;  import static se.leap.bitmaskclient.BitmaskApp.getRefWatcher;  import static se.leap.bitmaskclient.ConfigHelper.getSaveBattery; +import static se.leap.bitmaskclient.ConfigHelper.getShowAlwaysOnDialog;  import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;  import static se.leap.bitmaskclient.Constants.REQUEST_CODE_SWITCH_PROVIDER;  import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; @@ -293,7 +298,8 @@ public class NavigationDrawerFragment extends Fragment {          try {              AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity());              showEnableExperimentalFeature = true; -            alertDialog = alertBuilder.setTitle(activity.getString(R.string.save_battery)) +            alertDialog = alertBuilder +                    .setTitle(activity.getString(R.string.save_battery))                      .setMessage(activity.getString(R.string.save_battery_message))                      .setPositiveButton((android.R.string.yes), new DialogInterface.OnClickListener() {                          @Override @@ -323,6 +329,19 @@ public class NavigationDrawerFragment extends Fragment {          } catch (IllegalStateException e) {              e.printStackTrace();          } +    } + +    public void showAlwaysOnDialog() { +        try { + +            FragmentTransaction fragmentTransaction = new FragmentManagerEnhanced( +                    getActivity().getSupportFragmentManager()).removePreviousFragment( +                    AlwaysOnDialog.TAG); +            DialogFragment newFragment = new AlwaysOnDialog(); +            newFragment.show(fragmentTransaction, AlwaysOnDialog.TAG); +        } catch (IllegalStateException | NullPointerException e) { +            e.printStackTrace(); +        }      } @@ -428,9 +447,13 @@ public class NavigationDrawerFragment extends Fragment {                      fragment = new AboutFragment();                      break;                  case ALWAYS_ON: -                    Intent intent = new Intent("android.net.vpn.SETTINGS"); -                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); -                    startActivity(intent); +                    if (getShowAlwaysOnDialog(getContext())) { +                        showAlwaysOnDialog(); +                    } else { +                        Intent intent = new Intent("android.net.vpn.SETTINGS"); +                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +                        startActivity(intent); +                    }                      break;                  default:                      break; diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java b/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java new file mode 100644 index 00000000..80510b86 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java @@ -0,0 +1,67 @@ +package se.leap.bitmaskclient.fragments; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatDialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.CheckBox; + +import butterknife.ButterKnife; +import butterknife.InjectView; +import se.leap.bitmaskclient.R; + +import static se.leap.bitmaskclient.ConfigHelper.saveShowAlwaysOnDialog; + +/** + * Created by cyberta on 25.02.18. + */ + + + +public class AlwaysOnDialog extends AppCompatDialogFragment { + +    public final static String TAG = AlwaysOnDialog.class.getName(); + +    @InjectView(R.id.do_not_show_again) +    CheckBox doNotShowAgainCheckBox; + +    @Override +    public void onCreate(@Nullable Bundle savedInstanceState) { +        super.onCreate(savedInstanceState); +    } + +    @NonNull +    @Override +    public Dialog onCreateDialog(Bundle savedInstanceState) { +        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); +        LayoutInflater inflater = getActivity().getLayoutInflater(); +        View view = inflater.inflate(R.layout.checkbox_confirm_dialog, null); +        ButterKnife.inject(this, view); + +        builder.setView(view) +                .setMessage(R.string.always_on_vpn_user_message) +                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { +                    public void onClick(DialogInterface dialog, int id) { +                        if (doNotShowAgainCheckBox.isChecked()) { +                            saveShowAlwaysOnDialog(getContext(), false); +                        } +                        Intent intent = new Intent("android.net.vpn.SETTINGS"); +                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +                        startActivity(intent); +                    } +                }) +                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { +                    public void onClick(DialogInterface dialog, int id) { +                        dialog.cancel(); +                    } +                }); +        // Create the AlertDialog object and return it +        return builder.create(); +    } +} diff --git a/app/src/main/res/layout/checkbox_confirm_dialog.xml b/app/src/main/res/layout/checkbox_confirm_dialog.xml new file mode 100644 index 00000000..d8d4a19e --- /dev/null +++ b/app/src/main/res/layout/checkbox_confirm_dialog.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +    android:layout_width="wrap_content" +    android:layout_height="wrap_content" +    xmlns:tools="http://schemas.android.com/tools" +    android:orientation="vertical"> + +    <TextView +        android:id="@+id/user_message" +        android:layout_width="match_parent" +        android:layout_height="wrap_content" +        android:layout_marginTop="@dimen/activity_horizontal_margin" +        android:layout_margin="4dp" +        tools:text="To enable always-on VPN please click on the settings icon [img src=settings/] and turn the switch on. \nFurther information: https://help.bitmask.net/android" +        /> + + +    <CheckBox +        android:id="@+id/do_not_show_again" +        android:layout_width="wrap_content" +        android:layout_height="wrap_content" +        android:layout_margin="@dimen/stdpadding" +        android:text="@string/do_not_show_again" /> + +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 03fd4584..4d19758c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -111,4 +111,6 @@    <string name="save_battery">Save battery</string>    <string name="save_battery_message">Background data connections will hibernate when your phone is inactive. This feature is still experimental.</string>    <string name="always_on_vpn">Always-on VPN</string> +  <string name="do_not_show_again">Do not show again.</string> +  <string name="always_on_vpn_user_message">To enable always-on VPN in Android VPN Settings click on the configure icon and turn the switch on."</string>  </resources>  | 
