diff --git a/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml b/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml index 8b529701ba..27faf9deaa 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml @@ -1,5 +1,16 @@ + - / + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/IOrderService.aidl b/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/IOrderService.aidl new file mode 100644 index 0000000000..415109c249 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/IOrderService.aidl @@ -0,0 +1,14 @@ +// IOrderService.aidl +package com.mogo.och.taxi.passenger.mulprocess; + +// Declare any non-default types here with import statements + +interface IOrderService { + + /** + * 向主进程传输坐标 + */ + boolean transmission(int x, int action); + + void open(); +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderCursor.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderCursor.java new file mode 100644 index 0000000000..c1d1c3c5bd --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderCursor.java @@ -0,0 +1,64 @@ +package com.mogo.och.taxi.passenger.mulprocess; + +import android.database.MatrixCursor; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Parcel; +import android.os.Parcelable; + +public class BinderCursor extends MatrixCursor { + + static final String KEY_BINDER = "binder"; + + Bundle mBinderExtra = new Bundle(); + + public static class BinderParcelable implements Parcelable { + + public IBinder mBinder; + + public static final Creator CREATOR = new Creator() { + @Override + public BinderParcelable createFromParcel(Parcel source) { + return new BinderParcelable(source); + } + + @Override + public BinderParcelable[] newArray(int size) { + return new BinderParcelable[size]; + } + }; + + BinderParcelable(IBinder binder) { + mBinder = binder; + } + + BinderParcelable(Parcel source) { + mBinder = source.readStrongBinder(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeStrongBinder(mBinder); + } + } + + public BinderCursor(String[] columnNames, IBinder binder) { + super(columnNames); + + if (binder != null) { + Parcelable value = new BinderParcelable(binder); + mBinderExtra.putParcelable(KEY_BINDER, value); + } + } + + @Override + public Bundle getExtras() { + return mBinderExtra; + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderProvider.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderProvider.java new file mode 100644 index 0000000000..a5aedc83b1 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/BinderProvider.java @@ -0,0 +1,55 @@ +package com.mogo.och.taxi.passenger.mulprocess; + +import static android.os.Binder.getCallingUid; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; +import android.os.IBinder; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + + +public class BinderProvider extends ContentProvider { + + public static final String TAG = BinderProvider.class.getSimpleName(); + + public static final String AUTHORITY = "com.mogo.och.taxi.passenger.leftmenu"; + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/binder"); + public static final String SERVICE_LEFTMENU = "lefmenu"; + + @Override + public boolean onCreate() { + return true; + } + + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + getCallingUid(); + IBinder binder; + if (selectionArgs[0].equals(BinderProvider.SERVICE_LEFTMENU)) { + binder = new OrderServiceImpl(); + } else { + return null; + } + BinderCursor cursor = new BinderCursor(new String[]{"service"}, binder); + return cursor; + } + + + @Override + public String getType(Uri uri) {return null;} + + + @Override + public Uri insert(Uri uri, ContentValues values) {return null;} + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) {return 0;} + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {return 0;} +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java new file mode 100644 index 0000000000..8854f392cc --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/mulprocess/OrderServiceImpl.java @@ -0,0 +1,25 @@ +package com.mogo.och.taxi.passenger.mulprocess; + +import android.app.Application; +import android.os.Build; +import android.os.RemoteException; + +import androidx.annotation.RequiresApi; + +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.eagle.core.utilcode.util.Utils; +import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen; +import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils; + +public class OrderServiceImpl extends IOrderService.Stub { + + @Override + public boolean transmission(int x, int action) throws RemoteException { + return LeftMenuOpen.INSTANCE.dragAndOpen(x,action); + } + + @Override + public void open() throws RemoteException { + UiThreadHandler.getsUiHandler().post(() -> OverlayLeftViewUtils.INSTANCE.open()); + } +} \ No newline at end of file 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 d7ed74a9d6..bf1dee6175 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 @@ -1,5 +1,6 @@ package com.mogo.och.taxi.passenger.ui; +import android.content.Intent; import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -18,6 +19,7 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerSmpManager; import com.mogo.eagle.core.utilcode.util.OverlayViewUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.eagle.core.utilcode.util.Utils; import com.mogo.map.MogoMapUIController; import com.mogo.map.MogoMarkerManager; import com.mogo.map.listener.IMogoMapListener; @@ -29,6 +31,7 @@ import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback; import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter; import com.mogo.och.taxi.passenger.ui.comment.TaxiPassengerArrivedView; import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils; +import com.mogo.och.taxi.passenger.ui.video.VideoActivity; import java.lang.ref.WeakReference; @@ -128,15 +131,15 @@ public class TaxiPassengerBaseFragment extends MvpFragment { -// OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity()); -// OverlayLeftViewUtils.INSTANCE.dragTarget(vOpenLeft); + Intent intent = new Intent(getContext(), VideoActivity.class); + startActivity(intent); + OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity()); + OverlayLeftViewUtils.INSTANCE.dragTarget(vOpenLeft); //showOrHideArrivedEndLayout(true, "北京北京北京", "1527481606997577728"); //showOrHidePressengerCheckPager(true, "开始站点开", "开始站点开始站点开始", "2", "京A888888", "18811539480"); //OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext()); //OverlayViewUtils.showOverlayView(getActivity(),new TaxiPassengerMogoConsultView(getContext())); }); - - vOpenLeft.setOnClickListener(v -> OverlayLeftViewUtils.INSTANCE.open()); } private void initArrivedView(){ 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 index a45e01036c..ac30241751 100644 --- 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 @@ -1,74 +1,36 @@ package com.mogo.och.taxi.passenger.ui.leftmenu +import android.annotation.SuppressLint import android.view.MotionEvent import android.view.View import android.view.WindowManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -class ItemViewTouchListener( - private val windowView: View, - private val wl: WindowManager.LayoutParams, - private val windowManager: WindowManager?, - private val close: (view:View,windowManager: WindowManager?) -> Unit, - private val open : (view:View,windowManager: WindowManager?) -> Unit -) : +class ItemViewTouchListener : View.OnTouchListener { - private var x = 0 // 判断并放跑点击事件 private var dragTime = 0L - private val DEVIATION = 10 - private val NEGATIVEDEVIATION = -10 + @SuppressLint("ClickableViewAccessibility") override fun onTouch(view: View, motionEvent: MotionEvent): Boolean { when (motionEvent.action) { MotionEvent.ACTION_DOWN -> { - x = motionEvent.rawX.toInt() + LeftMenuOpen.dragAndOpenOwnProcess(motionEvent.rawX.toInt(),motionEvent.action) 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 - } + if (LeftMenuOpen.dragAndOpenOwnProcess(motionEvent.rawX.toInt(),motionEvent.action)) { return false } - - if (wl.x > NEGATIVEDEVIATION && movedX > 0) { - open(windowView,windowManager) - }else{ - //更新悬浮球控件位置 - windowManager?.updateViewLayout(windowView, wl) - } - if (wl.x < OverlayLeftViewUtils.DEVIATION_WIDTH +DEVIATION && movedX < 0) { - close(windowView,windowManager) - }else{ - //更新悬浮球控件位置 - windowManager?.updateViewLayout(windowView, wl) - } - - } MotionEvent.ACTION_UP -> { - val startX = wl.x - if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX < 0) { - //拖动距离大于一半 自动打开 - open(windowView,windowManager) - } else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH /2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) { - // 拖动距离小于一半自动关闭 - close(windowView,windowManager) - } + LeftMenuOpen.dragAndOpenOwnProcess(motionEvent.rawX.toInt(),motionEvent.action) if (System.currentTimeMillis() - dragTime > 500) { dragTime = 0 return true } } - else -> { - - } + else -> {} } return false } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt new file mode 100644 index 0000000000..2c334cbd80 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/LeftMenuOpen.kt @@ -0,0 +1,206 @@ +package com.mogo.och.taxi.passenger.ui.leftmenu + +import android.annotation.SuppressLint +import android.content.ContentResolver +import android.database.Cursor +import android.os.IBinder +import android.os.RemoteException +import android.view.MotionEvent +import android.view.View +import android.view.WindowManager +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.eagle.core.utilcode.util.Utils +import com.mogo.och.taxi.passenger.mulprocess.BinderCursor +import com.mogo.och.taxi.passenger.mulprocess.BinderProvider +import com.mogo.och.taxi.passenger.mulprocess.IOrderService + +@SuppressLint("StaticFieldLeak") +object LeftMenuOpen { + + private var windowView: View? = null + private var wl: WindowManager.LayoutParams? = null + private var windowManager: WindowManager? = null + private var close: ((view: View, windowManager: WindowManager?) -> Unit)? = null + private var open: ((view: View, windowManager: WindowManager?) -> Unit)? = null + + + private var cu: Cursor? = null + + // 两部分主进程和子进程 + private var dragList = mutableSetOf() + + private var orderService: IOrderService? = null + + // 主进程 + fun setValue( + windowView: View, + wl: WindowManager.LayoutParams?, + windowManager: WindowManager?, + close: (view: View, windowManager: WindowManager?) -> Unit, + open: (view: View, windowManager: WindowManager?) -> Unit + ) { + this.open = open + this.close = close + this.windowView = windowView + this.windowManager = windowManager + this.wl = wl + dragList.forEach { + registerDragView(it) + } + registerC() + } + + // 主进程 + fun clearValue() { + this.open = null + this.close = null + this.windowView = null + this.windowManager = null + this.wl = null + + cu?.let { + it.close() + orderService = null + } + val iterator = dragList.iterator() + while (iterator.hasNext()) { + val next = iterator.next() + unRegisterDragView(next) + } + } + + + private var x = 0 + + // 判断并放跑点击事件 + private const val DEVIATION = 10 + private const val NEGATIVEDEVIATION = -10 + + fun dragAndOpenOwnProcess(newX: Int, action: Int): Boolean { + return orderService?.transmission(newX, action) ?: false + } + + fun dragAndOpen(newX: Int, action: Int): Boolean { + when (action) { + MotionEvent.ACTION_DOWN -> { + x = newX + } + MotionEvent.ACTION_MOVE -> { + val nowX = newX + val movedX = nowX - x + x = nowX + wl?.let { it -> + it.x += movedX + if (it.x > 0 || it.x < OverlayLeftViewUtils.DEVIATION_WIDTH) { + it.apply { + x -= movedX + } + return true + } + windowView?.let { windowView -> + windowManager?.let { windowManager -> + if (it.x > NEGATIVEDEVIATION && movedX > 0) { + open?.let { it1 -> + UiThreadHandler.getsUiHandler().post { + it1(windowView, windowManager) + } + } + } else { + //更新悬浮球控件位置 + UiThreadHandler.getsUiHandler().post { + windowManager.updateViewLayout(windowView, it) + } + } + if (it.x < OverlayLeftViewUtils.DEVIATION_WIDTH + DEVIATION && movedX < 0) { + close?.let { it1 -> + UiThreadHandler.getsUiHandler().post { + it1(windowView, windowManager) + } + } + } else { + //更新悬浮球控件位置 + UiThreadHandler.getsUiHandler().post { + windowManager.updateViewLayout(windowView, it) + } + } + } + + } + + } + } + MotionEvent.ACTION_UP -> { + wl?.let { wl -> + val startX = wl.x + if (startX > OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX < 0) { + //拖动距离大于一半 自动打开 + open?.let { + UiThreadHandler.getsUiHandler().post { + it(windowView!!, windowManager) + } + } + } else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) { + // 拖动距离小于一半自动关闭 + close?.let { + UiThreadHandler.getsUiHandler().post { + it(windowView!!, windowManager) + } + } + } else { + + } + } + } + } + return false + } + + fun registerDragView(view: View?) { + if (view != null) { + dragList.add(view) + if (orderService == null) { + registerC() + } + view.setOnTouchListener(ItemViewTouchListener()) + view.setOnClickListener { + orderService?.open() + } + } + } + + fun unRegisterDragView(view: View?) { + dragList.remove(view) + view?.let { + it.setOnTouchListener(null) + it.setOnClickListener(null) + } + } + + private fun registerC() { + val resolver: ContentResolver = Utils.getApp().contentResolver + + cu = resolver.query( + BinderProvider.CONTENT_URI, + null, + null, + arrayOf(BinderProvider.SERVICE_LEFTMENU), + null + ) ?: return + + val binder: IBinder = getBinder(cu!!) + try { + orderService = IOrderService.Stub.asInterface(binder) + } catch (e: RemoteException) { + e.printStackTrace() + cu?.close() + cu = null + } + } + + private fun getBinder(cursor: Cursor): IBinder { + val extras = cursor.extras + extras.classLoader = BinderCursor.BinderParcelable::class.java.classLoader + val w = extras.getParcelable("binder") + return w!!.mBinder + } +} \ 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 index 7c6a68910f..aa5d261540 100644 --- 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 @@ -6,13 +6,18 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.graphics.PixelFormat -import android.graphics.Rect -import android.view.* +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager import android.view.animation.LinearInterpolator import android.widget.ListView import androidx.appcompat.widget.AppCompatImageView import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.IAppStateListener import com.mogo.eagle.core.utilcode.util.OverlayViewUtils +import com.mogo.eagle.core.utilcode.util.ProcessUtils import com.mogo.och.taxi.passenger.R import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel import com.mogo.och.taxi.passenger.ui.video.FullVideoUtils @@ -51,13 +56,26 @@ object OverlayLeftViewUtils { private var taxiPassengerMogoMoviesView: TaxiPassengerMogoMoviesView? = null private var acivOpenClose: AppCompatImageView?=null - private var dragList = mutableListOf() + + private val appStatesListener = object : IAppStateListener { + override fun onAppStateChanged(isForeground: Boolean) { + if (isForeground) { + CallerLogger.d("FinalizeCrashFixer", "--- 切换到前台 ---") + } else { + CallerLogger.d("FinalizeCrashFixer", "--- 切换到后台 ---") + } + } + } /** * 添加覆盖View在Activity上面 */ @JvmOverloads fun showOverlayView(context: Activity, ani: Int = -1) { + if (!ProcessUtils.isMainProcess(context)) { + // 只有主进程可以启动 + return + } if (isShowing) { return } @@ -84,13 +102,7 @@ object OverlayLeftViewUtils { val vDragField = view.findViewById(R.id.v_drag_field) acivOpenClose = view.findViewById(R.id.aciv_open_close) - dragList.forEach { - it.setOnTouchListener(ItemViewTouchListener( - overlayView!!,params!!, windowManager, ::close, - ::open)) - } - vDragField.setOnTouchListener(ItemViewTouchListener(overlayView!!,params!!, windowManager, ::close, - ::open)) + vDragField.setOnTouchListener(ItemViewTouchListener()) vDragField.setOnClickListener { val start: Int = params!!.x if (start > DEVIATION_WIDTH /2 && start < 10) { @@ -136,6 +148,9 @@ 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) + + //AppStateManager.registerAppStateListener(appStatesListener) + LeftMenuOpen.setValue(view, params, windowManager,::close,::open) try { windowManager!!.addView(overlayView, params) isShowing = true @@ -182,22 +197,12 @@ object OverlayLeftViewUtils { } } - fun dragTarget(view :View){ - if(view!=null) { - dragList.add(view) - params?.let { - view.setOnTouchListener( - ItemViewTouchListener( - overlayView!!, params!!, windowManager, ::close, - ::open - ) - ) - } - } + fun dragTarget(view :View?){ + LeftMenuOpen.registerDragView(view) } - fun removeDragTarget(view: View){ - dragList.remove(view) + fun removeDragTarget(view: View?){ + LeftMenuOpen.unRegisterDragView(view) } private fun closeByTime( @@ -262,7 +267,7 @@ object OverlayLeftViewUtils { it.y = 0 it.format = PixelFormat.RGBA_8888 // 设置窗口类型为应用子窗口,和PopupWindow同类型 - it.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL + it.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY // 没有边界限制,允许窗口扩展到屏幕外 it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or @@ -281,17 +286,15 @@ object OverlayLeftViewUtils { if (!isShowing) { return } + //AppStateManager.unRegisterAppStateListener(appStatesListener) subscribe?.let { if (!it.isDisposed) { it.dispose() } } + LeftMenuOpen.clearValue() FullVideoUtils.dismissOverlayView(true) // 管理的要关闭都得关闭 - dragList.forEach { - it.setOnTouchListener(null) - } - dragList.clear() closeConsult() closeMovice() subscribe = null @@ -323,7 +326,4 @@ object OverlayLeftViewUtils { System.gc() } - private fun getViewBounds(view: View): Rect { - 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/video/TaxiPassengerMogoConsultView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoConsultView.kt index d6f5799311..3bd0c79020 100644 --- 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 @@ -59,9 +59,6 @@ class TaxiPassengerMogoConsultView :RelativeLayout { clContain = findViewById(R.id.cl_contain) vOpenLeft = findViewById(R.id.v_open_left) - vOpenLeft.setOnClickListener { - OverlayLeftViewUtils.open() - } OverlayLeftViewUtils.dragTarget(vOpenLeft) val arrayListOf = ArrayList() diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoMoviesView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoMoviesView.kt index 2693764339..99c5aca7d3 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoMoviesView.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/TaxiPassengerMogoMoviesView.kt @@ -60,9 +60,6 @@ class TaxiPassengerMogoMoviesView :RelativeLayout { clContain = findViewById(R.id.cl_contain) vOpenLeft = findViewById(R.id.v_open_left) - vOpenLeft.setOnClickListener { - OverlayLeftViewUtils.open() - } OverlayLeftViewUtils.dragTarget(vOpenLeft) val arrayListOf = ArrayList() diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt new file mode 100644 index 0000000000..659c725555 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/VideoActivity.kt @@ -0,0 +1,301 @@ +package com.mogo.och.taxi.passenger.ui.video + +import android.content.ContentResolver +import android.database.Cursor +import android.graphics.Bitmap +import android.graphics.Color +import android.graphics.drawable.BitmapDrawable +import android.net.Uri +import android.os.Bundle +import android.os.IBinder +import android.os.RemoteException +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.SimpleTarget +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 +import com.mogo.och.taxi.passenger.utils.blur.GlideBlurTransform +import com.mogo.och.taxi.passenger.widget.ConsultVideoPlayer +import com.mogo.och.taxi.passenger.widget.indicator.IndicatorView +import com.mogo.och.taxi.passenger.widget.indicator.enums.IndicatorOrientation +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 kotlin.math.floor + + +class VideoActivity : AppCompatActivity() { + + private lateinit var rvVideoPlaylist: RecyclerView + private lateinit var indicatorView: IndicatorView + private lateinit var clContain: ConstraintLayout + private lateinit var vOpenLeft: View + + companion object{ + const val SERVICE_ORDER = "order" + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_video) + + initView() + initListener() + initData() + } + + private fun initData() { + val arrayListOf = ArrayList() + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708596763/全车型混剪增加红旗车队.m4v", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969511280/车队.png", + "蘑菇车联覆盖生活的方方面面" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708554279/红旗车队.m4v", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969553174/红旗重新排版.png", + "蘑菇车联之红旗车队" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png", + "蘑菇车联牵手成都大运会" + ) + ) + arrayListOf.add( + TaxiPassengerVideoPlay( + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708409810/20210610重新排版3屏.m4v", + "https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969579713/三屏.png", + "多视角体验蘑菇车联自动驾驶" + ) + ) + val recyclerVideoAdapter = RecyclerVideoAdapter(this, arrayListOf) + val carouselLayoutManager = CarouselLayoutManager(CarouselLayoutManager.HORIZONTAL, true) + carouselLayoutManager.setPostLayoutListener(CarouselZoomPostLayoutListener()) + carouselLayoutManager.maxVisibleItems = 1 + indicatorView.notifyDataChanged(arrayListOf.size) + indicatorView.setSlideMode(IndicatorSlideMode.SCALE) + indicatorView.setOrientation(IndicatorOrientation.INDICATOR_HORIZONTAL) + indicatorView.setIndicatorStyle(IndicatorStyle.ROUND_RECT) + indicatorView.setSliderColor( + Color.parseColor("#80FFFFFF"), Color.parseColor("#2972FF"), + Color.parseColor("#27C8FF") + ) + indicatorView.setSliderWidth(16f, 101f) + indicatorView.setSliderHeight(16f) + indicatorView.setSliderGap(30f) + rvVideoPlaylist.addOnScrollListener(object : CenterScrollListener() { + var prePlayerPosition = 0 + override fun pageSelect(recyclerView: RecyclerView?, newState: Int) { + //播放视频 + val (centerItemPosition: kotlin.Int, player) = getPlayer(carouselLayoutManager) + indicatorView.onPageSelected(centerItemPosition) + if (player is ConsultVideoPlayer) { + if (prePlayerPosition != centerItemPosition) { + if (player.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { + player.onVideoReset() + } else { + } + val playerHolder = + carouselLayoutManager.findViewByPosition(prePlayerPosition) + val prePlayer = + playerHolder?.findViewById(R.id.video_item_player) + prePlayer?.let { + if (it is ConsultVideoPlayer) { + it.onVideoReset() + } + } + val taxiPassengerVideoPlay = arrayListOf[centerItemPosition] + setBackageAndPlayNext(taxiPassengerVideoPlay, player, centerItemPosition) + } else { + player.onVideoResume(false) + } + } + prePlayerPosition = centerItemPosition + } + + override fun pageStop() { + val (centerItemPosition: kotlin.Int, player) = getPlayer(carouselLayoutManager) + if (player is ConsultVideoPlayer) { + player.onVideoPause() + } + } + + }) + carouselLayoutManager.addOnDargAutoDiffListener { adapterPosition, currentPosition -> + val fl = adapterPosition - floor(adapterPosition) + var currentIndex = currentPosition + if (fl > 0.5) { + if (currentPosition == 0) { + currentIndex = rvVideoPlaylist.adapter!!.itemCount - 1 + } else { + currentIndex -= 1 + } + } + indicatorView.onPageScrolled(currentIndex, fl, 0) + } + recyclerVideoAdapter.setOnThumbImageClilckListener { + val (centerItemPosition: kotlin.Int, player) = getPlayer(carouselLayoutManager) + if (player is ConsultVideoPlayer) { + player.onVideoReset() + player.thumbImageViewLayout.visibility = View.VISIBLE + } + rvVideoPlaylist.smoothScrollToPosition(it) + } + rvVideoPlaylist.layoutManager = carouselLayoutManager + rvVideoPlaylist.setHasFixedSize(true) + rvVideoPlaylist.adapter = recyclerVideoAdapter + } + + private fun getPlayer(carouselLayoutManager: CarouselLayoutManager): Pair { + val centerItemPosition: Int = carouselLayoutManager.centerItemPosition + val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition) + val player = playerHolder?.findViewById(R.id.video_item_player) + return Pair(centerItemPosition, player) + } + + private fun initListener() { + OverlayLeftViewUtils.dragTarget(vOpenLeft) + } + + private fun initView() { + 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) + } + + + private fun setBackageAndPlayNext( + taxiPassengerVideoPlay: TaxiPassengerVideoPlay, + player: ConsultVideoPlayer, + centerItemPosition: Int, + ) { + // 设置背景图片 + Glide.with(this).asBitmap() + .load(taxiPassengerVideoPlay.imageUrl) + .apply( + RequestOptions().transform( + GlideBlurTransform(this, taxiPassengerVideoPlay.imageUrl, 100) + ) + ) + .into(object : SimpleTarget() { + override fun onResourceReady( + resource: Bitmap, + transition: Transition? + ) { + clContain.background = BitmapDrawable(resources, resource) + } + }) + if (player.getVideoAllCallBack() == null) { + player.setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onAutoComplete(url: String?, vararg objects: Any?) { + player.onVideoReset() + val itemCount = rvVideoPlaylist.adapter?.itemCount + itemCount?.let { + if (centerItemPosition == itemCount - 1) { + rvVideoPlaylist.smoothScrollToPosition(0) + } else { + rvVideoPlaylist.smoothScrollToPosition(centerItemPosition + 1) + } + } + } + + override fun onClickBlank(url: String?, vararg objects: Any?) { + super.onClickBlank(url, *objects) + rvVideoPlaylist.smoothScrollToPosition(centerItemPosition) + } + + override fun onPlayError(url: String?, vararg objects: Any?) { + super.onPlayError(url, *objects) + ToastUtils.showLong("哎呀,出错了,看看其他视频吧") + } + + override fun onClickStartError(url: String?, vararg objects: Any?) { + super.onClickStartError(url, *objects) + ToastUtils.showLong("哎呀,出错了,看看其他视频吧") + } + }) + } + } + + override fun onResume() { + super.onResume() + val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager + val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) + player?.let { + if (player is ConsultVideoPlayer) { + + // 恢复播放和开始播放 + if (player.isIfCurrentIsFullscreen) {// 全屏了 + + } else { + when (player.currentState) { + GSYVideoView.CURRENT_STATE_PAUSE -> { + player.onVideoResume(false) + } + GSYVideoView.CURRENT_STATE_PLAYING -> { + } + else -> { + val recyclerVideoAdapter = + rvVideoPlaylist.adapter as RecyclerVideoAdapter + setBackageAndPlayNext( + recyclerVideoAdapter.getItemByPosition(centerItemPosition), + player, centerItemPosition + ) + //player.startPlayLogic() + } + } + } + } + + } + + } + + override fun onPause() { + super.onPause() + val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager + val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager) + player?.let { + if (player is ConsultVideoPlayer) { + // 离开应用 暂停视频 + // 关闭 onDetachedFromWindow 会reset + if (player.isIfCurrentIsFullscreen) {// 全屏了 + } else { + player.onVideoPause() + } + } + } + } + + override fun onDestroy() { + super.onDestroy() + val carouselLayoutManager = rvVideoPlaylist.layoutManager as CarouselLayoutManager + val (_: Int, player) = getPlayer(carouselLayoutManager) + player?.let { + if(player is ConsultVideoPlayer){ + player.currentPlayer.release() + player.onVideoReset() + } + } + OverlayLeftViewUtils.removeDragTarget(vOpenLeft) + } + +} \ No newline at end of file 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 index 797e69c1a1..10f9d251c4 100644 --- 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 @@ -76,9 +76,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { aivStartPlay.scaleY = 0.8f vPpenLeft = findViewById(R.id.v_open_left) - vPpenLeft.setOnClickListener { - OverlayLeftViewUtils.open() - } OverlayLeftViewUtils.dragTarget(vPpenLeft) } diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/activity_video.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/activity_video.xml new file mode 100644 index 0000000000..6d7db62b32 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/activity_video.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml index bc93dc9da1..e26ceacfa4 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml @@ -31,7 +31,7 @@ 请输出手机号后4位: 小蘑菇 删除 - + 点击开始 启动中... 自动驾驶启动失败,请与司机确认车辆状态