summaryrefslogtreecommitdiff
path: root/app/src/main
diff options
context:
space:
mode:
authorcyBerta <cyberta@riseup.net>2022-12-15 15:11:22 +0100
committercyBerta <cyberta@riseup.net>2022-12-15 23:59:53 +0100
commite090b6dd60daca11603b36a197dfe5b05ecc3cb9 (patch)
tree2779e7f0e59cb659fa71eb6c3aee8d04aefa6949 /app/src/main
parentbccc782a143692a1db01f4725cd94784aa99ca72 (diff)
center and capitalize actionbar title, in Bitmask, center but not capitalize title in riseupvpn, allow to configure both properties on compile time in build.gradle
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java96
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/AboutFragment.java4
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java15
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/ExcludeAppsFragment.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java5
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/LogFragment.java11
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java55
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java4
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/utils/ViewHelper.java80
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/views/ActionBarTitle.java96
-rw-r--r--app/src/main/res/layout/a_main.xml2
-rw-r--r--app/src/main/res/layout/v_actionbar_title.xml32
12 files changed, 256 insertions, 146 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java b/app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java
index f56f2223..9225755e 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java
@@ -17,6 +17,7 @@
package se.leap.bitmaskclient.base;
+import static androidx.appcompat.app.ActionBar.DISPLAY_SHOW_CUSTOM;
import static se.leap.bitmaskclient.R.string.downloading_vpn_certificate_failed;
import static se.leap.bitmaskclient.R.string.vpn_certificate_user_message;
import static se.leap.bitmaskclient.base.models.Constants.ASK_TO_CANCEL_VPN;
@@ -34,7 +35,6 @@ import static se.leap.bitmaskclient.base.models.Constants.REQUEST_CODE_LOG_IN;
import static se.leap.bitmaskclient.base.models.Constants.REQUEST_CODE_SWITCH_PROVIDER;
import static se.leap.bitmaskclient.base.models.Constants.SHARED_PREFERENCES;
import static se.leap.bitmaskclient.base.utils.PreferenceHelper.storeProviderInPreferences;
-import static se.leap.bitmaskclient.base.utils.ViewHelper.isBrightColor;
import static se.leap.bitmaskclient.eip.EIP.EIPErrors.ERROR_INVALID_VPN_CERTIFICATE;
import static se.leap.bitmaskclient.eip.EIP.EIPErrors.ERROR_VPN_PREPARE;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.ERRORID;
@@ -46,17 +46,14 @@ import static se.leap.bitmaskclient.providersetup.ProviderAPI.TOR_TIMEOUT;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE;
import static se.leap.bitmaskclient.providersetup.ProviderAPI.USER_MESSAGE;
+import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
-import android.graphics.drawable.ColorDrawable;
-import android.os.Build;
import android.os.Bundle;
import android.util.Log;
-import android.view.Window;
-import android.view.WindowManager;
+import android.view.Gravity;
-import androidx.annotation.ColorRes;
-import androidx.annotation.StringRes;
+import androidx.annotation.ColorInt;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
@@ -70,6 +67,7 @@ import org.json.JSONObject;
import java.util.Observable;
import java.util.Observer;
+import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.base.fragments.EipFragment;
import se.leap.bitmaskclient.base.fragments.ExcludeAppsFragment;
@@ -81,7 +79,7 @@ import se.leap.bitmaskclient.base.fragments.SettingsFragment;
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.ActionBarTitle;
import se.leap.bitmaskclient.eip.EIP;
import se.leap.bitmaskclient.eip.EipCommand;
import se.leap.bitmaskclient.eip.EipSetupListener;
@@ -103,8 +101,6 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
public final static String ACTION_SHOW_DIALOG_FRAGMENT = "action_show_dialog_fragment";
public final static String ACTION_SHOW_MOTD_FRAGMENT = "action_show_motd_fragment";
- private @ColorRes int actionBarTextColor = R.color.colorActionBarTitleFont;
-
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
@@ -113,8 +109,7 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a_main);
- setSupportActionBar(findViewById(R.id.toolbar));
-
+ setupActionBar();
navigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
@@ -143,7 +138,6 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
newFragment.setArguments(bundle);
}
fragmentManagerEnhanced.replace(R.id.main_container, newFragment, MainActivity.TAG);
- hideActionBarSubTitle();
} else {
super.onBackPressed();
}
@@ -171,7 +165,6 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
}
bundle.putParcelable(PROVIDER_KEY, provider);
fragment.setArguments(bundle);
- hideActionBarSubTitle();
showActionBar();
break;
case ACTION_SHOW_MOTD_FRAGMENT:
@@ -181,12 +174,10 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
motdBundle.putString(EXTRA_MOTD_MSG, intent.getStringExtra(EXTRA_MOTD_MSG));
}
fragment.setArguments(motdBundle);
- hideActionBarSubTitle();
hideActionBar();
break;
case ACTION_SHOW_LOG_FRAGMENT:
fragment = new LogFragment();
- setActionBarTitle(R.string.log_fragment_title);
showActionBar();
break;
case ACTION_SHOW_DIALOG_FRAGMENT:
@@ -209,6 +200,31 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
}
}
+ private void setupActionBar() {
+ setSupportActionBar(findViewById(R.id.toolbar));
+ final ActionBar actionBar = getSupportActionBar();
+ Context context = actionBar.getThemedContext();
+ actionBar.setDisplayOptions(DISPLAY_SHOW_CUSTOM);
+
+ ActionBarTitle actionBarTitle = new ActionBarTitle(context);
+ actionBarTitle.setTitleCaps(BuildConfig.actionbar_capitalize_title);
+ actionBarTitle.setTitle(getString(R.string.app_name));
+
+ @ColorInt int titleColor = ContextCompat.getColor(context, R.color.colorActionBarTitleFont);
+ actionBarTitle.setTitleTextColor(titleColor);
+
+ actionBarTitle.setCentered(BuildConfig.actionbar_center_title);
+ if (BuildConfig.actionbar_center_title) {
+ ActionBar.LayoutParams params = new ActionBar.LayoutParams(
+ ActionBar.LayoutParams.WRAP_CONTENT,
+ ActionBar.LayoutParams.MATCH_PARENT,
+ Gravity.CENTER);
+ actionBar.setCustomView(actionBarTitle, params);
+ } else {
+ actionBar.setCustomView(actionBarTitle);
+ }
+ }
+
private void hideActionBar() {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
@@ -223,53 +239,6 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
}
}
- private void hideActionBarSubTitle() {
- ActionBar actionBar = getSupportActionBar();
- if (actionBar != null) {
- actionBar.setSubtitle(null);
- }
- }
- private void setActionBarTitle(@StringRes int stringId) {
- ActionBar actionBar = getSupportActionBar();
- if (actionBar != null) {
- actionBar.setSubtitle(stringId);
- }
- }
-
- public @ColorRes int getActionBarTitleColor() {
- return actionBarTextColor;
- }
-
- public void setDefaultActivityBarColor() {
- setActivityBarColor(R.color.colorPrimary, R.color.colorPrimaryDark, R.color.colorActionBarTitleFont);
- }
-
- public void setActivityBarColor(@ColorRes int primaryColor, @ColorRes int secondaryColor, @ColorRes int textColor) {
- ActionBar bar = getSupportActionBar();
- if (bar == null) {
- return;
- }
- int color = ContextCompat.getColor(this, secondaryColor);
- bar.setBackgroundDrawable(new ColorDrawable(color));
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- Window window = this.getWindow();
- window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(ContextCompat.getColor(this, primaryColor));
- }
-
- if (bar.getTitle() == null) {
- return;
- }
-
- if (textColor == 0) {
- actionBarTextColor = isBrightColor(color) ? R.color.actionbar_connectivity_state_text_color_dark : R.color.actionbar_connectivity_state_text_color_light;
- } else {
- actionBarTextColor = textColor;
- }
-
- ViewHelper.setActionBarTextColor(bar, actionBarTextColor);
- }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
@@ -313,7 +282,6 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
fragment.setArguments(arguments);
new FragmentManagerEnhanced(getSupportFragmentManager())
.replace(R.id.main_container, fragment, MainActivity.TAG);
- hideActionBarSubTitle();
}
@Override
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/AboutFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/AboutFragment.java
index 646637b9..e92aa703 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/AboutFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/AboutFragment.java
@@ -18,7 +18,7 @@ import se.leap.bitmaskclient.R;
import static android.view.View.VISIBLE;
import static se.leap.bitmaskclient.R.string.about_fragment_title;
-import static se.leap.bitmaskclient.base.utils.ViewHelper.setActionBarTitle;
+import static se.leap.bitmaskclient.base.utils.ViewHelper.setActionBarSubtitle;
public class AboutFragment extends Fragment {
@@ -36,7 +36,7 @@ public class AboutFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.f_about, container, false);
unbinder = ButterKnife.bind(this, view);
- setActionBarTitle(this, about_fragment_title);
+ setActionBarSubtitle(this, about_fragment_title);
return view;
}
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 66f976f6..409efcf0 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
@@ -75,6 +75,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.LocationButton;
import se.leap.bitmaskclient.base.views.MainButton;
import se.leap.bitmaskclient.databinding.FEipBinding;
@@ -164,8 +165,6 @@ public class EipFragment extends Fragment implements Observer {
}
gatewaysManager = new GatewaysManager(getContext());
-
-
}
@Override
@@ -178,6 +177,7 @@ public class EipFragment extends Fragment implements Observer {
mainDescription = binding.mainDescription;
subDescription = binding.subDescription;
stateView = binding.stateView;
+ ViewHelper.setActionBarTitle(this, R.string.app_name);
eipStatus.addObserver(this);
torStatusObservable.addObserver(this);
@@ -256,10 +256,7 @@ public class EipFragment extends Fragment implements Observer {
super.onDestroyView();
Log.d(TAG, "onDestroyView");
- Activity activity = getActivity();
- if (activity != null) {
- ((MainActivity) activity).setDefaultActivityBarColor();
- }
+ ViewHelper.setDefaultActivityBarColor(getActivity());
eipStatus.deleteObserver(this);
providerObservable.deleteObserver(this);
torStatusObservable.deleteObserver(this);
@@ -423,11 +420,7 @@ public class EipFragment extends Fragment implements Observer {
}
private void setActivityBarColor(@ColorRes int primaryColor, @ColorRes int secondaryColor) {
- Activity activity = getActivity();
- if (activity == null) {
- return;
- }
- ((MainActivity) getActivity()).setActivityBarColor(primaryColor, secondaryColor, R.color.actionbar_connectivity_state_text_color_dark);
+ ViewHelper.setActivityBarColor(getActivity(), primaryColor, secondaryColor, R.color.actionbar_connectivity_state_text_color_dark);
}
private void handleNewState() {
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/ExcludeAppsFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/ExcludeAppsFragment.java
index 1574dbb0..98c2e438 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/ExcludeAppsFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/ExcludeAppsFragment.java
@@ -312,7 +312,7 @@ public class ExcludeAppsFragment extends Fragment implements AdapterView.OnItemC
mListView.setOnItemClickListener(this);
mListView.setEmptyView(v.findViewById(R.id.loading_container));
- ViewHelper.setActionBarTitle(this, exclude_apps_fragment_title);
+ ViewHelper.setActionBarSubtitle(this, exclude_apps_fragment_title);
new Thread(() -> mListAdapter.populateList(getActivity())).start();
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java
index 00bd55ef..749ffd9f 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java
@@ -52,7 +52,6 @@ import se.leap.bitmaskclient.eip.GatewaysManager;
import static android.content.Context.MODE_PRIVATE;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
-import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OPENVPN;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.PT;
import static se.leap.bitmaskclient.base.MainActivity.ACTION_SHOW_VPN_FRAGMENT;
@@ -60,7 +59,7 @@ import static se.leap.bitmaskclient.base.models.Constants.SHARED_PREFERENCES;
import static se.leap.bitmaskclient.base.models.Constants.USE_BRIDGES;
import static se.leap.bitmaskclient.base.utils.PreferenceHelper.getUseBridges;
import static se.leap.bitmaskclient.base.utils.PreferenceHelper.useBridges;
-import static se.leap.bitmaskclient.base.utils.ViewHelper.setActionBarTitle;
+import static se.leap.bitmaskclient.base.utils.ViewHelper.setActionBarSubtitle;
interface LocationListSelectionListener {
void onLocationManuallySelected(Location location);
@@ -109,7 +108,7 @@ public class GatewaySelectionFragment extends Fragment implements Observer, Loca
initRecyclerView();
initRecommendedLocationEntry();
initBridgesHint(view);
- setActionBarTitle(this, R.string.gateway_selection_title);
+ setActionBarSubtitle(this, R.string.gateway_selection_title);
}
@Override
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/LogFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/LogFragment.java
index 6f0f29ef..8f73595d 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/LogFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/LogFragment.java
@@ -5,6 +5,10 @@
package se.leap.bitmaskclient.base.fragments;
+import static de.blinkt.openvpn.core.OpenVPNService.humanReadableByteCount;
+import static se.leap.bitmaskclient.R.string.log_fragment_title;
+import static se.leap.bitmaskclient.base.utils.ViewHelper.setActionBarSubtitle;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
@@ -59,10 +63,6 @@ import de.blinkt.openvpn.core.VpnStatus.StateListener;
import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.base.models.Constants;
-import static de.blinkt.openvpn.core.OpenVPNService.humanReadableByteCount;
-import static se.leap.bitmaskclient.R.string.log_fragment_title;
-import static se.leap.bitmaskclient.base.utils.ViewHelper.setActionBarTitle;
-
public class LogFragment extends ListFragment implements StateListener, SeekBar.OnSeekBarChangeListener, RadioGroup.OnCheckedChangeListener, VpnStatus.ByteCountListener {
public static final String TAG = LogFragment.class.getSimpleName();
private static final String LOGTIMEFORMAT = "logtimeformat";
@@ -533,7 +533,7 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
if (mShowOptionsLayout)
mOptionsLayout.setVisibility(View.VISIBLE);
- setActionBarTitle(this, log_fragment_title);
+ setActionBarSubtitle(this, log_fragment_title);
return v;
}
@@ -557,7 +557,6 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
}
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 5c4e891e..68435fec 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
@@ -38,9 +38,6 @@ import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -48,15 +45,11 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
-import androidx.appcompat.widget.ViewUtils;
-import androidx.core.content.ContextCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
@@ -70,7 +63,6 @@ import se.leap.bitmaskclient.base.FragmentManagerEnhanced;
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.ViewHelper;
import se.leap.bitmaskclient.base.views.IconSwitchEntry;
import se.leap.bitmaskclient.base.views.IconTextEntry;
import se.leap.bitmaskclient.eip.EipStatus;
@@ -179,7 +171,6 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
this.drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
toolbar = this.drawerLayout.findViewById(R.id.toolbar);
- setupActionBar();
setupEntries();
setupActionBarDrawerToggle(activity);
@@ -240,7 +231,6 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
Bundle arguments = new Bundle();
arguments.putParcelable(PROVIDER_KEY, currentProvider);
fragment.setArguments(arguments);
- hideActionBarSubTitle();
fragmentManager.replace(R.id.main_container, fragment, MainActivity.TAG);
closeDrawer();
});
@@ -355,15 +345,7 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
}
}
- private ActionBar setupActionBar() {
- AppCompatActivity activity = (AppCompatActivity) getActivity();
- activity.setSupportActionBar(toolbar);
- final ActionBar actionBar = activity.getSupportActionBar();
- actionBar.setDisplayHomeAsUpEnabled(true);
- actionBar.setHomeButtonEnabled(true);
- actionBar.setDisplayShowTitleEnabled(true);
- return actionBar;
- }
+
@NonNull
private void closeDrawerWithDelay() {
@@ -425,14 +407,6 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
}
@Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if (drawerLayout != null && isDrawerOpen()) {
- showGlobalContextActionBar();
- }
- super.onCreateOptionsMenu(menu, inflater);
- }
-
- @Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
@@ -446,33 +420,6 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
preferences.unregisterOnSharedPreferenceChangeListener(this);
}
- /**
- * Per the navigation drawer design guidelines, updates the action bar to show the global app
- * 'context', rather than just what's in the current screen.
- */
- private void showGlobalContextActionBar() {
- ActionBar actionBar = getActionBar();
- actionBar.setDisplayShowTitleEnabled(true);
- actionBar.setTitle(R.string.app_name);
- Activity activity = getActivity();
- if (activity == null) {
- return;
- }
- @ColorRes int titleColor = ((MainActivity) activity).getActionBarTitleColor();
- ViewHelper.setActionBarTextColor(actionBar, titleColor);
- }
-
- private ActionBar getActionBar() {
- return ((AppCompatActivity) getActivity()).getSupportActionBar();
- }
-
- private void hideActionBarSubTitle() {
- ActionBar actionBar = getActionBar();
- if (actionBar != null) {
- actionBar.setSubtitle(null);
- }
- }
-
public void refresh() {
Provider currentProvider = ProviderObservable.getInstance().getCurrentProvider();
account.setText(currentProvider.getName());
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java
index f7d20aa9..d5bbd2c5 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/SettingsFragment.java
@@ -24,7 +24,7 @@ import static se.leap.bitmaskclient.base.utils.PreferenceHelper.setUseObfuscatio
import static se.leap.bitmaskclient.base.utils.PreferenceHelper.useBridges;
import static se.leap.bitmaskclient.base.utils.PreferenceHelper.useObfuscationPinning;
import static se.leap.bitmaskclient.base.utils.PreferenceHelper.useSnowflake;
-import static se.leap.bitmaskclient.base.utils.ViewHelper.setActionBarTitle;
+import static se.leap.bitmaskclient.base.utils.ViewHelper.setActionBarSubtitle;
import android.app.AlertDialog;
import android.content.Context;
@@ -90,7 +90,7 @@ public class SettingsFragment extends Fragment implements SharedPreferences.OnSh
initGatewayPinningEntry(view);
initExperimentalTransportsEntry(view);
initObfuscationPinningEntry(view);
- setActionBarTitle(this, advanced_settings);
+ setActionBarSubtitle(this, advanced_settings);
return view;
}
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 bbd77c36..8f4d7862 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
@@ -1,26 +1,39 @@
package se.leap.bitmaskclient.base.utils;
+import android.app.Activity;
import android.app.Notification;
import android.content.Context;
import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Build;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
+import android.util.Log;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
import androidx.annotation.ColorRes;
import androidx.annotation.DimenRes;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
+import se.leap.bitmaskclient.R;
+import se.leap.bitmaskclient.base.views.ActionBarTitle;
+
/**
* Created by cyberta on 29.06.18.
*/
public class ViewHelper {
+ private static final String TAG = ViewHelper.class.getSimpleName();
+
public static int convertDimensionToPx(Context context, @DimenRes int dimension) {
return context.getResources().getDimensionPixelSize(dimension);
}
@@ -30,16 +43,81 @@ public class ViewHelper {
* @param fragment
* @param stringId
*/
+ public static void setActionBarSubtitle(Fragment fragment, @StringRes int stringId) {
+ AppCompatActivity appCompatActivity = (AppCompatActivity) fragment.getActivity();
+ if (appCompatActivity != null) {
+ ActionBar actionBar = appCompatActivity.getSupportActionBar();
+ if (actionBar != null) {
+ View customView = actionBar.getCustomView();
+ if (customView instanceof ActionBarTitle) {
+ ActionBarTitle actionBarTitle = (ActionBarTitle) customView;
+ actionBarTitle.setSubtitle(stringId);
+ actionBarTitle.showSubtitle(true);
+ }
+ }
+ }
+ }
+
+ /**
+ * Sets the subtitle of an activities action bar. The activity needs to be an AppCompatActivity.
+ * @param fragment
+ * @param stringId
+ */
public static void setActionBarTitle(Fragment fragment, @StringRes int stringId) {
AppCompatActivity appCompatActivity = (AppCompatActivity) fragment.getActivity();
if (appCompatActivity != null) {
ActionBar actionBar = appCompatActivity.getSupportActionBar();
if (actionBar != null) {
- actionBar.setSubtitle(stringId);
+ View customView = actionBar.getCustomView();
+ if (customView instanceof ActionBarTitle) {
+ ActionBarTitle actionBarTitle = (ActionBarTitle) customView;
+ actionBarTitle.setTitle(stringId);
+ actionBarTitle.showSubtitle(false);
+ } else {
+ Log.e(TAG, "ActionBar has no custom action title!");
+ }
}
}
}
+
+ public static void setDefaultActivityBarColor(Activity activity) {
+ 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) {
+ if (!(activity instanceof AppCompatActivity)) {
+ return;
+ }
+
+ ActionBar bar = ((AppCompatActivity) activity).getSupportActionBar();
+ if (bar == null) {
+ return;
+ }
+ int color = ContextCompat.getColor(activity, secondaryColor);
+ bar.setBackgroundDrawable(new ColorDrawable(color));
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ 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 actionBarTextColor;
+ if (textColor == 0) {
+ actionBarTextColor = isBrightColor(color) ? R.color.actionbar_connectivity_state_text_color_dark : R.color.actionbar_connectivity_state_text_color_light;
+ } else {
+ actionBarTextColor = textColor;
+ }
+
+ View customView = bar.getCustomView();
+ if (customView instanceof ActionBarTitle) {
+ ActionBarTitle actionBarTitle = (ActionBarTitle) customView;
+ actionBarTitle.setTitleTextColor(ContextCompat.getColor(bar.getThemedContext(), actionBarTextColor));
+ }
+ }
+
+
public static boolean isBrightColor(int color) {
if (android.R.color.transparent == color)
return true;
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/views/ActionBarTitle.java b/app/src/main/java/se/leap/bitmaskclient/base/views/ActionBarTitle.java
new file mode 100644
index 00000000..a151305e
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/base/views/ActionBarTitle.java
@@ -0,0 +1,96 @@
+package se.leap.bitmaskclient.base.views;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.widget.RelativeLayout;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.appcompat.widget.AppCompatTextView;
+import androidx.appcompat.widget.LinearLayoutCompat;
+
+import se.leap.bitmaskclient.databinding.VActionbarTitleBinding;
+
+public class ActionBarTitle extends LinearLayoutCompat {
+ private AppCompatTextView actionBarTitle;
+ private AppCompatTextView actionBarSubtitle;
+ private LinearLayoutCompat container;
+
+ public ActionBarTitle(@NonNull Context context) {
+ super(context);
+ initLayout(context);
+ }
+
+ public ActionBarTitle(@NonNull Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ initLayout(context);
+ }
+
+ public ActionBarTitle(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ initLayout(context);
+ }
+
+ public void initLayout(Context context) {
+ VActionbarTitleBinding binding = VActionbarTitleBinding.inflate(LayoutInflater.from(context), this, true);
+ actionBarTitle = binding.actionBarTitle;
+ actionBarSubtitle = binding.actionBarSubtitle;
+ container = binding.actionBarTitleContainer;
+ }
+
+ public void setTitle(CharSequence text) {
+ actionBarTitle.setText(text);
+ }
+
+ public void setTitleCaps(boolean caps) {
+ actionBarTitle.setAllCaps(caps);
+ }
+
+ public void setSubtitle(CharSequence text) {
+ actionBarSubtitle.setText(text);
+ }
+
+ public void setTitle(@StringRes int resId) {
+ actionBarTitle.setText(resId);
+ }
+
+ public void setSubtitle(@StringRes int resId) {
+ actionBarSubtitle.setText(resId);
+ }
+
+ public void setTitleTextColor(@ColorInt int color) {
+ actionBarTitle.setTextColor(color);
+ }
+
+ public void setSubtitleTextColor(@ColorInt int color) {
+ actionBarSubtitle.setTextColor(color);
+ }
+
+ public void showSubtitle(boolean show) {
+ actionBarSubtitle.setVisibility(show ? VISIBLE : GONE);
+ }
+
+ public void setCentered(boolean centered) {
+ LayoutParams titleLayoutParams = (LayoutParams) actionBarTitle.getLayoutParams();
+ LayoutParams subtitleLayoutParams = (LayoutParams) actionBarSubtitle.getLayoutParams();
+ LayoutParams containerLayoutParams = (LayoutParams) container.getLayoutParams();
+ if (centered) {
+ titleLayoutParams.gravity = Gravity.CENTER;
+ subtitleLayoutParams.gravity = Gravity.CENTER;
+ containerLayoutParams.gravity = Gravity.CENTER;
+ } else {
+ titleLayoutParams.gravity = Gravity.NO_GRAVITY;
+ subtitleLayoutParams.gravity = Gravity.NO_GRAVITY;
+ containerLayoutParams.gravity = Gravity.NO_GRAVITY;
+ }
+ actionBarTitle.setLayoutParams(titleLayoutParams);
+ actionBarSubtitle.setLayoutParams(subtitleLayoutParams);
+ container.setLayoutParams(containerLayoutParams);
+
+
+ }
+}
diff --git a/app/src/main/res/layout/a_main.xml b/app/src/main/res/layout/a_main.xml
index 92e0a3c0..927217f4 100644
--- a/app/src/main/res/layout/a_main.xml
+++ b/app/src/main/res/layout/a_main.xml
@@ -22,8 +22,6 @@
android:minHeight="?attr/actionBarSize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- app:titleTextColor="@color/colorActionBarTitleFont"
- app:subtitleTextColor="@color/colorActionBarSubtitleFont"
android:background="?attr/colorPrimary">
</androidx.appcompat.widget.Toolbar>
diff --git a/app/src/main/res/layout/v_actionbar_title.xml b/app/src/main/res/layout/v_actionbar_title.xml
new file mode 100644
index 00000000..1985ef21
--- /dev/null
+++ b/app/src/main/res/layout/v_actionbar_title.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/action_bar_title_container"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <androidx.appcompat.widget.AppCompatTextView
+ android:id="@+id/action_bar_title"
+ android:layout_width="wrap_content"
+ tools:text="Bitmask"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:maxLines="1"
+ android:textStyle="normal"
+ android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"
+ />
+
+ <androidx.appcompat.widget.AppCompatTextView
+ android:id="@+id/action_bar_subtitle"
+ android:layout_width="wrap_content"
+ tools:text="Advanced Settings"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:maxLines="1"
+ android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle"
+ android:textColor="@color/colorActionBarSubtitleFont"
+ />
+
+</androidx.appcompat.widget.LinearLayoutCompat>