blob: 035df834d7608150ec03ad1d719b06b550ed5403 [file] [log] [blame]
Timi Rautamäkie83f9e12022-03-16 13:21:30 +00001/*
Oliver Scottf58c0f42024-01-08 14:52:12 -05002 * Copyright (C) 2022-2024 The LineageOS Project
Timi Rautamäkie83f9e12022-03-16 13:21:30 +00003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.lineageos.setupwizard;
18
19import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON_OVERLAY;
20import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY;
21import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY;
22
Michael Bestasa5ba5df2023-07-15 16:19:36 +030023import static com.android.systemui.shared.recents.utilities.Utilities.isLargeScreen;
24
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000025import static org.lineageos.internal.util.DeviceKeysConstants.KEY_MASK_APP_SWITCH;
26import static org.lineageos.setupwizard.SetupWizardApp.DISABLE_NAV_KEYS;
27import static org.lineageos.setupwizard.SetupWizardApp.NAVIGATION_OPTION_KEY;
28
29import android.animation.Animator;
30import android.animation.AnimatorListenerAdapter;
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000031import android.os.Bundle;
32import android.os.UserHandle;
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000033import android.view.View;
34import android.widget.CheckBox;
35import android.widget.RadioButton;
36import android.widget.RadioGroup;
37import android.widget.RadioGroup.OnCheckedChangeListener;
38
39import com.airbnb.lottie.LottieAnimationView;
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000040
41import lineageos.providers.LineageSettings;
42
43import org.lineageos.setupwizard.util.SetupWizardUtils;
44
45public class NavigationSettingsActivity extends BaseSetupWizardActivity {
46
47 public static final String TAG = NavigationSettingsActivity.class.getSimpleName();
48
49 private SetupWizardApp mSetupWizardApp;
50
Michael Bestasa5ba5df2023-07-15 16:19:36 +030051 private boolean mIsTaskbarEnabled;
52
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000053 private String mSelection = NAV_BAR_MODE_GESTURAL_OVERLAY;
54
55 private CheckBox mHideGesturalHint;
56
57 @Override
58 protected void onCreate(Bundle savedInstanceState) {
59 super.onCreate(savedInstanceState);
60
61 mSetupWizardApp = (SetupWizardApp) getApplication();
62 boolean navBarEnabled = false;
63 if (mSetupWizardApp.getSettingsBundle().containsKey(DISABLE_NAV_KEYS)) {
64 navBarEnabled = mSetupWizardApp.getSettingsBundle().getBoolean(DISABLE_NAV_KEYS);
65 }
Michael Bestasa5ba5df2023-07-15 16:19:36 +030066 mIsTaskbarEnabled = LineageSettings.System.getInt(getContentResolver(),
67 LineageSettings.System.ENABLE_TASKBAR, isLargeScreen(this) ? 1 : 0) == 1;
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000068
69 int deviceKeys = getResources().getInteger(
70 org.lineageos.platform.internal.R.integer.config_deviceHardwareKeys);
71 boolean hasHomeKey = (deviceKeys & KEY_MASK_APP_SWITCH) != 0;
72
73 getGlifLayout().setDescriptionText(getString(R.string.navigation_summary));
74 setNextText(R.string.next);
75
76 int available = 3;
77 // Hide unavailable navigation modes
Bruno Martins70551982022-03-22 20:07:33 +000078 if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_GESTURAL_OVERLAY)) {
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000079 findViewById(R.id.radio_gesture).setVisibility(View.GONE);
80 ((RadioButton) findViewById(R.id.radio_sw_keys)).setChecked(true);
81 available--;
82 }
83
Bruno Martins70551982022-03-22 20:07:33 +000084 if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_2BUTTON_OVERLAY)) {
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000085 findViewById(R.id.radio_two_button).setVisibility(View.GONE);
86 available--;
87 }
88
Bruno Martins70551982022-03-22 20:07:33 +000089 if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_3BUTTON_OVERLAY)) {
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000090 findViewById(R.id.radio_sw_keys).setVisibility(View.GONE);
91 available--;
92 }
93
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000094 // Hide this page if the device has hardware keys but didn't enable navbar
95 // or if there's <= 1 available navigation modes
96 if (!navBarEnabled && hasHomeKey || available <= 1) {
97 mSetupWizardApp.getSettingsBundle().putString(NAVIGATION_OPTION_KEY,
98 NAV_BAR_MODE_3BUTTON_OVERLAY);
Oliver Scottf58c0f42024-01-08 14:52:12 -050099 finishAction(RESULT_OK);
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000100 }
101
102 final LottieAnimationView navigationIllustration =
103 findViewById(R.id.navigation_illustration);
104 final RadioGroup radioGroup = findViewById(R.id.navigation_radio_group);
105 mHideGesturalHint = findViewById(R.id.hide_navigation_hint);
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300106
107 // Hide navigation hint checkbox when taskbar is enabled
108 if (mIsTaskbarEnabled) {
109 mHideGesturalHint.setVisibility(View.GONE);
110 }
111
Oliver Scott76644612024-01-10 17:16:28 -0500112 radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
113 switch (checkedId) {
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000114 case R.id.radio_gesture:
115 mSelection = NAV_BAR_MODE_GESTURAL_OVERLAY;
116 navigationIllustration
117 .setAnimation(R.raw.lottie_system_nav_fully_gestural);
118 revealHintCheckbox();
119 break;
120 case R.id.radio_two_button:
121 mSelection = NAV_BAR_MODE_2BUTTON_OVERLAY;
122 navigationIllustration.setAnimation(R.raw.lottie_system_nav_2_button);
123 hideHintCheckBox();
124 break;
125 case R.id.radio_sw_keys:
126 mSelection = NAV_BAR_MODE_3BUTTON_OVERLAY;
127 navigationIllustration.setAnimation(R.raw.lottie_system_nav_3_button);
128 hideHintCheckBox();
129 break;
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000130 }
Oliver Scott76644612024-01-10 17:16:28 -0500131
132 navigationIllustration.playAnimation();
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000133 });
134 }
135
136 private void revealHintCheckbox() {
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300137 if (mIsTaskbarEnabled) {
Oliver Scott76644612024-01-10 17:16:28 -0500138 return;
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300139 }
140
Alessandro Astone0fa84172022-04-04 17:33:18 +0200141 mHideGesturalHint.animate().cancel();
142
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000143 if (mHideGesturalHint.getVisibility() == View.VISIBLE) {
144 return;
145 }
146
147 mHideGesturalHint.setVisibility(View.VISIBLE);
148 mHideGesturalHint.setAlpha(0.0f);
149 mHideGesturalHint.animate()
Oliver Scott76644612024-01-10 17:16:28 -0500150 .translationY(0)
151 .alpha(1.0f)
152 .setListener(null);
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000153 }
154
155 private void hideHintCheckBox() {
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300156 if (mIsTaskbarEnabled) {
Oliver Scott76644612024-01-10 17:16:28 -0500157 return;
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300158 }
159
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000160 if (mHideGesturalHint.getVisibility() == View.INVISIBLE) {
161 return;
162 }
163
164 mHideGesturalHint.animate()
Oliver Scott76644612024-01-10 17:16:28 -0500165 .translationY(-mHideGesturalHint.getHeight())
166 .alpha(0.0f)
167 .setListener(new AnimatorListenerAdapter() {
168 @Override
169 public void onAnimationEnd(Animator animation) {
170 super.onAnimationEnd(animation);
171 mHideGesturalHint.setVisibility(View.INVISIBLE);
172 }
173 });
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000174 }
175
176 @Override
177 protected void onNextPressed() {
178 mSetupWizardApp.getSettingsBundle().putString(NAVIGATION_OPTION_KEY, mSelection);
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300179 if (!mIsTaskbarEnabled) {
180 boolean hideHint = mHideGesturalHint.isChecked();
181 LineageSettings.System.putIntForUser(getContentResolver(),
182 LineageSettings.System.NAVIGATION_BAR_HINT, hideHint ? 0 : 1,
183 UserHandle.USER_CURRENT);
184 }
Oliver Scott04c9f462024-01-06 20:36:13 -0500185 super.onNextPressed();
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000186 }
187
188 @Override
189 protected int getLayoutResId() {
190 return R.layout.setup_navigation;
191 }
192
193 @Override
194 protected int getTitleResId() {
195 return R.string.setup_navigation;
196 }
197
198 @Override
199 protected int getIconResId() {
200 return R.drawable.ic_navigation;
201 }
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000202}