Revamp outro animation
Use the wallpaper as part of the window background rather than trying to replicate it with WallpaperManager. This allows us to perform a circular hide to whatever the wallpaper currently looks like exactly, rather than needing to obtain the wallpaper Bitmap or Drawable and guess. Display the Finish activity edge-to-edge. Fade out rather than slide out. Change-Id: I1154043178a04ca0ced7e8365e338dc10f3377cb
This commit is contained in:
committed by
Michael Bestas
parent
63bbec0258
commit
ed1a968160
@@ -292,6 +292,7 @@
|
|||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".FinishActivity"
|
<activity android:name=".FinishActivity"
|
||||||
|
android:theme="@style/EdgeToEdgeWallpaperBackground"
|
||||||
android:label="@string/activity_label_empty"
|
android:label="@string/activity_label_empty"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:configChanges="mcc|mnc"
|
android:configChanges="mcc|mnc"
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
Copyright (C) 2015 The CyanogenMod Project
|
Copyright (C) 2024 The LineageOS Project
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -15,5 +15,5 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
|
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
<solid android:color="@color/page_background" />
|
<solid android:color="?android:attr/colorBackground" />
|
||||||
</shape>
|
</shape>
|
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
Copyright (C) 2016 The CyanogenMod Project
|
Copyright (C) 2016 The CyanogenMod Project
|
||||||
Copyright (C) 2017-2021 The LineageOS Project
|
Copyright (C) 2017-2024 The LineageOS Project
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -25,7 +25,15 @@
|
|||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
app:insetForeground="@android:color/transparent">
|
app:insetForeground="@android:color/transparent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/background"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/background"
|
||||||
|
android:visibility="visible"/>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:id="@+id/linear_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
@@ -49,11 +57,4 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/reveal"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:background="@drawable/reveal"
|
|
||||||
android:visibility="invisible"/>
|
|
||||||
|
|
||||||
</android.widget.FrameLayout>
|
</android.widget.FrameLayout>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
Copyright (C) 2013 The CyanogenMod Project
|
Copyright (C) 2013 The CyanogenMod Project
|
||||||
Copyright (C) 2017-2022 The LineageOS Project
|
Copyright (C) 2017-2024 The LineageOS Project
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -62,4 +62,12 @@
|
|||||||
<item name="android:paddingBottom">@dimen/welcome_title_padding_bottom</item>
|
<item name="android:paddingBottom">@dimen/welcome_title_padding_bottom</item>
|
||||||
<item name="android:lineHeight">@dimen/welcome_title_line_height</item>
|
<item name="android:lineHeight">@dimen/welcome_title_line_height</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="EdgeToEdgeWallpaperBackground" parent="Theme.Setup">
|
||||||
|
<item name="android:windowShowWallpaper">true</item>
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||||
|
<item name="android:statusBarColor">?attr/android:windowBackground</item>
|
||||||
|
<item name="android:navigationBarColor">?attr/android:windowBackground</item>
|
||||||
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -51,8 +51,14 @@ import android.os.UserHandle;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewAnimationUtils;
|
import android.view.ViewAnimationUtils;
|
||||||
|
import android.view.ViewGroup.MarginLayoutParams;
|
||||||
|
import android.view.Window;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import androidx.core.graphics.Insets;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
|
|
||||||
import lineageos.providers.LineageSettings;
|
import lineageos.providers.LineageSettings;
|
||||||
|
|
||||||
import org.lineageos.setupwizard.util.SetupWizardUtils;
|
import org.lineageos.setupwizard.util.SetupWizardUtils;
|
||||||
@@ -61,7 +67,7 @@ public class FinishActivity extends BaseSetupWizardActivity {
|
|||||||
|
|
||||||
public static final String TAG = FinishActivity.class.getSimpleName();
|
public static final String TAG = FinishActivity.class.getSimpleName();
|
||||||
|
|
||||||
private ImageView mReveal;
|
private ImageView mBackground;
|
||||||
|
|
||||||
private SetupWizardApp mSetupWizardApp;
|
private SetupWizardApp mSetupWizardApp;
|
||||||
|
|
||||||
@@ -85,12 +91,34 @@ public class FinishActivity extends BaseSetupWizardActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
overridePendingTransition(R.anim.translucent_enter, R.anim.translucent_exit);
|
||||||
if (LOGV) {
|
if (LOGV) {
|
||||||
logActivityState("onCreate savedInstanceState=" + savedInstanceState);
|
logActivityState("onCreate savedInstanceState=" + savedInstanceState);
|
||||||
}
|
}
|
||||||
mSetupWizardApp = (SetupWizardApp) getApplication();
|
mSetupWizardApp = (SetupWizardApp) getApplication();
|
||||||
mReveal = (ImageView) findViewById(R.id.reveal);
|
mBackground = (ImageView) findViewById(R.id.background);
|
||||||
setNextText(R.string.start);
|
setNextText(R.string.start);
|
||||||
|
|
||||||
|
// Edge-to-edge. Needed for the background view to fill the full screen.
|
||||||
|
final Window window = getWindow();
|
||||||
|
window.setDecorFitsSystemWindows(false);
|
||||||
|
|
||||||
|
// Make sure 3-button navigation bar is the same color as the rest of the screen.
|
||||||
|
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) -> {
|
||||||
|
final View linearLayout = findViewById(R.id.linear_layout);
|
||||||
|
final Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
final MarginLayoutParams params = (MarginLayoutParams) linearLayout.getLayoutParams();
|
||||||
|
params.leftMargin = insets.left;
|
||||||
|
params.topMargin = insets.top;
|
||||||
|
params.rightMargin = insets.right;
|
||||||
|
params.bottomMargin = insets.bottom;
|
||||||
|
linearLayout.setLayoutParams(params);
|
||||||
|
return WindowInsetsCompat.CONSUMED;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -122,47 +150,26 @@ public class FinishActivity extends BaseSetupWizardActivity {
|
|||||||
hideNextButton();
|
hideNextButton();
|
||||||
|
|
||||||
// Begin outro animation.
|
// Begin outro animation.
|
||||||
setupRevealImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupRevealImage() {
|
|
||||||
Rect rect = getWindowManager().getCurrentWindowMetrics().getBounds();
|
|
||||||
final Point p = new Point(rect.width(), rect.height());
|
|
||||||
final WallpaperManager wallpaperManager =
|
|
||||||
WallpaperManager.getInstance(this);
|
|
||||||
wallpaperManager.forgetLoadedWallpaper();
|
|
||||||
final Bitmap wallpaper = wallpaperManager.getBitmap();
|
|
||||||
Bitmap cropped = null;
|
|
||||||
if (wallpaper != null) {
|
|
||||||
cropped = Bitmap.createBitmap(wallpaper, 0,
|
|
||||||
0, Math.min(p.x, wallpaper.getWidth()),
|
|
||||||
Math.min(p.y, wallpaper.getHeight()));
|
|
||||||
}
|
|
||||||
if (cropped != null) {
|
|
||||||
mReveal.setScaleType(ImageView.ScaleType.CENTER_CROP);
|
|
||||||
mReveal.setImageBitmap(cropped);
|
|
||||||
} else {
|
|
||||||
mReveal.setBackground(wallpaperManager
|
|
||||||
.getBuiltInDrawable(p.x, p.y, false, 0, 0));
|
|
||||||
}
|
|
||||||
animateOut();
|
animateOut();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void animateOut() {
|
private void animateOut() {
|
||||||
int cx = (mReveal.getLeft() + mReveal.getRight()) / 2;
|
final View rootView = findViewById(R.id.root);
|
||||||
int cy = (mReveal.getTop() + mReveal.getBottom()) / 2;
|
final int cx = (rootView.getLeft() + rootView.getRight()) / 2;
|
||||||
int finalRadius = Math.max(mReveal.getWidth(), mReveal.getHeight());
|
final int cy = (rootView.getTop() + rootView.getBottom()) / 2;
|
||||||
|
final float fullRadius = (float) Math.hypot(cx, cy);
|
||||||
Animator anim =
|
Animator anim =
|
||||||
ViewAnimationUtils.createCircularReveal(mReveal, cx, cy, 0, finalRadius);
|
ViewAnimationUtils.createCircularReveal(rootView, cx, cy, fullRadius, 0f);
|
||||||
anim.setDuration(900);
|
anim.setDuration(900);
|
||||||
anim.addListener(new AnimatorListenerAdapter() {
|
anim.addListener(new AnimatorListenerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationStart(Animator animation) {
|
public void onAnimationStart(Animator animation) {
|
||||||
mReveal.setVisibility(View.VISIBLE);
|
rootView.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationEnd(Animator animation) {
|
public void onAnimationEnd(Animator animation) {
|
||||||
|
rootView.setVisibility(View.INVISIBLE);
|
||||||
mHandler.post(() -> {
|
mHandler.post(() -> {
|
||||||
if (LOGV) {
|
if (LOGV) {
|
||||||
Log.v(TAG, "Animation ended");
|
Log.v(TAG, "Animation ended");
|
||||||
|
Reference in New Issue
Block a user