diff options
author | Norbel AMBANUMBEN <aanorbel@gmail.com> | 2024-10-11 21:54:31 +0100 |
---|---|---|
committer | Norbel AMBANUMBEN <aanorbel@gmail.com> | 2024-10-11 21:54:31 +0100 |
commit | 2d785c98c0af74a3e26ecb4bad2451012299dc4b (patch) | |
tree | 8a0342dda176d82fe0f0cd4b1717924fdf5fdada | |
parent | 55219121b127a000b2d410a841b6441a25adb1f3 (diff) |
feat(invite-code): register scheme for `obfsvpnintro`
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) { |