diff --git a/src/plugins/browser/android/com/foxdebug/browser/Browser.java b/src/plugins/browser/android/com/foxdebug/browser/Browser.java index 7cfea53fb..bd0d4ab93 100644 --- a/src/plugins/browser/android/com/foxdebug/browser/Browser.java +++ b/src/plugins/browser/android/com/foxdebug/browser/Browser.java @@ -293,6 +293,7 @@ public void onGlobalLayout() { case "Set as Default": if (deviceEmulator != null) { deviceEmulator.saveAsDefault(); + updateDefaultItems(emulator); Toast .makeText( context, @@ -304,6 +305,7 @@ public void onGlobalLayout() { break; case "Clear Default": Emulator.clearDefault(context); + updateDefaultItems(emulator); Toast .makeText(context, "Default cleared", Toast.LENGTH_SHORT) .show(); @@ -334,13 +336,38 @@ public void onGlobalLayout() { private void updateDefaultItems(boolean emulatorOn) { menu.setVisible("Set as Default", emulatorOn); - menu.setVisible("Clear Default", emulatorOn); + menu.setVisible( + "Clear Default", + emulatorOn && Emulator.hasDefault(context) + ); + } + + private void reloadAfterLayout() { + // If no page was requested yet, the first load will already happen at + // the saved size, so there is nothing to reload. + if (url.isEmpty()) return; + + webView + .getViewTreeObserver() + .addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + webView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + webView.reload(); + } + } + ); } private void restoreEmulator() { if (onlyConsole) return; if (!Emulator.hasDefault(context)) return; + // Apply the saved mode before the first navigation so the page is not + // loaded with the wrong user agent and then reloaded. + setDesktopMode(true, false); + webView .getViewTreeObserver() .addOnGlobalLayoutListener( @@ -352,21 +379,25 @@ public void onGlobalLayout() { if (deviceEmulator == null) { createDeviceEmulatorLayout(); + deviceEmulator.setRestoredListener( + new Runnable() { + @Override + public void run() { + reloadAfterLayout(); + } + } + ); } emulator = true; menu.setChecked("Devices", true); updateDefaultItems(true); - setDesktopMode(true); setConsoleVisible(false); menu.setChecked("Console", false); menu.setVisible("Console", false); addView(deviceEmulator); - fitWebViewTo( - deviceEmulator.getWidthProgress(), - deviceEmulator.getHeightProgress(), - deviceEmulator.getScaleProgress() - ); + // The emulator sets up its sliders on a later layout pass and then + // applies the saved size itself, so the webview is not resized here. } } ); @@ -403,6 +434,10 @@ private void setTextViewProperties(TextView textView, int height) { } private void setDesktopMode(boolean enabled) { + setDesktopMode(enabled, true); + } + + private void setDesktopMode(boolean enabled, boolean reload) { int width = 0; int height = 0; WebSettings webSettings = webView.getSettings(); @@ -424,7 +459,9 @@ private void setDesktopMode(boolean enabled) { webSettings.setLoadWithOverviewMode(enabled); webSettings.setSupportZoom(enabled); webSettings.setBuiltInZoomControls(enabled); - webView.reload(); + if (reload) { + webView.reload(); + } } public void setDesktopMode() { diff --git a/src/plugins/browser/android/com/foxdebug/browser/Emulator.java b/src/plugins/browser/android/com/foxdebug/browser/Emulator.java index 862ae033f..25f0d70ea 100644 --- a/src/plugins/browser/android/com/foxdebug/browser/Emulator.java +++ b/src/plugins/browser/android/com/foxdebug/browser/Emulator.java @@ -333,6 +333,12 @@ public void saveAsDefault() { .apply(); } + private Runnable restoredListener; + + public void setRestoredListener(Runnable listener) { + restoredListener = listener; + } + private void restoreDefaultDevice() { if (!hasDefault(context)) return; @@ -343,39 +349,60 @@ private void restoreDefaultDevice() { SeekBar widthSeekBar = seekBars.get("width"); SeekBar heightSeekBar = seekBars.get("height"); SeekBar scaleSeekBar = seekBars.get("scale"); - - int width = Math.min( - prefs.getInt("default_width", widthSeekBar.getMax()), - widthSeekBar.getMax() - ); - int height = Math.min( - prefs.getInt("default_height", heightSeekBar.getMax()), - heightSeekBar.getMax() - ); - - widthSeekBar.setProgress(width); - heightSeekBar.setProgress(height); - setMaxScale(width, height); - int scale = Math.min( - prefs.getInt("default_scale", 100), - scaleSeekBar.getMax() - ); - scaleSeekBar.setProgress(scale); - String name = prefs.getString("default_device", "Custom"); + + Device preset = null; for (Device device : deviceListView.devices) { - if (device.name.equals(name)) { - if (deviceListView.selectedDeviceView != null) { - deviceListView.selectedDeviceView.deselect(); - } - deviceListView.select(device); - selectedDevice = device; + if (device.id != customDevice.id && device.name.equals(name)) { + preset = device; break; } } - if (listener != null) { - listener.onChange(width, height, scale / 100f); + if (preset != null && listener != null) { + // A preset is re-fitted to the current screen, so it keeps its shape if + // the screen size changed since it was saved (rotation, split-screen, + // foldables). Only the scale is restored from the saved value. + if (deviceListView.selectedDeviceView != null) { + deviceListView.selectedDeviceView.deselect(); + } + deviceListView.select(preset); + selectDevice(preset); + + int scale = Math.min( + prefs.getInt("default_scale", scaleSeekBar.getMax()), + scaleSeekBar.getMax() + ); + scaleSeekBar.setProgress(scale); + listener.onChange(getWidthProgress(), getHeightProgress(), scale / 100f); + } else { + // Custom sizes are restored from the saved width/height. + int width = Math.min( + prefs.getInt("default_width", widthSeekBar.getMax()), + widthSeekBar.getMax() + ); + int height = Math.min( + prefs.getInt("default_height", heightSeekBar.getMax()), + heightSeekBar.getMax() + ); + + widthSeekBar.setProgress(width); + heightSeekBar.setProgress(height); + setMaxScale(width, height); + int scale = Math.min( + prefs.getInt("default_scale", 100), + scaleSeekBar.getMax() + ); + scaleSeekBar.setProgress(scale); + selectedDevice = customDevice; + + if (listener != null) { + listener.onChange(width, height, scale / 100f); + } + } + + if (restoredListener != null) { + restoredListener.run(); } }