/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.exalm.tabletkat.statusbar.policy; import android.content.Context; import android.graphics.Region; import android.util.AttributeSet; import android.view.View; import android.view.ViewTreeObserver; import de.robv.android.xposed.XposedHelpers; public class EventHole extends View implements ViewTreeObserver.OnComputeInternalInsetsListener { private static final String TAG = "StatusBar.EventHole"; private boolean mWindowVis; private int[] mLoc = new int[2]; public EventHole(Context context, AttributeSet attrs) { this(context, attrs, 0); } public EventHole(Context context, AttributeSet attrs, int defStyle) { super(context, attrs); } @Override protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); mWindowVis = visibility == View.VISIBLE; } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); XposedHelpers.callMethod(getViewTreeObserver(), "addOnComputeInternalInsetsListener", this); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); XposedHelpers.callMethod(getViewTreeObserver(), "removeOnComputeInternalInsetsListener", this); } public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { final boolean visible = isShown() && mWindowVis && getWidth() > 0 && getHeight() > 0; final int[] loc = mLoc; getLocationInWindow(loc); final int l = loc[0]; final int r = l + getWidth(); final int t = loc[1]; final int b = t + getHeight(); View top = this; while (top.getParent() instanceof View) { top = (View)top.getParent(); } if (visible) { info.setTouchableInsets( ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); info.touchableRegion.set(0, 0, top.getWidth(), top.getHeight()); info.touchableRegion.op(l, t, r, b, Region.Op.DIFFERENCE); } else { info.setTouchableInsets( ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME); } } }