kopia lustrzana https://github.com/ryukoposting/Signal-Android
84 wiersze
2.7 KiB
Java
84 wiersze
2.7 KiB
Java
package org.thoughtcrime.securesms.registration.fragments;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.os.Bundle;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.webkit.WebView;
|
|
import android.webkit.WebViewClient;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.lifecycle.ViewModelProvider;
|
|
import androidx.navigation.fragment.NavHostFragment;
|
|
|
|
import org.thoughtcrime.securesms.BuildConfig;
|
|
import org.thoughtcrime.securesms.LoggingFragment;
|
|
import org.thoughtcrime.securesms.R;
|
|
import org.thoughtcrime.securesms.registration.viewmodel.BaseRegistrationViewModel;
|
|
import org.thoughtcrime.securesms.registration.viewmodel.RegistrationViewModel;
|
|
|
|
import java.io.Serializable;
|
|
|
|
/**
|
|
* Fragment that displays a Captcha in a WebView.
|
|
*/
|
|
public final class CaptchaFragment extends LoggingFragment {
|
|
|
|
public static final String EXTRA_VIEW_MODEL_PROVIDER = "view_model_provider";
|
|
|
|
private BaseRegistrationViewModel viewModel;
|
|
|
|
@Override
|
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
return inflater.inflate(R.layout.fragment_registration_captcha, container, false);
|
|
}
|
|
|
|
@Override
|
|
@SuppressLint("SetJavaScriptEnabled")
|
|
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
|
super.onViewCreated(view, savedInstanceState);
|
|
|
|
WebView webView = view.findViewById(R.id.registration_captcha_web_view);
|
|
|
|
webView.getSettings().setJavaScriptEnabled(true);
|
|
webView.clearCache(true);
|
|
|
|
webView.setWebViewClient(new WebViewClient() {
|
|
@Override
|
|
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
|
if (url != null && url.startsWith(RegistrationConstants.SIGNAL_CAPTCHA_SCHEME)) {
|
|
handleToken(url.substring(RegistrationConstants.SIGNAL_CAPTCHA_SCHEME.length()));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
|
|
webView.loadUrl(BuildConfig.SIGNAL_CAPTCHA_URL);
|
|
|
|
CaptchaViewModelProvider provider = null;
|
|
if (getArguments() != null) {
|
|
provider = (CaptchaViewModelProvider) requireArguments().getSerializable(EXTRA_VIEW_MODEL_PROVIDER);
|
|
}
|
|
|
|
if (provider == null) {
|
|
viewModel = new ViewModelProvider(
|
|
requireActivity()).get(RegistrationViewModel.class);
|
|
} else {
|
|
viewModel = provider.get(this);
|
|
}
|
|
}
|
|
|
|
private void handleToken(@NonNull String token) {
|
|
viewModel.setCaptchaResponse(token);
|
|
|
|
NavHostFragment.findNavController(this).navigateUp();
|
|
}
|
|
|
|
public interface CaptchaViewModelProvider extends Serializable {
|
|
@NonNull BaseRegistrationViewModel get(@NonNull CaptchaFragment fragment);
|
|
}
|
|
}
|