Update some activities to handle rotation.

This commit is contained in:
Greyson Parrelli
2026-08-04 07:42:40 -04:00
committed by Alex Hart
parent 34648c2c04
commit c28ecbca4c
2 changed files with 51 additions and 21 deletions
@@ -4,16 +4,20 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.ActivityInfo
import android.media.AudioManager
import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.view.ViewCompat
import androidx.media.AudioManagerCompat
import androidx.window.layout.WindowMetricsCalculator
import com.bumptech.glide.Glide
import com.bumptech.glide.MemoryCategory
import org.signal.core.ui.WindowBreakpoint
import org.signal.core.ui.getWindowBreakpoint
import org.signal.core.util.ServiceUtil
import org.signal.core.util.dp
import org.signal.core.util.getParcelableCompat
@@ -45,6 +49,10 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
}
override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
if (resources.getWindowBreakpoint() !is WindowBreakpoint.Small) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
}
if (savedInstanceState != null) {
val cache: StoryViewStateCache? = savedInstanceState.getParcelableCompat(DATA_CACHE, StoryViewStateCache::class.java)
if (cache != null) {
@@ -58,24 +66,12 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
supportPostponeEnterTransition()
val root = findViewById<View>(android.R.id.content)
val metrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this)
val statusBarHeight = ViewUtil.getStatusBarHeight(root)
val contentHeight = metrics.bounds.width() * (16 / 9f) + 48.sp
val spaceAndNavbar = metrics.bounds.height() - statusBarHeight - contentHeight
val (padTop, padBottom) = if (spaceAndNavbar > 72.dp) {
val pad = (metrics.bounds.height() - contentHeight) / 2f
pad to pad
} else {
statusBarHeight to ViewUtil.getNavigationBarHeight(root)
updateContentPadding(root)
ViewCompat.setOnApplyWindowInsetsListener(root) { view, insets ->
updateContentPadding(view)
insets
}
root.setPadding(
0,
padTop.toInt(),
0,
padBottom.toInt()
)
super.onCreate(savedInstanceState, ready)
setContentView(R.layout.fragment_container)
@@ -121,6 +117,31 @@ class StoryViewerActivity : PassphraseRequiredActivity(), VoiceNoteMediaControll
window.transitionBackgroundFadeDuration = 100
}
/**
* Centers the 16:9 story content when the window is tall enough for it, and otherwise insets it by the system bars.
* Recomputed on every inset dispatch rather than just at creation, because this activity handles its own
* configuration changes and is free to rotate on large screens.
*/
private fun updateContentPadding(root: View) {
val metrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this)
val statusBarHeight = ViewUtil.getStatusBarHeight(root)
val contentHeight = metrics.bounds.width() * (16 / 9f) + 48.sp
val spaceAndNavbar = metrics.bounds.height() - statusBarHeight - contentHeight
val (padTop, padBottom) = if (spaceAndNavbar > 72.dp) {
val pad = (metrics.bounds.height() - contentHeight) / 2f
pad to pad
} else {
statusBarHeight.toFloat() to ViewUtil.getNavigationBarHeight(root).toFloat()
}
root.setPadding(
0,
padTop.toInt(),
0,
padBottom.toInt()
)
}
private fun replaceStoryViewerFragment() {
supportFragmentManager.beginTransaction()
.replace(
@@ -2,10 +2,11 @@ package org.thoughtcrime.securesms.wallpaper.crop;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Point;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
@@ -20,7 +21,9 @@ import androidx.appcompat.widget.SwitchCompat;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.window.layout.WindowMetricsCalculator;
import org.signal.core.ui.WindowBreakpoint;
import org.signal.core.util.logging.Log;
import org.signal.imageeditor.core.ImageEditorView;
import org.signal.imageeditor.core.model.EditorElement;
@@ -43,6 +46,8 @@ import java.util.Collections;
import java.util.Locale;
import java.util.Objects;
import static org.signal.core.ui.WindowSizeClassExtensionsKt.getWindowBreakpoint;
public final class WallpaperCropActivity extends BaseActivity {
private static final String TAG = Log.tag(WallpaperCropActivity.class);
@@ -75,6 +80,11 @@ public final class WallpaperCropActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!(getWindowBreakpoint(getResources()) instanceof WindowBreakpoint.Small)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
dynamicTheme.onCreate(this);
setContentView(R.layout.chat_wallpaper_crop_activity);
@@ -182,10 +192,9 @@ public final class WallpaperCropActivity extends BaseActivity {
}
private void setupImageEditor(@NonNull Uri imageUri) {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
Rect bounds = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(this).getBounds();
int height = bounds.height();
int width = bounds.width();
float ratio = width / (float) height;
EditorModel editorModel = EditorModel.createForWallpaperEditing(ratio, ContextCompat.getColor(this, org.signal.core.ui.R.color.signal_colorBackground));