Skip to content

Commit

Permalink
Handle intent parameters, first implementation of launching immersive…
Browse files Browse the repository at this point in the history
… mode by simulating clicks
  • Loading branch information
felipeerias committed Dec 29, 2023
1 parent 7319e31 commit 58ebb3a
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 1 deletion.
26 changes: 26 additions & 0 deletions app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
import com.igalia.wolvic.crashreporting.GlobalExceptionHandler;
import com.igalia.wolvic.geolocation.GeolocationWrapper;
import com.igalia.wolvic.input.MotionEventGenerator;
import com.igalia.wolvic.launchmode.ImmersiveModeController;
import com.igalia.wolvic.search.SearchEngineWrapper;
import com.igalia.wolvic.speech.SpeechRecognizer;
import com.igalia.wolvic.speech.SpeechServices;
Expand Down Expand Up @@ -126,6 +127,13 @@ public class VRBrowserActivity extends PlatformActivity implements WidgetManager
public static final String EXTRA_HIDE_WEBXR_INTERSTITIAL = "hide_webxr_interstitial";
public static final String EXTRA_HIDE_WHATS_NEW = "hide_whats_new";
public static final String EXTRA_KIOSK = "kiosk";
public static final String EXTRA_OPEN_IN_IMMERSIVE = "open_in_immersive";
// Element where the given event ("click" by default) would be simulated to launch the WebXR experience. Takes priority.
public static final String EXTRA_OPEN_IN_IMMERSIVE_ELEMENT = "open_in_immersive_element";
public static final String EXTRA_OPEN_IN_IMMERSIVE_EVENT = "open_in_immersive_event";
// (X, Y) position on the page where a click would be simulated to launch the WebXR experience.
public static final String EXTRA_OPEN_IN_IMMERSIVE_X = "open_in_immersive_x";
public static final String EXTRA_OPEN_IN_IMMERSIVE_Y = "open_in_immersive_y";

private BroadcastReceiver mCrashReceiver = new BroadcastReceiver() {
@Override
Expand All @@ -143,6 +151,7 @@ public void onReceive(Context context, Intent intent) {
};

private LifecycleRegistry mLifeCycle;
private ImmersiveModeController mImmersiveModeController;

@NonNull
@Override
Expand Down Expand Up @@ -769,6 +778,7 @@ void loadFromIntent(final Intent intent) {
boolean openInWindow = false;
boolean openInBackground = false;
boolean openInKioskMode = false;
boolean openInImmersive = false;

Uri dataUri = intent.getData();
Uri targetUri = null;
Expand Down Expand Up @@ -845,6 +855,20 @@ void loadFromIntent(final Intent intent) {
}

openInKioskMode = extras.getBoolean(EXTRA_KIOSK, false);

if (extras.getBoolean(EXTRA_OPEN_IN_IMMERSIVE)) {
Integer targetX = extras.containsKey(EXTRA_OPEN_IN_IMMERSIVE_X) ? extras.getInt(EXTRA_OPEN_IN_IMMERSIVE_X) : null;
Integer targetY = extras.containsKey(EXTRA_OPEN_IN_IMMERSIVE_Y) ? extras.getInt(EXTRA_OPEN_IN_IMMERSIVE_Y) : null;
String targetElement = extras.getString(EXTRA_OPEN_IN_IMMERSIVE_ELEMENT);
String targetEvent = extras.getString(EXTRA_OPEN_IN_IMMERSIVE_EVENT);

// Open in immersive requires specific information to be present
openInImmersive = targetUri != null && ((targetX != null && targetY != null) || targetElement != null);

if (openInImmersive) {
mImmersiveModeController = new ImmersiveModeController(targetUri, targetX, targetY, targetElement, targetEvent);
}
}
}

// If there is a target URI we open it
Expand All @@ -856,6 +880,8 @@ void loadFromIntent(final Intent intent) {
if (openInKioskMode) {
// FIXME this might not work as expected if the app was already running
mWindows.openInKioskMode(targetUri.toString());
} if (openInImmersive) {
mWindows.openInImmersiveMode(mImmersiveModeController);
} else {
if (openInWindow) {
location = Windows.OPEN_IN_NEW_WINDOW;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.igalia.wolvic.launchmode;

import android.net.Uri;
import android.os.SystemClock;
import android.view.MotionEvent;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.igalia.wolvic.ui.widgets.WindowWidget;

public class ImmersiveModeController {
@NonNull private final Uri mTargetUri;
@Nullable private final Integer mTargetX;
@Nullable private final Integer mTargetY;
@Nullable private final String mTargetElement;
@Nullable private final String mTargetEvent;

private boolean mTriggered = false;

public ImmersiveModeController(@NonNull Uri targetUri,
@Nullable Integer targetX, @Nullable Integer targetY,
@Nullable String targetElement, @Nullable String targetEvent) {
mTargetUri = targetUri;
mTargetX = targetX;
mTargetY = targetY;
mTargetElement = targetElement;
mTargetEvent = targetEvent;
}

@NonNull public Uri getTargetUri() {
return mTargetUri;
}

@Nullable public Integer getTargetX() {
return mTargetX;
}

@Nullable public Integer getTargetY() {
return mTargetY;
}

@Nullable public String getTargetElement() {
return mTargetElement;
}

@Nullable public String getTargetEvent() {
return mTargetEvent;
}

public void launchImmersiveMode(WindowWidget window) {
if (mTriggered) {
return;
}

if (mTargetX != null && mTargetY != null) {
MotionEvent downEvent = MotionEvent.obtain(
SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_DOWN, mTargetX, mTargetY, 0);
window.handleTouchEvent(downEvent);

MotionEvent upEvent = MotionEvent.obtain(
SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
MotionEvent.ACTION_DOWN, mTargetX, mTargetY, 0);
window.handleTouchEvent(upEvent);

downEvent.recycle();
upEvent.recycle();
}
mTriggered = true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import android.graphics.RectF;
import android.graphics.SurfaceTexture;
import android.net.Uri;
import androidx.preference.PreferenceManager;
import android.text.format.Formatter;
import android.util.Log;
import android.util.Pair;
Expand All @@ -37,6 +36,7 @@
import androidx.annotation.UiThread;
import androidx.core.content.FileProvider;
import androidx.lifecycle.ViewModelProvider;
import androidx.preference.PreferenceManager;

import com.igalia.wolvic.R;
import com.igalia.wolvic.VRBrowserActivity;
Expand Down Expand Up @@ -157,6 +157,7 @@ default void onFullScreen(@NonNull WindowWidget aWindow, boolean aFullScreen) {}
default void onMediaFullScreen(@NonNull final WMediaSession mediaSession, boolean aFullScreen) {}
default void onVideoAvailabilityChanged(@NonNull WindowWidget aWindow) {}
default void onKioskMode(WindowWidget aWindow, boolean isKioskMode) {}
default void onPageLoaded(WindowWidget aWindow) {}
}

@Override
Expand Down Expand Up @@ -1873,6 +1874,10 @@ public void onPageStop(@NonNull WSession aSession, boolean b) {
}

mViewModel.setIsLoading(false);

for (WindowListener listener: mListeners) {
listener.onPageLoaded(this);
}
}

public void captureImage() {
Expand Down
12 changes: 12 additions & 0 deletions app/src/common/shared/com/igalia/wolvic/ui/widgets/Windows.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import com.igalia.wolvic.browser.engine.SessionState;
import com.igalia.wolvic.browser.engine.SessionStore;
import com.igalia.wolvic.downloads.DownloadsManager;
import com.igalia.wolvic.launchmode.ImmersiveModeController;
import com.igalia.wolvic.telemetry.TelemetryService;
import com.igalia.wolvic.ui.widgets.dialogs.PromptDialogWidget;
import com.igalia.wolvic.ui.widgets.dialogs.UIDialog;
Expand Down Expand Up @@ -1455,6 +1456,17 @@ public void openInKioskMode(@NonNull String aUri) {
mFocusedWindow.setKioskMode(true);
}

public void openInImmersiveMode(@NonNull ImmersiveModeController controller) {
Session session = SessionStore.get().createSuspendedSession(controller.getTargetUri().toString(), false);
setFirstPaint(mFocusedWindow, session);
mFocusedWindow.setSession(session, WindowWidget.DEACTIVATE_CURRENT_SESSION);
mFocusedWindow.addWindowListener(new WindowWidget.WindowListener() {
@Override public void onPageLoaded(WindowWidget aWindow) {
controller.launchImmersiveMode(aWindow);
}
});
}

public void addTab(@NonNull WindowWidget targetWindow, @Nullable String aUri) {
Session session = SessionStore.get().createSuspendedSession(aUri, targetWindow.getSession().isPrivateMode());
session.setParentSession(targetWindow.getSession());
Expand Down

0 comments on commit 58ebb3a

Please sign in to comment.