From bd707078da66174e3f3f46ced8b1a14b184267fd Mon Sep 17 00:00:00 2001 From: liujing Date: Tue, 26 Oct 2021 15:42:58 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[add]=20930-UI=20push=E5=BC=B9=E6=A1=86=20?= =?UTF-8?q?=E4=BA=A4=E8=AD=A6=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../check/view/CheckRecyclerFooter.java | 28 --- .../mogo-core-function-hmi/build.gradle | 1 + .../hmi/ui/notice/NoticeTrafficAdapter.java | 55 ++++++ .../hmi/ui/notice/NoticeTrafficDialog.java | 50 ++++++ .../NoticeTrafficInfoGridItemDivider.java | 165 ++++++++++++++++++ .../hmi/ui/notice/NoticeTrafficInfoView.java | 42 +++++ .../drawable/notice_push_item_background.xml | 11 ++ .../layout/notice_dialog_traffic_police.xml | 31 +++- .../res/layout/notice_push_top_banner.xml | 88 ++++++++++ .../notice_traffice_info_list_adapter.xml | 37 ++++ .../main/res/values-xhdpi-2560x1440/color.xml | 2 + .../res/values-xhdpi-2560x1440/dimens.xml | 13 ++ .../src/main/res/values/color.xml | 2 + .../src/main/res/values/dimens.xml | 14 ++ .../eagle/core/data/notice/NoticeInfo.java | 67 +++++++ .../drawable/notice_banner_default.png | Bin 0 -> 27841 bytes 16 files changed, 574 insertions(+), 32 deletions(-) delete mode 100644 core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/view/CheckRecyclerFooter.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficAdapter.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficInfoGridItemDivider.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficInfoView.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/notice_push_item_background.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_push_top_banner.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_traffice_info_list_adapter.xml create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeInfo.java create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable/notice_banner_default.png diff --git a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/view/CheckRecyclerFooter.java b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/view/CheckRecyclerFooter.java deleted file mode 100644 index f072f65a03..0000000000 --- a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/view/CheckRecyclerFooter.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.mogo.eagle.core.function.check.view; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; - -import com.mogo.eagle.core.function.check.R; - -import java.util.jar.Attributes; - -/** - * @author liujing - * @description 描述 - * @since: 10/13/21 - */ -public class CheckRecyclerFooter extends View { - - public CheckRecyclerFooter(Context context, AttributeSet attributes) { - super(context, attributes); - LayoutInflater.from(context).inflate(R.layout.check_recycler_footer, null); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } -} diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index aa8fc72bc4..5fc71fcd47 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -48,6 +48,7 @@ dependencies { implementation rootProject.ext.dependencies.androidxconstraintlayout implementation rootProject.ext.dependencies.arouter implementation rootProject.ext.dependencies.rxandroid + implementation rootProject.ext.dependencies.androidxrecyclerview kapt rootProject.ext.dependencies.aroutercompiler diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficAdapter.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficAdapter.java new file mode 100644 index 0000000000..2dc70cf41e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficAdapter.java @@ -0,0 +1,55 @@ +package com.mogo.eagle.core.function.hmi.ui.notice; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.eagle.core.function.hmi.R; + +/** + * @author liujing + * @description 描述 + * @since: 10/26/21 + */ +class NoticeTrafficAdapter extends RecyclerView.Adapter { + LayoutInflater mLayoutInflater; + + public NoticeTrafficAdapter(@NonNull Context context) { + mLayoutInflater = LayoutInflater.from(context); + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = mLayoutInflater.inflate(R.layout.notice_traffice_info_list_adapter, parent, + false); + TrafficInfoHolder holder = new TrafficInfoHolder(v); + return holder; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + + } + + @Override + public int getItemCount() { + return 18; + } + + public class TrafficInfoHolder extends RecyclerView.ViewHolder { + private TextView keyText; + private TextView valueText; + + public TrafficInfoHolder(@NonNull View itemView) { + super(itemView); + keyText = itemView.findViewById(R.id.key_text_view); + valueText = itemView.findViewById(R.id.value_text_view); + } + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java new file mode 100644 index 0000000000..8a14da7768 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java @@ -0,0 +1,50 @@ +package com.mogo.eagle.core.function.hmi.ui.notice; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.eagle.core.function.hmi.R; +import com.mogo.module.common.dialog.BaseFloatDialog; + +import java.util.List; + +/** + * @author liujing + * @description 描述 + * @since: 10/26/21 + */ +public class NoticeTrafficDialog extends BaseFloatDialog { + private Context mContext; + private RecyclerView mRecyclerView; + + public NoticeTrafficDialog(@NonNull Context context) { + super(context); + mContext = context; + initView(); + } + + public NoticeTrafficDialog(@NonNull Context context, int themeResId) { + super(context, themeResId); + } + + public void initView() { + mRecyclerView = findViewById(R.id.traffic_info_recyclerView); + //网格布局 + GridLayoutManager layoutManager = new GridLayoutManager(mContext, 4); + mRecyclerView.setLayoutManager(layoutManager); + layoutManager.setOrientation(GridLayoutManager.VERTICAL); + //网格绘制 + try { + NoticeTrafficInfoGridItemDivider gridLayoutDivider = new NoticeTrafficInfoGridItemDivider(1, + (mContext.getResources().getColor(R.color.notice_dialog_back))); + mRecyclerView.addItemDecoration(gridLayoutDivider); + } catch (Exception e) { + e.printStackTrace(); + } + NoticeTrafficAdapter adapter = new NoticeTrafficAdapter(mContext); + mRecyclerView.setAdapter(adapter); + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficInfoGridItemDivider.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficInfoGridItemDivider.java new file mode 100644 index 0000000000..fb1e7dba89 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficInfoGridItemDivider.java @@ -0,0 +1,165 @@ +package com.mogo.eagle.core.function.hmi.ui.notice; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.view.View; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +/** + * @author liujing + * @description 网格布局网格绘制类 + * @since: 9/22/21 + */ +public class NoticeTrafficInfoGridItemDivider extends RecyclerView.ItemDecoration { + private String TAG = getClass().getSimpleName(); + private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; + private Drawable divider; + + public NoticeTrafficInfoGridItemDivider(Context context) { + final TypedArray a = context.obtainStyledAttributes(ATTRS); + divider = a.getDrawable(0); + a.recycle(); + } + + public NoticeTrafficInfoGridItemDivider(Drawable drawable) { + divider = drawable; + } + + public NoticeTrafficInfoGridItemDivider(int height, int color) { + GradientDrawable shapeDrawable = new GradientDrawable(); + shapeDrawable.setColor(color); + shapeDrawable.setShape(GradientDrawable.RECTANGLE); + shapeDrawable.setSize(height, height); + divider = shapeDrawable; + } + + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + + drawHorizontal(c, parent); + drawVertical(c, parent); + + } + + private int getSpanCount(RecyclerView parent) { + // 列数 + int spanCount = -1; + RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + + spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); + } else if (layoutManager instanceof StaggeredGridLayoutManager) { + spanCount = ((StaggeredGridLayoutManager) layoutManager) + .getSpanCount(); + } + return spanCount; + } + + public void drawHorizontal(Canvas c, RecyclerView parent) { + int childCount = parent.getChildCount(); //获取可见item的数量 + int spanCount = getSpanCount(parent); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int left = child.getLeft() - params.leftMargin; + final int right = child.getRight() + params.rightMargin + + divider.getIntrinsicWidth(); + final int top = child.getBottom() + params.bottomMargin; + final int bottom = top + divider.getIntrinsicHeight(); + divider.setBounds(left, top, right, bottom); + divider.draw(c); + if (i < spanCount) { //画第一行顶部的分割线 + drawHorizontalForFirstRow(c, child); + } + } + } + + private void drawHorizontalForFirstRow(Canvas c, View child) { + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + int left = child.getLeft() - params.leftMargin - divider.getIntrinsicWidth(); + int top = child.getTop() - params.topMargin - divider.getIntrinsicHeight(); + int right = child.getRight() + params.rightMargin + divider.getIntrinsicWidth(); + int bottom = top + divider.getIntrinsicHeight(); + divider.setBounds(left, top, right, bottom); + divider.draw(c); + } + + private void drawVerticalForFirstColum(Canvas c, View child) { + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams();//在父布局的 + int left = child.getLeft() - params.leftMargin - divider.getIntrinsicWidth(); + int top = child.getTop() - params.topMargin; + int right = child.getLeft() - params.leftMargin; + int bottom = top + child.getHeight() + divider.getIntrinsicHeight(); + divider.setBounds(left, top, right, bottom); + divider.draw(c); + } + + public void drawVertical(Canvas c, RecyclerView parent) { + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int top = child.getTop() - params.topMargin; + final int bottom = child.getBottom() + params.bottomMargin; + final int left = child.getRight() + params.rightMargin; + final int right = left + divider.getIntrinsicWidth(); + divider.setBounds(left, top, right, bottom); + divider.draw(c); + if (isFirstColum(parent, i, getSpanCount(parent))) { //画第一列左边分割线 + drawVerticalForFirstColum(c, child); + } + } + } + + //是否为第一列 + private boolean isFirstColum(RecyclerView parent, int pos, int spanCount) { + RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { //网格布局 + if ((pos + 1) % spanCount == 1) { + return true; + } + } + return false; + } + + //是否为第一行 + private boolean isFirstRaw(int pos, int spanCount) { + if (pos < spanCount) { + return true; + } + return false; + } + + @Override + public void getItemOffsets(Rect outRect, int itemPosition, + RecyclerView parent) { + int spanCount = getSpanCount(parent); //列数 + + if (itemPosition == 0) { //第一行第一个,四边都画 + outRect.set(divider.getIntrinsicWidth(), divider.getIntrinsicHeight(), + divider.getIntrinsicWidth(), divider.getIntrinsicHeight()); + } else if (isFirstRaw(itemPosition, spanCount)) { //第一行,画上下右三边 + outRect.set(0, divider.getIntrinsicHeight(), divider.getIntrinsicWidth(), divider.getIntrinsicHeight()); + } else if (isFirstColum(parent, itemPosition, spanCount)) { //第一列,画左右下三边 + outRect.set(divider.getIntrinsicWidth(), 0, divider.getIntrinsicWidth(), divider.getIntrinsicHeight()); + } else { //其他,画右下两边 + outRect.set(0, 0, divider.getIntrinsicWidth(), divider.getIntrinsicHeight()); + } + + } + +} + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficInfoView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficInfoView.java new file mode 100644 index 0000000000..d4c632b9d6 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficInfoView.java @@ -0,0 +1,42 @@ +package com.mogo.eagle.core.function.hmi.ui.notice; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.eagle.core.function.hmi.R; + +/** + * @author liujing + * @description 交通事故任务详情 + * @since: 10/26/21 + */ +public class NoticeTrafficInfoView extends RecyclerView { + private int maxHeight = (int) getContext().getResources().getDimension(R.dimen.notice_traffic_info_width); + private int maxWeight = (int) getContext().getResources().getDimension(R.dimen.notice_traffic_info_height); + + public NoticeTrafficInfoView(@NonNull Context context) { + super(context); + } + + public NoticeTrafficInfoView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public NoticeTrafficInfoView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + super.onMeasure(widthSpec, heightSpec); + int limitHeight = getMeasuredHeight(); + if (getMeasuredHeight() > maxHeight) { + limitHeight = maxHeight; + } + setMeasuredDimension(maxWeight, limitHeight); + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/notice_push_item_background.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/notice_push_item_background.xml new file mode 100644 index 0000000000..c190bbd78e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/notice_push_item_background.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_dialog_traffic_police.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_dialog_traffic_police.xml index b3c45c3e42..9968c19c15 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_dialog_traffic_police.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_dialog_traffic_police.xml @@ -30,7 +30,28 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_traffice_info_list_adapter.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_traffice_info_list_adapter.xml new file mode 100644 index 0000000000..fe5aeaf134 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_traffice_info_list_adapter.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/color.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/color.xml index 3c0fb558fb..5caff3edca 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/color.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/color.xml @@ -2,6 +2,8 @@ #2B6EFF #1F9BFE + #5A8EFD #E63B4577 #D5D5D4 + #3B4577 \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml index 8734c2bd14..3e20cb1ce5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml @@ -4,14 +4,27 @@ 1200px 1400px 788px + 900px + 506px 1300px 1210px + 1160px + 290px 32px + 30px + 36px + 38px 42px 50px 52px 54px 56px 150px + 180px + 220px + 580px + 588px + 1066px + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml index 3c0fb558fb..5caff3edca 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml @@ -2,6 +2,8 @@ #2B6EFF #1F9BFE + #5A8EFD #E63B4577 #D5D5D4 + #3B4577 \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml index 8734c2bd14..c2347e1dec 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml @@ -4,14 +4,28 @@ 1200px 1400px 788px + 900px + 506px 1300px 1210px + 1160px + 290px + 32px + 30px + 36px + 38px 42px 50px 52px 54px 56px 150px + 180px + 220px + 580px + 588px + 1066px + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeInfo.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeInfo.java new file mode 100644 index 0000000000..024dba8d76 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/notice/NoticeInfo.java @@ -0,0 +1,67 @@ +package com.mogo.eagle.core.data.notice; + +import java.io.Serializable; + +/** + * @author liujing + * @description 交通事故任务详情数据bean + * @since: 10/26/21 + */ +public class NoticeInfo implements Serializable { + private String infoId;//事故id + private long dataCreateTime;//事故发生时间 + private long dataHandleTime;//事故处理时间 + private String operaStatus;//事故状态 + private String reason;//事故原因 + + public String getInfoId() { + return infoId; + } + + public void setInfoId(String infoId) { + this.infoId = infoId; + } + + public long getDataCreateTime() { + return dataCreateTime; + } + + public void setDataCreateTime(long dataCreateTime) { + this.dataCreateTime = dataCreateTime; + } + + public long getDataHandleTime() { + return dataHandleTime; + } + + public void setDataHandleTime(long dataHandleTime) { + this.dataHandleTime = dataHandleTime; + } + + public String getOperaStatus() { + return operaStatus; + } + + public void setOperaStatus(String operaStatus) { + this.operaStatus = operaStatus; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + @Override + public String toString() { + return "NoticeInfo{" + + "infoId='" + infoId + '\'' + + ", dataCreateTime=" + dataCreateTime + + ", dataHandleTime=" + dataHandleTime + + ", operaStatus='" + operaStatus + '\'' + + ", reason='" + reason + '\'' + + '}'; + } +} diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable/notice_banner_default.png b/core/mogo-core-res/src/main/function-hmi-res/drawable/notice_banner_default.png new file mode 100644 index 0000000000000000000000000000000000000000..a6aef500e9a1213f2a6102f85448cd1e9ca1b34f GIT binary patch literal 27841 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

a~yMR$YmgM`*mi?EnS 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 Date: Tue, 26 Oct 2021 18:30:04 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[add]=20=E6=B7=BB=E5=8A=A0=E9=A1=B6?= =?UTF-8?q?=E9=83=A8=E5=BC=B9=E6=A1=86java=E7=B1=BB=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/notice/NoticeBannerView.java | 67 ++++++++++++++++++ .../res/layout/notice_push_top_banner.xml | 22 ++++-- .../res/values-xhdpi-2560x1440/dimens.xml | 3 + .../src/main/res/values/dimens.xml | 4 +- .../drawable/notice_banner_icon_video.png | Bin 0 -> 3031 bytes 5 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeBannerView.java create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable/notice_banner_icon_video.png diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeBannerView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeBannerView.java new file mode 100644 index 0000000000..f76d032c57 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeBannerView.java @@ -0,0 +1,67 @@ +package com.mogo.eagle.core.function.hmi.ui.notice; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.mogo.eagle.core.data.notice.NoticeInfo; +import com.mogo.eagle.core.function.hmi.R; + +/** + * @author liujing + * @description 云公告顶部弹框 + * @since: 10/26/21 + */ +public class NoticeBannerView extends ConstraintLayout { + + private ImageView styleImageView; + private ImageView iconImageView; + private TextView noticePushTitle; + private TextView noticePushContent; + private TextView noticeBannerCheck; + private NoticeTrafficDialog mNoticeTrafficDialog; + private Context mContext; + + public NoticeBannerView(@NonNull Context context) { + super(context); + mContext = context; + LayoutInflater.from(context).inflate(R.layout.notice_push_top_banner, this); + initView(); + } + + public NoticeBannerView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public NoticeBannerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public NoticeBannerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public void initView() { + styleImageView = findViewById(R.id.notice_push_style_image); + iconImageView = findViewById(R.id.notice_push_icon_video); + noticePushTitle = findViewById(R.id.notice_push_title); + noticePushContent = findViewById(R.id.notice_push_content); + noticeBannerCheck = findViewById(R.id.notice_push_banner_check); + + noticeBannerCheck.setOnClickListener(v -> { + mNoticeTrafficDialog = new NoticeTrafficDialog(mContext); + mNoticeTrafficDialog.show(); + }); + } + + //数据改变刷新UI + public void pushBeanChanged(NoticeInfo info){ + + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_push_top_banner.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_push_top_banner.xml index d7c3a463a5..96c68a8355 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_push_top_banner.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/notice_push_top_banner.xml @@ -8,7 +8,7 @@ android:background="@drawable/notice_push_item_background"> + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml index 3e20cb1ce5..57be068902 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml @@ -12,14 +12,17 @@ 290px 32px + 18px 30px 36px 38px 42px + 45px 50px 52px 54px 56px + 62px 150px 180px 220px diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml index c2347e1dec..57be068902 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml @@ -11,16 +11,18 @@ 1160px 290px - 32px + 18px 30px 36px 38px 42px + 45px 50px 52px 54px 56px + 62px 150px 180px 220px diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable/notice_banner_icon_video.png b/core/mogo-core-res/src/main/function-hmi-res/drawable/notice_banner_icon_video.png new file mode 100644 index 0000000000000000000000000000000000000000..d187488084d9553fe29a13a392705cae9d5813e0 GIT binary patch literal 3031 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 Z{s&opGmSD;Mydb+002ovPDHLkV1oKK(WL+Y literal 0 HcmV?d00001 From 0dd56e641bca1300dad9aba9dfdecce496c7fa17 Mon Sep 17 00:00:00 2001 From: liujing Date: Wed, 27 Oct 2021 16:07:32 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[add]=20=E6=B7=BB=E5=8A=A0=E4=BA=91?= =?UTF-8?q?=E5=85=AC=E5=91=8A=E6=B3=A8=E5=86=8Cjava=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/notice/MoGoNoticeManager.java | 10 ++++++++ .../function/notice/MoGoNoticeProvider.kt | 22 ----------------- .../notice/receiver/NoticeReceiver.java | 19 +++++++++++++++ .../api/notice/IMoGoNoticeListener.java | 10 ++++++++ .../api/notice/IMoGoNoticeProvider.kt | 13 ---------- .../call/notice/CallerNoticeManager.java | 24 ++++++++++++++++--- 6 files changed, 60 insertions(+), 38 deletions(-) create mode 100644 core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeManager.java delete mode 100644 core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeProvider.kt create mode 100644 core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeReceiver.java create mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeListener.java delete mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.kt diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeManager.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeManager.java new file mode 100644 index 0000000000..d4190d8adc --- /dev/null +++ b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeManager.java @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.function.notice; + +/** + * @author liujing + * @description 云公告注册 + * @since: 10/27/21 + */ +public class MoGoNoticeManager { + +} diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeProvider.kt b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeProvider.kt deleted file mode 100644 index 28edb711c7..0000000000 --- a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeProvider.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.mogo.eagle.core.function.notice - -import android.content.Context -import com.mogo.eagle.core.function.api.notice.IMoGoNoticeProvider - -/** - * @author xiaoyuzhou - * @date 2021/9/18 11:44 上午 - * 处理云端下发通知、公告类的逻辑的接口 - */ -class MoGoNoticeProvider : IMoGoNoticeProvider { - private val TAG = "MoGoNoticeProvider" - - override val functionName: String - get() = TAG - - override fun onDestroy() { - - } - - override fun init(context: Context) {} -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeReceiver.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeReceiver.java new file mode 100644 index 0000000000..a008846c2f --- /dev/null +++ b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeReceiver.java @@ -0,0 +1,19 @@ +package com.mogo.eagle.core.function.notice.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +/** + * @author Jing + * @description push云公告消息接收 + * @since: 10/27/21 + */ +public class NoticeReceiver extends BroadcastReceiver { + private Context mContext; + + @Override + public void onReceive(Context context, Intent intent) { + mContext = context; + } +} diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeListener.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeListener.java new file mode 100644 index 0000000000..50ca9f3333 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeListener.java @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.function.api.notice; + +/** + * @author Jing + * @description 云公告监听者 + * @since: 10/27/21 + */ +public interface IMoGoNoticeListener { + +} diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.kt deleted file mode 100644 index 048e468b2f..0000000000 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.mogo.eagle.core.function.api.notice - -import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider - -/** - * @author xiaoyuzhou - * @date 2021/9/18 11:25 上午 - * 处理云端下发通知、公告类的逻辑的接口 - */ -interface IMoGoNoticeProvider : IMoGoFunctionServerProvider { - - -} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java index 99bdaabb35..791a87f2a4 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java @@ -1,9 +1,27 @@ package com.mogo.eagle.core.function.call.notice; +import com.mogo.eagle.core.function.api.notice.IMoGoNoticeListener; +import com.mogo.eagle.core.function.call.base.CallerBase; + +import java.util.HashMap; + /** * @author xiaoyuzhou - * @date 2021/9/18 11:48 上午 - * 云端公告、通知类的 调用者管理,这里对外及其他模块提供功能的调用,用啥写啥,不要过度设计,不允许直接将Provider暴露出去 */ -public class CallerNoticeManager { +public class CallerNoticeManager extends CallerBase { + private HashMap mListeners = new HashMap<>(); + + /** + * 添加监听者 + */ + void addListener(String tag, IMoGoNoticeListener listener) { + mListeners.put(tag, listener); + } + + /** + * 移除监听者 + */ + void removeListener(String tag) { + mListeners.remove(tag); + } } From 954fae75e052927056c963f169256de6f6a93f64 Mon Sep 17 00:00:00 2001 From: liujing Date: Wed, 27 Oct 2021 19:44:03 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[add]=20=E6=B7=BB=E5=8A=A01.=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=B6=88=E6=81=AF=E7=B1=BB=E5=9E=8B=202.=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E7=B1=BB=203.=E4=BA=91=E5=85=AC=E5=91=8A=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E8=B7=AF=E7=94=B1PATH=204.Caller=20java=E6=96=87?= =?UTF-8?q?=E4=BB=B6=20=E9=95=BF=E9=93=BE=E6=8E=A5=E6=9C=AA=E8=B0=83?= =?UTF-8?q?=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/launcher/MogoApplication.java | 3 +- .../mogo-core-function-notice/build.gradle | 13 +++-- .../function/notice/MoGoNoticeManager.java | 10 ---- .../core/function/notice/NoticeProvider.java | 54 +++++++++++++++++++ .../function/notice/NoticeSocketManager.java | 53 ++++++++++++++++++ .../receiver/NoticeMessageListener.java | 28 ++++++++++ .../notice/receiver/NoticeReceiver.java | 19 ------- .../core/data/constants/MogoServicePaths.java | 7 +++ .../api/notice/IMoGoNoticeListener.java | 10 ---- .../api/notice/IMoGoNoticeProvider.java | 12 +++++ .../call/notice/CallerNoticeManager.java | 6 +-- 11 files changed, 168 insertions(+), 47 deletions(-) delete mode 100644 core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeManager.java create mode 100644 core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/NoticeProvider.java create mode 100644 core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/NoticeSocketManager.java create mode 100644 core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeMessageListener.java delete mode 100644 core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeReceiver.java delete mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeListener.java create mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.java diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index bc835850ee..5c6abc3da7 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -304,7 +304,8 @@ public class MogoApplication extends AbsMogoApplication { MogoModulePaths.addBaseModule(new MogoModule(MogoServicePaths.PATH_V2X_FRONT_CRASH_WARNING, "IV2XManagerProvider")); // 全局语音唤醒 MogoModulePaths.addBaseModule(new MogoModule(MogoServicePaths.PATH_GLOBAL_UNWAKE, "GlobalUnwake")); - + // 云公告发布 + MogoModulePaths.addModuleFunction(new MogoModule(MogoServicePaths.PATH_AI_NOTICE, "IMoGoNoticeProvider")); if (!DebugConfig.isLauncher()) { PersistentManager.getInstance().initManager(this); diff --git a/core/function-impl/mogo-core-function-notice/build.gradle b/core/function-impl/mogo-core-function-notice/build.gradle index 9da8588b39..e8c776714b 100644 --- a/core/function-impl/mogo-core-function-notice/build.gradle +++ b/core/function-impl/mogo-core-function-notice/build.gradle @@ -48,17 +48,22 @@ dependencies { implementation rootProject.ext.dependencies.androidxconstraintlayout implementation rootProject.ext.dependencies.arouter implementation rootProject.ext.dependencies.rxandroid + implementation project(path: ':services:mogo-service-api') kapt rootProject.ext.dependencies.aroutercompiler if (Boolean.valueOf(RELEASE)) { - + api rootProject.ext.dependencies.mogocommons + api rootProject.ext.dependencies.mogoserviceapi + implementation rootProject.ext.dependencies.modulecommon } else { - - implementation project(':core:mogo-core-data') + api project(":foudations:mogo-commons") + api project(':services:mogo-service-api') implementation project(':core:mogo-core-utils') - implementation project(':core:mogo-core-function-api') + implementation project(':modules:mogo-module-common') implementation project(':core:mogo-core-function-call') + implementation project(':core:mogo-core-res') + implementation project(':core:mogo-core-data') } } diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeManager.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeManager.java deleted file mode 100644 index d4190d8adc..0000000000 --- a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/MoGoNoticeManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.mogo.eagle.core.function.notice; - -/** - * @author liujing - * @description 云公告注册 - * @since: 10/27/21 - */ -public class MoGoNoticeManager { - -} diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/NoticeProvider.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/NoticeProvider.java new file mode 100644 index 0000000000..69af9d10d4 --- /dev/null +++ b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/NoticeProvider.java @@ -0,0 +1,54 @@ +package com.mogo.eagle.core.function.notice; + +import android.content.Context; +import android.os.Bundle; +import android.util.Log; + +import androidx.fragment.app.Fragment; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.eagle.core.data.constants.MogoServicePaths; +import com.mogo.eagle.core.function.api.notice.IMoGoNoticeProvider; +import com.mogo.eagle.core.function.notice.receiver.NoticeMessageListener; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.service.cloud.socket.IMogoLifecycleListener; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + + +/** + * @author Jing + * @description 云公告 + * @since: 10/27/21 + */ +@Route(path = MogoServicePaths.PATH_AI_NOTICE) +public class NoticeProvider implements IMoGoNoticeProvider { + private String TAG = "AINotice"; + private Context mContext; + + @Nullable + @Override + public Fragment createCoverage(@Nullable Context context, @Nullable Bundle data) { + return null; + } + + @NotNull + @Override + public String getFunctionName() { + return null; + } + + @Override + public void onDestroy() { + NoticeSocketManager.getInstance().unRegisterSocketMessage(); + } + + @Override + public void init(Context context) { + Log.d(TAG, "init"); + mContext = context; + NoticeSocketManager.getInstance().registerSocketMessage(context); + } + +} diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/NoticeSocketManager.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/NoticeSocketManager.java new file mode 100644 index 0000000000..082c7505b6 --- /dev/null +++ b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/NoticeSocketManager.java @@ -0,0 +1,53 @@ +package com.mogo.eagle.core.function.notice; + +import android.content.Context; +import android.util.Log; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.eagle.core.function.notice.receiver.NoticeMessageListener; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.service.IMogoServiceApis; + +/** + * @author Jing + * @description 云公告注册、反注册 + * @since: 10/27/21 + */ +class NoticeSocketManager { + private String TAG = "AINotice"; + private static NoticeSocketManager mNoticeSocketManager; + private NoticeMessageListener mNoticeMessageListener; + private static IMogoServiceApis mMoGoServiceApis; + private Context mContext; + + public static synchronized NoticeSocketManager getInstance() { + synchronized (NoticeSocketManager.class) { + if (mNoticeSocketManager == null) { + mNoticeSocketManager = new NoticeSocketManager(); + } + } + return mNoticeSocketManager; + } + + public void registerSocketMessage(Context context) { + Log.d(TAG, "registerSocketMessage"); + mContext = context; + mNoticeMessageListener = new NoticeMessageListener(); + if (mMoGoServiceApis == null) { + mMoGoServiceApis = (IMogoServiceApis) ARouter.getInstance().build(com.mogo.eagle.core.data.constants. + MogoServicePaths.PATH_SERVICE_APIS).navigation(context); + } + mMoGoServiceApis. + getSocketManagerApi(context). + registerOnMessageListener(100, mNoticeMessageListener); + } + + public void unRegisterSocketMessage() { + if (mNoticeMessageListener != null) { + mMoGoServiceApis + .getSocketManagerApi(mContext). + unregisterOnMessageListener(100, mNoticeMessageListener); + } + } +} + diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeMessageListener.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeMessageListener.java new file mode 100644 index 0000000000..da3bc2570d --- /dev/null +++ b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeMessageListener.java @@ -0,0 +1,28 @@ +package com.mogo.eagle.core.function.notice.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import com.mogo.service.cloud.socket.IMogoOnMessageListener; + +/** + * @author Jing + * @description push云公告消息接收 + * @since: 10/27/21 + */ +public class NoticeMessageListener implements IMogoOnMessageListener { + private String TAG = "AINotice"; + private Context mContext; + + @Override + public Class target() { + return null; + } + + @Override + public void onMsgReceived(Object obj) { + Log.d(TAG, obj.toString()); + } +} diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeReceiver.java b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeReceiver.java deleted file mode 100644 index a008846c2f..0000000000 --- a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/receiver/NoticeReceiver.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.mogo.eagle.core.function.notice.receiver; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -/** - * @author Jing - * @description push云公告消息接收 - * @since: 10/27/21 - */ -public class NoticeReceiver extends BroadcastReceiver { - private Context mContext; - - @Override - public void onReceive(Context context, Intent intent) { - mContext = context; - } -} diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java index 97c7094d5b..c44ef7d437 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java @@ -361,4 +361,11 @@ public class MogoServicePaths { @Keep @Deprecated public static final String PATH_AUTO_PILOT = "/auto_pilot/api"; + + /** + * 云公告 模块 + */ + @Keep + @Deprecated + public static final String PATH_AI_NOTICE = "/ai/notice"; } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeListener.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeListener.java deleted file mode 100644 index 50ca9f3333..0000000000 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeListener.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.mogo.eagle.core.function.api.notice; - -/** - * @author Jing - * @description 云公告监听者 - * @since: 10/27/21 - */ -public interface IMoGoNoticeListener { - -} diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.java new file mode 100644 index 0000000000..59ec7f1081 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/notice/IMoGoNoticeProvider.java @@ -0,0 +1,12 @@ +package com.mogo.eagle.core.function.api.notice; + +import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider; + +/** + * @author Jing + * @description 云公告监听者 + * @since: 10/27/21 + */ +public interface IMoGoNoticeProvider extends IMoGoFunctionProvider { + +} diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java index 791a87f2a4..03094b70e2 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/notice/CallerNoticeManager.java @@ -1,6 +1,6 @@ package com.mogo.eagle.core.function.call.notice; -import com.mogo.eagle.core.function.api.notice.IMoGoNoticeListener; +import com.mogo.eagle.core.function.api.notice.IMoGoNoticeProvider; import com.mogo.eagle.core.function.call.base.CallerBase; import java.util.HashMap; @@ -9,12 +9,12 @@ import java.util.HashMap; * @author xiaoyuzhou */ public class CallerNoticeManager extends CallerBase { - private HashMap mListeners = new HashMap<>(); + private HashMap mListeners = new HashMap<>(); /** * 添加监听者 */ - void addListener(String tag, IMoGoNoticeListener listener) { + void addListener(String tag, IMoGoNoticeProvider listener) { mListeners.put(tag, listener); }