[3.4.0]
[删除侧滑业务]
@@ -4,18 +4,7 @@
|
||||
|
||||
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
|
||||
<application>
|
||||
<activity
|
||||
android:name=".ui.video.VideoActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:process=":video"
|
||||
android:theme="@style/ActivityTranslucentVideo"
|
||||
android:exported="false" />
|
||||
<service android:name=".mulprocess.EmptyService"
|
||||
android:process=":video" />
|
||||
<provider
|
||||
android:name=".mulprocess.BinderProvider"
|
||||
android:authorities="com.mogo.och.taxi.passenger.leftmenu"
|
||||
android:exported="false" />
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -1,12 +0,0 @@
|
||||
// ICallback.aidl
|
||||
package com.mogo.och.taxi.passenger.mulprocess;
|
||||
|
||||
// Declare any non-default types here with import statements
|
||||
|
||||
interface ICallback {
|
||||
|
||||
void onResult(long meters, long timeInSecond,float speed);
|
||||
|
||||
void postEvent(int type);
|
||||
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
// ILeftMenuService.aidl
|
||||
package com.mogo.och.taxi.passenger.mulprocess;
|
||||
|
||||
import com.mogo.och.taxi.passenger.mulprocess.ICallback;
|
||||
|
||||
// Declare any non-default types here with import statements
|
||||
|
||||
interface ILeftMenuService {
|
||||
|
||||
/**
|
||||
* Pass the selected item to the main process
|
||||
*/
|
||||
void transmissionIndex(int index);
|
||||
|
||||
void registerCallback(in ICallback cb);
|
||||
|
||||
void unRegisterCallback(in ICallback cb);
|
||||
|
||||
}
|
||||
@@ -16,7 +16,6 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.data.map.MogoLocation
|
||||
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener
|
||||
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.startAutoPilot
|
||||
@@ -60,7 +59,6 @@ import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
|
||||
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback
|
||||
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback
|
||||
@@ -68,8 +66,6 @@ import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum.Companion.valueOf
|
||||
import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils.transmissionIndexGet
|
||||
import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager
|
||||
import io.reactivex.disposables.Disposable
|
||||
import io.reactivex.exceptions.UndeliverableException
|
||||
@@ -473,7 +469,7 @@ object TaxiPassengerModel {
|
||||
if (currentOCHOrder == null) {
|
||||
ToastUtils.showLong("行程已结束")
|
||||
} else {
|
||||
transmissionIndexGet(OverlayLeftViewUtils.OVERVIEW)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
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;}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.mulprocess
|
||||
|
||||
import android.app.Service
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.IBinder
|
||||
|
||||
class EmptyService: Service() {
|
||||
|
||||
companion object{
|
||||
fun startService(context: Context){
|
||||
//预加载视频进程
|
||||
val intent = Intent(context, EmptyService::class.java)
|
||||
context.startService(intent)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBind(intent: Intent?): IBinder? {
|
||||
// 加载进程的空Service
|
||||
return null
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.mulprocess;
|
||||
|
||||
import android.os.RemoteException;
|
||||
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant;
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen;
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils;
|
||||
|
||||
public class OrderServiceImpl extends ILeftMenuService.Stub {
|
||||
|
||||
public static final String TAG = "mulprocessOrderServiceImpl";
|
||||
|
||||
@Override
|
||||
public void transmissionIndex(int index) throws RemoteException {
|
||||
CallerLogger.INSTANCE.d(SceneConstant.M_TAXI_P + TAG, "跨进程 transmissionIndex"+index);
|
||||
UiThreadHandler.post(() -> {
|
||||
OverlayLeftViewUtils.INSTANCE.transmissionIndexGet(index);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerCallback(ICallback cb) throws RemoteException {
|
||||
CallerLogger.INSTANCE.d(SceneConstant.M_TAXI_P + TAG, "跨进程 registerCallback");
|
||||
LeftMenuOpen.INSTANCE.registerCallbackHost(cb);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unRegisterCallback(ICallback cb) throws RemoteException {
|
||||
CallerLogger.INSTANCE.d(SceneConstant.M_TAXI_P + TAG, "跨进程 unRegisterCallback");
|
||||
LeftMenuOpen.INSTANCE.unregisterCallbackHost(cb);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -9,7 +9,6 @@ import androidx.lifecycle.LifecycleOwner;
|
||||
|
||||
import com.mogo.commons.AbsMogoApplication;
|
||||
import com.mogo.commons.mvp.Presenter;
|
||||
import com.mogo.eagle.core.data.map.MogoLocation;
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
|
||||
import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
|
||||
@@ -23,7 +22,6 @@ import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback;
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum;
|
||||
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel;
|
||||
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment;
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
@@ -80,15 +78,6 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
|
||||
}
|
||||
}
|
||||
|
||||
// 获取当前订单状态
|
||||
public TaxiPassengerOrderStatusEnum getCurOrderStatus() {
|
||||
return TaxiPassengerModel.INSTANCE.getCurOrderStatus();
|
||||
}
|
||||
|
||||
public void startOrStopOrderLoop(){
|
||||
TaxiPassengerModel.INSTANCE.startOrStopOrderLoop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotArriveEnd() {
|
||||
|
||||
@@ -126,7 +115,7 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
|
||||
LeftMenuOpen.INSTANCE.callCallBack(meters,timeInSecond,-1);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -17,25 +14,18 @@ import com.mogo.commons.module.status.MogoStatusManager;
|
||||
import com.mogo.commons.mvp.MvpFragment;
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
|
||||
import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView;
|
||||
import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxButtonView;
|
||||
import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxListView;
|
||||
import com.mogo.eagle.core.function.hmi.ui.widget.RomaPassengerView;
|
||||
import com.mogo.eagle.core.function.view.MapBizView;
|
||||
import com.mogo.eagle.core.utilcode.util.DeviceUtils;
|
||||
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils;
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
|
||||
import com.mogo.map.listener.IMogoMapListener;
|
||||
import com.mogo.map.uicontroller.IMogoMapUIController;
|
||||
import com.mogo.map.uicontroller.VisualAngleMode;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback;
|
||||
import com.mogo.och.taxi.passenger.event.UIStatus;
|
||||
import com.mogo.och.taxi.passenger.mulprocess.EmptyService;
|
||||
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 org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
@@ -93,14 +83,8 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
|
||||
}else{
|
||||
romaPView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
initListener();
|
||||
|
||||
onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState());
|
||||
|
||||
switchVRFlatMode(MogoStatusManager.getInstance().isVrMode());
|
||||
//预加载视频进程
|
||||
EmptyService.Companion.startService(getContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -128,17 +112,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
|
||||
mapBizView.onResume();
|
||||
}
|
||||
|
||||
/**
|
||||
* VR mode 转换
|
||||
*
|
||||
* @param isVRMode
|
||||
*/
|
||||
public void switchVRFlatMode(boolean isVRMode) {
|
||||
if (mRootView != null) {
|
||||
mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 改变自动驾驶状态
|
||||
*
|
||||
@@ -228,9 +201,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
|
||||
if (ochServingOrderFragment == null) {
|
||||
ochServingOrderFragment = TaxiPassengerServingOrderFragment.newInstance();
|
||||
}
|
||||
if (showOrHideLefeMenu) {
|
||||
OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity(), 0, true, -1, true);
|
||||
}
|
||||
if (ochServingOrderFragment.isHidden()) {
|
||||
transaction
|
||||
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
|
||||
@@ -255,7 +225,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
|
||||
.hide(ochServingOrderFragment).commitAllowingStateLoss();
|
||||
}
|
||||
if (showOrHideLefeMenu) {
|
||||
OverlayLeftViewUtils.INSTANCE.dismissOverlayView(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui.leftmenu
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
|
||||
class ItemViewTouchListener :
|
||||
View.OnTouchListener {
|
||||
// 判断并放跑点击事件
|
||||
private var dragTime = 0L
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
|
||||
try {
|
||||
when (motionEvent.action) {
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action)
|
||||
dragTime = System.currentTimeMillis()
|
||||
}
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
if (LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
MotionEvent.ACTION_UP -> {
|
||||
LeftMenuOpen.dragAndOpen(motionEvent.rawX.toInt(),motionEvent.action)
|
||||
if (System.currentTimeMillis() - dragTime > 500) {
|
||||
dragTime = 0
|
||||
return true
|
||||
}
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
CallerLogger.e(SceneConstant.M_TAXI_P + TAG, e.message)
|
||||
e.printStackTrace()
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "ItemViewTouchListener"
|
||||
}
|
||||
}
|
||||
@@ -1,448 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui.leftmenu
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.ContentResolver
|
||||
import android.database.Cursor
|
||||
import android.os.DeadObjectException
|
||||
import android.os.IBinder
|
||||
import android.os.RemoteCallbackList
|
||||
import android.os.RemoteException
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
|
||||
import com.mogo.eagle.core.utilcode.util.Utils
|
||||
import com.mogo.och.common.module.utils.DateTimeUtil
|
||||
import com.mogo.och.common.module.utils.NumberFormatUtil
|
||||
import com.mogo.och.taxi.passenger.R
|
||||
import com.mogo.och.taxi.passenger.event.FinishActivity
|
||||
import com.mogo.och.taxi.passenger.mulprocess.BinderCursor
|
||||
import com.mogo.och.taxi.passenger.mulprocess.BinderProvider
|
||||
import com.mogo.och.taxi.passenger.mulprocess.ICallback
|
||||
import com.mogo.och.taxi.passenger.mulprocess.ILeftMenuService
|
||||
import com.mogo.och.taxi.passenger.ui.video.FloatingDistanceInfoUtils
|
||||
import com.mogo.och.taxi.passenger.ui.video.VideoActivity
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import rx.Observable
|
||||
import rx.Observer
|
||||
import rx.exceptions.OnCompletedFailedException
|
||||
import rx.schedulers.Schedulers
|
||||
import java.util.*
|
||||
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
object LeftMenuOpen {
|
||||
|
||||
const val TAG = "mulprocessLeftMenuOpen"
|
||||
|
||||
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 dragList = mutableSetOf<View>()
|
||||
|
||||
private var orderService: ILeftMenuService? = null
|
||||
|
||||
private var icallbacks: RemoteCallbackList<ICallback>? = null
|
||||
|
||||
var checkIndex = OverlayLeftViewUtils.LIVE
|
||||
private var lastClickTime = 0L
|
||||
private const val FAST_CLICK_DELAY_TIME = 1300 // 防止事件发送过快
|
||||
|
||||
|
||||
fun setValue(
|
||||
windowView: View,
|
||||
wl: WindowManager.LayoutParams?,
|
||||
windowManager: WindowManager?,
|
||||
close: (view: View, windowManager: WindowManager?) -> Unit,
|
||||
open: (view: View, windowManager: WindowManager?) -> Unit,
|
||||
isMainProcess: Boolean
|
||||
) {
|
||||
this.open = open
|
||||
this.close = close
|
||||
this.windowView = windowView
|
||||
this.windowManager = windowManager
|
||||
this.wl = wl
|
||||
dragList.forEach {
|
||||
registerDragView(it)
|
||||
}
|
||||
if(!isMainProcess) {
|
||||
registerC()
|
||||
}
|
||||
}
|
||||
|
||||
fun clearValue() {
|
||||
this.open = null
|
||||
this.close = null
|
||||
this.windowView = null
|
||||
this.windowManager = null
|
||||
this.wl = null
|
||||
|
||||
orderService = null
|
||||
|
||||
val iterator = dragList.iterator()
|
||||
while (iterator.hasNext()) {
|
||||
val next = iterator.next()
|
||||
unRegisterDragView(next,false)
|
||||
iterator.remove()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private var x = 0
|
||||
|
||||
// 判断并放跑点击事件
|
||||
private const val DEVIATION = 10
|
||||
private const val NEGATIVEDEVIATION = -10
|
||||
|
||||
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.post {
|
||||
it1(windowView, windowManager)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//更新悬浮球控件位置
|
||||
UiThreadHandler.post {
|
||||
windowManager.updateViewLayout(windowView, it)
|
||||
}
|
||||
}
|
||||
if (it.x < OverlayLeftViewUtils.DEVIATION_WIDTH + DEVIATION && movedX < 0) {
|
||||
close?.let { it1 ->
|
||||
UiThreadHandler.post {
|
||||
it1(windowView, windowManager)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//更新悬浮球控件位置
|
||||
UiThreadHandler.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.post {
|
||||
it(windowView!!, windowManager)
|
||||
}
|
||||
}
|
||||
} else if (startX < OverlayLeftViewUtils.DEVIATION_WIDTH / 2 && startX >= OverlayLeftViewUtils.DEVIATION_WIDTH) {
|
||||
// 拖动距离小于一半自动关闭
|
||||
close?.let {
|
||||
UiThreadHandler.post {
|
||||
it(windowView!!, windowManager)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fun registerDragView(view: View?) {
|
||||
if (view != null) {
|
||||
dragList.add(view)
|
||||
view.setOnTouchListener(ItemViewTouchListener())
|
||||
view.setOnClickListener {
|
||||
open?.let { it1 -> it1(windowView!!, windowManager) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun unRegisterDragView(view: View?,remove:Boolean) {
|
||||
if(remove) {
|
||||
dragList.remove(view)
|
||||
}
|
||||
view?.let {
|
||||
it.setOnTouchListener(null)
|
||||
it.setOnClickListener(null)
|
||||
if(it.id==R.id.ids_video_anchor){
|
||||
val parent = it.parent as ViewGroup
|
||||
parent.removeView(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun transmissionIndex(index:Int){
|
||||
Observable.empty<String?>().subscribeOn(Schedulers.io())
|
||||
.subscribe(object : Observer<String?> {
|
||||
override fun onCompleted() {
|
||||
try {
|
||||
CallerLogger.d(M_TAXI_P + TAG, "tran--transmissionIndex---$index")
|
||||
if (orderService == null) {
|
||||
registerC()
|
||||
}
|
||||
orderService?.transmissionIndex(index)
|
||||
}catch (ill:IllegalStateException){
|
||||
ill.printStackTrace()
|
||||
}catch (onCo: OnCompletedFailedException){
|
||||
onCo.printStackTrace()
|
||||
}catch (deadobjectexception: DeadObjectException){
|
||||
deadobjectexception.printStackTrace()
|
||||
}
|
||||
}
|
||||
override fun onError(e: Throwable?) {}
|
||||
override fun onNext(t: String?) {}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 主进程调用
|
||||
*/
|
||||
fun registerCallbackHost(cb:ICallback?){
|
||||
if(icallbacks==null){
|
||||
icallbacks = RemoteCallbackList<ICallback>()
|
||||
}
|
||||
cb?.let {
|
||||
icallbacks?.register(it)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 主进程调用 反注册
|
||||
*/
|
||||
fun unregisterCallbackHost(cb:ICallback?){
|
||||
cb?.let {
|
||||
icallbacks?.unregister(it)
|
||||
}
|
||||
icallbacks?.kill()
|
||||
icallbacks = null
|
||||
}
|
||||
|
||||
/**
|
||||
* 子进程调用 注册回调 主进程中调用
|
||||
* 方便主进程传递到子进程 速度、剩余公里、剩余时间、到达时间
|
||||
*/
|
||||
fun registerCallback(cb:ICallback?){
|
||||
Observable.empty<String?>().subscribeOn(Schedulers.io())
|
||||
.subscribe(object : Observer<String?> {
|
||||
override fun onCompleted() {
|
||||
try {
|
||||
CallerLogger.d(M_TAXI_P + TAG, "tran--registerCallback--注册")
|
||||
if (orderService == null) {
|
||||
registerC()
|
||||
}
|
||||
cb?.let {
|
||||
orderService?.registerCallback(it)
|
||||
}
|
||||
}catch (ill:IllegalStateException){
|
||||
ill.printStackTrace()
|
||||
}catch (onCo: OnCompletedFailedException){
|
||||
onCo.printStackTrace()
|
||||
}catch (deadobjectexception: DeadObjectException){
|
||||
deadobjectexception.printStackTrace()
|
||||
}
|
||||
|
||||
}
|
||||
override fun onError(e: Throwable?) {}
|
||||
override fun onNext(t: String?) {}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 子进程调用 反注册
|
||||
*/
|
||||
fun unregisterCallback(cb:ICallback?){
|
||||
Observable.empty<String?>().subscribeOn(Schedulers.io())
|
||||
.subscribe(object : Observer<String?> {
|
||||
override fun onCompleted() {
|
||||
CallerLogger.d(M_TAXI_P + TAG, "tran--unregisterCallback--反注册")
|
||||
cb?.let {
|
||||
try {
|
||||
orderService?.unRegisterCallback(it)
|
||||
}catch (ill:IllegalStateException){
|
||||
ill.printStackTrace()
|
||||
}catch (onCo: OnCompletedFailedException){
|
||||
onCo.printStackTrace()
|
||||
}catch (deadobjectexception: DeadObjectException){
|
||||
deadobjectexception.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
override fun onError(e: Throwable?) {}
|
||||
override fun onNext(t: String?) {}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 主进程调用 向子进程传输 剩余距离、剩余时间、和速度
|
||||
*/
|
||||
fun callCallBack(meters: Long,timeInSecond: Long,speed:Float){
|
||||
if(checkIndex == OverlayLeftViewUtils.CONSULT||checkIndex == OverlayLeftViewUtils.MOVIE) {
|
||||
if (System.currentTimeMillis() - lastClickTime < FAST_CLICK_DELAY_TIME){
|
||||
return
|
||||
}
|
||||
lastClickTime = System.currentTimeMillis()
|
||||
|
||||
Observable.empty<String?>().subscribeOn(Schedulers.io())
|
||||
.subscribe(object : Observer<String?> {
|
||||
override fun onCompleted() {
|
||||
CallerLogger.d(M_TAXI_P + TAG, "callCallBack$meters--$timeInSecond--$speed")
|
||||
try {
|
||||
val len = icallbacks?.beginBroadcast()
|
||||
len?.let {
|
||||
for (i in 0 until len) {
|
||||
try {
|
||||
icallbacks?.getBroadcastItem(i)?.onResult(meters, timeInSecond, speed)
|
||||
} catch (e: RemoteException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
icallbacks?.finishBroadcast()
|
||||
}catch (e:Exception){
|
||||
CallerLogger.e(M_TAXI_P + TAG, "callCallBack${e.message}")
|
||||
}
|
||||
}
|
||||
override fun onError(e: Throwable?) {}
|
||||
override fun onNext(t: String?) {}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fun invoKeyByEventType(typeID:Int){
|
||||
Observable.empty<String?>().subscribeOn(Schedulers.io())
|
||||
.subscribe(object : Observer<String?> {
|
||||
override fun onCompleted() {
|
||||
val len = icallbacks?.beginBroadcast()
|
||||
len?.let {
|
||||
for (i in 0 until it) {
|
||||
try {
|
||||
icallbacks?.getBroadcastItem(i)?.postEvent(typeID)
|
||||
} catch (e: RemoteException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
icallbacks?.finishBroadcast()
|
||||
}
|
||||
override fun onError(e: Throwable?) {}
|
||||
override fun onNext(t: String?) {}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 主进程、video进程都得调用
|
||||
* 主进程在显示是主动调用
|
||||
* video进程在天津View是判断是否调用了
|
||||
*/
|
||||
@Synchronized
|
||||
private fun registerC() {
|
||||
if(orderService!=null){
|
||||
return
|
||||
}
|
||||
CallerLogger.d(M_TAXI_P + TAG, "tran--registerC--获取jni")
|
||||
val resolver: ContentResolver = Utils.getApp().contentResolver
|
||||
|
||||
val cu = resolver.query(
|
||||
BinderProvider.CONTENT_URI,
|
||||
null,
|
||||
null,
|
||||
arrayOf(BinderProvider.SERVICE_LEFTMENU),
|
||||
null
|
||||
) ?: return
|
||||
|
||||
val binder: IBinder = getBinder(cu)
|
||||
try {
|
||||
try {
|
||||
orderService = ILeftMenuService.Stub.asInterface(binder)
|
||||
}catch (ill:IllegalStateException){
|
||||
ill.printStackTrace()
|
||||
}catch (onCo: OnCompletedFailedException){
|
||||
onCo.printStackTrace()
|
||||
}catch (deadobjectexception: DeadObjectException){
|
||||
deadobjectexception.printStackTrace()
|
||||
}
|
||||
|
||||
} catch (e: RemoteException) {
|
||||
e.printStackTrace()
|
||||
} finally {
|
||||
cu.close()
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
val callBack = object : ICallback.Stub() {
|
||||
override fun onResult(meters :Long, timeInSecond:Long,speed:Float) {
|
||||
if(speed<0){
|
||||
// 距离单位
|
||||
var disUnit = "公里"
|
||||
// 距离
|
||||
var remainDis: String? = "0"
|
||||
|
||||
if (meters > 0) {
|
||||
if (meters / 1000 < 1) {
|
||||
disUnit = "米"
|
||||
remainDis = Math.round(meters.toFloat()).toString()
|
||||
} else {
|
||||
disUnit = "公里"
|
||||
remainDis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
|
||||
}
|
||||
}
|
||||
// 剩余时间
|
||||
val time = Math.ceil(timeInSecond.toDouble() / 60f).toInt()
|
||||
|
||||
val beforeTime = Calendar.getInstance()
|
||||
beforeTime.add(Calendar.MINUTE, time)
|
||||
//到达时间
|
||||
val arriveTime = DateTimeUtil.formatCalendarToString(beforeTime, DateTimeUtil.HH_mm)
|
||||
FloatingDistanceInfoUtils.setDistance(meters,remainDis,disUnit,time,arriveTime)
|
||||
}else{
|
||||
FloatingDistanceInfoUtils.setSpeed(speed)
|
||||
}
|
||||
}
|
||||
|
||||
override fun postEvent(type: Int) {
|
||||
when (type) {
|
||||
VideoActivity.EVENT_FINISH -> {
|
||||
EventBus.getDefault().post(FinishActivity())
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
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<LeftMenuModel>) : 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 {
|
||||
setSelectIndex(position,true)
|
||||
}
|
||||
return imageView
|
||||
}
|
||||
|
||||
/**
|
||||
* 多进程调用
|
||||
*/
|
||||
fun setSelectIndex(index: Int,needStartActivity: Boolean) {
|
||||
for (i in list.indices) {
|
||||
if(index==i){
|
||||
if(!list[i].isChecked){
|
||||
list[i].selectListener.onSelect(needStartActivity)
|
||||
OverlayLeftViewUtils.transmissionIndex(index)
|
||||
}
|
||||
}
|
||||
list[i].isChecked = index == i
|
||||
}
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
interface OnTabSelectListener {
|
||||
fun onSelect(isCurrentProcess:Boolean)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,432 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui.leftmenu
|
||||
|
||||
import android.animation.Animator
|
||||
import android.animation.ValueAnimator
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.content.Context.WINDOW_SERVICE
|
||||
import android.graphics.PixelFormat
|
||||
import android.view.Gravity
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.view.animation.LinearInterpolator
|
||||
import android.widget.FrameLayout
|
||||
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.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
|
||||
import com.mogo.eagle.core.utilcode.util.*
|
||||
import com.mogo.och.taxi.passenger.R
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst
|
||||
import com.mogo.och.taxi.passenger.event.FinishActivity
|
||||
import com.mogo.och.taxi.passenger.event.UIStatus
|
||||
import com.mogo.och.taxi.passenger.mulprocess.EmptyService
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.model.LeftMenuModel
|
||||
import com.mogo.och.taxi.passenger.ui.video.VideoActivity
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.disposables.Disposable
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
/**
|
||||
* 遮罩层工具类
|
||||
*
|
||||
* @author mogoauto
|
||||
*/
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
object OverlayLeftViewUtils {
|
||||
private const val TAG = "OverlayViewUtils"
|
||||
private var windowManager: WindowManager? = null
|
||||
|
||||
@Volatile
|
||||
private var isShowing = false
|
||||
|
||||
private var params:WindowManager.LayoutParams?=null
|
||||
|
||||
const val WIDTH = 810
|
||||
const val DEVIATION_WIDTH = -669
|
||||
|
||||
const val LIVE = 0
|
||||
const val OVERVIEW = 1
|
||||
const val CONSULT = 2
|
||||
const val MOVIE = 3
|
||||
|
||||
|
||||
private var overlayView: View?=null
|
||||
|
||||
private var subscribe: Disposable?=null
|
||||
private var subscribeLive: Disposable?=null
|
||||
private var subscribeOVERVIEW: Disposable?=null
|
||||
|
||||
private var acivOpenClose: AppCompatImageView?=null
|
||||
|
||||
/**
|
||||
* 添加覆盖View在Activity上面
|
||||
*/
|
||||
@JvmOverloads
|
||||
fun showOverlayView(context: Activity,checkIndex:Int = LIVE,isOpen: Boolean=true, ani: Int = -1,isMainProcess: Boolean = false) {
|
||||
if (isShowing) {
|
||||
return
|
||||
}
|
||||
if (windowManager == null) {
|
||||
windowManager = context.getSystemService(WINDOW_SERVICE) as WindowManager
|
||||
}
|
||||
|
||||
overlayView = LayoutInflater.from(context)
|
||||
.inflate(R.layout.taxi_p_window_float_interphone, null) as ConstraintLayout
|
||||
overlayView?.let { view ->
|
||||
// 设置View显示模式,沉浸式的侵入到状态栏,导航栏
|
||||
view.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,view, isOpen)
|
||||
|
||||
// 如果正在展示中,并且lastOverlayView不为null,先做移除操作,保证覆盖在最上面的View只有一个,防止叠加导致无法移除
|
||||
dismissOverlayView(false)
|
||||
|
||||
val vDragField = view.findViewById<View>(R.id.v_drag_field)
|
||||
acivOpenClose = view.findViewById(R.id.aciv_open_close)
|
||||
vDragField.setOnTouchListener(ItemViewTouchListener())
|
||||
vDragField.setOnClickListener {
|
||||
val start: Int = params!!.x
|
||||
if (start > DEVIATION_WIDTH /2 && start < 10) {
|
||||
close(view, windowManager)
|
||||
} else if (start < DEVIATION_WIDTH /2 && start >= DEVIATION_WIDTH) {
|
||||
open(view, windowManager)
|
||||
}
|
||||
}
|
||||
|
||||
val lvSelectItem = view.findViewById<ListView>(R.id.lv_select_item)
|
||||
val integers = mutableListOf<LeftMenuModel>()
|
||||
|
||||
val liveSelected = object :ListAdapter.OnTabSelectListener{
|
||||
override fun onSelect(isCurrentProcess:Boolean) {
|
||||
LeftMenuOpen.checkIndex = LIVE
|
||||
if(isCurrentProcess) {
|
||||
close(view, windowManager)
|
||||
}else {
|
||||
LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH)
|
||||
}
|
||||
if(isMainProcess){
|
||||
//主进程 建议Eventbus实现
|
||||
subscribeLive = Observable.timer(300, TimeUnit.MILLISECONDS)
|
||||
.subscribe {
|
||||
EventBus.getDefault().post(UIStatus(UIStatus.LIVE))
|
||||
}
|
||||
}else{
|
||||
EventBus.getDefault().post(FinishActivity())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val overViewSelected = object :ListAdapter.OnTabSelectListener{
|
||||
override fun onSelect(isCurrentProcess:Boolean) {
|
||||
LeftMenuOpen.checkIndex = OVERVIEW
|
||||
if(isCurrentProcess) {
|
||||
close(view, windowManager)
|
||||
}else {
|
||||
LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH)
|
||||
}
|
||||
if(isMainProcess){
|
||||
//主进程 建议Eventbus实现
|
||||
subscribeOVERVIEW = Observable.timer(300, TimeUnit.MILLISECONDS)
|
||||
.subscribe {
|
||||
EventBus.getDefault().post(UIStatus(UIStatus.OVERVIEW))
|
||||
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "发送Eventbus subscribeOVERVIEW")
|
||||
}
|
||||
}else{
|
||||
EventBus.getDefault().post(FinishActivity())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val consultSelect = object :ListAdapter.OnTabSelectListener{
|
||||
override fun onSelect(isCurrentProcess:Boolean) {
|
||||
LeftMenuOpen.checkIndex = CONSULT
|
||||
if(isCurrentProcess) {
|
||||
close(view, windowManager)
|
||||
//计算订单起点和终点距离
|
||||
val sumDis = SharedPrefsMgr.getInstance(context).getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0)
|
||||
VideoActivity.startActivity(context, VideoActivity.VIDEOTYPE_CONSULT,sumDis)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val entertainmentSelect = object :ListAdapter.OnTabSelectListener{
|
||||
override fun onSelect(isCurrentProcess:Boolean) {
|
||||
LeftMenuOpen.checkIndex = MOVIE
|
||||
if(isCurrentProcess) {
|
||||
close(view, windowManager)
|
||||
val sumDis = SharedPrefsMgr.getInstance(context).getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0)
|
||||
VideoActivity.startActivity(context, VideoActivity.VIDEOTYPE_MOIES,sumDis)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
integers.add(LeftMenuModel(R.drawable.shape_size_live_select, R.drawable.shape_size_live_selected,false,liveSelected))
|
||||
integers.add(LeftMenuModel(R.drawable.shape_size_overview_select, R.drawable.shape_size_overview_selected,false,overViewSelected))
|
||||
integers.add(LeftMenuModel(R.drawable.shape_size_consult_select, R.drawable.shape_size_consult_selected,false,consultSelect))
|
||||
integers.add(LeftMenuModel(R.drawable.shape_size_entertainment_select, R.drawable.shape_size_entertainment_selected,false,entertainmentSelect))
|
||||
integers.forEachIndexed { index, leftMenuModel ->
|
||||
leftMenuModel.isChecked = index == checkIndex
|
||||
}
|
||||
lvSelectItem.adapter = ListAdapter(context, integers)
|
||||
|
||||
addTarget(context)
|
||||
|
||||
LeftMenuOpen.setValue(view, params, windowManager,::close,::open,isMainProcess)
|
||||
try {
|
||||
windowManager!!.addView(overlayView, params)
|
||||
checkProcess()
|
||||
isShowing = true
|
||||
} catch (e: WindowManager.BadTokenException) {
|
||||
isShowing = true;
|
||||
dismissOverlayView(false)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun addTarget(context: Activity) {
|
||||
try {
|
||||
val content =
|
||||
context.window.decorView.findViewById<FrameLayout>(android.R.id.content)
|
||||
val textView = View(context)
|
||||
textView.id = R.id.ids_video_anchor
|
||||
addDragTarget(textView)
|
||||
val param: FrameLayout.LayoutParams =
|
||||
FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT)
|
||||
param.gravity = Gravity.CENTER_VERTICAL
|
||||
param.width = 143
|
||||
param.height = 308
|
||||
textView.layoutParams = param
|
||||
content.addView(textView)
|
||||
} catch (e: java.lang.Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 打开状态栏
|
||||
*/
|
||||
private fun open(overlayView: View,windowManager: WindowManager?) {
|
||||
checkProcess()
|
||||
val valueAnimator = ValueAnimator.ofInt(params!!.x, 0)
|
||||
valueAnimator.duration = 100
|
||||
valueAnimator.interpolator = LinearInterpolator()
|
||||
valueAnimator.addUpdateListener {
|
||||
params?.x = it.animatedValue as Int
|
||||
windowManager?.updateViewLayout(overlayView, params)
|
||||
}
|
||||
valueAnimator.addListener(object : Animator.AnimatorListener {
|
||||
override fun onAnimationStart(animation: Animator) {}
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
acivOpenClose?.apply {
|
||||
pivotX = (width /2).toFloat()
|
||||
pivotY = (height /2).toFloat()
|
||||
rotation = 0f
|
||||
}
|
||||
closeByTime(overlayView, windowManager)
|
||||
params?.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
|
||||
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
|
||||
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
|
||||
windowManager?.updateViewLayout(overlayView, params)
|
||||
}
|
||||
override fun onAnimationCancel(animation: Animator) {}
|
||||
override fun onAnimationRepeat(animation: Animator) {}
|
||||
})
|
||||
valueAnimator.start()
|
||||
}
|
||||
|
||||
private fun checkProcess() {
|
||||
ThreadPoolService.execute {
|
||||
val currentProcessName = ProcessUtils.getCurrentProcessName()
|
||||
if (currentProcessName.contains(":video")) {
|
||||
return@execute
|
||||
}
|
||||
val allBackgroundProcesses = ProcessUtils.getAllBackgroundProcesses()
|
||||
var haveProcess = false
|
||||
allBackgroundProcesses.forEach {
|
||||
if (it.contains(":video")) {
|
||||
haveProcess = true
|
||||
return@forEach
|
||||
}
|
||||
}
|
||||
if (!haveProcess) {
|
||||
EmptyService.startService(Utils.getApp())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun addDragTarget(view :View?){
|
||||
LeftMenuOpen.registerDragView(view)
|
||||
}
|
||||
|
||||
fun removeDragTarget(view: View?){
|
||||
LeftMenuOpen.unRegisterDragView(view,true)
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
fun transmissionIndex(index:Int){
|
||||
// TODO 需要与,杨亚坤,确认为啥要限制仅在主进程
|
||||
// if(!ProcessUtils.isMainProcess(Utils.getApp())) {
|
||||
LeftMenuOpen.transmissionIndex(index)
|
||||
// }
|
||||
}
|
||||
|
||||
fun transmissionIndexGet(index: Int){
|
||||
overlayView?.let {
|
||||
val lvSelectItem = it.findViewById<ListView>(R.id.lv_select_item)
|
||||
val listAdapter = lvSelectItem.adapter as ListAdapter
|
||||
listAdapter.setSelectIndex(index,false)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun closeByTime(
|
||||
overlayView: View,
|
||||
windowManager: WindowManager?
|
||||
) {
|
||||
subscribe?.let {
|
||||
if (!it.isDisposed) {
|
||||
it.dispose()
|
||||
}
|
||||
}
|
||||
subscribe = Observable.timer(3000, TimeUnit.MILLISECONDS)
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe {
|
||||
if (params?.x == 0) {
|
||||
close(overlayView, windowManager)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭状态栏
|
||||
*/
|
||||
private fun close(overlayView: View,windowManager: WindowManager?) {
|
||||
val valueAnimator = ValueAnimator.ofInt(params!!.x, DEVIATION_WIDTH)
|
||||
valueAnimator.duration = 100
|
||||
valueAnimator.interpolator = LinearInterpolator()
|
||||
valueAnimator.addUpdateListener {
|
||||
params?.let { paramsIn->
|
||||
paramsIn.x = it.animatedValue as Int
|
||||
windowManager?.updateViewLayout(overlayView, paramsIn)
|
||||
}
|
||||
}
|
||||
valueAnimator.addListener(object : Animator.AnimatorListener {
|
||||
override fun onAnimationStart(animation: Animator) {}
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
acivOpenClose?.apply {
|
||||
pivotX = (width /2).toFloat()
|
||||
pivotY = (height /2).toFloat()
|
||||
rotation = 180f
|
||||
}
|
||||
params?.let {
|
||||
it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
|
||||
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
|
||||
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or
|
||||
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
|
||||
windowManager?.updateViewLayout(overlayView, it)
|
||||
}
|
||||
|
||||
}
|
||||
override fun onAnimationCancel(animation: Animator) {}
|
||||
override fun onAnimationRepeat(animation: Animator) {}
|
||||
})
|
||||
valueAnimator.start()
|
||||
}
|
||||
|
||||
private fun layoutParams(ani: Int,view :View,isOpen: Boolean) {
|
||||
if(params ==null) {
|
||||
params = WindowManager.LayoutParams()
|
||||
}
|
||||
params = WindowManager.LayoutParams()
|
||||
params?.let {
|
||||
it.width = WIDTH
|
||||
it.height = WindowManager.LayoutParams.MATCH_PARENT
|
||||
it.alpha = 1.0f
|
||||
it.gravity = Gravity.START or Gravity.CENTER_HORIZONTAL
|
||||
if(isOpen) {
|
||||
it.x = 0
|
||||
}else{
|
||||
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
|
||||
}
|
||||
closeByTime(view, windowManager)
|
||||
}
|
||||
}
|
||||
|
||||
fun getStatus():Boolean{
|
||||
return isShowing
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除覆盖View在Activity上面
|
||||
*/
|
||||
fun dismissOverlayView(isMain:Boolean) {
|
||||
if (!isShowing) {
|
||||
return
|
||||
}
|
||||
releaseDelay(subscribe)
|
||||
releaseDelay(subscribeLive)
|
||||
releaseDelay(subscribeOVERVIEW)
|
||||
subscribe = null
|
||||
subscribeLive = null
|
||||
subscribeOVERVIEW = null
|
||||
// 管理的要关闭都得关闭
|
||||
if(isMain) {
|
||||
LeftMenuOpen.invoKeyByEventType(VideoActivity.EVENT_FINISH)
|
||||
}
|
||||
|
||||
LeftMenuOpen.clearValue()
|
||||
try {
|
||||
if (windowManager != null && overlayView != null) {
|
||||
windowManager!!.removeViewImmediate(overlayView)
|
||||
params = null
|
||||
}
|
||||
if(windowManager!=null){
|
||||
windowManager = null
|
||||
}
|
||||
if(params!=null){
|
||||
params = null
|
||||
}
|
||||
if (overlayView!=null) {
|
||||
overlayView = null
|
||||
}
|
||||
if (acivOpenClose!=null) {
|
||||
acivOpenClose = null
|
||||
}
|
||||
isShowing = false
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
private fun releaseDelay(subscribe: Disposable?) {
|
||||
subscribe?.let {
|
||||
if (!it.isDisposed) {
|
||||
it.dispose()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui.leftmenu.model
|
||||
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.ListAdapter
|
||||
|
||||
data class LeftMenuModel(
|
||||
val select: Int,
|
||||
val selected: Int,
|
||||
var isChecked: Boolean,
|
||||
val selectListener: ListAdapter.OnTabSelectListener
|
||||
)
|
||||
@@ -13,16 +13,12 @@ import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.widget.AppCompatImageView
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.mogo.commons.screen.ScreenHelper
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.eagle.core.utilcode.util.BarUtils
|
||||
import com.mogo.och.taxi.passenger.R
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst
|
||||
import com.mogo.och.taxi.passenger.event.FinishActivity
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen
|
||||
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
|
||||
@@ -33,7 +29,6 @@ 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.video.base.GSYVideoView
|
||||
import me.jessyan.autosize.AutoSize
|
||||
import me.jessyan.autosize.AutoSizeCompat
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.greenrobot.eventbus.Subscribe
|
||||
@@ -111,7 +106,6 @@ class VideoActivity : AppCompatActivity() {
|
||||
}
|
||||
initListener()
|
||||
initData()
|
||||
LeftMenuOpen.registerCallback(LeftMenuOpen.callBack)
|
||||
}
|
||||
|
||||
private fun initConsultData() {
|
||||
@@ -280,22 +274,6 @@ class VideoActivity : AppCompatActivity() {
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
when (videotype) {
|
||||
VIDEOTYPE_CONSULT -> {
|
||||
OverlayLeftViewUtils.showOverlayView(
|
||||
this,
|
||||
isOpen = false,
|
||||
checkIndex = OverlayLeftViewUtils.CONSULT
|
||||
)
|
||||
}
|
||||
VIDEOTYPE_MOIES -> {
|
||||
OverlayLeftViewUtils.showOverlayView(
|
||||
this,
|
||||
isOpen = false,
|
||||
checkIndex = OverlayLeftViewUtils.MOVIE
|
||||
)
|
||||
}
|
||||
}
|
||||
val sumDis = intent.getIntExtra(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0)
|
||||
FloatingDistanceInfoUtils.showOverlayView(this, sumDis = sumDis)
|
||||
}
|
||||
@@ -324,33 +302,7 @@ class VideoActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
}
|
||||
subscribe = Observable.interval(2, 8, TimeUnit.SECONDS)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(object : Observer<Long> {
|
||||
override fun onCompleted() {}
|
||||
override fun onError(e: Throwable?) {}
|
||||
override fun onNext(t: Long?) {
|
||||
if (!OverlayLeftViewUtils.getStatus()) {
|
||||
when (videotype) {
|
||||
VIDEOTYPE_CONSULT -> {
|
||||
OverlayLeftViewUtils.showOverlayView(
|
||||
this@VideoActivity,
|
||||
isOpen = false,
|
||||
checkIndex = OverlayLeftViewUtils.CONSULT
|
||||
)
|
||||
}
|
||||
VIDEOTYPE_MOIES -> {
|
||||
OverlayLeftViewUtils.showOverlayView(
|
||||
this@VideoActivity,
|
||||
isOpen = false,
|
||||
checkIndex = OverlayLeftViewUtils.MOVIE
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
@@ -386,9 +338,7 @@ class VideoActivity : AppCompatActivity() {
|
||||
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "onDestroy()")
|
||||
super.onDestroy()
|
||||
EventBus.getDefault().unregister(this)
|
||||
LeftMenuOpen.unregisterCallback(LeftMenuOpen.callBack)
|
||||
releaseOnNewInstance()
|
||||
OverlayLeftViewUtils.dismissOverlayView(false)
|
||||
FloatingDistanceInfoUtils.dismissOverlayView()
|
||||
FixMemoryLeak.fixLeak(this)
|
||||
cancleSubscribe()
|
||||
|
||||
@@ -21,7 +21,6 @@ import com.mogo.eagle.core.utilcode.util.TimeTransformUtils
|
||||
import com.mogo.eagle.core.utilcode.util.ToastUtils
|
||||
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
|
||||
import com.mogo.och.taxi.passenger.R
|
||||
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils
|
||||
import com.mogo.och.taxi.passenger.ui.video.FullVideoUtils
|
||||
import com.mogo.och.taxi.passenger.utils.ZoomDrawable
|
||||
import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack
|
||||
@@ -83,7 +82,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
|
||||
|
||||
private fun addDrageAnchor(){
|
||||
vPpenLeft.visibility = VISIBLE
|
||||
OverlayLeftViewUtils.addDragTarget(vPpenLeft)
|
||||
layoutBottom.post {
|
||||
val layoutParams = layoutBottom.layoutParams as ConstraintLayout.LayoutParams
|
||||
layoutParams.setMargins(333,0,333,90)
|
||||
@@ -207,7 +205,6 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer {
|
||||
setVideoAllCallBack(null)
|
||||
}
|
||||
dismissProgressDialog()
|
||||
OverlayLeftViewUtils.removeDragTarget(vPpenLeft)
|
||||
super.onDetachedFromWindow()
|
||||
}
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 183 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:drawable="@drawable/taxi_p_mogo_consult_select"
|
||||
android:width="@dimen/dp_610"
|
||||
android:height="@dimen/dp_310"/>
|
||||
</layer-list >
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:drawable="@drawable/taxi_p_mogo_consult_selected"
|
||||
android:width="@dimen/dp_610"
|
||||
android:height="@dimen/dp_310"/>
|
||||
</layer-list >
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:drawable="@drawable/taxi_p_mogo_entertainment_select"
|
||||
android:width="@dimen/dp_610"
|
||||
android:height="@dimen/dp_310"/>
|
||||
</layer-list >
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:drawable="@drawable/taxi_p_mogo_entertainment_selected"
|
||||
android:width="@dimen/dp_610"
|
||||
android:height="@dimen/dp_310"/>
|
||||
</layer-list >
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:drawable="@drawable/taxi_p_mogo_live_select"
|
||||
android:width="@dimen/dp_610"
|
||||
android:height="@dimen/dp_310"/>
|
||||
</layer-list >
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:drawable="@drawable/taxi_p_mogo_live_selected"
|
||||
android:width="@dimen/dp_610"
|
||||
android:height="@dimen/dp_310"/>
|
||||
</layer-list >
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:drawable="@drawable/taxi_p_mogo_overview_select"
|
||||
android:width="@dimen/dp_610"
|
||||
android:height="@dimen/dp_310"/>
|
||||
</layer-list >
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:drawable="@drawable/taxi_p_mogo_overview_selected"
|
||||
android:width="@dimen/dp_610"
|
||||
android:height="@dimen/dp_310"/>
|
||||
</layer-list >
|
||||
@@ -1,41 +0,0 @@
|
||||
<?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:background="@drawable/taxi_p_left_flow_bg"
|
||||
android:clickable="false"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:ignore="MissingDefaultResource">
|
||||
|
||||
<ListView
|
||||
android:id="@+id/lv_select_item"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:paddingTop="153dp"
|
||||
android:layout_marginEnd="143dp"
|
||||
android:divider="@null"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/v_drag_field"
|
||||
app:layout_constraintStart_toEndOf="@+id/lv_select_item"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_width="143dp"
|
||||
android:layout_height="308dp">
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/aciv_open_close"
|
||||
android:layout_marginStart="14dp"
|
||||
android:src="@drawable/ic_baseline_arrow"
|
||||
android:rotation="180"
|
||||
android:layout_width="25dp"
|
||||
android:layout_height="33dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout >
|
||||