summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbel AMBANUMBEN <aanorbel@gmail.com>2024-10-11 21:54:31 +0100
committerNorbel AMBANUMBEN <aanorbel@gmail.com>2024-10-11 21:54:31 +0100
commit2d785c98c0af74a3e26ecb4bad2451012299dc4b (patch)
tree8a0342dda176d82fe0f0cd4b1717924fdf5fdada
parent55219121b127a000b2d410a841b6441a25adb1f3 (diff)
feat(invite-code): register scheme for `obfsvpnintro`
-rw-r--r--app/src/main/AndroidManifest.xml15
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java4
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/providersetup/activities/SetupActivity.java55
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java12
4 files changed, 84 insertions, 2 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index cc876ecc..08433778 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -39,6 +39,21 @@
android:screenOrientation="portrait"
android:exported="false" />
+ <activity-alias
+ android:exported="true"
+ android:name=".InviteCodeActivity"
+ android:targetActivity=".providersetup.activities.SetupActivity">
+
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+
+ <data android:scheme="obfsvpnintro" />
+ </intent-filter>
+ </activity-alias>
+
<service
android:name="de.blinkt.openvpn.core.OpenVPNService"
android:exported="false"
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java b/app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java
index bf1e6b94..487134d4 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/models/Provider.java
@@ -751,6 +751,10 @@ public final class Provider implements Parcelable {
return introducer != null;
}
+ public Introducer getIntroducer() {
+ return introducer;
+ }
+
/**
* resets everything except the main url, the providerIp and the geoip
* service url (currently preseeded)
diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/activities/SetupActivity.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/activities/SetupActivity.java
index 9284edc9..75d2f29e 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/activities/SetupActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/activities/SetupActivity.java
@@ -8,7 +8,7 @@ import static se.leap.bitmaskclient.base.utils.BuildConfigHelper.isDefaultBitmas
import static se.leap.bitmaskclient.base.utils.PreferenceHelper.deleteProviderDetailsFromPreferences;
import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory.CIRCUMVENTION_SETUP_FRAGMENT;
import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory.CONFIGURE_PROVIDER_FRAGMENT;
-import static se.leap.bitmaskclient.providersetup.fragments.viewmodel.ProviderSelectionViewModel.INVITE_CODE_PROVIDER;
+import static se.leap.bitmaskclient.providersetup.fragments.SetupFragmentFactory.PROVIDER_SELECTION_FRAGMENT;
import static se.leap.bitmaskclient.tor.TorStatusObservable.TorStatus.OFF;
import android.Manifest;
@@ -33,7 +33,9 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import org.json.JSONException;
@@ -41,10 +43,12 @@ import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashSet;
+import java.util.Objects;
import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.base.FragmentManagerEnhanced;
+import se.leap.bitmaskclient.base.models.Introducer;
import se.leap.bitmaskclient.base.models.Provider;
import se.leap.bitmaskclient.base.models.ProviderObservable;
import se.leap.bitmaskclient.base.utils.ViewHelper;
@@ -53,6 +57,7 @@ import se.leap.bitmaskclient.databinding.ActivitySetupBinding;
import se.leap.bitmaskclient.providersetup.ProviderSetupFailedDialog;
import se.leap.bitmaskclient.providersetup.ProviderSetupObservable;
import se.leap.bitmaskclient.providersetup.SetupViewPagerAdapter;
+import se.leap.bitmaskclient.providersetup.fragments.ProviderSelectionFragment;
import se.leap.bitmaskclient.tor.TorServiceCommand;
import se.leap.bitmaskclient.tor.TorStatusObservable;
@@ -167,6 +172,54 @@ public class SetupActivity extends AppCompatActivity implements SetupActivityCal
}
}
binding.viewPager.setCurrentItem(currentPosition, false);
+ if (getIntent() != null) {
+ manageIntent(getIntent());
+ }
+ }
+
+ /**
+ * Manages the incoming intent and processes the provider selection if the intent action is ACTION_VIEW
+ * and the data scheme is "obfsvpnintro". This method create an introducer from the URI data and sets the
+ * current provider to the introducer.
+ * <p>
+ * If the current fragment is a ProviderSelectionFragment, it will notify the fragment that the provider
+ * selection has changed.
+ * </p>
+ *
+ *
+ * @param intent The incoming intent to be managed.
+ * @see #onProviderSelected(Provider)
+ * @see ProviderSelectionFragment#providerSelectionChanged()
+ */
+ private void manageIntent(Intent intent) {
+ if (Intent.ACTION_VIEW.equals(intent.getAction()) && intent.getData() != null) {
+ String scheme = intent.getData().getScheme();
+
+ if (Objects.equals(scheme, "obfsvpnintro")) {
+ try {
+ onProviderSelected(new Provider(Introducer.fromUrl(intent.getData().toString())));
+ binding.viewPager.setCurrentItem(adapter.getFragmentPostion(PROVIDER_SELECTION_FRAGMENT));
+ binding.viewPager.post(() -> {
+ /**
+ * @see FragmentStateAdapter#saveState()
+ */
+ String fragmentTag = "f" + binding.viewPager.getCurrentItem();
+ Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
+ if (fragment instanceof ProviderSelectionFragment){
+ ((ProviderSelectionFragment) fragment).providerSelectionChanged();
+ }
+ });
+ } catch (Exception e) {
+ Log.d("invite", e.getMessage());
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ manageIntent(intent);
}
@Override
diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java
index 24da4691..e5c19e28 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/fragments/ProviderSelectionFragment.java
@@ -155,7 +155,17 @@ public class ProviderSelectionFragment extends BaseSetupFragment implements Canc
binding.getRoot().smoothScrollTo(binding.editCustomProvider.getLeft(), binding.getRoot().getBottom());
}
});
- binding.providerRadioGroup.check(viewModel.getSelected());
+ providerSelectionChanged();
+ }
+
+ public void providerSelectionChanged(){
+ Provider provider = setupActivityCallback.getSelectedProvider();
+ if (provider != null && provider.hasIntroducer()) {
+ binding.providerRadioGroup.check(INVITE_CODE_PROVIDER);
+ binding.editCustomProvider.setText(provider.getIntroducer().toUrl());
+ } else {
+ binding.providerRadioGroup.check(viewModel.getSelected());
+ }
}
private void providerSelected(String string, int checkedId) {