From 61cb85d85223c1e8010ab69a92496dddb7453297 Mon Sep 17 00:00:00 2001 From: Norbel Ambanumben Date: Tue, 4 Feb 2025 17:45:31 +0000 Subject: Resolve "new permissions screen implementation" --- .../providersetup/SetupViewPagerAdapter.java | 9 ++- .../fragments/NotificationSetupFragment.java | 35 ----------- .../fragments/PermissionExplanationFragment.java | 72 ++++++++++++++++++++++ .../fragments/SetupFragmentFactory.java | 20 +++--- .../fragments/VpnPermissionSetupFragment.java | 36 ----------- app/src/main/res/layout/f_notification_setup.xml | 34 ---------- .../main/res/layout/f_permission_explanation.xml | 54 ++++++++++++++++ app/src/main/res/layout/f_vpn_permission_setup.xml | 34 ---------- app/src/main/res/values/strings.xml | 9 ++- 9 files changed, 146 insertions(+), 157 deletions(-) delete mode 100644 app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/NotificationSetupFragment.java create mode 100644 app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/PermissionExplanationFragment.java delete mode 100644 app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/VpnPermissionSetupFragment.java delete mode 100644 app/src/main/res/layout/f_notification_setup.xml create mode 100644 app/src/main/res/layout/f_permission_explanation.xml delete mode 100644 app/src/main/res/layout/f_vpn_permission_setup.xml (limited to 'app/src') diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/SetupViewPagerAdapter.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/SetupViewPagerAdapter.java index 4f7f2957..24b4179f 100644 --- a/app/src/main/java/se/leap/bitmaskclient/providersetup/SetupViewPagerAdapter.java +++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/SetupViewPagerAdapter.java @@ -7,7 +7,6 @@ import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory.NOTIFICATION_PERMISSON_FRAGMENT; import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory.PROVIDER_SELECTION_FRAGMENT; import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory.SUCCESS_FRAGMENT; -import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory.VPN_PERMISSON_EDUCATIONAL_FRAGMENT; import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory.VPN_PERMISSON_FRAGMENT; import android.content.Intent; @@ -39,20 +38,20 @@ public class SetupViewPagerAdapter extends FragmentStateAdapter { } fragments.add(CIRCUMVENTION_SETUP_FRAGMENT); } - + if (showNotificationPermission || vpnPermissionRequest != null) { + fragments.add(NOTIFICATION_PERMISSON_EDUCATIONAL_FRAGMENT); + } if (vpnPermissionRequest != null) { - fragments.add(VPN_PERMISSON_EDUCATIONAL_FRAGMENT); fragments.add(VPN_PERMISSON_FRAGMENT); } if (showNotificationPermission) { - fragments.add(NOTIFICATION_PERMISSON_EDUCATIONAL_FRAGMENT); fragments.add(NOTIFICATION_PERMISSON_FRAGMENT); } if (providerSetup) { fragments.add(CONFIGURE_PROVIDER_FRAGMENT); } fragments.add(SUCCESS_FRAGMENT); - setupFragmentFactory = new SetupFragmentFactory(fragments, vpnPermissionRequest); + setupFragmentFactory = new SetupFragmentFactory(fragments, vpnPermissionRequest, showNotificationPermission); } @NonNull diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/NotificationSetupFragment.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/NotificationSetupFragment.java deleted file mode 100644 index a9589336..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/NotificationSetupFragment.java +++ /dev/null @@ -1,35 +0,0 @@ -package se.leap.bitmaskclient.providersetup.fragments; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import se.leap.bitmaskclient.databinding.FNotificationSetupBinding; - -public class NotificationSetupFragment extends BaseSetupFragment { - - public static NotificationSetupFragment newInstance(int position) { - NotificationSetupFragment fragment = new NotificationSetupFragment(); - fragment.setArguments(initBundle(position)); - return fragment; - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - FNotificationSetupBinding binding = FNotificationSetupBinding.inflate(inflater, container, false); - return binding.getRoot(); - } - - @Override - public void onFragmentSelected() { - super.onFragmentSelected(); - setupActivityCallback.setNavigationButtonHidden(false); - setupActivityCallback.setCancelButtonHidden(true); - } - -} \ No newline at end of file diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/PermissionExplanationFragment.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/PermissionExplanationFragment.java new file mode 100644 index 00000000..4ac69ee8 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/PermissionExplanationFragment.java @@ -0,0 +1,72 @@ +package se.leap.bitmaskclient.providersetup.fragments; + +import static android.view.View.GONE; +import static android.view.View.VISIBLE; +import static se.leap.bitmaskclient.base.utils.BuildConfigHelper.isDefaultBitmask; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import se.leap.bitmaskclient.R; +import se.leap.bitmaskclient.databinding.FPermissionExplanationBinding; + + +public class PermissionExplanationFragment extends BaseSetupFragment { + + private static String EXTRA_SHOW_NOTIFICATION_PERMISSION = "EXTRA_SHOW_NOTIFICATION_PERMISSION"; + private static String EXTRA_SHOW_VPN_PERMISSION = "EXTRA_SHOW_VPN_PERMISSION"; + FPermissionExplanationBinding binding; + public static PermissionExplanationFragment newInstance(int position, boolean showNotificationPermission, boolean showVpnPermission) { + PermissionExplanationFragment fragment = new PermissionExplanationFragment(); + Bundle bundle = initBundle(position); + bundle.putBoolean(EXTRA_SHOW_NOTIFICATION_PERMISSION, showNotificationPermission); + bundle.putBoolean(EXTRA_SHOW_VPN_PERMISSION, showVpnPermission); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = FPermissionExplanationBinding.inflate(inflater, container, false); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (getArguments() != null) { + boolean showNotificationPermission = getArguments().getBoolean(EXTRA_SHOW_NOTIFICATION_PERMISSION); + boolean showVpnPermission = getArguments().getBoolean(EXTRA_SHOW_VPN_PERMISSION); + if (showVpnPermission && showNotificationPermission) { + binding.tvTitle.setText(R.string.title_upcoming_request); + binding.titleUpcomingRequestSummary.setVisibility(VISIBLE); + } else if (showVpnPermission) { + binding.tvTitle.setText(R.string.title_upcoming_connection_request); + binding.titleUpcomingRequestSummary.setVisibility(GONE); + } else if (showNotificationPermission) { + binding.tvTitle.setText(R.string.title_upcoming_notifications_request); + binding.titleUpcomingRequestSummary.setVisibility(GONE); + } + + binding.titleUpcomingNotificationRequestSummary.setVisibility(showNotificationPermission ? VISIBLE: GONE); + binding.titleUpcomingConnectionRequestSummary.setText(isDefaultBitmask() ? + getString(R.string.title_upcoming_connection_request_summary) : + getString(R.string.title_upcoming_connection_request_summary_custom, getString(R.string.app_name))); + binding.titleUpcomingConnectionRequestSummary.setVisibility(showVpnPermission ? VISIBLE : GONE); + } + } + + @Override + public void onFragmentSelected() { + super.onFragmentSelected(); + setupActivityCallback.setNavigationButtonHidden(false); + setupActivityCallback.setCancelButtonHidden(true); + } + +} \ No newline at end of file diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/SetupFragmentFactory.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/SetupFragmentFactory.java index 5cf15e7c..13d1e5ff 100644 --- a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/SetupFragmentFactory.java +++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/SetupFragmentFactory.java @@ -11,21 +11,23 @@ import java.util.ArrayList; public class SetupFragmentFactory { public static final int PROVIDER_SELECTION_FRAGMENT = 0; public static final int CIRCUMVENTION_SETUP_FRAGMENT = 1; - public static final int VPN_PERMISSON_EDUCATIONAL_FRAGMENT = 2; - public static final int VPN_PERMISSON_FRAGMENT = 3; - public static final int NOTIFICATION_PERMISSON_EDUCATIONAL_FRAGMENT = 4; - public static final int NOTIFICATION_PERMISSON_FRAGMENT = 5; - public static final int CONFIGURE_PROVIDER_FRAGMENT = 6; + public static final int VPN_PERMISSON_FRAGMENT = 2; + public static final int NOTIFICATION_PERMISSON_EDUCATIONAL_FRAGMENT = 3; + public static final int NOTIFICATION_PERMISSON_FRAGMENT = 4; + public static final int CONFIGURE_PROVIDER_FRAGMENT = 5; - public static final int SUCCESS_FRAGMENT = 7; + public static final int SUCCESS_FRAGMENT = 6; private final Intent vpnPermissionRequest; private final ArrayList fragmentTypes; - public SetupFragmentFactory(@NonNull ArrayList fragmentTypes, Intent vpnPermissionRequest) { + private final boolean showNotificationPermission; + + public SetupFragmentFactory(@NonNull ArrayList fragmentTypes, Intent vpnPermissionRequest, boolean showNotificationPermission) { this.fragmentTypes = fragmentTypes; this.vpnPermissionRequest = vpnPermissionRequest; + this.showNotificationPermission = showNotificationPermission; } public Fragment createFragment(int position) { @@ -41,11 +43,9 @@ public class SetupFragmentFactory { case CONFIGURE_PROVIDER_FRAGMENT: return ConfigureProviderFragment.newInstance(position); case NOTIFICATION_PERMISSON_EDUCATIONAL_FRAGMENT: - return NotificationSetupFragment.newInstance(position); + return PermissionExplanationFragment.newInstance(position, showNotificationPermission, vpnPermissionRequest!=null); case NOTIFICATION_PERMISSON_FRAGMENT: return EmptyPermissionSetupFragment.newInstance(position, Manifest.permission.POST_NOTIFICATIONS); - case VPN_PERMISSON_EDUCATIONAL_FRAGMENT: - return VpnPermissionSetupFragment.newInstance(position); case VPN_PERMISSON_FRAGMENT: return EmptyPermissionSetupFragment.newInstance(position, vpnPermissionRequest); case SUCCESS_FRAGMENT: diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/VpnPermissionSetupFragment.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/VpnPermissionSetupFragment.java deleted file mode 100644 index 188ba9ac..00000000 --- a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/VpnPermissionSetupFragment.java +++ /dev/null @@ -1,36 +0,0 @@ -package se.leap.bitmaskclient.providersetup.fragments; - -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import se.leap.bitmaskclient.databinding.FVpnPermissionSetupBinding; - -public class VpnPermissionSetupFragment extends BaseSetupFragment { - - public static VpnPermissionSetupFragment newInstance(int position) { - VpnPermissionSetupFragment fragment = new VpnPermissionSetupFragment(); - fragment.setArguments(initBundle(position)); - return fragment; - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - FVpnPermissionSetupBinding binding = FVpnPermissionSetupBinding.inflate(inflater, container, false); - return binding.getRoot(); - } - - @Override - public void onFragmentSelected() { - super.onFragmentSelected(); - setupActivityCallback.setNavigationButtonHidden(false); - setupActivityCallback.setCancelButtonHidden(true); - } - -} \ No newline at end of file diff --git a/app/src/main/res/layout/f_notification_setup.xml b/app/src/main/res/layout/f_notification_setup.xml deleted file mode 100644 index d9c7d1a3..00000000 --- a/app/src/main/res/layout/f_notification_setup.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/f_permission_explanation.xml b/app/src/main/res/layout/f_permission_explanation.xml new file mode 100644 index 00000000..447f12de --- /dev/null +++ b/app/src/main/res/layout/f_permission_explanation.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/f_vpn_permission_setup.xml b/app/src/main/res/layout/f_vpn_permission_setup.xml deleted file mode 100644 index 99dd531b..00000000 --- a/app/src/main/res/layout/f_vpn_permission_setup.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - \ 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 6351ade7..41904f13 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -211,7 +211,7 @@ When using a VPN you are transferring your trust from your Internet Service Provider to your VPN provider. Bitmask only connects to providers with a clear history of privacy protection and advocacy. Riseup provides online communication tools for people and groups working on liberatory social change. We are a project to create democratic alternatives and practice self-determination by controlling our own secure means of communications. Next - Bitmask connects to trusted providers that are not publicly listed. Enter your provider’s url below. + Bitmask allows you to connect to providers that are not publicly listed. Make sure you know and trust the provider you are adding. Enter the provider’s URL here. Bitmask allows you to connect to providers using a private Invite Code. Enter your trusted Invite Code here. @@ -235,9 +235,12 @@ Snowflake proxy rendezvous successful Sending data via Snowflake Upcoming Connection Request - In the next panel Android will remind you that it’s essential to trust your VPN provider. Bitmask only partners with providers that adhere to strict privacy best practices for VPNs and have a verifiable history of protecting user’s data and identities. + Upcoming requests + In the next panels Android will ask for your permission in form of a Connection Request and Notification Request. + Accepting the Connection Request is essential to use the core functionality of %s. + For the Connection Request it’s important to know that Bitmask only partners with trusted partner providers that adhere to best practices for VPNs and have a verifiable history of protecting user’s data and identities. However, if you are manually connecting to a non-public provider, make sure you trust them. + Accepting the Notification Request allows the app to run in the background and enables you to see your data usage from within Android’s notification center. Upcoming Notifications Request - In the next panel Android will ask if you want to allow notifications. This will ensure a stable background connection and enable you to see your data usage from within Android’s notification center. You\'re all set! Click the button below to connect Permission request rejected. -- cgit v1.2.3