Adapt FinishActivity and outro for 14 QPR3

windowShowWallpaper behaves unexpectedly with transitions as of 14 QPR3.
As a result, the changes of "Revamp outro animation" were causing the
transition into the final page of the wizard to instantaneously have
a transparent wallpaper background, even before the animation finished.
This was jarring and odd, so now we use a regular theme until we are
ready to start our animation, at which point we recreate the activity
with the EdgeToEdgeWallpaperBackground (windowShowWallpaper) theme
before running the animation.

Change-Id: Ib19918d7d2a615aff44a48066b17ec9d2f04bac6
This commit is contained in:
Tommy Webb
2024-07-25 18:16:20 +00:00
committed by t-m-w
parent 1d833219d8
commit a4dd79f78d
2 changed files with 74 additions and 17 deletions

View File

@@ -284,7 +284,6 @@
<activity
android:name=".FinishActivity"
android:theme="@style/EdgeToEdgeWallpaperBackground"
android:label="@string/activity_label_empty"
android:configChanges="mcc|mnc"
android:immersive="true"

View File

@@ -10,7 +10,9 @@ import static org.lineageos.setupwizard.SetupWizardApp.LOGV;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -32,7 +34,13 @@ public class FinishActivity extends BaseSetupWizardActivity {
private final Handler mHandler = new Handler(Looper.getMainLooper());
private boolean mIsFinishing;
// "Why not just start this activity with an Intent extra?" you might ask. Been there.
// We need this to affect the theme, and even onCreate is not early enough for that,
// so "static volatile boolean" it is. Feel free to rework this if you dare.
private static volatile boolean sIsFinishing;
private View mRootView;
private Resources.Theme mEdgeToEdgeWallpaperBackgroundTheme;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -52,8 +60,8 @@ public class FinishActivity extends BaseSetupWizardActivity {
window.setNavigationBarContrastEnforced(false);
// Ensure the main layout (not including the background view) does not get obscured by bars.
final View rootView = findViewById(R.id.root);
ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> {
mRootView = findViewById(R.id.root);
ViewCompat.setOnApplyWindowInsetsListener(mRootView, (view, windowInsets) -> {
final View linearLayout = findViewById(R.id.linear_layout);
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
final MarginLayoutParams params = (MarginLayoutParams) linearLayout.getLayoutParams();
@@ -64,6 +72,29 @@ public class FinishActivity extends BaseSetupWizardActivity {
linearLayout.setLayoutParams(params);
return WindowInsetsCompat.CONSUMED;
});
if (sIsFinishing) {
startFinishSequence();
}
}
private void disableActivityTransitions() {
overrideActivityTransition(OVERRIDE_TRANSITION_OPEN, 0, 0);
overrideActivityTransition(OVERRIDE_TRANSITION_CLOSE, 0, 0);
}
@Override
protected void applyForwardTransition() {
if (!sIsFinishing) {
super.applyForwardTransition();
}
}
@Override
protected void applyBackwardTransition() {
if (!sIsFinishing) {
super.applyBackwardTransition();
}
}
@Override
@@ -71,41 +102,68 @@ public class FinishActivity extends BaseSetupWizardActivity {
return R.layout.finish_activity;
}
@Override
public Resources.Theme getTheme() {
Resources.Theme theme = super.getTheme();
if (sIsFinishing) {
if (mEdgeToEdgeWallpaperBackgroundTheme == null) {
theme.applyStyle(R.style.EdgeToEdgeWallpaperBackground, true);
mEdgeToEdgeWallpaperBackgroundTheme = theme;
}
return mEdgeToEdgeWallpaperBackgroundTheme;
}
return theme;
}
@Override
public void onNavigateNext() {
startFinishSequence();
if (!sIsFinishing) {
sIsFinishing = true;
startActivity(getIntent());
finish();
disableActivityTransitions();
}
hideNextButton();
}
private void startFinishSequence() {
if (mIsFinishing) {
return;
}
mIsFinishing = true;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
hideNextButton();
// Begin outro animation.
animateOut();
if (mRootView.isAttachedToWindow()) {
mHandler.post(() -> animateOut());
} else {
mRootView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
mHandler.post(() -> animateOut());
}
@Override
public void onViewDetachedFromWindow(View v) {
// Do nothing
}
});
}
}
private void animateOut() {
final View rootView = findViewById(R.id.root);
final int cx = (rootView.getLeft() + rootView.getRight()) / 2;
final int cy = (rootView.getTop() + rootView.getBottom()) / 2;
final int cx = (mRootView.getLeft() + mRootView.getRight()) / 2;
final int cy = (mRootView.getTop() + mRootView.getBottom()) / 2;
final float fullRadius = (float) Math.hypot(cx, cy);
Animator anim =
ViewAnimationUtils.createCircularReveal(rootView, cx, cy, fullRadius, 0f);
ViewAnimationUtils.createCircularReveal(mRootView, cx, cy, fullRadius, 0f);
anim.setDuration(900);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
rootView.setVisibility(View.VISIBLE);
mRootView.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
rootView.setVisibility(View.INVISIBLE);
mRootView.setVisibility(View.INVISIBLE);
mHandler.post(() -> {
if (LOGV) {
Log.v(TAG, "Animation ended");