删除反射使用通过中间宿主来实现

This commit is contained in:
yangyakun
2022-07-01 13:15:21 +08:00
parent dc054393ef
commit a9e13d7fb6
12 changed files with 110 additions and 141 deletions

View File

@@ -1,5 +1,6 @@
package com.mogo.och.taxi.passenger.ui;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
@@ -54,6 +55,8 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
private WeakReference<TaxiPassengerCheckView> mArrivedCheckView;
private WeakReference<TaxiPassengerStartAutopilotView> mStartAutopilotView;
private View vOpenLeft;
protected TaxiPassengerServingOrderFragment ochServingOrderFragment = null;
private Handler mHandler = new Handler(Looper.getMainLooper());
@@ -83,6 +86,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
CallerHmiManager.INSTANCE.setProxyNotificationView(mV2XNotificationView);
mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_iv);
vOpenLeft = findViewById(R.id.v_open_left);
updateSwitchMapIcon();
initListener();
@@ -130,6 +134,9 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
//OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext());
//OverlayViewUtils.showOverlayView(getActivity(),new TaxiPassengerMogoConsultView(getContext()));
});
vOpenLeft.setOnClickListener(v -> OverlayLeftViewUtils.INSTANCE.open());
OverlayLeftViewUtils.INSTANCE.dragTarget(vOpenLeft);
}
private void initArrivedView(){
@@ -223,6 +230,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
@Override
public void onDestroyView() {
super.onDestroyView();
OverlayLeftViewUtils.INSTANCE.removeDragTarget(vOpenLeft);
removeListener();
}

View File

@@ -3,9 +3,9 @@ package com.mogo.och.taxi.passenger.ui.leftmenu
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
import androidx.constraintlayout.widget.ConstraintLayout
class ItemViewTouchListener(
private val windowView: View,
private val wl: WindowManager.LayoutParams,
private val windowManager: WindowManager?,
private val close: (view:View,windowManager: WindowManager?) -> Unit,
@@ -38,16 +38,16 @@ class ItemViewTouchListener(
}
if (wl.x > NEGATIVEDEVIATION && movedX > 0) {
open(view.rootView,windowManager)
open(windowView,windowManager)
}else{
//更新悬浮球控件位置
windowManager?.updateViewLayout(view.rootView, wl)
windowManager?.updateViewLayout(windowView, wl)
}
if (wl.x < OverlayLeftViewUtils.DEVIATION_WIDTH +DEVIATION && movedX < 0) {
close(view.rootView,windowManager)
close(windowView,windowManager)
}else{
//更新悬浮球控件位置
windowManager?.updateViewLayout(view.rootView, wl)
windowManager?.updateViewLayout(windowView, wl)
}
@@ -56,10 +56,10 @@ class ItemViewTouchListener(
val startX = wl.x
if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX < 0) {
//拖动距离大于一半 自动打开
open(view.rootView,windowManager)
open(windowView,windowManager)
} else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) {
// 拖动距离小于一半自动关闭
close(view.rootView,windowManager)
close(windowView,windowManager)
}
if (System.currentTimeMillis() - dragTime > 500) {
dragTime = 0

View File

@@ -7,7 +7,6 @@ import android.app.Activity
import android.content.Context
import android.graphics.PixelFormat
import android.graphics.Rect
import android.graphics.Region
import android.view.*
import android.view.animation.LinearInterpolator
import android.widget.ListView
@@ -19,8 +18,6 @@ import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel
import com.mogo.och.taxi.passenger.ui.video.FullVideoUtils
import com.mogo.och.taxi.passenger.ui.video.TaxiPassengerMogoConsultView
import com.mogo.och.taxi.passenger.ui.video.TaxiPassengerMogoMoviesView
import com.mogo.och.taxi.passenger.utils.windowdispatch.OnComputeInternalInsetsListener
import com.mogo.och.taxi.passenger.utils.windowdispatch.ReflectionUtils
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -40,9 +37,6 @@ object OverlayLeftViewUtils {
@Volatile
private var isShowing = false
private var mInvocationHandler: OnComputeInternalInsetsListener? = null
private val mTouchRegion = Region()
private var params:WindowManager.LayoutParams?=null
const val WIDTH = 810
@@ -57,6 +51,7 @@ object OverlayLeftViewUtils {
private var taxiPassengerMogoMoviesView: TaxiPassengerMogoMoviesView? = null
private var acivOpenClose: AppCompatImageView?=null
private var dragList = mutableListOf<View>()
/**
* 添加覆盖View在Activity上面
@@ -89,7 +84,12 @@ object OverlayLeftViewUtils {
val vDragField = view.findViewById<View>(R.id.v_drag_field)
acivOpenClose = view.findViewById(R.id.aciv_open_close)
vDragField.setOnTouchListener(ItemViewTouchListener(params!!, windowManager, ::close,
dragList.forEach {
it.setOnTouchListener(ItemViewTouchListener(
overlayView!!,params!!, windowManager, ::close,
::open))
}
vDragField.setOnTouchListener(ItemViewTouchListener(overlayView!!,params!!, windowManager, ::close,
::open))
vDragField.setOnClickListener {
val start: Int = params!!.x
@@ -136,26 +136,7 @@ object OverlayLeftViewUtils {
integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_consult_select,R.drawable.taxi_p_mogo_consult_selected,false,consultSelect))
integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_entertainment_select,R.drawable.taxi_p_mogo_entertainment_selected,false,entertainmentSelect))
lvSelectItem.adapter = ListAdapter(context, integers)
view.viewTreeObserver
.addOnGlobalLayoutListener(object :ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() {
mTouchRegion.setEmpty()
mTouchRegion.op(getViewBounds(vDragField), Region.Op.UNION)
mTouchRegion.op(getViewBounds(lvSelectItem), Region.Op.UNION)
mInvocationHandler?.touchRegion = mTouchRegion
view.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
try {
mInvocationHandler =
OnComputeInternalInsetsListener()
ReflectionUtils.removeOnComputeInternalInsetsListener(view.viewTreeObserver)
ReflectionUtils.addOnComputeInternalInsetsListener(
view.viewTreeObserver,
mInvocationHandler?.getListener()
)
mInvocationHandler?.touchRegion = mTouchRegion
windowManager!!.addView(overlayView, params)
isShowing = true
} catch (e: Exception) {
@@ -184,6 +165,10 @@ object OverlayLeftViewUtils {
rotation = 0f
}
closeByTime(overlayView, windowManager)
params?.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
windowManager?.updateViewLayout(overlayView, params)
}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationRepeat(animation: Animator?) {}
@@ -191,6 +176,24 @@ object OverlayLeftViewUtils {
valueAnimator.start()
}
fun open(){
if(isShowing) {
overlayView?.let { open(it, windowManager) }
}
}
fun dragTarget(view :View){
dragList.add(view)
params?.let {
view.setOnTouchListener(ItemViewTouchListener(overlayView!!,params!!, windowManager, ::close,
::open))
}
}
fun removeDragTarget(view: View){
dragList.remove(view)
}
private fun closeByTime(
overlayView: View,
windowManager: WindowManager?
@@ -228,6 +231,11 @@ object OverlayLeftViewUtils {
pivotY = (height /2).toFloat()
rotation = 180f
}
params?.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
windowManager?.updateViewLayout(overlayView, params)
}
override fun onAnimationCancel(animation: Animator?) {}
override fun onAnimationRepeat(animation: Animator?) {}
@@ -243,7 +251,7 @@ object OverlayLeftViewUtils {
it.width = WIDTH
it.height = WindowManager.LayoutParams.MATCH_PARENT
it.alpha = 1.0f
it.gravity = Gravity.START or Gravity.TOP
it.gravity = Gravity.START or Gravity.CENTER_HORIZONTAL
it.x = 0
it.y = 0
it.format = PixelFormat.RGBA_8888

View File

@@ -17,6 +17,7 @@ import com.bumptech.glide.request.transition.Transition
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselLayoutManager
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselZoomPostLayoutListener
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CenterScrollListener
@@ -28,7 +29,6 @@ import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorSlideMode
import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorStyle
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import java.util.*
import kotlin.math.floor
@@ -50,12 +50,19 @@ class TaxiPassengerMogoConsultView :RelativeLayout {
private lateinit var rvVideoPlaylist: RecyclerView
private lateinit var indicatorView: IndicatorView
private lateinit var clContain: ConstraintLayout
private lateinit var vOpenLeft: View
private fun initView(context: Context) {
LayoutInflater.from(context).inflate(R.layout.taxi_p_arrived_mogo_consult, this, true)
rvVideoPlaylist = findViewById(R.id.rv_video_playlist)
indicatorView = findViewById(R.id.indicatorView)
clContain = findViewById(R.id.cl_contain)
vOpenLeft = findViewById(R.id.v_open_left)
vOpenLeft.setOnClickListener {
OverlayLeftViewUtils.open()
}
OverlayLeftViewUtils.dragTarget(vOpenLeft)
val arrayListOf = ArrayList<TaxiPassengerVideoPlay>()
arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v","https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969511280/车队.png","蘑菇车联覆盖生活的方方面面"))
@@ -249,6 +256,7 @@ class TaxiPassengerMogoConsultView :RelativeLayout {
player.onVideoReset()
}
}
OverlayLeftViewUtils.removeDragTarget(vOpenLeft)
super.onDetachedFromWindow()
}

View File

@@ -17,6 +17,7 @@ import com.bumptech.glide.request.transition.Transition
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselLayoutManager
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CarouselZoomPostLayoutListener
import com.mogo.och.taxi.passenger.ui.video.layoutmanage.CenterScrollListener
@@ -50,6 +51,7 @@ class TaxiPassengerMogoMoviesView :RelativeLayout {
private lateinit var rvVideoPlaylist: RecyclerView
private lateinit var indicatorView: IndicatorView
private lateinit var clContain: ConstraintLayout
private lateinit var vOpenLeft: View
private fun initView(context: Context) {
LayoutInflater.from(context).inflate(R.layout.taxi_p_mogo_movies, this, true)
@@ -57,6 +59,12 @@ class TaxiPassengerMogoMoviesView :RelativeLayout {
indicatorView = findViewById(R.id.indicatorView)
clContain = findViewById(R.id.cl_contain)
vOpenLeft = findViewById(R.id.v_open_left)
vOpenLeft.setOnClickListener {
OverlayLeftViewUtils.open()
}
OverlayLeftViewUtils.dragTarget(vOpenLeft)
val arrayListOf = ArrayList<TaxiPassengerVideoPlay>()
arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558672856/小宝宝.mp4","https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559345882/1.png","小宝宝"))
arrayListOf.add(TaxiPassengerVideoPlay("https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558697055/小猫.mp4","https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559367261/2.png","小猫"))
@@ -249,6 +257,7 @@ class TaxiPassengerMogoMoviesView :RelativeLayout {
player.onVideoReset()
}
}
OverlayLeftViewUtils.removeDragTarget(vOpenLeft)
super.onDetachedFromWindow()
}

View File

@@ -1,55 +0,0 @@
package com.mogo.och.taxi.passenger.utils.windowdispatch;
import android.graphics.Region;
import android.inputmethodservice.InputMethodService;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class OnComputeInternalInsetsListener implements InvocationHandler {
private Region touchRegion = null;
public Object getListener() {
Object target = null;
try {
Class class1 = Class.forName("android.view.ViewTreeObserver$OnComputeInternalInsetsListener");
target = Proxy.newProxyInstance(OnComputeInternalInsetsListener.class.getClassLoader(),
new Class[]{class1}, this);
} catch (Exception e) {
e.printStackTrace();
}
return target;
}
public Region getTouchRegion() {
return touchRegion;
}
public void setTouchRegion(Region touchRegion) {
this.touchRegion = touchRegion;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
try {
Field regionField = args[0].getClass()
.getDeclaredField("touchableRegion");
regionField.setAccessible(true);
Field insetField = args[0].getClass()
.getDeclaredField("mTouchableInsets");
insetField.setAccessible(true);
if (touchRegion != null) {
Region region = (Region) regionField.get(args[0]);
region.set(touchRegion);
insetField.set(args[0], InputMethodService.Insets.TOUCHABLE_INSETS_REGION);
} else {
insetField.set(args[0], InputMethodService.Insets.TOUCHABLE_INSETS_FRAME);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

View File

@@ -1,51 +0,0 @@
package com.mogo.och.taxi.passenger.utils.windowdispatch;
import android.view.ViewTreeObserver;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class ReflectionUtils {
private ReflectionUtils() {
}
public static void removeOnComputeInternalInsetsListener(ViewTreeObserver viewTree) {
if (viewTree == null) {
return;
}
try {
Class<?> clazz = Class.forName("android.view.ViewTreeObserver");
Field field = viewTree.getClass().getDeclaredField("mOnComputeInternalInsetsListeners");
field.setAccessible(true);
Object listenerList = field.get(viewTree);
Method method = listenerList.getClass().getDeclaredMethod("getArray");
method.setAccessible(true);
ArrayList<Object> list = (ArrayList<Object>) method.invoke(listenerList);
Class<?> classes[] = {Class.forName("android.view.ViewTreeObserver$OnComputeInternalInsetsListener")};
if (list != null && list.size() > 0) {
clazz.getDeclaredMethod("removeOnComputeInternalInsetsListener", classes).invoke(viewTree,
list.get(0));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void addOnComputeInternalInsetsListener(ViewTreeObserver viewTree, Object object) {
if (viewTree == null) {
return;
}
try {
Class<?> classes[] = {Class.forName("android.view.ViewTreeObserver$OnComputeInternalInsetsListener")};
Class<?> clazz = Class.forName("android.view.ViewTreeObserver");
clazz.getDeclaredMethod("addOnComputeInternalInsetsListener", classes).invoke(viewTree,
object);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -3,6 +3,7 @@ package com.mogo.och.taxi.passenger.widget
import android.app.Activity
import android.content.Context
import android.graphics.Color
import android.os.Build
import android.util.AttributeSet
import android.util.TypedValue
import android.view.Gravity
@@ -19,6 +20,7 @@ import com.mogo.eagle.core.utilcode.util.TimeTransformUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils
import com.mogo.och.taxi.passenger.ui.video.FullVideoUtils
import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack
import com.shuyu.gsyvideoplayer.utils.GSYVideoType
@@ -42,6 +44,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
private lateinit var totalTimeTextView: TextView
private lateinit var aivStartPlay: AppCompatImageView
private lateinit var layoutBottom: ConstraintLayout
private lateinit var vPpenLeft: View
private var fullVideoPlayer:ConsultVideoPlayer?=null
var smalllPlayer:ConsultVideoPlayer?=null
@@ -71,6 +74,12 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL)
aivStartPlay.scaleX = 0.8f
aivStartPlay.scaleY = 0.8f
vPpenLeft = findViewById(R.id.v_open_left)
vPpenLeft.setOnClickListener {
OverlayLeftViewUtils.open()
}
OverlayLeftViewUtils.dragTarget(vPpenLeft)
}
override fun getLayoutId(): Int {
@@ -163,6 +172,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
setVideoAllCallBack(null)
}
dismissProgressDialog()
OverlayLeftViewUtils.removeDragTarget(vPpenLeft)
super.onDetachedFromWindow()
}

View File

@@ -61,6 +61,14 @@
app:vpi_slider_radius="@dimen/dp_20"
app:vpi_style="round_rect" />
<View
android:id="@+id/v_open_left"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="143px"
android:layout_height="308px"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -28,6 +28,14 @@
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/v_open_left"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="143px"
android:layout_height="308px"/>
<ImageView
android:id="@+id/module_och_taxi_swich_map_iv"
android:layout_width="@dimen/module_mogo_och_operation_status_bg_width"

View File

@@ -62,6 +62,14 @@
app:vpi_slider_radius="@dimen/dp_20"
app:vpi_style="round_rect" />
<View
android:id="@+id/v_open_left"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="143px"
android:layout_height="308px"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -124,4 +124,12 @@
android:textColor="@android:color/white"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/v_open_left"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_width="143px"
android:layout_height="308px"/>
</androidx.constraintlayout.widget.ConstraintLayout>