Skip to content

Commit

Permalink
feat: allow initialize SDK with Activity for hideDialog(true)
Browse files Browse the repository at this point in the history
  • Loading branch information
CAMOBAP committed Mar 2, 2024
1 parent 210f157 commit fdc7f95
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.hcaptcha.sdk;

import androidx.fragment.app.FragmentActivity;
import android.app.Activity;

public class TestHCaptchaVerifier implements IHCaptchaVerifier {

@Override
public void startVerification(FragmentActivity activity) {
public void startVerification(Activity activity) {
// no implementation need for performance measurement
}

Expand Down
18 changes: 11 additions & 7 deletions sdk/src/main/java/com/hcaptcha/sdk/HCaptcha.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hcaptcha.sdk;

import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
Expand All @@ -14,7 +15,7 @@ public final class HCaptcha extends Task<HCaptchaTokenResponse> implements IHCap
public static final String META_SITE_KEY = "com.hcaptcha.sdk.site-key";

@NonNull
private final FragmentActivity activity;
private final Activity activity;

@Nullable
private IHCaptchaVerifier captchaVerifier;
Expand All @@ -25,22 +26,23 @@ public final class HCaptcha extends Task<HCaptchaTokenResponse> implements IHCap
@NonNull
private final HCaptchaInternalConfig internalConfig;

private HCaptcha(@NonNull final FragmentActivity activity, @NonNull final HCaptchaInternalConfig internalConfig) {
private HCaptcha(@NonNull final Activity activity, @NonNull final HCaptchaInternalConfig internalConfig) {
this.activity = activity;
this.internalConfig = internalConfig;
}

/**
* Constructs a new client which allows to display a challenge dialog
*
* @param activity The current activity
* @param activity FragmentActivity instance for a visual challenge verification,
* or any Activity in case of passive siteKey
* @return new {@link HCaptcha} object
*/
public static HCaptcha getClient(@NonNull final FragmentActivity activity) {
public static HCaptcha getClient(@NonNull final Activity activity) {
return new HCaptcha(activity, HCaptchaInternalConfig.builder().build());
}

static HCaptcha getClient(@NonNull final FragmentActivity activity,
static HCaptcha getClient(@NonNull final Activity activity,
@NonNull HCaptchaInternalConfig internalConfig) {
return new HCaptcha(activity, internalConfig);
}
Expand Down Expand Up @@ -100,9 +102,11 @@ void onFailure(final HCaptchaException exception) {
.loading(false)
.build();
captchaVerifier = new HCaptchaHeadlessWebView(activity, this.config, internalConfig, listener);
} else {
} else if (this.activity instanceof FragmentActivity) {
captchaVerifier = HCaptchaDialogFragment.newInstance(inputConfig, internalConfig, listener);
this.config = inputConfig;
} else {
listener.onFailure(new HCaptchaException(HCaptchaError.BAD_ACTIVITY_ERROR));
}
} catch (AndroidRuntimeException e) {
listener.onFailure(new HCaptchaException(HCaptchaError.ERROR));
Expand Down Expand Up @@ -154,7 +158,7 @@ private HCaptcha startVerification() {
HCaptchaLog.d("HCaptcha.startVerification");
handler.removeCallbacksAndMessages(null);
if (captchaVerifier == null) {
setException(new HCaptchaException(HCaptchaError.ERROR));
setExceptionIfMissing(new HCaptchaException(HCaptchaError.ERROR));
} else {
captchaVerifier.startVerification(activity);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,8 @@ public void onSuccess(final String token) {
}

@Override
public void startVerification(@NonNull FragmentActivity fragmentActivity) {
final FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager();
public void startVerification(@NonNull Activity fragmentActivity) {
final FragmentManager fragmentManager = ((FragmentActivity) fragmentActivity).getSupportFragmentManager();
final Fragment oldFragment = fragmentManager.findFragmentByTag(HCaptchaDialogFragment.TAG);
if (oldFragment != null && oldFragment.isAdded()) {
HCaptchaLog.w("DialogFragment was already added.");
Expand Down
5 changes: 5 additions & 0 deletions sdk/src/main/java/com/hcaptcha/sdk/HCaptchaError.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ public enum HCaptchaError implements Serializable {
*/
INSECURE_HTTP_REQUEST_ERROR(33, "Insecure resource requested"),

/**
*
*/
BAD_ACTIVITY_ERROR(34, "Visual Challenge verification require FragmentActivity"),

/**
* Generic error for unknown situations - should never happen.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.hcaptcha.sdk;

import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import androidx.fragment.app.FragmentActivity;

import lombok.Getter;
import lombok.NonNull;
Expand All @@ -25,7 +25,7 @@ final class HCaptchaHeadlessWebView implements IHCaptchaVerifier {
private boolean shouldExecuteOnLoad;
private boolean shouldResetOnLoad;

HCaptchaHeadlessWebView(@NonNull final FragmentActivity activity,
HCaptchaHeadlessWebView(@NonNull final Activity activity,
@NonNull final HCaptchaConfig config,
@NonNull final HCaptchaInternalConfig internalConfig,
@NonNull final HCaptchaStateListener listener) {
Expand All @@ -44,7 +44,7 @@ final class HCaptchaHeadlessWebView implements IHCaptchaVerifier {
}

@Override
public void startVerification(@NonNull FragmentActivity activity) {
public void startVerification(@NonNull Activity activity) {
if (webViewLoaded) {
// Safe to execute
webViewHelper.resetAndExecute();
Expand Down
4 changes: 2 additions & 2 deletions sdk/src/main/java/com/hcaptcha/sdk/IHCaptchaVerifier.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.hcaptcha.sdk;

import androidx.fragment.app.FragmentActivity;
import android.app.Activity;

import com.hcaptcha.sdk.tasks.OnFailureListener;
import com.hcaptcha.sdk.tasks.OnLoadedListener;
Expand All @@ -17,7 +17,7 @@ interface IHCaptchaVerifier extends
/**
* Starts the human verification process.
*/
void startVerification(@NonNull FragmentActivity activity);
void startVerification(@NonNull Activity activity);

/**
* Force stop verification and release resources.
Expand Down
9 changes: 9 additions & 0 deletions sdk/src/main/java/com/hcaptcha/sdk/tasks/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,15 @@ protected void setException(@NonNull HCaptchaException exception) {
tryCb();
}

protected void setExceptionIfMissing(@NonNull HCaptchaException exception) {
if (this.hCaptchaException == null) {
this.hCaptchaException = exception;
}
this.successful = false;
this.complete = true;
tryCb();
}

/**
* Internal callback which called once 'open-callback' fired in js SDK
*/
Expand Down
25 changes: 25 additions & 0 deletions test/src/androidTest/java/com/hcaptcha/sdk/HCaptchaTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import android.app.Activity;
import android.os.Looper;

import androidx.test.core.app.ActivityScenario;
import androidx.test.ext.junit.rules.ActivityScenarioRule;

import com.hcaptcha.sdk.tasks.OnSuccessListener;
import com.hcaptcha.sdk.test.TestActivity;
import com.hcaptcha.sdk.test.TestNonFragmentActivity;

import org.junit.Rule;
import org.junit.Test;
Expand Down Expand Up @@ -121,4 +125,25 @@ public void e2eWithDebugTokenHeadlessWebView() throws Exception {

assertTrue(latch.await(E2E_AWAIT_CALLBACK_MS, TimeUnit.MILLISECONDS));
}

@Test
public void badActivity() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);

Looper.prepare();
final Activity activity = new TestNonFragmentActivity();

HCaptcha.getClient(activity)
.verifyWithHCaptcha(config.toBuilder().hideDialog(false).diagnosticLog(true).build())
.addOnSuccessListener(response -> fail("No token expected"))
.addOnFailureListener(exception -> {
if (exception.getHCaptchaError() == HCaptchaError.BAD_ACTIVITY_ERROR) {
latch.countDown();
} else {
fail("Wrong failure reason: " + exception.getHCaptchaError());
}
});

assertTrue(latch.await(E2E_AWAIT_CALLBACK_MS, TimeUnit.MILLISECONDS));
}
}
9 changes: 9 additions & 0 deletions test/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.hcaptcha.sdk.test.TestNonFragmentActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="androidx.fragment.app.testing.EmptyFragmentActivity"
android:exported="true">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.hcaptcha.sdk.test;

public class TestNonFragmentActivity extends android.app.Activity {
}

0 comments on commit fdc7f95

Please sign in to comment.