summaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java19
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java6
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/utils/ViewHelper.java93
3 files changed, 106 insertions, 12 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java
index 76834332..f618b22b 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java
@@ -30,8 +30,10 @@ import static se.leap.bitmaskclient.providersetup.ProviderAPI.UPDATE_INVALID_VPN
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
+import android.graphics.Rect;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
@@ -41,6 +43,7 @@ import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
import android.widget.Toast;
import androidx.annotation.ColorRes;
@@ -59,6 +62,7 @@ import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
+import java.util.Collections;
import de.blinkt.openvpn.core.ConnectionStatus;
import de.blinkt.openvpn.core.VpnStatus;
@@ -150,6 +154,8 @@ public class EipFragment extends Fragment implements PropertyChangeListener {
mainButton = binding.mainButton;
locationButton = binding.gatewayLocationButton;
locationButton.setTextColor(R.color.black800);
+ ViewHelper.applyInsetsToViewMargin(locationButton, false, false, false, true);
+ excludeBackGesture(binding);
mainDescription = binding.mainDescription;
subDescription = binding.subDescription;
stateView = binding.stateView;
@@ -189,6 +195,19 @@ public class EipFragment extends Fragment implements PropertyChangeListener {
return binding.getRoot();
}
+ private void excludeBackGesture(FEipBinding binding) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) return;
+ ViewTreeObserver treeObserver = binding.gestureSuppressView.getViewTreeObserver();
+ treeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ binding.gestureSuppressView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ Rect rect = new Rect(0, 0, binding.gestureSuppressView.getWidth(), binding.gestureSuppressView.getHeight());
+ binding.gestureSuppressView.setSystemGestureExclusionRects(Collections.singletonList(rect));
+ }
+ });
+ }
+
@Override
public void onStart() {
super.onStart();
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
index 41e102bb..376be389 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
@@ -46,11 +46,9 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.graphics.drawable.DrawerArrowDrawable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
-import androidx.core.os.LocaleListCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
@@ -58,7 +56,6 @@ import androidx.fragment.app.Fragment;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Locale;
-import java.util.Map;
import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.R;
@@ -67,6 +64,7 @@ import se.leap.bitmaskclient.base.MainActivity;
import se.leap.bitmaskclient.base.models.Provider;
import se.leap.bitmaskclient.base.models.ProviderObservable;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
+import se.leap.bitmaskclient.base.utils.ViewHelper;
import se.leap.bitmaskclient.base.views.IconSwitchEntry;
import se.leap.bitmaskclient.base.views.IconTextEntry;
import se.leap.bitmaskclient.eip.EipStatus;
@@ -127,6 +125,7 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
restoreFromSavedInstance(savedInstanceState);
TetheringObservable.getInstance().addObserver(this);
EipStatus.getInstance().addObserver(this);
+ ViewHelper.applyInsetsToViewMargin(drawerView, true, true, true, false);
return drawerView;
}
@@ -169,6 +168,7 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
// set a custom shadow that overlays the main content when the drawer opens
this.drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
toolbar = this.drawerLayout.findViewById(R.id.toolbar);
+ ViewHelper.applyInsetsToViewPadding(toolbar, true, true, true, false);
setupEntries();
setupActionBarDrawerToggle(activity);
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/utils/ViewHelper.java b/app/src/main/java/se/leap/bitmaskclient/base/utils/ViewHelper.java
index e04ba70d..0c03a16f 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/utils/ViewHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/utils/ViewHelper.java
@@ -2,22 +2,28 @@ package se.leap.bitmaskclient.base.utils;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
+import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
+import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewGroup;
import android.view.Window;
+import android.view.WindowInsetsController;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
@@ -29,9 +35,16 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
+import androidx.core.graphics.Insets;
import androidx.core.graphics.drawable.DrawableCompat;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.base.views.ActionBarTitle;
@@ -94,7 +107,7 @@ public class ViewHelper {
setActivityBarColor(activity, R.color.colorPrimary, R.color.colorPrimaryDark, R.color.colorActionBarTitleFont);
}
- public static void setActivityBarColor(Activity activity, @ColorRes int primaryColor, @ColorRes int secondaryColor, @ColorRes int textColor) {
+ public static void setActivityBarColor(Activity activity, @ColorRes int primaryColorRes, @ColorRes int secondaryColorRes, @ColorRes int textColor) {
if (!(activity instanceof AppCompatActivity)) {
return;
}
@@ -103,16 +116,12 @@ public class ViewHelper {
if (bar == null) {
return;
}
- int color = ContextCompat.getColor(activity, secondaryColor);
- bar.setBackgroundDrawable(new ColorDrawable(color));
- Window window = activity.getWindow();
- window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(ContextCompat.getColor(activity, primaryColor));
-
+ int secondaryColor = ContextCompat.getColor(activity, secondaryColorRes);
+ bar.setBackgroundDrawable(new ColorDrawable(secondaryColor));
+ setStatusBarColor(activity, primaryColorRes);
int actionBarTextColor;
if (textColor == 0) {
- actionBarTextColor = isBrightColor(color) ? R.color.actionbar_connectivity_state_text_color_dark : R.color.actionbar_connectivity_state_text_color_light;
+ actionBarTextColor = isBrightColor(secondaryColor) ? R.color.actionbar_connectivity_state_text_color_dark : R.color.actionbar_connectivity_state_text_color_light;
} else {
actionBarTextColor = textColor;
}
@@ -130,6 +139,72 @@ public class ViewHelper {
}
}
+ public static void applyInsetsToViewPadding(View view, boolean left, boolean top, boolean right, boolean bottom) {
+ ViewCompat.setOnApplyWindowInsetsListener(view, (v, windowInsets) -> {
+ Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ if (left) {
+ view.setPadding(insets.left, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
+ }
+ if (right) {
+ view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), insets.right, view.getPaddingBottom());
+ }
+ if (bottom) {
+ view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), insets.bottom);
+ }
+ if (top) {
+ view.setPadding(view.getPaddingLeft(), insets.top, view.getPaddingRight(), view.getPaddingBottom());
+ }
+
+ // Return CONSUMED if you don't want the window insets to keep passing
+ // down to descendant views.
+ return WindowInsetsCompat.CONSUMED;
+ });
+ }
+
+ public static void applyInsetsToViewMargin(View view, boolean left, boolean top, boolean right, boolean bottom) {
+ ViewCompat.setOnApplyWindowInsetsListener(view, (v, windowInsets) -> {
+ Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
+ if (left) {
+ mlp.leftMargin = insets.left;
+ }
+ if (right) {
+ mlp.rightMargin = insets.right;
+ }
+ if (bottom) {
+ mlp.bottomMargin = insets.bottom;
+ }
+ if (top) {
+ mlp.topMargin = insets.top;
+ }
+ v.setLayoutParams(mlp);
+
+ // Return CONSUMED if you don't want the window insets to keep passing
+ // down to descendant views.
+ return WindowInsetsCompat.CONSUMED;
+ });
+ }
+
+ private static void setStatusBarColor(Activity activity, int colorRes) {
+ Window window = activity.getWindow();
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
+ window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
+ window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+ window.setStatusBarColor(ContextCompat.getColor(activity, colorRes));
+ } else {
+ // in Androiid 15+, the status bar is transparent. Hence we need to make sure that the status bar icons
+ // have enough contrast to be visible above the the underlying UI
+ WindowInsetsController controller = window.getInsetsController();
+ if (controller != null) {
+ int color = ContextCompat.getColor(activity, colorRes);
+ if (isBrightColor(color)) {
+ controller.setSystemBarsAppearance(APPEARANCE_LIGHT_STATUS_BARS, APPEARANCE_LIGHT_STATUS_BARS);
+ } else {
+ controller.setSystemBarsAppearance(0, APPEARANCE_LIGHT_STATUS_BARS);
+ }
+ }
+ }
+ }
public static boolean isBrightColor(int color) {
if (android.R.color.transparent == color)