mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-18 02:08:20 +00:00
Folder support in Taskbar
- Add TaskbarActivityContext which allows shared Launcher elements to "just work" using existing generic ActivityContext. - TaskbarContainerView extends BaseDragLayer<TaskbarActivityContext>. - Inflate FolderIcon and Folder using TaskbarActivityContext to be shown in TaskbarContainerView. - Use TaskbarActivityContext's DeviceProfile to determine icon size instead of overriding in styles. This also ensures that normal BubbleTextView icons have the same size as FolderIcons. Test: Place a folder in home screen hotseat, ensure it shows up in taskbar and can be opened, and that apps inside it can be launched or dragged. Bug: 171917176 Change-Id: Ic25d2f84bcd7e3399c88989305ea565497c030d9
This commit is contained in:
@@ -34,11 +34,15 @@ import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.AbstractFloatingView;
|
||||
import com.android.launcher3.BaseQuickstepLauncher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.QuickstepAppTransitionManagerImpl;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.folder.Folder;
|
||||
import com.android.launcher3.folder.FolderIcon;
|
||||
import com.android.launcher3.model.data.FolderInfo;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.touch.ItemClickHandler;
|
||||
@@ -81,8 +85,9 @@ public class TaskbarController {
|
||||
TaskbarContainerView taskbarContainerView) {
|
||||
mLauncher = launcher;
|
||||
mTaskbarContainerView = taskbarContainerView;
|
||||
mTaskbarContainerView.construct(createTaskbarContainerViewCallbacks());
|
||||
mTaskbarView = mTaskbarContainerView.findViewById(R.id.taskbar_view);
|
||||
mTaskbarView.setCallbacks(createTaskbarViewCallbacks());
|
||||
mTaskbarView.construct(createTaskbarViewCallbacks());
|
||||
mWindowManager = mLauncher.getWindowManager();
|
||||
mTaskbarSize = new Point(MATCH_PARENT,
|
||||
mLauncher.getResources().getDimensionPixelSize(R.dimen.taskbar_size));
|
||||
@@ -110,6 +115,18 @@ public class TaskbarController {
|
||||
};
|
||||
}
|
||||
|
||||
private TaskbarContainerViewCallbacks createTaskbarContainerViewCallbacks() {
|
||||
return new TaskbarContainerViewCallbacks() {
|
||||
@Override
|
||||
public void onViewRemoved() {
|
||||
if (mTaskbarContainerView.getChildCount() == 1) {
|
||||
// Only TaskbarView remains.
|
||||
setTaskbarWindowFullscreen(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private TaskbarViewCallbacks createTaskbarViewCallbacks() {
|
||||
return new TaskbarViewCallbacks() {
|
||||
@Override
|
||||
@@ -120,9 +137,29 @@ public class TaskbarController {
|
||||
Task task = (Task) tag;
|
||||
ActivityManagerWrapper.getInstance().startActivityFromRecents(task.key,
|
||||
ActivityOptions.makeBasic());
|
||||
} else if (tag instanceof FolderInfo) {
|
||||
FolderIcon folderIcon = (FolderIcon) view;
|
||||
Folder folder = folderIcon.getFolder();
|
||||
|
||||
setTaskbarWindowFullscreen(true);
|
||||
|
||||
mTaskbarContainerView.post(() -> {
|
||||
folder.animateOpen();
|
||||
|
||||
folder.iterateOverItems((itemInfo, itemView) -> {
|
||||
itemView.setOnClickListener(getItemOnClickListener());
|
||||
itemView.setOnLongClickListener(getItemOnLongClickListener());
|
||||
// To play haptic when dragging, like other Taskbar items do.
|
||||
itemView.setHapticFeedbackEnabled(true);
|
||||
return false;
|
||||
});
|
||||
});
|
||||
} else {
|
||||
ItemClickHandler.INSTANCE.onClick(view);
|
||||
}
|
||||
|
||||
AbstractFloatingView.closeAllOpenViews(
|
||||
mTaskbarContainerView.getTaskbarActivityContext());
|
||||
};
|
||||
}
|
||||
|
||||
@@ -344,6 +381,20 @@ public class TaskbarController {
|
||||
return mTaskbarContainerView.getWindowId().equals(v.getWindowId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the TaskbarContainer to MATCH_PARENT vs original Taskbar size.
|
||||
*/
|
||||
private void setTaskbarWindowFullscreen(boolean fullscreen) {
|
||||
if (fullscreen) {
|
||||
mWindowLayoutParams.width = MATCH_PARENT;
|
||||
mWindowLayoutParams.height = MATCH_PARENT;
|
||||
} else {
|
||||
mWindowLayoutParams.width = mTaskbarSize.x;
|
||||
mWindowLayoutParams.height = mTaskbarSize.y;
|
||||
}
|
||||
mWindowManager.updateViewLayout(mTaskbarContainerView, mWindowLayoutParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* Contains methods that TaskbarStateHandler can call to interface with TaskbarController.
|
||||
*/
|
||||
@@ -360,6 +411,13 @@ public class TaskbarController {
|
||||
void updateTaskbarVisibilityAlpha(float alpha);
|
||||
}
|
||||
|
||||
/**
|
||||
* Contains methods that TaskbarContainerView can call to interface with TaskbarController.
|
||||
*/
|
||||
protected interface TaskbarContainerViewCallbacks {
|
||||
void onViewRemoved();
|
||||
}
|
||||
|
||||
/**
|
||||
* Contains methods that TaskbarView can call to interface with TaskbarController.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user