/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.weex.extend.component; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.support.annotation.NonNull; import android.view.Gravity; import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.PopupWindow; import org.apache.weex.extend.view.WXMaskView; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.dom.CSSShorthand; import com.taobao.weex.dom.WXStyle; import com.taobao.weex.ui.action.BasicComponentData; import com.taobao.weex.ui.component.WXVContainer; import java.util.HashMap; import java.util.Map; /** * Created by lixinke on 2016/12/26. */ public class WXMask extends WXVContainer { private PopupWindow mPopupWindow; private WXMaskView mContainerView; public WXMask(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) { super(instance, parent, basicComponentData); } @Override protected View initComponentHostView(@NonNull Context context) { mContainerView = new WXMaskView(context); mPopupWindow = new PopupWindow(context); mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { mPopupWindow.setAttachedInDecor(true); } //setClippingEnabled(false) will cause INPUT_ADJUST_PAN invalid. //mPopupWindow.setClippingEnabled(false); mPopupWindow.setContentView(mContainerView); mPopupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); mPopupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); mPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); mPopupWindow.setFocusable(true); mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { fireVisibleChangedEvent(false); } }); int y = 0; int statusBarHeight = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = context.getResources().getDimensionPixelSize(resourceId); y = statusBarHeight; } mPopupWindow.showAtLocation(((Activity) context).getWindow().getDecorView(), Gravity.TOP | Gravity.START, 0, y); fireVisibleChangedEvent(true); return mContainerView; } @Override public boolean isVirtualComponent() { return true; } @Override public void removeVirtualComponent() { if (mPopupWindow.isShowing()) { mPopupWindow.dismiss(); } } private void fireVisibleChangedEvent(boolean visible) { Map<String, Object> event = new HashMap<>(1); event.put("visible", visible); fireEvent("visiblechanged", event); } @Override protected void setHostLayoutParams(View host, int width, int height, int left, int right, int top, int bottom) { left = get(LEFT); right = get(RIGHT); top = get(TOP); bottom = get(BOTTOM); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, height); this.setMarginsSupportRTL(params, left, top, right, bottom); getHostView().setLayoutParams(params); } private static final int LEFT = 0; private static final int RIGHT = 1; private static final int TOP = 2; private static final int BOTTOM = 3; private int get(int type) { try { CSSShorthand margin = getMargin(); WXStyle style = getStyles(); switch (type) { case LEFT: return add(style.getLeft(), margin.get(CSSShorthand.EDGE.LEFT)); case RIGHT: return add(style.getRight(), margin.get(CSSShorthand.EDGE.RIGHT)); case TOP: return add(style.getTop(), margin.get(CSSShorthand.EDGE.TOP)); case BOTTOM: return add(style.getBottom(), margin.get(CSSShorthand.EDGE.BOTTOM)); } } catch (Throwable t) { //ignore } return 0; } private int add(float a, float b) { if (Float.isNaN(a)) { a = 0f; } if (Float.isNaN(b)) { b = 0f; } return (int) (a + b); } }