diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java index d5349b69ed..c69f939b09 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java @@ -54,7 +54,7 @@ public class TaxiPassengerServiceManager { */ private String getDriverAppSn(){ if(DebugConfig.isDebug()){ - return CallerTelematicManager.INSTANCE.getServerToken(); + return "X20202205051RD29W4"; }else { return CallerTelematicManager.INSTANCE.getServerToken(); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java index f74e961db2..4f5b89c8f6 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java @@ -27,6 +27,8 @@ import com.mogo.module.common.constants.DataTypes; import com.mogo.och.common.module.wigets.OCHBorderShadowLayout; import com.mogo.och.taxi.passenger.R; import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter; +import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils; +import com.mogo.och.taxi.passenger.ui.video.TaxiPassengerMogoConsultView; import java.lang.ref.WeakReference; @@ -127,9 +129,12 @@ public class TaxiPassengerBaseFragment extends MvpFragment { + //OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity()); //showOrHideArrivedEndLayout(true, "北京北京北京", "1527481606997577728"); //showOrHidePressengerCheckPager(true, "开始站点开", "开始站点开始站点开始", "2", "京A888888", "18811539480"); - //CallerHmiManager.INSTANCE.showToolsView(); + //OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext()); + OverlayViewUtils.showOverlayView(getActivity(),new TaxiPassengerMogoConsultView(getContext())); + ToastUtils.showShort("测试点击"); }); mStartAutopilotBtn.setOnClickListener(view -> { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ItemViewTouchListener.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ItemViewTouchListener.kt new file mode 100644 index 0000000000..9ae678ff78 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ItemViewTouchListener.kt @@ -0,0 +1,65 @@ +package com.mogo.och.taxi.passenger.ui.leftmenu + +import android.view.MotionEvent +import android.view.View +import android.view.WindowManager + +class ItemViewTouchListener( + private val wl: WindowManager.LayoutParams, + private val windowManager: WindowManager? +) : + View.OnTouchListener { + private var x = 0 + private var dragTime = 0L + private val DEVIATION = 10 + private val NEGATIVEDEVIATION = -10 + override fun onTouch(view: View, motionEvent: MotionEvent): Boolean { + when (motionEvent.action) { + MotionEvent.ACTION_DOWN -> { + x = motionEvent.rawX.toInt() + dragTime = System.currentTimeMillis() + } + MotionEvent.ACTION_MOVE -> { + val nowX = motionEvent.rawX.toInt() + val movedX = nowX - x + x = nowX + wl.apply { + x += movedX + } + if (wl.x > 0 || wl.x < OverlayLeftViewUtils.DEVIATION_WIDTH) { + wl.apply { + x -= movedX + } + return false + } + if (wl.x > NEGATIVEDEVIATION && movedX > 0) { + wl.x = 0 + } + if (wl.x < OverlayLeftViewUtils.DEVIATION_WIDTH +DEVIATION && movedX < 0) { + wl.x = OverlayLeftViewUtils.DEVIATION_WIDTH + } + + //更新悬浮球控件位置 + windowManager?.updateViewLayout(view.rootView, wl) + } + MotionEvent.ACTION_UP -> { + val startX = wl.x + if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX < 0) { + wl.x = 0 + windowManager?.updateViewLayout(view.rootView, wl) + } else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) { + wl.x = OverlayLeftViewUtils.DEVIATION_WIDTH + windowManager?.updateViewLayout(view.rootView, wl) + } + if (System.currentTimeMillis() - dragTime > 500) { + dragTime = 0 + return true + } + } + else -> { + + } + } + return false + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ListAdapter.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ListAdapter.kt new file mode 100644 index 0000000000..0b77d23ef7 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/ListAdapter.kt @@ -0,0 +1,41 @@ +package com.mogo.och.taxi.passenger.ui.leftmenu + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import android.widget.BaseAdapter +import android.widget.ImageView +import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel + +class ListAdapter(private val context: Context,val list: MutableList) : BaseAdapter() { + + override fun getCount(): Int { + return list.size + } + + override fun getItem(position: Int): Any { + return list[position] + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val imageView = ImageView(context) + val leftMenuModel = list[position] + if (leftMenuModel.isChecked) { + imageView.setImageResource(leftMenuModel.selected) + } else { + imageView.setImageResource(leftMenuModel.select) + } + imageView.setOnClickListener { + for (i in list.indices) { + list[i].isChecked = position == i + } + notifyDataSetChanged() + } + return imageView + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt new file mode 100644 index 0000000000..9b4633f3e0 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt @@ -0,0 +1,171 @@ +package com.mogo.och.taxi.passenger.ui.leftmenu + +import android.annotation.SuppressLint +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.widget.ListView +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.taxi.passenger.R +import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel +import com.mogo.och.taxi.passenger.utils.windowdispatch.OnComputeInternalInsetsListener +import com.mogo.och.taxi.passenger.utils.windowdispatch.ReflectionUtils + +/** + * 遮罩层工具类 + * + * @author mogoauto + */ +@SuppressLint("StaticFieldLeak") +object OverlayLeftViewUtils { + private const val TAG = "OverlayViewUtils" + private var windowManager: WindowManager? = null + private var applicationContext: Context? = null + + @Volatile + private var isShowing = false + + + private var mInvocationHandler: OnComputeInternalInsetsListener? = null + private val mTouchRegion = Region() + private var params:WindowManager.LayoutParams?=null + + const val WIDTH = 810 + const val DEVIATION_WIDTH = -669 + + + /** + * 记录上一次的View + */ + private var lastOverlayView: View? = null + + /** + * 添加覆盖View在Activity上面 + */ + @JvmOverloads + fun showOverlayView(context: Activity, ani: Int = -1) { + if (applicationContext == null) { + applicationContext = context.applicationContext + } + if (windowManager == null) { + windowManager = context.windowManager + } + val overlayView = LayoutInflater.from(context) + .inflate(R.layout.taxi_p_window_float_interphone, null) as ConstraintLayout + // 设置View显示模式,沉浸式的侵入到状态栏,导航栏 + overlayView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_LAYOUT_STABLE + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) + layoutParams(ani) + + // 如果正在展示中,并且lastOverlayView不为null,先做移除操作,保证覆盖在最上面的View只有一个,防止叠加导致无法移除 + if (lastOverlayView != null) { + dismissOverlayView(lastOverlayView) + } + val vDragField = overlayView.findViewById(R.id.v_drag_field) + vDragField.setOnTouchListener(ItemViewTouchListener(params!!, windowManager)) + vDragField.setOnClickListener { + val start: Int = params!!.x + if (start > DEVIATION_WIDTH /2 && start < 10) { + params?.x = DEVIATION_WIDTH + windowManager?.updateViewLayout(overlayView, params) + } else if (start < DEVIATION_WIDTH /2 && start >= DEVIATION_WIDTH) { + params?.x = 0 + windowManager?.updateViewLayout(overlayView, params) + } + } + + val lvSelectItem = overlayView.findViewById(R.id.lv_select_item) + val integers = mutableListOf() + integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_live_selected,R.drawable.taxi_p_mogo_live_selected,true)) + integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_overview_selected,R.drawable.taxi_p_mogo_overview_selected,false)) + integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_consult_select,R.drawable.taxi_p_mogo_consult_selected,false)) + integers.add(LeftMenuModel(R.drawable.taxi_p_mogo_entertainment_select,R.drawable.taxi_p_mogo_entertainment_selected,false)) + lvSelectItem.adapter = ListAdapter(context, integers) + + overlayView.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 + overlayView.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + }) + try { + lastOverlayView = overlayView + mInvocationHandler = + OnComputeInternalInsetsListener() + ReflectionUtils.removeOnComputeInternalInsetsListener(overlayView.viewTreeObserver) + ReflectionUtils.addOnComputeInternalInsetsListener( + overlayView.viewTreeObserver, + mInvocationHandler?.getListener() + ) + mInvocationHandler?.touchRegion = mTouchRegion + windowManager!!.addView(overlayView, params) + isShowing = true + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun layoutParams(ani: Int) { + if(params ==null) { + params = WindowManager.LayoutParams() + } + params?.let { + it.width = WIDTH + it.height = WindowManager.LayoutParams.MATCH_PARENT + it.alpha = 1.0f + it.gravity = Gravity.START or Gravity.TOP + it.x = DEVIATION_WIDTH + it.y = 0 + it.format = PixelFormat.RGBA_8888 + // 设置窗口类型为应用子窗口,和PopupWindow同类型 + it.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL + // 没有边界限制,允许窗口扩展到屏幕外 + it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + if (ani != -1) { + it.windowAnimations = ani + } + } + } + + /** + * 移除覆盖View在Activity上面 + */ + fun dismissOverlayView(overlayView: View?) { + if (!isShowing) { + return + } + try { + if (windowManager != null && overlayView != null) { + windowManager!!.removeView(overlayView) + } + if (lastOverlayView != null && lastOverlayView === overlayView) { + lastOverlayView = null + } + isShowing = false + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun getViewBounds(view: View): Rect { + CallerLogger.e( + SceneConstant.M_TAXI_P + "ItemViewTouchListener", + "点击的位置${view.left}----${view.top}---${view.right}-----${view.bottom}" + ) + return Rect(view.left, view.top, view.right, view.bottom) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/model/LeftMenuModel.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/model/LeftMenuModel.kt new file mode 100644 index 0000000000..961788a959 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/model/LeftMenuModel.kt @@ -0,0 +1,7 @@ +package com.mogo.och.taxi.passenger.ui.leftmenu.model + +data class LeftMenuModel( + val select: Int, + val selected: Int, + var isChecked: Boolean +) \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerItemVideoHolder.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerItemVideoHolder.java new file mode 100644 index 0000000000..17c96f4e08 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerItemVideoHolder.java @@ -0,0 +1,47 @@ +package com.mogo.och.taxi.passenger.ui.video; + +import android.content.Context; +import android.view.View; +import android.widget.ImageView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.och.taxi.passenger.R; +import com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer; +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder; + +public class RecyclerItemVideoHolder extends RecyclerView.ViewHolder { + + public final static String TAG = "RecyclerView2List"; + + protected Context context; + + ConsultVideoPlayer gsyVideoPlayer; + + ImageView imageView; + + GSYVideoOptionBuilder gsyVideoOptionBuilder; + + public RecyclerItemVideoHolder(Context context, View v) { + super(v); + this.context = context; + gsyVideoPlayer = v.findViewById(R.id.video_item_player); + imageView = new ImageView(context); + gsyVideoOptionBuilder = new GSYVideoOptionBuilder(); + } + + public void onBind(final int position, String videoModel) { + + String url; + if (position % 2 == 0) { + url = "https://pointshow.oss-cn-hangzhou.aliyuncs.com/McTk51586843620689.mp4"; + } else { + url = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4"; + } + gsyVideoOptionBuilder.setUrl(url).setCacheWithPlay(false).setPlayTag("NoticeTrafficDialog") + .build(gsyVideoPlayer); + gsyVideoPlayer.getStartButton().performClick(); + + } + +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerVideoAdapter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerVideoAdapter.java new file mode 100644 index 0000000000..ad0ae64c7f --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/RecyclerVideoAdapter.java @@ -0,0 +1,53 @@ +package com.mogo.och.taxi.passenger.ui.video; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.och.taxi.passenger.R; + +import java.util.List; + +public class RecyclerVideoAdapter extends RecyclerView.Adapter { + private final static String TAG = "RecyclerBaseAdapter"; + + private List itemDataList = null; + private Context context = null; + + public RecyclerVideoAdapter(Context context, List itemDataList) { + this.itemDataList = itemDataList; + this.context = context; + } + + @NonNull + @Override + public RecyclerItemVideoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(context).inflate(R.layout.list_video_item_normal, parent, false); + return new RecyclerItemVideoHolder(context, v); + } + + @Override + public void onBindViewHolder(@NonNull final RecyclerItemVideoHolder holder, int position) { + holder.onBind(position, itemDataList.get(position)); + } + + @Override + public int getItemCount() { + return itemDataList.size(); + } + + + @Override + public int getItemViewType(int position) { + return 1; + } + + public void setListData(List data) { + itemDataList = data; + notifyDataSetChanged(); + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoConsultView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoConsultView.kt new file mode 100644 index 0000000000..322f82a2a5 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoConsultView.kt @@ -0,0 +1,71 @@ +package com.mogo.och.taxi.passenger.ui.video + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.RelativeLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.taxi.passenger.R +import io.reactivex.disposables.Disposable + + +/** + * + * 蘑菇咨询 + * Created on 2022/5/16 + */ +class TaxiPassengerMogoConsultView :RelativeLayout { + + constructor(context: Context?) : super(context) + + constructor(context: Context?, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) + + constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) + + + private lateinit var rvVideoPlaylist: RecyclerView + + private var subscribe: Disposable?=null + + private fun initView(context: Context) { + d(SceneConstant.M_TAXI_P + TAG, "initView") + LayoutInflater.from(context).inflate(R.layout.taxi_p_arrived_mogo_consult, this, true) + rvVideoPlaylist = findViewById(R.id.rv_video_playlist) + + val arrayListOf = ArrayList() + arrayListOf.add("") + arrayListOf.add("") + val recyclerVideoAdapter = RecyclerVideoAdapter(context, arrayListOf) + val linearLayoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + rvVideoPlaylist.layoutManager = linearLayoutManager + rvVideoPlaylist.adapter = recyclerVideoAdapter + } + + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + subscribe?.let { + if (!it.isDisposed) { + it.dispose() + } + } + } + + companion object { + const val TAG = "TaxiPassengerMogoConsultView" + } + + init { + try { + initView(context) + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/OnComputeInternalInsetsListener.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/OnComputeInternalInsetsListener.java new file mode 100644 index 0000000000..6fd67ae232 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/OnComputeInternalInsetsListener.java @@ -0,0 +1,55 @@ +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; + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/ReflectionUtils.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/ReflectionUtils.java new file mode 100755 index 0000000000..1ade41a62d --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/windowdispatch/ReflectionUtils.java @@ -0,0 +1,51 @@ +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 list = (ArrayList) 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(); + } + } + +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/widget/ConsultVideoPlayer.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/widget/ConsultVideoPlayer.kt new file mode 100644 index 0000000000..da85038f80 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/widget/ConsultVideoPlayer.kt @@ -0,0 +1,224 @@ +package com.mogo.och.taxi.passenger.widget + +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.view.Surface +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import com.mogo.eagle.core.utilcode.util.TimeTransformUtils +import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider +import com.mogo.och.taxi.passenger.R +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer +import com.shuyu.gsyvideoplayer.video.base.GSYVideoView +import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge + +/** + * @author lixiaopeng + * @since 2021/11/3 + * + * 视频播放器,ui定制 + */ +class ConsultVideoPlayer : StandardGSYVideoPlayer { + + companion object { + const val PLAY_EVT_PLAY_LOADING = 1000 + const val PLAY_EVT_PLAY_BEGIN = 2000 + const val PLAY_EVT_PLAY_ERROR = 3000 + } + + private var playListener: PlayListener? = null + private lateinit var start: ImageView + private lateinit var coverImage: ImageView + private lateinit var currentTimeTextView: TextView + private lateinit var totalTimeTextView: TextView + + interface PlayListener { + fun onPlayEvent(event: Int) + } + + constructor(context: Context?) : super(context) + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context?, fullFlag: Boolean?) : super(context, fullFlag) + + override fun init(context: Context) { + super.init(context) + start = findViewById(R.id.start) + coverImage = findViewById(R.id.thumbImage) + currentTimeTextView = findViewById(R.id.current) + totalTimeTextView = findViewById(R.id.total) + + if (mThumbImageViewLayout != null + && (mCurrentState == -1 || mCurrentState == CURRENT_STATE_NORMAL || mCurrentState == CURRENT_STATE_ERROR) + ) { + mThumbImageViewLayout.visibility = View.VISIBLE + } + GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9) + } + + override fun getLayoutId(): Int { + return R.layout.taxi_p_video_show + } + + override fun getGSYVideoManager(): GSYVideoViewBridge { + GSYVideoManager.instance().initContext(context.applicationContext) + return GSYVideoManager.instance() + } + + override fun updateStartImage() { + when (mCurrentState) { + GSYVideoView.CURRENT_STATE_PLAYING -> + start.setImageResource(R.drawable.notice_video_pause) + GSYVideoView.CURRENT_STATE_ERROR -> + start.setImageResource(R.drawable.notice_video_pause) + else -> start.setImageResource(R.drawable.notice_video_after_pause) + } + } + + override fun setProgressAndTime( + progress: Int, + secProgress: Int, + currentTime: Int, + totalTime: Int, + forceChange: Boolean + ) { + super.setProgressAndTime(progress, secProgress, currentTime, totalTime, forceChange) + mBottomContainer?.visibility = View.VISIBLE + mProgressBar?.visibility = View.VISIBLE + start.visibility = View.VISIBLE + //时间显示 + currentTimeTextView.text = TimeTransformUtils.stringForTime(currentTime) + totalTimeTextView.text = TimeTransformUtils.stringForTime(totalTime) + + if (progress != 0) { + mProgressBar?.progress = progress + } + } + + fun setPlayListener(listener: PlayListener) { + this.playListener = listener + } + + override fun changeUiToCompleteShow() { + super.changeUiToCompleteShow() + } + + override fun hideAllWidget() { + super.hideAllWidget() + mBottomContainer?.visibility = View.VISIBLE + mProgressBar?.visibility = View.VISIBLE + start?.visibility = View.VISIBLE + start.setImageResource(R.drawable.notice_video_pause) + } + + override fun changeUiToPrepareingClear() { + super.changeUiToPrepareingClear() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun changeUiToPlayingBufferingClear() { + super.changeUiToPlayingBufferingClear() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + + } + +// override fun changeUiToClear() { +// super.changeUiToClear() +// } + + override fun changeUiToCompleteClear() { + super.changeUiToCompleteClear() + mBottomContainer?.visibility = View.INVISIBLE + mProgressBar?.visibility = View.GONE + } + + override fun onAutoCompletion() { + super.onAutoCompletion() + } + + override fun showWifiDialog() { + //直接播放,不显示WIFI对话框 + startPlayLogic() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + mProgressBar?.progress = 0 + mFullPauseBitmap = null + } + + override fun onClick(v: View?) { + super.onClick(v) + } + + override fun onCompletion() { + mBottomContainer?.visibility = View.VISIBLE + mProgressBar?.visibility = View.VISIBLE + start.visibility = View.VISIBLE + start.setImageResource(R.drawable.notice_video_after_pause) + + isPostBufferUpdate = false + } + + override fun onSurfaceUpdated(surface: Surface) { + super.onSurfaceUpdated(surface) + if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { + mThumbImageViewLayout.visibility = View.INVISIBLE + } + } + + override fun onPrepared() { + super.onPrepared() + + playListener?.onPlayEvent(PLAY_EVT_PLAY_LOADING) + } + + private var isPostBufferUpdate = false + + override fun onBufferingUpdate(percent: Int) { + super.onBufferingUpdate(percent) + if (!isPostBufferUpdate && percent == 0) { + isPostBufferUpdate = true + playListener?.onPlayEvent(PLAY_EVT_PLAY_BEGIN) + } + } + + override fun onError(what: Int, extra: Int) { + super.onError(what, extra) + playListener?.onPlayEvent(PLAY_EVT_PLAY_ERROR) + isPostBufferUpdate = false + } + + override fun setViewShowState(view: View?, visibility: Int) { + if (view === mThumbImageViewLayout && visibility != View.VISIBLE) { + return + } + super.setViewShowState(view, visibility) + } + + override fun onSurfaceAvailable(surface: Surface) { + super.onSurfaceAvailable(surface) + mProgressBar?.visibility = View.GONE + if (GSYVideoType.getRenderType() != GSYVideoType.TEXTURE) { + if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { + mThumbImageViewLayout.visibility = View.INVISIBLE + } + } + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + if (!mIfCurrentIsFullscreen) { + this.outlineProvider = TextureVideoViewOutlineProvider(40F) + this.clipToOutline = true + } + } + +} + diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_select.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_select.png new file mode 100755 index 0000000000..b3e4beb228 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_select.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_selected.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_selected.png new file mode 100755 index 0000000000..207ff8360d Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_selected.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_title_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_title_icon.png new file mode 100755 index 0000000000..55997f4ed2 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_consult_title_icon.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_entertainment_select.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_entertainment_select.png new file mode 100755 index 0000000000..6ba07fba56 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_entertainment_select.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_entertainment_selected.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_entertainment_selected.png new file mode 100755 index 0000000000..ba46e204b2 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_entertainment_selected.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_live_selected.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_live_selected.png new file mode 100755 index 0000000000..7c31031e5b Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_live_selected.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_overview_selected.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_overview_selected.png new file mode 100755 index 0000000000..9b9730bc83 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_mogo_overview_selected.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_left_flow_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_left_flow_bg.png new file mode 100644 index 0000000000..c4a7c79f53 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_left_flow_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_select.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_select.png new file mode 100755 index 0000000000..b3e4beb228 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_select.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_selected.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_selected.png new file mode 100755 index 0000000000..207ff8360d Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_selected.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_title_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_title_icon.png new file mode 100755 index 0000000000..55997f4ed2 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_consult_title_icon.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_entertainment_select.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_entertainment_select.png new file mode 100755 index 0000000000..6ba07fba56 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_entertainment_select.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_entertainment_selected.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_entertainment_selected.png new file mode 100755 index 0000000000..ba46e204b2 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_entertainment_selected.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_live_selected.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_live_selected.png new file mode 100755 index 0000000000..7c31031e5b Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_live_selected.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_overview_selected.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_overview_selected.png new file mode 100755 index 0000000000..9b9730bc83 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_mogo_overview_selected.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg.xml new file mode 100644 index 0000000000..af00303b21 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_bg.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_index.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_index.xml new file mode 100644 index 0000000000..98435cd0f6 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_video_index.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/ic_baseline_arrow_right_24.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/ic_baseline_arrow_right_24.xml new file mode 100644 index 0000000000..b619644073 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/ic_baseline_arrow_right_24.xml @@ -0,0 +1,6 @@ + + + + diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_seekbar_style.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_seekbar_style.xml new file mode 100644 index 0000000000..d593c74acf --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_video_seekbar_style.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/list_video_item_normal.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/list_video_item_normal.xml new file mode 100644 index 0000000000..64a33f5bcb --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/list_video_item_normal.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_mogo_consult.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_mogo_consult.xml new file mode 100644 index 0000000000..b06e2ec461 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_mogo_consult.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_video_show.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_video_show.xml new file mode 100644 index 0000000000..02629c9710 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_video_show.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_interphone.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_interphone.xml new file mode 100644 index 0000000000..b78ed99993 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_window_float_interphone.xml @@ -0,0 +1,37 @@ + + + + + + + + + + diff --git a/core/function-impl/mogo-core-function-devatools/build.gradle b/core/function-impl/mogo-core-function-devatools/build.gradle index 4e2d49d083..3f93f9184a 100644 --- a/core/function-impl/mogo-core-function-devatools/build.gradle +++ b/core/function-impl/mogo-core-function-devatools/build.gradle @@ -54,7 +54,8 @@ android { } protobuf { protoc { - artifact = rootProject.ext.dependencies.protoc + //artifact = rootProject.ext.dependencies.protoc + path = "/opt/homebrew/Cellar/protobuf@3.6/3.6.1.3_4/bin/protoc" } generateProtoTasks { all().each { task -> diff --git a/libraries/mogo-adas-data/build.gradle b/libraries/mogo-adas-data/build.gradle index 5ca64748fd..b49cf1d5da 100644 --- a/libraries/mogo-adas-data/build.gradle +++ b/libraries/mogo-adas-data/build.gradle @@ -36,7 +36,8 @@ android { protobuf { protoc { - artifact = rootProject.ext.dependencies.protoc + //artifact = rootProject.ext.dependencies.protoc + path = "/opt/homebrew/Cellar/protobuf@3.6/3.6.1.3_4/bin/protoc" } generateProtoTasks {