blob: 87fdd4ef22754a11809c1e33976411e42d4da917 [file] [log] [blame]
Timi Rautamäkie83f9e12022-03-16 13:21:30 +00001/*
Michael Bestasa5ba5df2023-07-15 16:19:36 +03002 * Copyright (C) 2022-2023 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;
31import android.app.Activity;
32import android.content.Intent;
33import android.os.Bundle;
34import android.os.UserHandle;
35import android.content.Context;
36import android.view.View;
37import android.widget.CheckBox;
38import android.widget.RadioButton;
39import android.widget.RadioGroup;
40import android.widget.RadioGroup.OnCheckedChangeListener;
41
42import com.airbnb.lottie.LottieAnimationView;
43import com.google.android.setupcompat.util.WizardManagerHelper;
44
45import lineageos.providers.LineageSettings;
46
47import org.lineageos.setupwizard.util.SetupWizardUtils;
48
49public class NavigationSettingsActivity extends BaseSetupWizardActivity {
50
51 public static final String TAG = NavigationSettingsActivity.class.getSimpleName();
52
53 private SetupWizardApp mSetupWizardApp;
54
Michael Bestasa5ba5df2023-07-15 16:19:36 +030055 private boolean mIsTaskbarEnabled;
56
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000057 private String mSelection = NAV_BAR_MODE_GESTURAL_OVERLAY;
58
59 private CheckBox mHideGesturalHint;
60
61 @Override
62 protected void onCreate(Bundle savedInstanceState) {
63 super.onCreate(savedInstanceState);
64
65 mSetupWizardApp = (SetupWizardApp) getApplication();
66 boolean navBarEnabled = false;
67 if (mSetupWizardApp.getSettingsBundle().containsKey(DISABLE_NAV_KEYS)) {
68 navBarEnabled = mSetupWizardApp.getSettingsBundle().getBoolean(DISABLE_NAV_KEYS);
69 }
Michael Bestasa5ba5df2023-07-15 16:19:36 +030070 mIsTaskbarEnabled = LineageSettings.System.getInt(getContentResolver(),
71 LineageSettings.System.ENABLE_TASKBAR, isLargeScreen(this) ? 1 : 0) == 1;
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000072
73 int deviceKeys = getResources().getInteger(
74 org.lineageos.platform.internal.R.integer.config_deviceHardwareKeys);
75 boolean hasHomeKey = (deviceKeys & KEY_MASK_APP_SWITCH) != 0;
76
77 getGlifLayout().setDescriptionText(getString(R.string.navigation_summary));
78 setNextText(R.string.next);
79
80 int available = 3;
81 // Hide unavailable navigation modes
Bruno Martins70551982022-03-22 20:07:33 +000082 if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_GESTURAL_OVERLAY)) {
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000083 findViewById(R.id.radio_gesture).setVisibility(View.GONE);
84 ((RadioButton) findViewById(R.id.radio_sw_keys)).setChecked(true);
85 available--;
86 }
87
Bruno Martins70551982022-03-22 20:07:33 +000088 if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_2BUTTON_OVERLAY)) {
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000089 findViewById(R.id.radio_two_button).setVisibility(View.GONE);
90 available--;
91 }
92
Bruno Martins70551982022-03-22 20:07:33 +000093 if (!SetupWizardUtils.isPackageInstalled(this, NAV_BAR_MODE_3BUTTON_OVERLAY)) {
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000094 findViewById(R.id.radio_sw_keys).setVisibility(View.GONE);
95 available--;
96 }
97
Timi Rautamäkie83f9e12022-03-16 13:21:30 +000098 // Hide this page if the device has hardware keys but didn't enable navbar
99 // or if there's <= 1 available navigation modes
100 if (!navBarEnabled && hasHomeKey || available <= 1) {
101 mSetupWizardApp.getSettingsBundle().putString(NAVIGATION_OPTION_KEY,
102 NAV_BAR_MODE_3BUTTON_OVERLAY);
103 Intent intent = WizardManagerHelper.getNextIntent(getIntent(), Activity.RESULT_OK);
104 finishAction(RESULT_OK, intent);
105 }
106
107 final LottieAnimationView navigationIllustration =
108 findViewById(R.id.navigation_illustration);
109 final RadioGroup radioGroup = findViewById(R.id.navigation_radio_group);
110 mHideGesturalHint = findViewById(R.id.hide_navigation_hint);
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300111
112 // Hide navigation hint checkbox when taskbar is enabled
113 if (mIsTaskbarEnabled) {
114 mHideGesturalHint.setVisibility(View.GONE);
115 }
116
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000117 radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
118 @Override
119 public void onCheckedChanged(RadioGroup group, int checkedId) {
120 switch (checkedId) {
121 case R.id.radio_gesture:
122 mSelection = NAV_BAR_MODE_GESTURAL_OVERLAY;
123 navigationIllustration
124 .setAnimation(R.raw.lottie_system_nav_fully_gestural);
125 revealHintCheckbox();
126 break;
127 case R.id.radio_two_button:
128 mSelection = NAV_BAR_MODE_2BUTTON_OVERLAY;
129 navigationIllustration.setAnimation(R.raw.lottie_system_nav_2_button);
130 hideHintCheckBox();
131 break;
132 case R.id.radio_sw_keys:
133 mSelection = NAV_BAR_MODE_3BUTTON_OVERLAY;
134 navigationIllustration.setAnimation(R.raw.lottie_system_nav_3_button);
135 hideHintCheckBox();
136 break;
137 }
138
139 navigationIllustration.playAnimation();
140 }
141 });
142 }
143
144 private void revealHintCheckbox() {
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300145 if (mIsTaskbarEnabled) {
146 return;
147 }
148
Alessandro Astone0fa84172022-04-04 17:33:18 +0200149 mHideGesturalHint.animate().cancel();
150
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000151 if (mHideGesturalHint.getVisibility() == View.VISIBLE) {
152 return;
153 }
154
155 mHideGesturalHint.setVisibility(View.VISIBLE);
156 mHideGesturalHint.setAlpha(0.0f);
157 mHideGesturalHint.animate()
158 .translationY(0)
159 .alpha(1.0f)
160 .setListener(null);
161 }
162
163 private void hideHintCheckBox() {
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300164 if (mIsTaskbarEnabled) {
165 return;
166 }
167
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000168 if (mHideGesturalHint.getVisibility() == View.INVISIBLE) {
169 return;
170 }
171
172 mHideGesturalHint.animate()
173 .translationY(-mHideGesturalHint.getHeight())
174 .alpha(0.0f)
175 .setListener(new AnimatorListenerAdapter() {
176 @Override
177 public void onAnimationEnd(Animator animation) {
178 super.onAnimationEnd(animation);
179 mHideGesturalHint.setVisibility(View.INVISIBLE);
180 }
181 });
182 }
183
184 @Override
185 protected void onNextPressed() {
186 mSetupWizardApp.getSettingsBundle().putString(NAVIGATION_OPTION_KEY, mSelection);
Michael Bestasa5ba5df2023-07-15 16:19:36 +0300187 if (!mIsTaskbarEnabled) {
188 boolean hideHint = mHideGesturalHint.isChecked();
189 LineageSettings.System.putIntForUser(getContentResolver(),
190 LineageSettings.System.NAVIGATION_BAR_HINT, hideHint ? 0 : 1,
191 UserHandle.USER_CURRENT);
192 }
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000193 Intent intent = WizardManagerHelper.getNextIntent(getIntent(), Activity.RESULT_OK);
194 nextAction(NEXT_REQUEST, intent);
195 }
196
197 @Override
198 protected int getLayoutResId() {
199 return R.layout.setup_navigation;
200 }
201
202 @Override
203 protected int getTitleResId() {
204 return R.string.setup_navigation;
205 }
206
207 @Override
208 protected int getIconResId() {
209 return R.drawable.ic_navigation;
210 }
Timi Rautamäkie83f9e12022-03-16 13:21:30 +0000211}