Skip to content

Commit

Permalink
feat(layer-core): 重构按键拦截实现
Browse files Browse the repository at this point in the history
  • Loading branch information
goweii committed Oct 15, 2023
1 parent e5bd038 commit 258c2d1
Show file tree
Hide file tree
Showing 4 changed files with 272 additions and 44 deletions.
66 changes: 66 additions & 0 deletions layer-core/src/main/java/per/goweii/layer/core/DecorLayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Build;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.FrameLayout;

import androidx.annotation.CallSuper;
Expand All @@ -15,6 +17,7 @@
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import per.goweii.layer.core.listener.WindowCallbackDelegate;
import per.goweii.layer.core.utils.Utils;

public class DecorLayer extends FrameLayer {
Expand Down Expand Up @@ -81,6 +84,14 @@ public LayoutInflater getLayoutInflater() {
return LayoutInflater.from(mActivity);
}

@NonNull
@Override
protected LayerRootLayout createLayerRootLayout() {
final LayerRootLayout layerRootLayout = super.createLayerRootLayout();
layerRootLayout.addOnAttachStateChangeListener(new LayerRootLayoutOnAttachStateChangeListenerImpl(getActivity(), layerRootLayout));
return layerRootLayout;
}

@CallSuper
@Override
protected void onAttach() {
Expand Down Expand Up @@ -182,6 +193,60 @@ public void dismiss(boolean withAnim) {
}
}

@NonNull
@Override
public Layer setInterceptKeyEvent(boolean intercept) {
getConfig().mInterceptKeyEventDispatch = intercept;
return super.setInterceptKeyEvent(false);
}

private static class LayerRootLayoutOnAttachStateChangeListenerImpl implements View.OnAttachStateChangeListener {
private final Activity mActivity;
private final LayerRootLayout mLayerRootLayout;

private WindowCallbackDelegate mWindowCallbackDelegate = null;
private Window.Callback mOldWindowCallback = null;

private LayerRootLayoutOnAttachStateChangeListenerImpl(@NonNull Activity activity, @NonNull LayerRootLayout layerRootLayout) {
mActivity = activity;
mLayerRootLayout = layerRootLayout;
}

@Override
public void onViewAttachedToWindow(View v) {
final Window window = mActivity.getWindow();
mOldWindowCallback = window.getCallback();
mWindowCallbackDelegate = new WindowCallbackDelegateImpl(mOldWindowCallback, mLayerRootLayout);
window.setCallback(mWindowCallbackDelegate);
}

@Override
public void onViewDetachedFromWindow(View v) {
final Window window = mActivity.getWindow();
window.setCallback(mOldWindowCallback);
mOldWindowCallback = null;
mWindowCallbackDelegate = null;
}
}

private static class WindowCallbackDelegateImpl extends WindowCallbackDelegate {
private final LayerRootLayout mLayerRootLayout;

public WindowCallbackDelegateImpl(@NonNull Window.Callback callback,
@NonNull LayerRootLayout layerRootLayout) {
super(callback);
mLayerRootLayout = layerRootLayout;
}

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (mLayerRootLayout.dispatchKeyEventFromWindow(event)) {
return true;
}
return super.dispatchKeyEvent(event);
}
}

public static class ViewHolder extends FrameLayer.ViewHolder {
private FrameLayout mActivityContent;
private View mDecorChild;
Expand Down Expand Up @@ -210,6 +275,7 @@ public FrameLayout getActivityContent() {
}

protected static class Config extends FrameLayer.Config {
private boolean mInterceptKeyEventDispatch = false;
}

protected static class ListenerHolder extends FrameLayer.ListenerHolder {
Expand Down
95 changes: 55 additions & 40 deletions layer-core/src/main/java/per/goweii/layer/core/FrameLayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Configuration;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
Expand Down Expand Up @@ -119,31 +120,6 @@ protected void onGlobalLayout() {
ensureLayerLayoutIsFront();
}

@Override
protected boolean onKeyBack() {
LayerRootLayout layerRootLayout = getViewHolder().getLayerRootLayout();
if (layerRootLayout != null) {
for (int i = layerRootLayout.getChildCount() - 1; i >= 0; i--) {
View layerRootChild = layerRootLayout.getChildAt(i);
if (layerRootChild instanceof LayerLevelLayout) {
LayerLevelLayout layerLevelLayout = (LayerLevelLayout) layerRootChild;
for (int j = layerLevelLayout.getChildCount() - 1; j >= 0; j--) {
View layerLevelChild = layerLevelLayout.getChildAt(j);
Object tag = layerLevelChild.getTag(R.id.layer_tag);
if (tag instanceof Layer) {
Layer layer = (Layer) tag;
if (layer.isCancelableOnKeyBack()) {
layer.dismiss();
return true;
}
}
}
}
}
}
return super.onKeyBack();
}

@NonNull
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
return new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
Expand All @@ -163,7 +139,7 @@ public FrameLayer setCancelableOnClickKeyBack(boolean cancelable) {
}

@NonNull
private ViewGroup installParent() {
protected ViewGroup installParent() {
LayerRootLayout layerRootLayout = findLayerRootLayoutFromRoot();
if (layerRootLayout == null) layerRootLayout = tryGetLayerRootLayoutFormHolder();
if (layerRootLayout == null) layerRootLayout = createLayerRootLayout();
Expand All @@ -186,7 +162,7 @@ private ViewGroup installParent() {
return layerLevelLayout;
}

private void uninstallParent() {
protected void uninstallParent() {
final LayerRootLayout layerRootLayout = findLayerRootLayoutFromRoot();
if (layerRootLayout == null) return;
layerRootLayout.unregisterOnConfigurationChangedListener(mOnConfigurationChangedListener);
Expand Down Expand Up @@ -233,15 +209,15 @@ protected LayerRootLayout findLayerRootLayoutFromRoot() {
}

@Nullable
private LayerRootLayout tryGetLayerRootLayoutFormHolder() {
protected LayerRootLayout tryGetLayerRootLayoutFormHolder() {
if (getViewHolder().getLayerRootLayout() == null) return null;
LayerRootLayout layerRootLayout = getViewHolder().getLayerRootLayout();
Utils.removeViewParent(layerRootLayout);
return layerRootLayout;
}

@NonNull
private LayerRootLayout createLayerRootLayout() {
protected LayerRootLayout createLayerRootLayout() {
final ViewGroup root = getViewHolder().getRoot();
LayerRootLayout layerRootLayout = new LayerRootLayout(root.getContext());
layerRootLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Expand All @@ -261,7 +237,7 @@ protected LayerLevelLayout findLayerLevelLayoutFromLayerLayout(@NonNull LayerRoo
}

@Nullable
private LayerLevelLayout tryGetLayerLevelLayoutFormHolder() {
protected LayerLevelLayout tryGetLayerLevelLayoutFormHolder() {
if (getViewHolder().getLayerLevelLayout() == null) {
return null;
}
Expand All @@ -278,7 +254,7 @@ private LayerLevelLayout tryGetLayerLevelLayoutFormHolder() {
}

@NonNull
private LayerLevelLayout createLayerLevelLayout() {
protected LayerLevelLayout createLayerLevelLayout() {
final ViewGroup root = getViewHolder().getRoot();
LayerLevelLayout layerLevelLayout = new LayerLevelLayout(root.getContext(), getRealLevel());
layerLevelLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Expand Down Expand Up @@ -364,13 +340,26 @@ public LayerRootLayout(@NonNull Context context) {
super(context);
}

public boolean dispatchKeyEventFromWindow(@NonNull KeyEvent event) {
for (Layer layer : getLayers()) {
if (layer.onKeyEvent(event)) {
return true;
}
final View child = layer.getViewHolder().getChildOrNull();
if (child != null && child.dispatchKeyEvent(event)) {
return true;
}
}
return false;
}

@Nullable
public LayerLevelLayout findLevelLayout(int level) {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
final View child = getChildAt(i);
if (child instanceof LayerLevelLayout) {
LayerLevelLayout layerLevelLayout = (LayerLevelLayout) child;
final LayerLevelLayout layerLevelLayout = (LayerLevelLayout) child;
if (level == layerLevelLayout.getLevel()) {
return layerLevelLayout;
}
Expand Down Expand Up @@ -421,13 +410,26 @@ protected void unregisterOnConfigurationChangedListener(@NonNull OnConfiguration
mOnConfigurationChangedListeners.remove(listener);
}

@Nullable
public Layer getTopLayer() {
final int childCount = getChildCount();
if (childCount > 0) {
final View view = getChildAt(childCount - 1);
if (view instanceof LayerLevelLayout) {
final LayerLevelLayout layerLevelLayout = (LayerLevelLayout) view;
return layerLevelLayout.getTopLayer();
}
}
return null;
}

@NonNull
public List<Layer> getLayers() {
List<Layer> layers = new LinkedList<>();
final List<Layer> layers = new LinkedList<>();
for (int i = getChildCount() - 1; i >= 0; i--) {
View view = getChildAt(i);
final View view = getChildAt(i);
if (view instanceof LayerLevelLayout) {
LayerLevelLayout layerLevelLayout = (LayerLevelLayout) view;
final LayerLevelLayout layerLevelLayout = (LayerLevelLayout) view;
layers.addAll(layerLevelLayout.getLayers());
}
}
Expand Down Expand Up @@ -466,14 +468,27 @@ public int compareTo(LayerLevelLayout o) {
return mLevel - mOtherLevel;
}

@Nullable
public Layer getTopLayer() {
final int childCount = getChildCount();
if (childCount > 0) {
final View view = getChildAt(childCount - 1);
final Object tag = view.getTag(R.id.layer_tag);
if (tag instanceof Layer) {
return (Layer) tag;
}
}
return null;
}

@NonNull
public List<Layer> getLayers() {
List<Layer> layers = new LinkedList<>();
final List<Layer> layers = new LinkedList<>();
for (int i = getChildCount() - 1; i >= 0; i--) {
View view = getChildAt(i);
Object tag = view.getTag(R.id.layer_tag);
final View view = getChildAt(i);
final Object tag = view.getTag(R.id.layer_tag);
if (tag instanceof Layer) {
Layer layer = (Layer) tag;
final Layer layer = (Layer) tag;
layers.add(layer);
}
}
Expand Down
10 changes: 6 additions & 4 deletions layer-core/src/main/java/per/goweii/layer/core/Layer.java
Original file line number Diff line number Diff line change
Expand Up @@ -246,9 +246,9 @@ protected Animator onCreateOutAnimator(@NonNull View view) {
return null;
}

protected boolean onKeyEvent(int keyCode, @NonNull KeyEvent event) {
protected boolean onKeyEvent(@NonNull KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
return onKeyBack();
}
}
Expand Down Expand Up @@ -504,7 +504,9 @@ public boolean isInterceptKeyEvent() {

@NonNull
public Layer setCancelableOnKeyBack(boolean cancelable) {
setInterceptKeyEvent(true);
if (cancelable) {
setInterceptKeyEvent(true);
}
mConfig.mCancelableOnKeyBack = cancelable;
return this;
}
Expand Down Expand Up @@ -932,7 +934,7 @@ public boolean onPreDraw() {
private class OnViewKeyListener implements ViewManager.OnKeyListener {
@Override
public boolean onKey(int keyCode, KeyEvent keyEvent) {
return Layer.this.onKeyEvent(keyCode, keyEvent);
return Layer.this.onKeyEvent(keyEvent);
}
}

Expand Down
Loading

0 comments on commit 258c2d1

Please sign in to comment.