From 1c6db3ebaf86b6a50fda2748c39e4e4a1231f90c Mon Sep 17 00:00:00 2001 From: aibingbing Date: Thu, 16 Nov 2023 21:09:22 +0800 Subject: [PATCH] =?UTF-8?q?[=E8=87=AA=E4=B8=BB=E7=AE=97=E8=B7=AF=E9=AA=8C?= =?UTF-8?q?=E8=AF=81]=20feat:=20=E5=A2=9E=E5=8A=A02=E7=A7=8D=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=88=87=E6=8D=A2=EF=BC=8C=E9=80=89=E6=8B=A9=E8=B7=AF?= =?UTF-8?q?=E7=BA=BF=E9=A1=B5=E9=9D=A2=E7=AD=89=E9=80=BB=E8=BE=91=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/AndroidManifest.xml | 8 +- .../bean/TaxiRoutingQueryLineResponse.java | 22 + .../com/mogo/och/taxi/ui/base/TaxiFragment.kt | 56 +- .../routing/TaxiRoutingChooseLineActivity.kt | 137 ++++ .../routing/TaxiRoutingChooseLineAdapter.kt | 80 +++ ...TaxiRoutingChooseLineItemOpenAnimator.java | 641 ++++++++++++++++++ .../taxi/ui/routing/TaxiRoutingFragment.kt | 37 + .../routing_line_task_arrow.png | Bin 0 -> 491 bytes .../routing_choose_line_btn_submit_bg.xml | 5 + ...ting_choose_line_btn_submit_bg_default.xml | 10 + ...ting_choose_line_btn_submit_bg_pressed.xml | 10 + .../drawable/routing_choose_line_close.png | Bin 0 -> 3825 bytes ..._line_shape_select_line_item_bg_normal.xml | 7 + ...ine_shape_select_line_item_bg_selected.xml | 7 + .../res/drawable/routing_click_btn_bg.xml | 5 + .../drawable/routing_click_btn_bg_default.xml | 10 + .../drawable/routing_click_btn_bg_pressed.xml | 10 + .../src/main/res/drawable/taxi_routing_bg.xml | 35 + .../layout/routing_choose_line_activity.xml | 73 ++ .../layout/routing_choose_line_list_item.xml | 51 ++ .../src/main/res/layout/routing_fragment.xml | 275 ++++++++ .../layout/routing_no_data_common_view.xml | 33 + .../src/main/res/values/colors.xml | 7 +- .../src/main/res/values/dimens.xml | 5 +- .../src/main/res/values/strings.xml | 10 + .../src/main/res/values/styles.xml | 21 + .../src/main/res/layout/view_sop_setting.xml | 4 +- 27 files changed, 1546 insertions(+), 13 deletions(-) create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingQueryLineResponse.java create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineItemOpenAnimator.java create mode 100644 OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable-xhdpi/routing_line_task_arrow.png create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg_default.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg_pressed.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_close.png create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_shape_select_line_item_bg_normal.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_shape_select_line_item_bg_selected.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg_default.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg_pressed.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/drawable/taxi_routing_bg.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/layout/routing_choose_line_activity.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/layout/routing_choose_line_list_item.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/layout/routing_fragment.xml create mode 100644 OCH/taxi/unmanned-driver/src/main/res/layout/routing_no_data_common_view.xml diff --git a/OCH/taxi/unmanned-driver/src/main/AndroidManifest.xml b/OCH/taxi/unmanned-driver/src/main/AndroidManifest.xml index fb42392054..3ab0402e38 100644 --- a/OCH/taxi/unmanned-driver/src/main/AndroidManifest.xml +++ b/OCH/taxi/unmanned-driver/src/main/AndroidManifest.xml @@ -1,5 +1,9 @@ - - / + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingQueryLineResponse.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingQueryLineResponse.java new file mode 100644 index 0000000000..7c3efdda76 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingQueryLineResponse.java @@ -0,0 +1,22 @@ +package com.mogo.och.taxi.bean; + +import com.mogo.eagle.core.data.BaseData; + +import java.util.List; + +/** + * @author: wangmingjun + * @date: 2022/2/9 + */ +public class TaxiRoutingQueryLineResponse extends BaseData { + public List data; + + public static class Result { + public int lineId;//线路id + public String name;//线路名字 + public int todayVerifyNum;//本车今天验证次数 + public int historyVerifyTotalUsableNum;//历史累计验证可用次数 + public int historyVerifyTotalNotUsableNum;//历史累计验证不可用次数 + public boolean isChoosed;//当前是否选中 + } +} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt index 7b83ee52a7..18ecb7806e 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiFragment.kt @@ -8,11 +8,13 @@ import android.view.ViewGroup import androidx.fragment.app.FragmentTransaction import com.alibaba.android.arouter.launcher.ARouter import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.module.status.StatusDescriptor import com.mogo.eagle.core.data.temp.EventLogout import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.biz.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.LoginService import com.mogo.och.common.module.utils.FlowBus @@ -21,6 +23,7 @@ import com.mogo.och.taxi.constant.TaxiDriverEventConst import com.mogo.och.taxi.constant.TaxiOrderStatusEnum import com.mogo.och.taxi.network.TaxiDriverLoginImpl import com.mogo.och.taxi.ui.operational.TaxiOperationalDialogFragment +import com.mogo.och.taxi.ui.routing.TaxiRoutingFragment import com.mogo.och.taxi.ui.task.TaxiTaskModel import com.mogo.och.taxi.ui.task.TaxiTaskTabFragment import com.mogo.och.taxi.utils.TPRouteDataTestUtils @@ -45,6 +48,7 @@ class TaxiFragment : BaseTaxiTabFragment(), private var taskTabFragment: WeakReference? = null private var personalDialogFragment: WeakReference? = null + private var routingVerifyFragment: WeakReference? = null private var loginService: LoginService? = null @Subscribe(threadMode = ThreadMode.MAIN) @@ -151,15 +155,53 @@ class TaxiFragment : BaseTaxiTabFragment(), } private fun initFragment() { - taskTabFragment = WeakReference(TaxiTaskTabFragment.newInstance()) + showTaskFragment() + MogoStatusManager.getInstance() + .registerStatusChangedListener( + TAG, StatusDescriptor.TAXI_UNMANED_DRIVER_LINE_ROUTING_VERIFY_MODE + ) { descriptor, isTrue -> + if (StatusDescriptor.TAXI_UNMANED_DRIVER_LINE_ROUTING_VERIFY_MODE == descriptor) { + UiThreadHandler.post { + if (isTrue) { + showRoutingFragment() + } else { + showTaskFragment() + } + } + } + } + } + + private fun showTaskFragment() { val transaction: FragmentTransaction = childFragmentManager.beginTransaction() - //默认显示OCHTaxiServerOrdersFragment - taskTabFragment?.get()?.let { - transaction.add(R.id.fragment_container, it).show( - it - ) + if (routingVerifyFragment?.get()?.isVisible == true) { + routingVerifyFragment?.get()?.also { + transaction.hide(it) + } + } + if (taskTabFragment?.get() == null) { + taskTabFragment = WeakReference(TaxiTaskTabFragment.newInstance()) + } + taskTabFragment?.get()?.also { + transaction.replace(R.id.fragment_container, it).show(it) + transaction.commitAllowingStateLoss() + } + } + + private fun showRoutingFragment() { + val transaction: FragmentTransaction = childFragmentManager.beginTransaction() + if (taskTabFragment?.get()?.isVisible == true) { + taskTabFragment?.get()?.also { + transaction.hide(it) + } + } + if (routingVerifyFragment?.get() == null) { + routingVerifyFragment = WeakReference(TaxiRoutingFragment.newInstance()) + } + routingVerifyFragment?.get()?.also { + transaction.replace(R.id.fragment_container, it).show(it) + transaction.commitAllowingStateLoss() } - transaction.commitAllowingStateLoss() } override fun createPresenter(): TaxiPresenter { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt new file mode 100644 index 0000000000..a23d982b90 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt @@ -0,0 +1,137 @@ +package com.mogo.och.taxi.ui.routing + +import android.graphics.Point +import android.os.Bundle +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.taxi.R +import com.mogo.och.taxi.bean.TaxiRoutingQueryLineResponse +import kotlinx.android.synthetic.main.routing_choose_line_activity.btnChooseLineSubmit +import kotlinx.android.synthetic.main.routing_choose_line_activity.btnClose +import kotlinx.android.synthetic.main.routing_choose_line_activity.chooseLineListView +import kotlinx.android.synthetic.main.routing_no_data_common_view.noDataContainer +import kotlinx.android.synthetic.main.taxi_debug_order.currentLineId + +class TaxiRoutingChooseLineActivity : AppCompatActivity() { + + companion object { + const val TAG = "TaxiRoutingChooseLineActivity" + } + + private lateinit var mChooseLineListAdapter: TaxiRoutingChooseLineAdapter + private lateinit var mLinearLayoutManager: LinearLayoutManager + private val mRoutingLineList: MutableList = ArrayList() + private var mCurrentChoosedLineId: Int? = -1 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.routing_choose_line_activity) + initWindowParams() + initView() + loadData() + } + + private fun initWindowParams() { + val window = window + val params = window.attributes + val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager + val point = Point() + windowManager.defaultDisplay.getSize(point) //用于获取屏幕高度 + params.width = (point.x * 0.375).toInt() + params.height = ViewGroup.LayoutParams.MATCH_PARENT + window.attributes = params + window.setGravity(Gravity.START or Gravity.BOTTOM) + } + + private fun initView() { + mLinearLayoutManager = LinearLayoutManager(this) + chooseLineListView.layoutManager = mLinearLayoutManager + chooseLineListView.itemAnimator = + TaxiRoutingChooseLineItemOpenAnimator() + mChooseLineListAdapter = TaxiRoutingChooseLineAdapter(applicationContext, mRoutingLineList) + chooseLineListView.addItemDecoration(SpacesItemDecoration(4)) + chooseLineListView.adapter = mChooseLineListAdapter + //设置item 点击事件 + mChooseLineListAdapter.setOnLineItemClickListener(object : + TaxiRoutingChooseLineAdapter.OnChooseLineItemClickListener { + override fun onItemClick(position: Int, close: Boolean) { + mCurrentChoosedLineId = mRoutingLineList[position].lineId + } + }) + + btnClose.setOnClickListener { + finish() + } + btnChooseLineSubmit.setOnClickListener { + if (mCurrentChoosedLineId == -1) { + ToastUtils.showLong("请先选择任务") + return@setOnClickListener + } + ToastUtils.showLong("当前选择的路线LineId:$currentLineId") + } + } + + private fun showEmptyView() { + chooseLineListView.visibility = View.GONE + btnChooseLineSubmit.visibility = View.GONE + noDataContainer.visibility = View.VISIBLE + } + + private fun showRecyclerView() { + chooseLineListView.visibility = View.VISIBLE + btnChooseLineSubmit.visibility = View.VISIBLE + noDataContainer.visibility = View.GONE + } + + /** + * 初始化数据 + */ + private fun loadData() { + //TODO + for (i in 1..10) { + val result = TaxiRoutingQueryLineResponse.Result() + result.lineId = i + result.name = "路线名称$i" + result.todayVerifyNum = 2 + result.historyVerifyTotalUsableNum = 5 + result.historyVerifyTotalNotUsableNum = 1 + result.isChoosed = false + mRoutingLineList.add(result) + } + if (mRoutingLineList.isEmpty()) { + showEmptyView() + } else { + showRecyclerView() + mChooseLineListAdapter.notifyDataSetChanged() + } + } + + fun onRoutingLineDataChanged(data: TaxiRoutingQueryLineResponse?) { + if (data?.data?.isNotEmpty() == true) { + showRecyclerView() + mRoutingLineList.clear() + mRoutingLineList.addAll(data.data) + mChooseLineListAdapter.notifyDataSetChanged() + } else { + showEmptyView() + } + } + + fun onChangeLineIdSuccess() { + //ToastUtils.showLong(resources.getString(R.string.bus_change_line_commit_tip_s)) + //mPresenter?.queryBusRoutes() + mChooseLineListAdapter.setOnLineItemClickListener(null) + //mPresenter?.removeListener() + finish() + } + + override fun onDestroy() { + super.onDestroy() + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt new file mode 100644 index 0000000000..ae513a83d3 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt @@ -0,0 +1,80 @@ +package com.mogo.och.taxi.ui.routing + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.och.taxi.R +import com.mogo.och.taxi.bean.TaxiRoutingQueryLineResponse + +class TaxiRoutingChooseLineAdapter( + private val mContext: Context, + private val mData: List +) : RecyclerView.Adapter() { + + companion object { + const val TAG = "TaxiRoutingChooseLineAdapter" + } + + private var mItemClickListener: OnChooseLineItemClickListener? = null + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwitchLineViewHolder { + val view = LayoutInflater.from(mContext).inflate( + R.layout.routing_choose_line_list_item, parent, false + ) + return SwitchLineViewHolder(view) + } + + override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { + val currentPosition = holder.bindingAdapterPosition + val data = mData[currentPosition] + holder.lineNameTextView.text = data.name + holder.todayVerifyNumTextView.text = "本车今日已验证:${data.todayVerifyNum}次" + holder.historyVerifyNumTextView.text = + "路线累计反馈${data.historyVerifyTotalUsableNum}可用,${data.historyVerifyTotalNotUsableNum}不可用" + if (data.isChoosed) { + holder.itemView.setBackgroundResource(R.drawable.routing_choose_line_shape_select_line_item_bg_selected) + } else { + holder.itemView.setBackgroundResource(R.drawable.routing_choose_line_shape_select_line_item_bg_normal) + } + + //设置item点击事件 + holder.itemView.setOnClickListener { + mData.forEachIndexed { index, result -> + if (result.isChoosed) { + result.isChoosed = false + + } + } + mData[currentPosition].isChoosed = true + notifyItemChanged(currentPosition) + mItemClickListener?.onItemClick(currentPosition, false) + } + } + + override fun getItemCount(): Int { + return mData.size + } + + fun setOnLineItemClickListener(itemClickListener: OnChooseLineItemClickListener?) { + mItemClickListener = itemClickListener + } + + interface OnChooseLineItemClickListener { + fun onItemClick(position: Int, close: Boolean) + } + + class SwitchLineViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val lineNameTextView: AppCompatTextView//线路名称 + val todayVerifyNumTextView: AppCompatTextView //本车今天验证次数 + val historyVerifyNumTextView: AppCompatTextView //路线累计验证次数 + + init { + lineNameTextView = itemView.findViewById(R.id.switchLineNameTextView) + todayVerifyNumTextView = itemView.findViewById(R.id.todayVerifyNumTextView) + historyVerifyNumTextView = itemView.findViewById(R.id.historyVerifyNumTextView) + } + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineItemOpenAnimator.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineItemOpenAnimator.java new file mode 100644 index 0000000000..323ec5e83a --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineItemOpenAnimator.java @@ -0,0 +1,641 @@ +package com.mogo.och.taxi.ui.routing; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.TimeInterpolator; +import android.animation.ValueAnimator; +import android.view.View; +import android.view.ViewPropertyAnimator; + +import androidx.annotation.NonNull; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +/** + * This implementation of {@link RecyclerView.ItemAnimator} provides basic + * animations on remove, add, and move events that happen to the items in + * a RecyclerView. RecyclerView uses a DefaultItemAnimator by default. + * + * @see RecyclerView#setItemAnimator(RecyclerView.ItemAnimator) + */ +public class TaxiRoutingChooseLineItemOpenAnimator extends DefaultItemAnimator { + private static final boolean DEBUG = false; + private static TimeInterpolator sDefaultInterpolator; + private final ArrayList mPendingRemovals = new ArrayList<>(); + private final ArrayList mPendingAdditions = new ArrayList<>(); + private final ArrayList mPendingMoves = new ArrayList<>(); + private final ArrayList mPendingChanges = new ArrayList<>(); + private final ArrayList> mAdditionsList = new ArrayList<>(); + private final ArrayList> mMovesList = new ArrayList<>(); + private final ArrayList> mChangesList = new ArrayList<>(); + private final ArrayList mAddAnimations = new ArrayList<>(); + private final ArrayList mMoveAnimations = new ArrayList<>(); + private final ArrayList mRemoveAnimations = new ArrayList<>(); + private final ArrayList mChangeAnimations = new ArrayList<>(); + + private static class MoveInfo { + public RecyclerView.ViewHolder holder; + public int fromX, fromY, toX, toY; + + MoveInfo(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { + this.holder = holder; + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + } + + private static class ChangeInfo { + public RecyclerView.ViewHolder oldHolder, newHolder; + public int fromX, fromY, toX, toY; + + private ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder) { + this.oldHolder = oldHolder; + this.newHolder = newHolder; + } + + ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, + int fromX, int fromY, int toX, int toY) { + this(oldHolder, newHolder); + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + + @Override + public String toString() { + return "ChangeInfo{" + + "oldHolder=" + oldHolder + + ", newHolder=" + newHolder + + ", fromX=" + fromX + + ", fromY=" + fromY + + ", toX=" + toX + + ", toY=" + toY + + '}'; + } + } + + @Override + public void runPendingAnimations() { + boolean removalsPending = !mPendingRemovals.isEmpty(); + boolean movesPending = !mPendingMoves.isEmpty(); + boolean changesPending = !mPendingChanges.isEmpty(); + boolean additionsPending = !mPendingAdditions.isEmpty(); + if (!removalsPending && !movesPending && !additionsPending && !changesPending) { + // nothing to animate + return; + } + // First, remove stuff + for (RecyclerView.ViewHolder holder : mPendingRemovals) { + animateRemoveImpl(holder); + } + mPendingRemovals.clear(); + // Next, move stuff + if (movesPending) { + final ArrayList moves = new ArrayList<>(mPendingMoves); + mMovesList.add(moves); + mPendingMoves.clear(); + Runnable mover = () -> { + for (MoveInfo moveInfo : moves) { + animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY, + moveInfo.toX, moveInfo.toY); + } + moves.clear(); + mMovesList.remove(moves); + }; + if (removalsPending) { + View view = moves.get(0).holder.itemView; + ViewCompat.postOnAnimationDelayed(view, mover, getRemoveDuration()); + } else { + mover.run(); + } + } + // Next, change stuff, to run in parallel with move animations + if (changesPending) { + final ArrayList changes = new ArrayList<>(mPendingChanges); + mChangesList.add(changes); + mPendingChanges.clear(); + Runnable changer = () -> { + for (ChangeInfo change : changes) { + animateChangeImpl(change); + } + changes.clear(); + mChangesList.remove(changes); + }; + if (removalsPending) { + RecyclerView.ViewHolder holder = changes.get(0).oldHolder; + ViewCompat.postOnAnimationDelayed(holder.itemView, changer, getRemoveDuration()); + } else { + changer.run(); + } + } + // Next, add stuff + if (additionsPending) { + final ArrayList additions = new ArrayList<>(mPendingAdditions); + mAdditionsList.add(additions); + mPendingAdditions.clear(); + Runnable adder = () -> { + for (RecyclerView.ViewHolder holder : additions) { + animateAddImpl(holder); + } + additions.clear(); + mAdditionsList.remove(additions); + }; + if (removalsPending || movesPending || changesPending) { + long removeDuration = removalsPending ? getRemoveDuration() : 0; + long moveDuration = movesPending ? getMoveDuration() : 0; + long changeDuration = changesPending ? getChangeDuration() : 0; + long totalDelay = removeDuration + Math.max(moveDuration, changeDuration); + View view = additions.get(0).itemView; + ViewCompat.postOnAnimationDelayed(view, adder, totalDelay); + } else { + adder.run(); + } + } + } + + @Override + public boolean animateRemove(final RecyclerView.ViewHolder holder) { + resetAnimation(holder); + mPendingRemovals.add(holder); + return true; + } + + private void animateRemoveImpl(final RecyclerView.ViewHolder holder) { + final View view = holder.itemView; + final ViewPropertyAnimator animation = view.animate(); + mRemoveAnimations.add(holder); + animation.setDuration(getRemoveDuration()).alpha(0).setListener( + new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchRemoveStarting(holder); + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + view.setAlpha(1); + dispatchRemoveFinished(holder); + mRemoveAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateAdd(final RecyclerView.ViewHolder holder) { + resetAnimation(holder); + holder.itemView.setAlpha(0); + mPendingAdditions.add(holder); + return true; + } + + void animateAddImpl(final RecyclerView.ViewHolder holder) { + final View view = holder.itemView; + final ViewPropertyAnimator animation = view.animate(); + mAddAnimations.add(holder); + animation.alpha(1).setDuration(getAddDuration()) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchAddStarting(holder); + } + + @Override + public void onAnimationCancel(Animator animator) { + view.setAlpha(1); + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + dispatchAddFinished(holder); + mAddAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY, + int toX, int toY) { + final View view = holder.itemView; + fromX += (int) holder.itemView.getTranslationX(); + fromY += (int) holder.itemView.getTranslationY(); + resetAnimation(holder); + int deltaX = toX - fromX; + int deltaY = toY - fromY; + if (deltaX == 0 && deltaY == 0) { + dispatchMoveFinished(holder); + return false; + } + if (deltaX != 0) { + view.setTranslationX(-deltaX); + } + if (deltaY != 0) { + view.setTranslationY(-deltaY); + } + mPendingMoves.add(new MoveInfo(holder, fromX, fromY, toX, toY)); + return true; + } + + void animateMoveImpl(final RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { + final View view = holder.itemView; + final int deltaX = toX - fromX; + final int deltaY = toY - fromY; + if (deltaX != 0) { + view.animate().translationX(0); + } + if (deltaY != 0) { + view.animate().translationY(0); + } + // TODO: make EndActions end listeners instead, since end actions aren't called when + // vpas are canceled (and can't end them. why?) + // need listener functionality in VPACompat for this. Ick. + final ViewPropertyAnimator animation = view.animate(); + mMoveAnimations.add(holder); + animation.setDuration(getMoveDuration()).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchMoveStarting(holder); + } + + @Override + public void onAnimationCancel(Animator animator) { + if (deltaX != 0) { + view.setTranslationX(0); + } + if (deltaY != 0) { + view.setTranslationY(0); + } + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + dispatchMoveFinished(holder); + mMoveAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, + int fromX, int fromY, int toX, int toY) { + if (oldHolder == newHolder) { + // Don't know how to run change animations when the same view holder is re-used. + // run a move animation to handle position changes. + return animateMove(oldHolder, fromX, fromY, toX, toY); + } + final float prevTranslationX = oldHolder.itemView.getTranslationX(); + final float prevTranslationY = oldHolder.itemView.getTranslationY(); + final float prevAlpha = oldHolder.itemView.getAlpha(); + resetAnimation(oldHolder); + int deltaX = (int) (toX - fromX - prevTranslationX); + int deltaY = (int) (toY - fromY - prevTranslationY); + // recover prev translation state after ending animation + oldHolder.itemView.setTranslationX(prevTranslationX); + oldHolder.itemView.setTranslationY(prevTranslationY); + oldHolder.itemView.setAlpha(prevAlpha); + if (newHolder != null) { + // carry over translation values + resetAnimation(newHolder); + newHolder.itemView.setTranslationX(-deltaX); + newHolder.itemView.setTranslationY(-deltaY); + newHolder.itemView.setAlpha(0); + } + mPendingChanges.add(new ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY)); + return true; + } + + void animateChangeImpl(final ChangeInfo changeInfo) { + final RecyclerView.ViewHolder holder = changeInfo.oldHolder; + final View view = holder == null ? null : holder.itemView; + final RecyclerView.ViewHolder newHolder = changeInfo.newHolder; + final View newView = newHolder != null ? newHolder.itemView : null; + if (view != null) { + final ViewPropertyAnimator oldViewAnim = view.animate().setDuration( + getChangeDuration()); + mChangeAnimations.add(changeInfo.oldHolder); + oldViewAnim.translationX((float) (changeInfo.toX - changeInfo.fromX)); + oldViewAnim.translationY((float) (changeInfo.toY - changeInfo.fromY)); + oldViewAnim.alpha(0).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchChangeStarting(changeInfo.oldHolder, true); + } + + @Override + public void onAnimationEnd(Animator animator) { + oldViewAnim.setListener(null); + view.setAlpha(1); + view.setTranslationX(0); + view.setTranslationY(0); + dispatchChangeFinished(changeInfo.oldHolder, true); + mChangeAnimations.remove(changeInfo.oldHolder); + dispatchFinishedWhenDone(); + } + }).start(); + } + if (newView != null) { + final ViewPropertyAnimator newViewAnimation = newView.animate(); + mChangeAnimations.add(changeInfo.newHolder); + newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()) + .alpha(1).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchChangeStarting(changeInfo.newHolder, false); + } + + @Override + public void onAnimationEnd(Animator animator) { + newViewAnimation.setListener(null); + newView.setAlpha(1); + newView.setTranslationX(0); + newView.setTranslationY(0); + dispatchChangeFinished(changeInfo.newHolder, false); + mChangeAnimations.remove(changeInfo.newHolder); + dispatchFinishedWhenDone(); + } + }).start(); + } + } + + private void endChangeAnimation(List infoList, RecyclerView.ViewHolder item) { + for (int i = infoList.size() - 1; i >= 0; i--) { + ChangeInfo changeInfo = infoList.get(i); + if (endChangeAnimationIfNecessary(changeInfo, item)) { + if (changeInfo.oldHolder == null && changeInfo.newHolder == null) { + infoList.remove(changeInfo); + } + } + } + } + + private void endChangeAnimationIfNecessary(ChangeInfo changeInfo) { + if (changeInfo.oldHolder != null) { + endChangeAnimationIfNecessary(changeInfo, changeInfo.oldHolder); + } + if (changeInfo.newHolder != null) { + endChangeAnimationIfNecessary(changeInfo, changeInfo.newHolder); + } + } + + private boolean endChangeAnimationIfNecessary(ChangeInfo changeInfo, RecyclerView.ViewHolder item) { + boolean oldItem = false; + if (changeInfo.newHolder == item) { + changeInfo.newHolder = null; + } else if (changeInfo.oldHolder == item) { + changeInfo.oldHolder = null; + oldItem = true; + } else { + return false; + } + item.itemView.setAlpha(1); + item.itemView.setTranslationX(0); + item.itemView.setTranslationY(0); + dispatchChangeFinished(item, oldItem); + return true; + } + + @Override + public void endAnimation(RecyclerView.ViewHolder item) { + final View view = item.itemView; + // this will trigger end callback which should set properties to their target values. + view.animate().cancel(); + // TODO if some other animations are chained to end, how do we cancel them as well? + for (int i = mPendingMoves.size() - 1; i >= 0; i--) { + MoveInfo moveInfo = mPendingMoves.get(i); + if (moveInfo.holder == item) { + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item); + mPendingMoves.remove(i); + } + } + endChangeAnimation(mPendingChanges, item); + if (mPendingRemovals.remove(item)) { + view.setAlpha(1); + dispatchRemoveFinished(item); + } + if (mPendingAdditions.remove(item)) { + view.setAlpha(1); + dispatchAddFinished(item); + } + + for (int i = mChangesList.size() - 1; i >= 0; i--) { + ArrayList changes = mChangesList.get(i); + endChangeAnimation(changes, item); + if (changes.isEmpty()) { + mChangesList.remove(i); + } + } + for (int i = mMovesList.size() - 1; i >= 0; i--) { + ArrayList moves = mMovesList.get(i); + for (int j = moves.size() - 1; j >= 0; j--) { + MoveInfo moveInfo = moves.get(j); + if (moveInfo.holder == item) { + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item); + moves.remove(j); + if (moves.isEmpty()) { + mMovesList.remove(i); + } + break; + } + } + } + for (int i = mAdditionsList.size() - 1; i >= 0; i--) { + ArrayList additions = mAdditionsList.get(i); + if (additions.remove(item)) { + view.setAlpha(1); + dispatchAddFinished(item); + if (additions.isEmpty()) { + mAdditionsList.remove(i); + } + } + } + + // animations should be ended by the cancel above. + //noinspection Pointless BooleanExpression,ConstantConditions + if (mRemoveAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mRemoveAnimations list"); + } + + //noinspection Pointless BooleanExpression,ConstantConditions + if (mAddAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mAddAnimations list"); + } + + //noinspection Pointless BooleanExpression,ConstantConditions + if (mChangeAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mChangeAnimations list"); + } + + //noinspection Pointless BooleanExpression,ConstantConditions + if (mMoveAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mMoveAnimations list"); + } + dispatchFinishedWhenDone(); + } + + private void resetAnimation(RecyclerView.ViewHolder holder) { + if (sDefaultInterpolator == null) { + sDefaultInterpolator = new ValueAnimator().getInterpolator(); + } + holder.itemView.animate().setInterpolator(sDefaultInterpolator); + endAnimation(holder); + } + + @Override + public boolean isRunning() { + return (!mPendingAdditions.isEmpty() + || !mPendingChanges.isEmpty() + || !mPendingMoves.isEmpty() + || !mPendingRemovals.isEmpty() + || !mMoveAnimations.isEmpty() + || !mRemoveAnimations.isEmpty() + || !mAddAnimations.isEmpty() + || !mChangeAnimations.isEmpty() + || !mMovesList.isEmpty() + || !mAdditionsList.isEmpty() + || !mChangesList.isEmpty()); + } + + /** + * Check the state of currently pending and running animations. If there are none + * pending/running, call {@link #dispatchAnimationsFinished()} to notify any + * listeners. + */ + void dispatchFinishedWhenDone() { + if (!isRunning()) { + dispatchAnimationsFinished(); + } + } + + @Override + public void endAnimations() { + int count = mPendingMoves.size(); + for (int i = count - 1; i >= 0; i--) { + MoveInfo item = mPendingMoves.get(i); + View view = item.holder.itemView; + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item.holder); + mPendingMoves.remove(i); + } + count = mPendingRemovals.size(); + for (int i = count - 1; i >= 0; i--) { + RecyclerView.ViewHolder item = mPendingRemovals.get(i); + dispatchRemoveFinished(item); + mPendingRemovals.remove(i); + } + count = mPendingAdditions.size(); + for (int i = count - 1; i >= 0; i--) { + RecyclerView.ViewHolder item = mPendingAdditions.get(i); + item.itemView.setAlpha(1); + dispatchAddFinished(item); + mPendingAdditions.remove(i); + } + count = mPendingChanges.size(); + for (int i = count - 1; i >= 0; i--) { + endChangeAnimationIfNecessary(mPendingChanges.get(i)); + } + mPendingChanges.clear(); + if (!isRunning()) { + return; + } + + int listCount = mMovesList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList moves = mMovesList.get(i); + count = moves.size(); + for (int j = count - 1; j >= 0; j--) { + MoveInfo moveInfo = moves.get(j); + RecyclerView.ViewHolder item = moveInfo.holder; + View view = item.itemView; + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(moveInfo.holder); + moves.remove(j); + if (moves.isEmpty()) { + mMovesList.remove(moves); + } + } + } + listCount = mAdditionsList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList additions = mAdditionsList.get(i); + count = additions.size(); + for (int j = count - 1; j >= 0; j--) { + RecyclerView.ViewHolder item = additions.get(j); + View view = item.itemView; + view.setAlpha(1); + dispatchAddFinished(item); + additions.remove(j); + if (additions.isEmpty()) { + mAdditionsList.remove(additions); + } + } + } + listCount = mChangesList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList changes = mChangesList.get(i); + count = changes.size(); + for (int j = count - 1; j >= 0; j--) { + endChangeAnimationIfNecessary(changes.get(j)); + if (changes.isEmpty()) { + mChangesList.remove(changes); + } + } + } + + cancelAll(mRemoveAnimations); + cancelAll(mMoveAnimations); + cancelAll(mAddAnimations); + cancelAll(mChangeAnimations); + + dispatchAnimationsFinished(); + } + + void cancelAll(List viewHolders) { + for (int i = viewHolders.size() - 1; i >= 0; i--) { + viewHolders.get(i).itemView.animate().cancel(); + } + } + + /** + * {@inheritDoc} + *

+ * If the payload list is not empty, DefaultItemAnimator returns true. + * When this is the case: + *

    + *
  • If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both + * ViewHolder arguments will be the same instance. + *
  • + *
  • + * If you are not overriding {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, + * then DefaultItemAnimator will call {@link #animateMove(RecyclerView.ViewHolder, int, int, int, int)} and + * run a move animation instead. + *
  • + *
+ */ + @Override + public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, + @NonNull List payloads) { + return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads); + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt new file mode 100644 index 0000000000..b209267f14 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt @@ -0,0 +1,37 @@ +package com.mogo.och.taxi.ui.routing + +import android.content.Intent +import android.os.Bundle +import com.mogo.commons.mvp.BaseFragment +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.taxi.R +import kotlinx.android.synthetic.main.routing_fragment.btnChooseTask + +class TaxiRoutingFragment : BaseFragment() { + + companion object { + const val TAG = SceneConstant.M_TAXI + "RoutingFragment" + + fun newInstance(): TaxiRoutingFragment { + val args = Bundle() + val fragment = TaxiRoutingFragment() + fragment.arguments = args + return fragment + } + } + + override fun getLayoutId(): Int { + return R.layout.routing_fragment + } + + override fun getTagName(): String { + return "RoutingFragment" + } + + override fun initViews() { + btnChooseTask.setOnClickListener { + val intent = Intent(context, TaxiRoutingChooseLineActivity::class.java) + startActivity(intent) + } + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable-xhdpi/routing_line_task_arrow.png b/OCH/taxi/unmanned-driver/src/main/res/drawable-xhdpi/routing_line_task_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b32f0693a6bd437f6e1c5e6039e9f9ef092dcaa3 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^!a%IV!3HGvmOVNGq!^2X+?^QKos)S9xJU2c1fa4|PZ!4! z58k!YZhJX7inQtOUB6p{=W{@cUAzAS=}KLeMwW#gi(Icr|4^Bzv9xm6`=D+2oAgo) zCv8p>`?KNttCez^+OPBCOQV(s$U*6*hMs&A9%+1V6SKe zcg{lwvo!~dHcVxX*v_PV;2PHsMf>mbuP)QG@cHvgmP=ku;3tFklEd$rAM_cUGQ=+a z;K}VW?K02H57B-*xHW1PGIwrfWjwWz^U}pd1wZ249$VZtTTsjHHNCujy@=Ft%U29< zty|_-J}>7;exV?{UgVF%rfG&RyH87-UOwuY5GwNA>+AL1!VL$f@71j;wf^om OKzq9SxvX + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg_default.xml b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg_default.xml new file mode 100644 index 0000000000..e94992d507 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg_default.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg_pressed.xml b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg_pressed.xml new file mode 100644 index 0000000000..975ed9780c --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_btn_submit_bg_pressed.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_close.png b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_close.png new file mode 100644 index 0000000000000000000000000000000000000000..370b61de38f35e5da73f6c3a98eeebc45b0bbeea GIT binary patch literal 3825 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 + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_shape_select_line_item_bg_selected.xml b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_shape_select_line_item_bg_selected.xml new file mode 100644 index 0000000000..e5faafb27b --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_choose_line_shape_select_line_item_bg_selected.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg.xml b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg.xml new file mode 100644 index 0000000000..ff04ae2b6d --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg_default.xml b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg_default.xml new file mode 100644 index 0000000000..6c763666ea --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg_default.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg_pressed.xml b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg_pressed.xml new file mode 100644 index 0000000000..3abd919e23 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/drawable/routing_click_btn_bg_pressed.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/drawable/taxi_routing_bg.xml b/OCH/taxi/unmanned-driver/src/main/res/drawable/taxi_routing_bg.xml new file mode 100644 index 0000000000..f5efecaa11 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/drawable/taxi_routing_bg.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/routing_choose_line_activity.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/routing_choose_line_activity.xml new file mode 100644 index 0000000000..a3acc88b8a --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/routing_choose_line_activity.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/routing_choose_line_list_item.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/routing_choose_line_list_item.xml new file mode 100644 index 0000000000..d0dd1cbcb5 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/routing_choose_line_list_item.xml @@ -0,0 +1,51 @@ + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/routing_fragment.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/routing_fragment.xml new file mode 100644 index 0000000000..4067a4c542 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/routing_fragment.xml @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/routing_no_data_common_view.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/routing_no_data_common_view.xml new file mode 100644 index 0000000000..434d9ad890 --- /dev/null +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/routing_no_data_common_view.xml @@ -0,0 +1,33 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/values/colors.xml b/OCH/taxi/unmanned-driver/src/main/res/values/colors.xml index aa93f0eeaa..e57d0be01c 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/values/colors.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/values/colors.xml @@ -28,5 +28,10 @@ #CAD6FF #00FFF8 #1D5EF3 - + #1D5EF3 + #801D5EF3 + #F7151D41 + #2966EC + #CCB9C3E9 + #4Dffffff \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/values/dimens.xml b/OCH/taxi/unmanned-driver/src/main/res/values/dimens.xml index 22d65210b4..2e8093ba90 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/values/dimens.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/values/dimens.xml @@ -117,6 +117,9 @@ 60dp 34dp - 1000dp + 934dp + 46dp + 50dp + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/values/strings.xml b/OCH/taxi/unmanned-driver/src/main/res/values/strings.xml index ce60468f17..d5ee38fc76 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/values/strings.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/values/strings.xml @@ -60,5 +60,15 @@ 查看 + 选择任务 + 任务列表 + 确认 + 暂无任务 + 选择时间 + 路线: + 起点: + 终点: + 往%1$s方向 + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/values/styles.xml b/OCH/taxi/unmanned-driver/src/main/res/values/styles.xml index 4dc523b396..f9764de193 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/values/styles.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/values/styles.xml @@ -23,4 +23,25 @@ + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml index b4dd1a06f9..5a584f262c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml @@ -557,9 +557,9 @@ android:scaleX="1.2" android:scaleY="1.2" android:text="自主算路验证模式" - app:layout_constraintLeft_toLeftOf="@id/otherGuideLine" + app:layout_constraintLeft_toRightOf="@id/scShowBagRecordWindow" app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toBottomOf="@id/scShowBagRecordWindow" /> + app:layout_constraintTop_toBottomOf="@id/scIPCReport" />