blob: 2429e1e11c00764e16de509fe0022d572aff7afe [file] [log] [blame]
/*
* SPDX-FileCopyrightText: 2022-2024 The LineageOS Project
* SPDX-FileCopyrightText: 2022-2024 The LeafOS Project
* SPDX-License-Identifier: Apache-2.0
*/
package org.lineageos.setupwizard;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON_OVERLAY;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY;
import static com.android.systemui.shared.recents.utilities.Utilities.isLargeScreen;
import static org.lineageos.setupwizard.SetupWizardApp.NAVIGATION_OPTION_KEY;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.os.Bundle;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.content.Context;
import android.content.res.Resources;
import android.view.View;
import android.widget.CheckBox;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.provider.Settings;
import com.airbnb.lottie.LottieAnimationView;
import org.lineageos.setupwizard.util.SetupWizardUtils;
public class NavigationSettingsActivity extends BaseSetupWizardActivity {
private SetupWizardApp mSetupWizardApp;
private boolean mIsTaskbarEnabled;
private String mSelection = NAV_BAR_MODE_GESTURAL_OVERLAY;
private CheckBox mHideGesturalHint;
public static boolean hasNavigationBar(Context context) {
Resources resources = context.getResources();
int resIdShow = resources.getIdentifier("config_showNavigationBar", "bool", "android");
boolean hasNavigationBar = false;
if (resIdShow > 0) {
hasNavigationBar = resources.getBoolean(resIdShow);
}
return hasNavigationBar || "1".equals(SystemProperties.get("qemu.hw.mainkeys"));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSetupWizardApp = (SetupWizardApp) getApplication();
boolean navBarEnabled = hasNavigationBar(this);
mIsTaskbarEnabled = Settings.System.getInt(getContentResolver(),
Settings.System.ENABLE_TASKBAR, isLargeScreen(this) ? 1 : 0) == 1;
getGlifLayout().setDescriptionText(getString(R.string.navigation_summary));
setNextText(R.string.next);
int available = 3;
// Hide unavailable navigation modes
if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_GESTURAL_OVERLAY)) {
findViewById(R.id.radio_gesture).setVisibility(View.GONE);
((RadioButton) findViewById(R.id.radio_sw_keys)).setChecked(true);
available--;
}
if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_2BUTTON_OVERLAY)) {
findViewById(R.id.radio_two_button).setVisibility(View.GONE);
available--;
}
if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_3BUTTON_OVERLAY)) {
findViewById(R.id.radio_sw_keys).setVisibility(View.GONE);
available--;
}
// Hide this page if the device has hardware keys but didn't enable navbar
// or if there's <= 1 available navigation modes
if (!navBarEnabled || available <= 1) {
mSetupWizardApp.getSettingsBundle().putString(NAVIGATION_OPTION_KEY,
NAV_BAR_MODE_3BUTTON_OVERLAY);
finishAction(RESULT_OK);
}
final LottieAnimationView navigationIllustration =
findViewById(R.id.navigation_illustration);
final RadioGroup radioGroup = findViewById(R.id.navigation_radio_group);
mHideGesturalHint = findViewById(R.id.hide_navigation_hint);
// Hide navigation hint checkbox when taskbar is enabled
if (mIsTaskbarEnabled) {
mHideGesturalHint.setVisibility(View.GONE);
}
radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
switch (checkedId) {
case R.id.radio_gesture:
mSelection = NAV_BAR_MODE_GESTURAL_OVERLAY;
navigationIllustration
.setAnimation(R.raw.lottie_system_nav_fully_gestural);
revealHintCheckbox();
break;
case R.id.radio_two_button:
mSelection = NAV_BAR_MODE_2BUTTON_OVERLAY;
navigationIllustration.setAnimation(R.raw.lottie_system_nav_2_button);
hideHintCheckBox();
break;
case R.id.radio_sw_keys:
mSelection = NAV_BAR_MODE_3BUTTON_OVERLAY;
navigationIllustration.setAnimation(R.raw.lottie_system_nav_3_button);
hideHintCheckBox();
break;
}
navigationIllustration.playAnimation();
});
}
private void revealHintCheckbox() {
if (mIsTaskbarEnabled) {
return;
}
mHideGesturalHint.animate().cancel();
if (mHideGesturalHint.getVisibility() == View.VISIBLE) {
return;
}
mHideGesturalHint.setVisibility(View.VISIBLE);
mHideGesturalHint.setAlpha(0.0f);
mHideGesturalHint.animate()
.translationY(0)
.alpha(1.0f)
.setListener(null);
}
private void hideHintCheckBox() {
if (mIsTaskbarEnabled) {
return;
}
if (mHideGesturalHint.getVisibility() == View.INVISIBLE) {
return;
}
mHideGesturalHint.animate()
.translationY(-mHideGesturalHint.getHeight())
.alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mHideGesturalHint.setVisibility(View.INVISIBLE);
}
});
}
@Override
protected void onNextPressed() {
mSetupWizardApp.getSettingsBundle().putString(NAVIGATION_OPTION_KEY, mSelection);
if (!mIsTaskbarEnabled) {
boolean hideHint = mHideGesturalHint.isChecked();
Settings.Secure.putIntForUser(getContentResolver(),
Settings.Secure.NAVIGATION_BAR_HINT, hideHint ? 0 : 1,
UserHandle.USER_CURRENT);
}
super.onNextPressed();
}
@Override
protected int getLayoutResId() {
return R.layout.setup_navigation;
}
@Override
protected int getTitleResId() {
return R.string.setup_navigation;
}
@Override
protected int getIconResId() {
return R.drawable.ic_navigation;
}
}