diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 771c1f74d7..740794bd48 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -89,6 +89,7 @@ diff --git a/OCH/mogo-och-bus/build.gradle b/OCH/mogo-och-bus/build.gradle index 2e4e685dd9..0cfd857606 100644 --- a/OCH/mogo-och-bus/build.gradle +++ b/OCH/mogo-och-bus/build.gradle @@ -44,6 +44,8 @@ dependencies { implementation rootProject.ext.dependencies.rxjava implementation rootProject.ext.dependencies.rxandroid + implementation rootProject.ext.dependencies.androidxrecyclerview + if (Boolean.valueOf(RELEASE)) { implementation rootProject.ext.dependencies.mogooch implementation rootProject.ext.dependencies.mogoutils diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java new file mode 100644 index 0000000000..59e6699b93 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java @@ -0,0 +1,94 @@ +package com.mogo.och.bus.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.och.bus.R; +import com.mogo.och.bus.bean.OchBusStation; +import com.mogo.och.bus.constant.OchBusConst; + +import java.util.ArrayList; +import java.util.List; + +/** + * Station Panel 中的车站列表adapter + * + * @author tongchenfei + */ +public class OchBusStationAdapter extends RecyclerView.Adapter { + + private final Context context; + private final List stationList = new ArrayList<>(); + private int currentStation; + + public OchBusStationAdapter(Context context) { + this.context = context; + } + + public void refreshStationList(List stationList) { + this.stationList.clear(); + this.stationList.addAll(stationList); + for (int i = 0; i < stationList.size(); i++) { + OchBusStation station = stationList.get(i); + if (station.getIsCurrentSite() == OchBusConst.STATION_STATUS_ARRIVING || station.getIsCurrentSite() == OchBusConst.STATION_STATUS_STOPED) { + currentStation = i; + break; + } + } + notifyDataSetChanged(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_och_bus_station, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.tvStationName.setText(stationList.get(position).getSiteName()); + if (position == currentStation) { + holder.tvStationName.setTextColor(context.getResources().getColor(R.color.module_mogo_och_bus_current_station_name_text_color)); + } else if (position < currentStation) { + // 驶过 + holder.tvStationName.setTextColor(context.getResources().getColor(R.color.module_mogo_och_bus_arrived_station_name_text_color)); + }else { + holder.tvStationName.setTextColor(context.getResources().getColor(R.color.module_mogo_och_bus_not_arrive_station_name_text_color)); + } + + if (position == 0) { + holder.tvStationNotice.setText("起点"); + holder.tvStationNotice.setVisibility(View.VISIBLE); + } else if (position == getItemCount() - 1) { + holder.tvStationNotice.setText("终点"); + holder.tvStationNotice.setVisibility(View.VISIBLE); + }else{ + holder.tvStationNotice.setVisibility(View.GONE); + } + + } + + @Override + public int getItemCount() { + return stationList.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder{ + ImageView ivIcon; + TextView tvStationName; + TextView tvStationNotice; + public ViewHolder(@NonNull View itemView) { + super(itemView); + ivIcon = itemView.findViewById(R.id.module_mogo_och_bus_station_icon); + tvStationName = itemView.findViewById(R.id.module_mogo_och_bus_station_name); + tvStationNotice = itemView.findViewById(R.id.module_mogo_och_bus_station_notice); + } + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.java new file mode 100644 index 0000000000..b528100786 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.java @@ -0,0 +1,13 @@ +package com.mogo.och.bus.constant; + +/** + * 常量 + * + * @author tongchenfei + */ +public class OchBusConst { + public static final int STATION_STATUS_IDLE = 0; + public static final int STATION_STATUS_STOPED = 1; + public static final int STATION_STATUS_LEAVING = 2; + public static final int STATION_STATUS_ARRIVING = 3; +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java index 00ca10e6c3..4e6c91f6da 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java @@ -1,22 +1,19 @@ package com.mogo.och.bus.fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.Button; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.constraintlayout.widget.Group; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; -import com.mogo.commons.mvp.MvpFragment; import com.mogo.module.common.MogoApisHandler; -import com.mogo.module.common.view.OnPreventFastClickListener; import com.mogo.och.BaseOchFragment; import com.mogo.och.bus.R; +import com.mogo.och.bus.adapter.OchBusStationAdapter; import com.mogo.och.bus.bean.OchBusStation; +import com.mogo.och.bus.constant.OchBusConst; import com.mogo.och.bus.presenter.OchBusPresenter; import com.mogo.och.view.SlidePanelView; -import com.mogo.service.adas.entity.AdasOCHData; import com.mogo.utils.logger.Logger; import java.util.ArrayList; @@ -30,32 +27,25 @@ import java.util.List; */ public class OchBusFragment extends BaseOchFragment implements SlidePanelView.OnSlidePanelMoveToEndListener { private static final String TAG = "OchBusFragment"; - private final List stationList = new ArrayList<>(); - private TextView tvNotice; + private TextView tvStationNotice; + private TextView tvStationName; + private RecyclerView rvStationList; + + private OchBusStationAdapter adapter; @Override protected void initViews() { super.initViews(); -// findViewById(R.id.btnEnterOchBus).setOnClickListener(new OnPreventFastClickListener() { -// @Override -// public void onClickImpl(View v) { -// showOchBus(); -// } -// }); -// findViewById(R.id.btnArrive).setOnClickListener(view->{ -// mPresenter.onArriveAt(new AdasOCHData(10, nextStation.getLon(), nextStation.getLat())); -// }); -// btnExecute = findViewById(R.id.btnExecute); -// btnExecute.setOnClickListener(new OnPreventFastClickListener() { -// @Override -// public void onClickImpl(View v) { -// mPresenter.autoDriveToNextStation(); -// } -// }); - tvNotice = findViewById(R.id.module_mogo_och_bus_station_notice); + tvStationNotice = findViewById(R.id.module_mogo_och_bus_current_station_notice); + tvStationName = findViewById(R.id.module_mogo_och_bus_current_station_name); + rvStationList = findViewById(R.id.module_mogo_och_bus_rv_station_list); - tvNotice.setOnClickListener(view->{ + adapter = new OchBusStationAdapter(getContext()); + rvStationList.setAdapter(adapter); + rvStationList.setLayoutManager(new LinearLayoutManager(getContext())); + + tvStationNotice.setOnClickListener(view -> { showSlidePanle("到达站点,乘客以下车"); }); } @@ -88,39 +78,39 @@ public class OchBusFragment extends BaseOchFragment busStationList) { + public void refreshBusStations(List stationList) { if (getActivity() == null) { return; } getActivity().runOnUiThread(() -> { - if (busStationList == null) { + if (stationList == null) { // todo 获取小巴数据失败 } else { // todo 渲染小巴路线数据 - stationList.clear(); - stationList.addAll(busStationList); -// for (int i = 0; i < stationList.size(); i++) { -// OchBusStation station = stationList.get(i); -// if (station.getIsCurrentSite() == OchBusPresenter.STATION_STATUS_LEAVING) { -// tvNotice.setText("正在从 " + i + "站驶向" + (i + 1) + "站"); -// nextStation = stationList.get(i + 1); -// btnExecute.setVisibility(View.GONE); -// break; -// } else if (station.getIsCurrentSite() == OchBusPresenter.STATION_STATUS_STOPED) { -// tvNotice.setText("车辆正停在" + i + "站"); -// btnExecute.setVisibility(View.VISIBLE); -// if (i == stationList.size() - 1) { -// btnExecute.setText("单程结束"); -// }else if(i == 0){ -// btnExecute.setText("准备出发"); -// }else{ -// btnExecute.setText("乘客已上车,准备出发"); -// } -// break; -// } -// } + adapter.refreshStationList(stationList); + + for (int i = 0; i < stationList.size(); i++) { + OchBusStation station = stationList.get(i); + if (station.getIsCurrentSite() == OchBusConst.STATION_STATUS_ARRIVING) { + tvStationName.setText(station.getSiteName()); + tvStationNotice.setText("下一站"); + onAutopilotStatusChanged(true); + break; + } else if (station.getIsCurrentSite() == OchBusConst.STATION_STATUS_STOPED) { + tvStationNotice.setText("当前车站"); + tvStationName.setText(station.getSiteName()); + onAutopilotStatusChanged(false); + if (i == stationList.size() - 1) { + tvStationNotice.setText("终点"); + showSlidePanle("单程结束"); + } else if (i == 0) { + showSlidePanle("准备出发"); + } else { + showSlidePanle("乘客已上车,准备出发"); + } + break; + } + } } }); } @@ -130,7 +120,7 @@ public class OchBusFragment extends BaseOchFragment implements IMogoA private static final String TAG = "OchBusPresenter"; private static final int VEHICAL_TYPE = 10; - public static final int STATION_STATUS_IDLE = 0; - public static final int STATION_STATUS_STOPED = 1; - public static final int STATION_STATUS_LEAVING = 2; - public static final int STATION_STATUS_ARRIVING = 3; - public OchBusPresenter(OchBusFragment view) { super(view); MogoApisHandler.getInstance().getApis().getAdasControllerApi().addAdasOCHCallback(this); diff --git a/OCH/mogo-och-bus/src/main/res/drawable/module_mogo_och_bus_station_green_dash_line.xml b/OCH/mogo-och-bus/src/main/res/drawable/module_mogo_och_bus_station_green_dash_line.xml new file mode 100644 index 0000000000..ede7dd747d --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/module_mogo_och_bus_station_green_dash_line.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/module_mogo_och_bus_station_v_green_dash.xml b/OCH/mogo-och-bus/src/main/res/drawable/module_mogo_och_bus_station_v_green_dash.xml new file mode 100644 index 0000000000..d184a7bf11 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/module_mogo_och_bus_station_v_green_dash.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml index 0e51a45408..78888b54d8 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml @@ -1,19 +1,58 @@ - + android:layout_height="@dimen/module_mogo_och_bus_station_panel_height" + android:background="#FF2C3862"> + + android:layout_marginStart="@dimen/module_mogo_och_bus_station_panel_guide_offset_left" + android:layout_marginTop="@dimen/module_mogo_och_bus_station_panel_padding_top" + android:text="顺义政府站" + android:textColor="@color/module_mogo_och_bus_current_station_name_text_color" + android:textSize="@dimen/module_mogo_och_bus_current_station_name_text_size" + app:layout_constraintLeft_toLeftOf="@id/vGuide" + app:layout_constraintTop_toTopOf="parent" /> + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/item_och_bus_station.xml b/OCH/mogo-och-bus/src/main/res/layout/item_och_bus_station.xml new file mode 100644 index 0000000000..9e953e0753 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/item_och_bus_station.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/colors.xml b/OCH/mogo-och-bus/src/main/res/values/colors.xml new file mode 100644 index 0000000000..b2dbac5862 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #FF1FA7FF + #FFFFFFFF + #FFFFFFFF + #FF51649D + #FF8299EB + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/dimens.xml b/OCH/mogo-och-bus/src/main/res/values/dimens.xml index 2a67585b14..3e8dc4658a 100644 --- a/OCH/mogo-och-bus/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values/dimens.xml @@ -1,7 +1,25 @@ - 24px 464px - 310px + 348px + + 32px + 20px + 26px + 20px + + 15px + + 20px + 36px + 28px + 36px + + 3px + 3px + 17px + 17px + + \ No newline at end of file diff --git a/OCH/mogo-och/src/main/java/com/mogo/och/BaseOchFragment.java b/OCH/mogo-och/src/main/java/com/mogo/och/BaseOchFragment.java index f6c8db5b2a..d7f3aa3540 100644 --- a/OCH/mogo-och/src/main/java/com/mogo/och/BaseOchFragment.java +++ b/OCH/mogo-och/src/main/java/com/mogo/och/BaseOchFragment.java @@ -11,7 +11,10 @@ import androidx.fragment.app.Fragment; import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; +import com.mogo.module.common.MogoApisHandler; import com.mogo.och.view.SlidePanelView; +import com.mogo.service.statusmanager.IMogoStatusChangedListener; +import com.mogo.service.statusmanager.StatusDescriptor; /** * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况 @@ -47,6 +50,20 @@ public abstract class BaseOchFragment> e LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener); + + checkCallView(MogoApisHandler.getInstance().getApis().getStatusManagerApi().isCallViewShow()); + MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("Och", StatusDescriptor.CALL_VIEW, callViewListener); + } + + private void checkCallView(boolean isShown){ + if (flStationPanelContainer == null) { + return; + } + if (isShown) { + flStationPanelContainer.setTranslationY(131f); + }else{ + flStationPanelContainer.setTranslationY(0f); + } } public void showSlidePanle(String text) { @@ -79,6 +96,18 @@ public abstract class BaseOchFragment> e return null; } + private final IMogoStatusChangedListener callViewListener = (descriptor, isTrue) -> { + if (descriptor == StatusDescriptor.CALL_VIEW) { + checkCallView(isTrue); + } + }; + + @Override + public void onDestroyView() { + super.onDestroyView(); + MogoApisHandler.getInstance().getApis().getStatusManagerApi().unregisterStatusChangedListener("Och", StatusDescriptor.CALL_VIEW, callViewListener); + } + /** * 获取站点面板view,在{@link #initViews()}时候添加到container中 * @return 站点面板view diff --git a/OCH/mogo-och/src/main/java/com/mogo/och/view/SlidePanelView.java b/OCH/mogo-och/src/main/java/com/mogo/och/view/SlidePanelView.java index d93463dd99..98101a57b5 100644 --- a/OCH/mogo-och/src/main/java/com/mogo/och/view/SlidePanelView.java +++ b/OCH/mogo-och/src/main/java/com/mogo/och/view/SlidePanelView.java @@ -14,7 +14,6 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader; import android.util.AttributeSet; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.animation.DecelerateInterpolator; @@ -49,10 +48,15 @@ public class SlidePanelView extends View { private final Paint blockPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - private static final int BLOCK_START_X = 10; - private static final int BLOCK_START_Y = 10; - private static final int TEXT_MARGIN_LEFT = 20; - private static final int TEXT_MARGIN_RIGHT = 30; + private static final int BLOCK_START_X = 15; + private static final int BLOCK_START_Y = 15; + private static final int NORMAL_TEXT_MARGIN_LEFT = 40; + private static final int NORMAL_TEXT_MARGIN_RIGHT = 50; + private static final int SHORT_TEXT_MARGIN_LEFT = 60; + private static final int SHORT_TEXT_MARGIN_RIGHT = 70; + + private int textMarginLeft = NORMAL_TEXT_MARGIN_LEFT; + private int textMarginRight = NORMAL_TEXT_MARGIN_RIGHT; private OnSlidePanelMoveToEndListener moveToEndListener; @@ -105,7 +109,7 @@ public class SlidePanelView extends View { textPaint.setStyle(Paint.Style.FILL); textPaint.setTextSize(40); textPaint.setTextAlign(Paint.Align.LEFT); - textGradient = new LinearGradient(-GRADIENT_OFFSET, 0, 0, 0, new int[]{0x33ffffff, 0xffffffff, 0x29ffffff}, new float[]{0, 0.5f, 1f}, Shader.TileMode.CLAMP); + textGradient = new LinearGradient(-GRADIENT_OFFSET, 0, 0, 0, new int[]{0x33ffffff, 0xffffffff, 0x33ffffff}, null, Shader.TileMode.CLAMP); textGradient.setLocalMatrix(gradientMatrix); textPaint.setShader(textGradient); textPaint.getFontMetrics(blockTextMetrics); @@ -118,17 +122,22 @@ public class SlidePanelView extends View { protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); - int widthSize = MeasureSpec.getSize(widthMeasureSpec); - int heightSize = MeasureSpec.getSize(heightMeasureSpec); + int widthSize; + int heightSize; - Log.d(TAG, "onMeasure:\r\n widthMode: " + widthMode + " widthSize: " + widthSize + " \r\n heightMode: " + heightMode + " heightSize: " + heightSize); + if (blockText.length() < 5) { + textMarginLeft = SHORT_TEXT_MARGIN_LEFT; + textMarginRight = SHORT_TEXT_MARGIN_RIGHT; + } else { + textMarginLeft = NORMAL_TEXT_MARGIN_LEFT; + textMarginRight = NORMAL_TEXT_MARGIN_RIGHT; + } - Log.d(TAG, "textMetrics: ascent: " + blockTextMetrics.ascent + " descent: " + blockTextMetrics.descent + " top: " + blockTextMetrics.top + " bottom: " + blockTextMetrics.bottom); if (widthMode == MeasureSpec.AT_MOST) { // 宽度根据图片大小,字符串长度,各种间隔确定 // 高度根据图片大小和上下间隔确定 textPaint.getTextBounds(blockText, 0, blockText.length(), textRect); - widthSize = BLOCK_START_X * 2 + bmBlock.getWidth() + TEXT_MARGIN_LEFT + TEXT_MARGIN_RIGHT + textRect.width(); + widthSize = BLOCK_START_X * 2 + bmBlock.getWidth() + textMarginLeft + textMarginRight + textRect.width(); heightSize = BLOCK_START_Y * 2 + bmBlock.getHeight(); widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode); heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode); @@ -148,7 +157,7 @@ public class SlidePanelView extends View { matrixAnim.cancel(); } textOffset = (getHeight() - blockTextMetrics.ascent - blockTextMetrics.descent) / 2; - matrixAnim = ObjectAnimator.ofFloat(this, "matrixTranslate", 0, w + GRADIENT_OFFSET).setDuration(1000); + matrixAnim = ObjectAnimator.ofFloat(this, "matrixTranslate", 0, w + GRADIENT_OFFSET).setDuration(2000); matrixAnim.setRepeatCount(ValueAnimator.INFINITE); matrixAnim.start(); } @@ -231,7 +240,7 @@ public class SlidePanelView extends View { gradientMatrix.setTranslate(matrixTranslate, 0); textGradient.setLocalMatrix(gradientMatrix); canvas.save(); - canvas.drawText(blockText, blockWidth + BLOCK_START_X + TEXT_MARGIN_LEFT, textOffset, textPaint); + canvas.drawText(blockText, blockWidth + BLOCK_START_X + textMarginLeft, textOffset, textPaint); canvas.restore(); // 画滑块 canvas.drawBitmap(bmBlock, BLOCK_START_X + blockOffset, BLOCK_START_Y, blockPaint); diff --git a/OCH/mogo-och/src/main/res/layout/module_mogo_och_base_fragment.xml b/OCH/mogo-och/src/main/res/layout/module_mogo_och_base_fragment.xml index 94f34cc808..251f80379c 100644 --- a/OCH/mogo-och/src/main/res/layout/module_mogo_och_base_fragment.xml +++ b/OCH/mogo-och/src/main/res/layout/module_mogo_och_base_fragment.xml @@ -16,19 +16,6 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - - - - - - - - - - - -