blob: af55c4a06bec8d87c1e80dc6cc7fd044d897401f [file] [log] [blame]
/*
* SPDX-FileCopyrightText: 2016 The CyanogenMod Project
* SPDX-FileCopyrightText: 2017-2024 The LineageOS Project
* SPDX-FileCopyrightText: 2022-2024 The LeafOS Project
* SPDX-License-Identifier: Apache-2.0
*/
package org.lineageos.setupwizard;
import static android.os.Binder.getCallingUserHandle;
import static android.os.UserHandle.USER_CURRENT;
import static org.lineageos.setupwizard.Manifest.permission.FINISH_SETUP;
import static org.lineageos.setupwizard.SetupWizardApp.ACTION_FINISHED;
import static org.lineageos.setupwizard.SetupWizardApp.ACTION_SETUP_COMPLETE;
import static org.lineageos.setupwizard.SetupWizardApp.LOGV;
import static org.lineageos.setupwizard.SetupWizardApp.NAVIGATION_OPTION_KEY;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import org.lineageos.setupwizard.util.SetupWizardUtils;
public class FinishActivity extends BaseSetupWizardActivity {
public static final String TAG = FinishActivity.class.getSimpleName();
private final Handler mHandler = new Handler(Looper.getMainLooper());
private boolean mIsFinishing;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overrideActivityTransition(OVERRIDE_TRANSITION_CLOSE, R.anim.translucent_enter,
R.anim.translucent_exit);
if (LOGV) {
logActivityState("onCreate savedInstanceState=" + savedInstanceState);
}
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
protected int getLayoutResId() {
return R.layout.finish_activity;
}
@Override
public void onNavigateNext() {
startFinishSequence();
}
private void startFinishSequence() {
if (mIsFinishing) {
return;
}
mIsFinishing = true;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
hideNextButton();
// Begin outro animation.
animateOut();
}
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 float fullRadius = (float) Math.hypot(cx, cy);
Animator anim =
ViewAnimationUtils.createCircularReveal(rootView, cx, cy, fullRadius, 0f);
anim.setDuration(900);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
rootView.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
rootView.setVisibility(View.INVISIBLE);
mHandler.post(() -> {
if (LOGV) {
Log.v(TAG, "Animation ended");
}
SetupWizardUtils.finishSetupWizard(FinishActivity.this);
});
}
});
anim.start();
}
}