视频使用单独的进程
This commit is contained in:
@@ -1,5 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.mogo.och.taxi.passenger">
|
||||
|
||||
/
|
||||
<application>
|
||||
<activity
|
||||
android:name=".ui.video.VideoActivity"
|
||||
android:process=":video"
|
||||
android:exported="false" />
|
||||
<provider
|
||||
android:name=".mulprocess.BinderProvider"
|
||||
android:authorities="com.mogo.och.taxi.passenger.leftmenu"
|
||||
android:exported="false" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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<BinderParcelable> CREATOR = new Creator<BinderParcelable>() {
|
||||
@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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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<TaxiPassengerBaseFrag
|
||||
});
|
||||
|
||||
findViewById(R.id.iv_temp).setOnClickListener(view -> {
|
||||
// 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(){
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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<View>()
|
||||
|
||||
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<BinderCursor.BinderParcelable>("binder")
|
||||
return w!!.mBinder
|
||||
}
|
||||
}
|
||||
@@ -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<View>()
|
||||
|
||||
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<View>(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)
|
||||
}
|
||||
}
|
||||
@@ -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<TaxiPassengerVideoPlay>()
|
||||
|
||||
@@ -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<TaxiPassengerVideoPlay>()
|
||||
|
||||
@@ -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<TaxiPassengerVideoPlay>()
|
||||
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<ConsultVideoPlayer>(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<Int, ConsultVideoPlayer?> {
|
||||
val centerItemPosition: Int = carouselLayoutManager.centerItemPosition
|
||||
val playerHolder = carouselLayoutManager.findViewByPosition(centerItemPosition)
|
||||
val player = playerHolder?.findViewById<ConsultVideoPlayer>(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<Bitmap?>() {
|
||||
override fun onResourceReady(
|
||||
resource: Bitmap,
|
||||
transition: Transition<in Bitmap?>?
|
||||
) {
|
||||
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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/cl_contain"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/cardview_dark_background"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<View
|
||||
android:background="#80000000"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/aciv_title_icon"
|
||||
android:src="@drawable/taxi_p_mogo_consult_title_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
android:layout_marginTop="@dimen/dp_130"
|
||||
android:layout_marginStart="@dimen/dp_100"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_mogo_consult"
|
||||
app:layout_constraintTop_toTopOf="@+id/aciv_title_icon"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/aciv_title_icon"
|
||||
app:layout_constraintStart_toEndOf="@+id/aciv_title_icon"
|
||||
android:text="蘑菇资讯"
|
||||
android:textStyle="bold"
|
||||
android:textSize="60px"
|
||||
android:includeFontPadding="false"
|
||||
android:textColor="@color/taxi_order_status_textColor"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_video_playlist"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1294px"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginTop="-40px"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tv_mogo_consult"/>
|
||||
|
||||
<com.mogo.och.taxi.passenger.widget.indicator.IndicatorView
|
||||
android:id="@+id/indicatorView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:layout_marginBottom="172px"
|
||||
app:vpi_orientation="horizontal"
|
||||
app:vpi_slide_mode="scale"
|
||||
app:vpi_slider_checked_color="@color/taxi_p_traffic_light_red_color_up"
|
||||
app:vpi_slider_normal_color="@color/taxi_p_check_keyboard_input_field"
|
||||
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>
|
||||
@@ -31,7 +31,7 @@
|
||||
<string name="taxi_p_check_input_phone_tail_title">请输出手机号后4位:</string>
|
||||
<string name="taxi_p_check_small_mogo">小蘑菇</string>
|
||||
<string name="tv_delete">删除</string>
|
||||
|
||||
|
||||
<string name="taxi_p_start_autopilot_txt">点击开始</string>
|
||||
<string name="taxi_p_start_autopilot_loading">启动中...</string>
|
||||
<string name="taxi_p_start_autopilot_fail_10s_tip">自动驾驶启动失败,请与司机确认车辆状态</string>
|
||||
|
||||
Reference in New Issue
Block a user