diff options
8 files changed, 274 insertions, 81 deletions
diff --git a/app/src/custom/res/drawable/donation_img.xml b/app/src/custom/res/drawable/donation_img.xml new file mode 100644 index 00000000..de93a9ce --- /dev/null +++ b/app/src/custom/res/drawable/donation_img.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<!--Used to create the image to be shown in the donation popup--> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/background_main" + android:gravity="fill_horizontal|fill_vertical"/> + <item android:drawable="@drawable/logo" + android:gravity="center" + /> +</layer-list> diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index 51f787b7..61abd6ce 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -25,27 +25,21 @@ import android.content.ServiceConnection; import android.content.SharedPreferences; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; -import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AlertDialog; import android.support.v7.widget.AppCompatImageView; import android.support.v7.widget.AppCompatTextView; -import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.temporal.ChronoUnit; -import java.util.Date; -import java.util.Locale; import java.util.Observable; import java.util.Observer; @@ -58,23 +52,17 @@ import de.blinkt.openvpn.core.OpenVPNService; import de.blinkt.openvpn.core.ProfileManager; import se.leap.bitmaskclient.eip.EipCommand; import se.leap.bitmaskclient.eip.EipStatus; -import se.leap.bitmaskclient.utils.DateHelper; +import se.leap.bitmaskclient.fragments.DonationReminderDialog; import se.leap.bitmaskclient.views.VpnStateImage; import static android.view.View.GONE; import static android.view.View.VISIBLE; import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_NONETWORK; -import static se.leap.bitmaskclient.Constants.DONATION_REMINDER_DURATION; import static se.leap.bitmaskclient.Constants.EIP_RESTART_ON_BOOT; -import static se.leap.bitmaskclient.Constants.FIRST_TIME_USER_DATE; import static se.leap.bitmaskclient.Constants.PROVIDER_KEY; import static se.leap.bitmaskclient.Constants.REQUEST_CODE_LOG_IN; import static se.leap.bitmaskclient.Constants.REQUEST_CODE_SWITCH_PROVIDER; import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; -import static se.leap.bitmaskclient.Constants.DONATION_URL; -import static se.leap.bitmaskclient.Constants.ENABLE_DONATION; -import static se.leap.bitmaskclient.Constants.ENABLE_DONATION_REMINDER; -import static se.leap.bitmaskclient.Constants.LAST_DONATION_REMINDER_DATE; import static se.leap.bitmaskclient.ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE; import static se.leap.bitmaskclient.ProviderAPI.USER_MESSAGE; import static se.leap.bitmaskclient.R.string.vpn_certificate_user_message; @@ -85,7 +73,6 @@ public class EipFragment extends Fragment implements Observer { public static final String ASK_TO_CANCEL_VPN = "ask_to_cancel_vpn"; - private SharedPreferences preferences; private Provider provider; @@ -172,8 +159,8 @@ public class EipFragment extends Fragment implements Observer { @Override public void onStart() { super.onStart(); - if (isDonationReminderCallable()) { - showDonationReminder(); + if (DonationReminderDialog.isCallable(getContext())) { + showDonationReminderDialog(); } } @@ -509,71 +496,16 @@ public class EipFragment extends Fragment implements Observer { } } - private void showDonationReminder() { - Activity activity = getActivity(); - if (activity == null) { - Log.e(TAG, "activity is null when triggering donation reminder"); - return; - } - String message = TextUtils.isEmpty(activity.getString(R.string.donate_message)) ? - activity.getString(R.string.donate_default_message) : activity.getString(R.string.donate_message); - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(activity); - alertDialog = alertBuilder.setTitle(activity.getString(R.string.donate_title)) - .setMessage(message) - .setPositiveButton(R.string.donate_button_donate, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(DONATION_URL)); - startActivity(browserIntent); - } - }) - .setNegativeButton(R.string.donate_button_remind_later, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - } - }).setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - preferences.edit().putString(LAST_DONATION_REMINDER_DATE, - DateHelper.getCurrentDateString()).apply(); - } - }).show(); - } - - private boolean isDonationReminderCallable() { - if (!ENABLE_DONATION || !ENABLE_DONATION_REMINDER) { - return false; - } - - if (preferences == null) { - Log.e(TAG, "preferences is null!"); - return false; - } - - String firstTimeUserDate = preferences.getString(FIRST_TIME_USER_DATE, null); - if (firstTimeUserDate == null) { - preferences.edit().putString(FIRST_TIME_USER_DATE, DateHelper.getCurrentDateString()).apply(); - return false; - } - + public void showDonationReminderDialog() { try { - long diffDays; - - diffDays = DateHelper.getDateDiffToCurrentDateInDays(firstTimeUserDate); - if (diffDays < 1) { - return false; - } - - String lastDonationReminderDate = preferences.getString(LAST_DONATION_REMINDER_DATE, null); - if (lastDonationReminderDate == null) { - return true; - } - diffDays = DateHelper.getDateDiffToCurrentDateInDays(lastDonationReminderDate); - return diffDays >= DONATION_REMINDER_DURATION; - - } catch (ParseException e) { + FragmentTransaction fragmentTransaction = new FragmentManagerEnhanced( + getActivity().getSupportFragmentManager()).removePreviousFragment( + DonationReminderDialog.TAG); + DialogFragment newFragment = new DonationReminderDialog(); + newFragment.setCancelable(false); + newFragment.show(fragmentTransaction, DonationReminderDialog.TAG); + } catch (IllegalStateException | NullPointerException e) { e.printStackTrace(); - Log.e(TAG, e.getMessage()); - return false; } } - } diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java b/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java new file mode 100644 index 00000000..001d7e6c --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/fragments/DonationReminderDialog.java @@ -0,0 +1,121 @@ +package se.leap.bitmaskclient.fragments; + +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +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.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; + +import java.text.ParseException; + +import butterknife.ButterKnife; +import butterknife.InjectView; +import se.leap.bitmaskclient.R; +import se.leap.bitmaskclient.utils.DateHelper; +import se.leap.bitmaskclient.utils.PreferenceHelper; + +import static se.leap.bitmaskclient.Constants.DONATION_REMINDER_DURATION; +import static se.leap.bitmaskclient.Constants.DONATION_URL; +import static se.leap.bitmaskclient.Constants.ENABLE_DONATION; +import static se.leap.bitmaskclient.Constants.ENABLE_DONATION_REMINDER; +import static se.leap.bitmaskclient.Constants.FIRST_TIME_USER_DATE; +import static se.leap.bitmaskclient.Constants.LAST_DONATION_REMINDER_DATE; + +public class DonationReminderDialog extends AppCompatDialogFragment { + + public final static String TAG = DonationReminderDialog.class.getName(); + private static boolean isShown = false; + + @InjectView(R.id.btnDonate) + Button btnDonate; + + @InjectView(R.id.btnLater) + Button btnLater; + + @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.donation_reminder_dialog, null); + ButterKnife.inject(this, view); + isShown = true; + + builder.setView(view); + btnDonate.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(DONATION_URL)); + startActivity(browserIntent); + PreferenceHelper.putString(getContext(), LAST_DONATION_REMINDER_DATE, + DateHelper.getCurrentDateString()); + dismiss(); + } + }); + btnLater.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + PreferenceHelper.putString(getContext(), LAST_DONATION_REMINDER_DATE, + DateHelper.getCurrentDateString()); + dismiss(); + } + }); + + return builder.create(); + } + + public static boolean isCallable(Context context) { + if (isShown) { + return false; + } + + if (!ENABLE_DONATION || !ENABLE_DONATION_REMINDER) { + return false; + } + + if (context == null) { + Log.e(TAG, "context is null!"); + return false; + } + + String firstTimeUserDate = PreferenceHelper.getString(context, FIRST_TIME_USER_DATE, null); + if (firstTimeUserDate == null) { + PreferenceHelper.putString(context, FIRST_TIME_USER_DATE, DateHelper.getCurrentDateString()); + return false; + } + + try { + long diffDays; + + diffDays = DateHelper.getDateDiffToCurrentDateInDays(firstTimeUserDate); + if (diffDays < 1) { + return false; + } + + String lastDonationReminderDate = PreferenceHelper.getString(context, LAST_DONATION_REMINDER_DATE, null); + if (lastDonationReminderDate == null) { + return true; + } + diffDays = DateHelper.getDateDiffToCurrentDateInDays(lastDonationReminderDate); + return diffDays >= DONATION_REMINDER_DURATION; + + } catch (ParseException e) { + e.printStackTrace(); + Log.e(TAG, e.getMessage()); + return false; + } + } +} diff --git a/app/src/main/java/se/leap/bitmaskclient/utils/PreferenceHelper.java b/app/src/main/java/se/leap/bitmaskclient/utils/PreferenceHelper.java index 12015dfb..5f739ce1 100644 --- a/app/src/main/java/se/leap/bitmaskclient/utils/PreferenceHelper.java +++ b/app/src/main/java/se/leap/bitmaskclient/utils/PreferenceHelper.java @@ -1,5 +1,6 @@ package se.leap.bitmaskclient.utils; +import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Looper; @@ -239,4 +240,13 @@ public class PreferenceHelper { return result; } + public static String getString(Context context, String key, String defValue) { + SharedPreferences preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE); + return preferences.getString(key, defValue); + } + + public static void putString(Context context, String key, String value){ + SharedPreferences preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE); + preferences.edit().putString(key, value).apply(); + } } diff --git a/app/src/main/res/drawable/cust_button_primary.xml b/app/src/main/res/drawable/cust_button_primary.xml new file mode 100644 index 00000000..3b0f7e26 --- /dev/null +++ b/app/src/main/res/drawable/cust_button_primary.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android" > + <item android:state_pressed="true" > + <shape android:shape="rectangle" > + <corners android:radius="50dp" /> + <padding android:left="8dp" android:right="8dp"/> + <solid android:color="@color/colorPrimaryDark"/> + </shape> + </item> + <item android:state_focused="true"> + <shape android:shape="rectangle" > + <corners android:radius="50dp" /> + <padding android:left="8dp" android:right="8dp"/> + <solid android:color="@color/colorPrimaryDark"/> + </shape> + </item> + <item > + <shape android:shape="rectangle" > + <corners android:radius="50dp" /> + <padding android:left="8dp" android:right="8dp"/> + <solid android:color="@color/colorPrimary"/> + </shape> + </item> +</selector>
\ No newline at end of file diff --git a/app/src/main/res/drawable/cust_button_secondary.xml b/app/src/main/res/drawable/cust_button_secondary.xml new file mode 100644 index 00000000..553adca8 --- /dev/null +++ b/app/src/main/res/drawable/cust_button_secondary.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android" > + <item android:state_pressed="true" > + <shape android:shape="rectangle" > + <corners android:radius="50dp" /> + <padding android:left="8dp" android:right="8dp"/> + <solid android:color="@android:color/transparent"/> + <stroke android:width="2dp" android:color="@color/colorPrimary"/> + </shape> + </item> + <item android:state_focused="true"> + <shape android:shape="rectangle" > + <corners android:radius="50dp" /> + <padding android:left="8dp" android:right="8dp"/> + <solid android:color="@android:color/transparent"/> + <stroke android:width="2dp" android:color="@color/colorPrimary"/> + </shape> + </item> + <item > + <shape android:shape="rectangle" > + <corners android:radius="50dp" /> + <padding android:left="8dp" android:right="8dp"/> + <solid android:color="@android:color/transparent"/> + <stroke android:width="2dp" android:color="@color/colorPrimary"/> + </shape> + </item> +</selector>
\ No newline at end of file diff --git a/app/src/main/res/drawable/donation_img.xml b/app/src/main/res/drawable/donation_img.xml new file mode 100644 index 00000000..1e0b405e --- /dev/null +++ b/app/src/main/res/drawable/donation_img.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/background_main" + android:gravity="fill_horizontal|fill_vertical"/> + <item android:drawable="@drawable/logo" + android:gravity="center" + /> +</layer-list> diff --git a/app/src/main/res/layout/donation_reminder_dialog.xml b/app/src/main/res/layout/donation_reminder_dialog.xml new file mode 100644 index 00000000..6b523053 --- /dev/null +++ b/app/src/main/res/layout/donation_reminder_dialog.xml @@ -0,0 +1,62 @@ +<?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" + android:gravity="center" + android:orientation="vertical"> + + <TextView + android:id="@+id/tvTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/standard_margin" + android:layout_marginTop="@dimen/add_button_margin" + android:gravity="center" + android:text="@string/donate_title" + android:textAllCaps="true" + android:textColor="@color/colorPrimary" + android:textSize="28sp" + android:textStyle="bold" /> + + <TextView + android:id="@+id/tvMessage" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="@dimen/standard_margin" + android:gravity="center" + android:text="@string/donate_message" /> + + <ImageView + android:id="@+id/ivImg" + android:layout_width="120dp" + android:layout_height="120dp" + android:layout_marginBottom="@dimen/add_button_margin" + android:layout_marginTop="@dimen/add_button_margin" + android:src="@drawable/donation_img" /> + + <Button + android:id="@+id/btnDonate" + android:layout_width="200dp" + android:layout_height="38dp" + android:layout_marginLeft="@dimen/add_button_margin" + android:layout_marginRight="@dimen/add_button_margin" + android:layout_marginTop="@dimen/standard_margin" + android:background="@drawable/cust_button_primary" + android:text="@string/donate_button_donate" + android:textColor="@color/white" + android:textStyle="bold" /> + + <Button + android:id="@+id/btnLater" + android:layout_width="200dp" + android:layout_height="38dp" + android:layout_marginBottom="@dimen/mainbutton_padding" + android:layout_marginLeft="@dimen/add_button_margin" + android:layout_marginRight="@dimen/add_button_margin" + android:layout_marginTop="@dimen/standard_margin" + android:background="@drawable/cust_button_secondary" + android:text="@string/donate_button_remind_later" + android:textColor="@android:color/tab_indicator_text" + android:textStyle="bold" /> + +</LinearLayout>
\ No newline at end of file |