mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-18 18:28:20 +00:00
Add IME switcher/hide button bar when IME showing
Bug: 180046394 Change-Id: Ic2bd919ab3d27e0a430b081c771ea8dc5827be81
This commit is contained in:
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package com.android.launcher3.taskbar;
|
||||
|
||||
import static android.view.View.GONE;
|
||||
import static android.view.View.INVISIBLE;
|
||||
import static android.view.View.VISIBLE;
|
||||
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
|
||||
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
|
||||
@@ -28,6 +31,7 @@ import android.app.ActivityOptions;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.view.Gravity;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
@@ -53,7 +57,7 @@ import com.android.launcher3.touch.ItemClickHandler;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.TaskAnimationManager;
|
||||
import com.android.quickstep.TouchInteractionService.TaskbarOverviewProxyDelegate;
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
import com.android.systemui.shared.system.WindowManagerWrapper;
|
||||
@@ -61,13 +65,15 @@ import com.android.systemui.shared.system.WindowManagerWrapper;
|
||||
/**
|
||||
* Interfaces with Launcher/WindowManager/SystemUI to determine what to show in TaskbarView.
|
||||
*/
|
||||
public class TaskbarController {
|
||||
public class TaskbarController implements TaskbarOverviewProxyDelegate {
|
||||
|
||||
private static final String WINDOW_TITLE = "Taskbar";
|
||||
|
||||
private final TaskbarContainerView mTaskbarContainerView;
|
||||
private final TaskbarView mTaskbarViewInApp;
|
||||
private final TaskbarView mTaskbarViewOnHome;
|
||||
private final ImeBarView mImeBarView;
|
||||
|
||||
private final BaseQuickstepLauncher mLauncher;
|
||||
private final WindowManager mWindowManager;
|
||||
// Layout width and height of the Taskbar in the default state.
|
||||
@@ -92,10 +98,13 @@ public class TaskbarController {
|
||||
mLauncher = launcher;
|
||||
mTaskbarContainerView = taskbarContainerView;
|
||||
mTaskbarContainerView.construct(createTaskbarContainerViewCallbacks());
|
||||
ButtonProvider buttonProvider = new ButtonProvider(launcher);
|
||||
mTaskbarViewInApp = mTaskbarContainerView.findViewById(R.id.taskbar_view);
|
||||
mTaskbarViewInApp.construct(createTaskbarViewCallbacks());
|
||||
mTaskbarViewInApp.construct(createTaskbarViewCallbacks(), buttonProvider);
|
||||
mTaskbarViewOnHome = taskbarViewOnHome;
|
||||
mTaskbarViewOnHome.construct(createTaskbarViewCallbacks());
|
||||
mTaskbarViewOnHome.construct(createTaskbarViewCallbacks(), buttonProvider);
|
||||
mImeBarView = mTaskbarContainerView.findViewById(R.id.ime_bar_view);
|
||||
mImeBarView.construct(buttonProvider);
|
||||
mNavButtonController = new TaskbarNavButtonController(launcher);
|
||||
mWindowManager = mLauncher.getWindowManager();
|
||||
mTaskbarSize = new Point(MATCH_PARENT, mLauncher.getDeviceProfile().taskbarSize);
|
||||
@@ -116,10 +125,20 @@ public class TaskbarController {
|
||||
|
||||
@Override
|
||||
public void updateTaskbarVisibilityAlpha(float alpha) {
|
||||
mTaskbarContainerView.setAlpha(alpha);
|
||||
mTaskbarViewInApp.setAlpha(alpha);
|
||||
mTaskbarViewOnHome.setAlpha(alpha);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateImeBarVisibilityAlpha(float alpha) {
|
||||
if (mNavMode != SysUINavigationMode.Mode.THREE_BUTTONS) {
|
||||
// TODO Remove sysui IME bar for gesture nav as well
|
||||
return;
|
||||
}
|
||||
mImeBarView.setAlpha(alpha);
|
||||
mImeBarView.setVisibility(alpha == 0 ? GONE : VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTaskbarScale(float scale) {
|
||||
mTaskbarViewInApp.setScaleX(scale);
|
||||
@@ -144,16 +163,21 @@ public class TaskbarController {
|
||||
return new TaskbarContainerViewCallbacks() {
|
||||
@Override
|
||||
public void onViewRemoved() {
|
||||
if (mTaskbarContainerView.getChildCount() == 1) {
|
||||
// Only TaskbarView remains.
|
||||
setTaskbarWindowFullscreen(false);
|
||||
// Ensure no other children present (like Folders, etc)
|
||||
for (int i = 0; i < mTaskbarContainerView.getChildCount(); i++) {
|
||||
View v = mTaskbarContainerView.getChildAt(i);
|
||||
if (!((v instanceof TaskbarView) || (v instanceof ImeBarView))){
|
||||
return;
|
||||
}
|
||||
}
|
||||
setTaskbarWindowFullscreen(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTaskbarTouchable() {
|
||||
return mTaskbarContainerView.getAlpha() > AlphaUpdateListener.ALPHA_CUTOFF_THRESHOLD
|
||||
&& mTaskbarViewInApp.getVisibility() == View.VISIBLE
|
||||
&& (mTaskbarViewInApp.getVisibility() == VISIBLE
|
||||
|| mImeBarView.getVisibility() == VISIBLE)
|
||||
&& !mIsAnimatingToLauncher;
|
||||
}
|
||||
};
|
||||
@@ -206,7 +230,7 @@ public class TaskbarController {
|
||||
// space so that the others line up with the home screen hotseat.
|
||||
boolean isOnHomeScreen = taskbarView == mTaskbarViewOnHome
|
||||
|| mLauncher.hasBeenResumed() || mIsAnimatingToLauncher;
|
||||
return isOnHomeScreen ? View.INVISIBLE : View.GONE;
|
||||
return isOnHomeScreen ? INVISIBLE : GONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -246,6 +270,7 @@ public class TaskbarController {
|
||||
mTaskbarViewInApp.init(mHotseatController.getNumHotseatIcons(), mNavMode);
|
||||
mTaskbarViewOnHome.init(mHotseatController.getNumHotseatIcons(), mNavMode);
|
||||
mTaskbarContainerView.init(mTaskbarViewInApp);
|
||||
mImeBarView.init(createTaskbarViewCallbacks());
|
||||
addToWindowManager();
|
||||
mTaskbarStateHandler.setTaskbarCallbacks(createTaskbarStateHandlerCallbacks());
|
||||
mTaskbarAnimationController.init();
|
||||
@@ -287,6 +312,7 @@ public class TaskbarController {
|
||||
mTaskbarViewInApp.cleanup();
|
||||
mTaskbarViewOnHome.cleanup();
|
||||
mTaskbarContainerView.cleanup();
|
||||
mImeBarView.cleanup();
|
||||
removeFromWindowManager();
|
||||
mTaskbarStateHandler.setTaskbarCallbacks(null);
|
||||
mTaskbarAnimationController.cleanup();
|
||||
@@ -410,6 +436,28 @@ public class TaskbarController {
|
||||
*/
|
||||
public void setIsImeVisible(boolean isImeVisible) {
|
||||
mTaskbarAnimationController.animateToVisibilityForIme(isImeVisible ? 0 : 1);
|
||||
blockTaskbarTouchesForIme(isImeVisible);
|
||||
}
|
||||
|
||||
/**
|
||||
* When in 3 button nav, the above doesn't get called since we prevent sysui nav bar from
|
||||
* instantiating at all, which is what's responsible for sending sysui state flags over.
|
||||
*
|
||||
* @param vis IME visibility flag
|
||||
* @param backDisposition Used to determine back button behavior for software keyboard
|
||||
* See BACK_DISPOSITION_* constants in {@link InputMethodService}
|
||||
*/
|
||||
public void updateImeStatus(int displayId, int vis, int backDisposition,
|
||||
boolean showImeSwitcher) {
|
||||
if (displayId != mTaskbarContainerView.getContext().getDisplayId() ||
|
||||
mNavMode != SysUINavigationMode.Mode.THREE_BUTTONS) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean imeVisible = (vis & InputMethodService.IME_VISIBLE) != 0;
|
||||
mTaskbarAnimationController.animateToVisibilityForIme(imeVisible ? 0 : 1);
|
||||
mImeBarView.setImeSwitcherVisibility(showImeSwitcher);
|
||||
blockTaskbarTouchesForIme(imeVisible);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -459,12 +507,17 @@ public class TaskbarController {
|
||||
|
||||
private void setWhichTaskbarViewIsVisible(@Nullable TaskbarView visibleTaskbar) {
|
||||
mTaskbarViewInApp.setVisibility(visibleTaskbar == mTaskbarViewInApp
|
||||
? View.VISIBLE : View.INVISIBLE);
|
||||
? VISIBLE : INVISIBLE);
|
||||
mTaskbarViewOnHome.setVisibility(visibleTaskbar == mTaskbarViewOnHome
|
||||
? View.VISIBLE : View.INVISIBLE);
|
||||
? VISIBLE : INVISIBLE);
|
||||
mLauncher.getHotseat().setIconsAlpha(visibleTaskbar != mTaskbarViewInApp ? 1f : 0f);
|
||||
}
|
||||
|
||||
private void blockTaskbarTouchesForIme(boolean block) {
|
||||
mTaskbarViewOnHome.setTouchesEnabled(!block);
|
||||
mTaskbarViewInApp.setTouchesEnabled(!block);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ratio of the taskbar icon size on home vs in an app.
|
||||
*/
|
||||
@@ -508,6 +561,7 @@ public class TaskbarController {
|
||||
protected interface TaskbarAnimationControllerCallbacks {
|
||||
void updateTaskbarBackgroundAlpha(float alpha);
|
||||
void updateTaskbarVisibilityAlpha(float alpha);
|
||||
void updateImeBarVisibilityAlpha(float alpha);
|
||||
void updateTaskbarScale(float scale);
|
||||
void updateTaskbarTranslationY(float translationY);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user