From b4032e2cd8c4a14c6869565ee175e109ed001c76 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Fri, 5 Jun 2020 13:26:26 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=88=B1=E8=B6=A3?= =?UTF-8?q?=E5=90=ACsdk=E6=8E=A5=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/mogo-module-media/build.gradle | 2 +- .../OPENSDK_Flow_cdb1c1a_1.0.1.30_release.aar | Bin 0 -> 30287 bytes .../src/main/AndroidManifest.xml | 1 + .../module/media/MediaCardViewProvider.java | 9 +- .../com/mogo/module/media/MediaWindow.java | 28 ++- .../module/media/constants/MusicConstant.java | 13 + .../media/presenter/BaseMediaPresenter.java | 53 ++++ .../media/presenter/WeCarFlowPresenter.java | 135 ++++++++++ .../media/utils/MusicControlBroadCast.java | 32 +-- .../mogo/module/media/view/IMusicView.java | 19 ++ .../module/media/widget/MediaWindow2.java | 234 ++++++++++++++++++ 11 files changed, 497 insertions(+), 29 deletions(-) create mode 100644 modules/mogo-module-media/libs/OPENSDK_Flow_cdb1c1a_1.0.1.30_release.aar create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/constants/MusicConstant.java create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/BaseMediaPresenter.java create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java diff --git a/modules/mogo-module-media/build.gradle b/modules/mogo-module-media/build.gradle index eccfa5b7fd..d028e927fd 100644 --- a/modules/mogo-module-media/build.gradle +++ b/modules/mogo-module-media/build.gradle @@ -35,7 +35,7 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['*.aar']) annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.arouter diff --git a/modules/mogo-module-media/libs/OPENSDK_Flow_cdb1c1a_1.0.1.30_release.aar b/modules/mogo-module-media/libs/OPENSDK_Flow_cdb1c1a_1.0.1.30_release.aar new file mode 100644 index 0000000000000000000000000000000000000000..72f411cce237b1d9a17b7e86ae9d65a6a4bac2cc GIT binary patch literal 30287 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 F{{wH8CyD?7 literal 0 HcmV?d00001 diff --git a/modules/mogo-module-media/src/main/AndroidManifest.xml b/modules/mogo-module-media/src/main/AndroidManifest.xml index 2b857c6071..4292dc7f05 100644 --- a/modules/mogo-module-media/src/main/AndroidManifest.xml +++ b/modules/mogo-module-media/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ + diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java index 8741bc36e9..fa467bc990 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java @@ -11,6 +11,7 @@ import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; +import com.mogo.module.media.widget.MediaWindow2; import com.mogo.service.module.IMogoModuleLifecycle; import com.mogo.service.module.IMogoModuleProvider; import com.mogo.service.module.ModuleType; @@ -21,8 +22,6 @@ public class MediaCardViewProvider implements IMogoModuleProvider { private static final String TAG = "MediaCardViewProvider"; - private MediaWindow mMediaWindow; - @Override public Fragment createFragment( Context context, Bundle data ) { @@ -35,10 +34,8 @@ public class MediaCardViewProvider implements IMogoModuleProvider { @Override public void init( Context context ) { ServiceMediaHandler.init( context ); - - mMediaWindow = new MediaWindow(); - mMediaWindow.initMedia(context); - + MediaWindow2 mediaWindow2 = new MediaWindow2(); + mediaWindow2.initMedia(context); } @Override diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow.java index 107206a46a..f13b506d43 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow.java @@ -181,8 +181,12 @@ public class MediaWindow implements MediaView{ } if (first || mMediaInfoData.getPlayState() == 1 || mMediaInfoData.getPlayState() == 2) { - if (mWindowMaxTime != null) mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime())); - if (mWindowCurrTime != null) mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime())); + if (mWindowMaxTime != null){ + mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime())); + } + if (mWindowCurrTime != null){ + mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime())); + } } if (mCircleImg != null){ @@ -286,7 +290,9 @@ public class MediaWindow implements MediaView{ } - if (mCircleImg != null) mCircleImg.stopAnim(); + if (mCircleImg != null){ + mCircleImg.stopAnim(); + } if (type == 1 || type == 2 || type ==3){ UiThreadHandler.removeCallbacks(mRunnable); @@ -417,10 +423,18 @@ public class MediaWindow implements MediaView{ bookid = leTingNewsData.getSid(); } - if (mediaName == null) mediaName = ""; - if (artist == null) artist = ""; - if (cover == null) cover = ""; - if (bookid == null) bookid = ""; + if (mediaName == null){ + mediaName = ""; + } + if (artist == null){ + artist = ""; + } + if (cover == null){ + cover = ""; + } + if (bookid == null){ + bookid = ""; + } } } catch (Exception e) { e.printStackTrace(); diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/constants/MusicConstant.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/constants/MusicConstant.java new file mode 100644 index 0000000000..e26222ae1f --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/constants/MusicConstant.java @@ -0,0 +1,13 @@ +package com.mogo.module.media.constants; + +/** + * 音频相关常量 + * + * @author tongchenfei + */ +public class MusicConstant { + public static final int PLAY_STATE_PLAYING = 1; + public static final int PLAY_STATE_BUFF = 2; + public static final int PLAY_STATE_PAUSE_OR_STOP = 0; + public static final int PLAY_STATE_ERROR = -1; +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/BaseMediaPresenter.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/BaseMediaPresenter.java new file mode 100644 index 0000000000..103528a49a --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/BaseMediaPresenter.java @@ -0,0 +1,53 @@ +package com.mogo.module.media.presenter; + +import android.content.Context; + +import com.mogo.commons.mvp.IView; +import com.mogo.commons.mvp.Presenter; +import com.mogo.module.media.model.MediaInfoData; + +/** + * 媒体播放presenter基类,目前没有整合到原MediaPresenter中,原来的qq音乐,喜马拉雅和懒人听书下掉了 + * + * @author tongchenfei + */ +public abstract class BaseMediaPresenter extends Presenter { + public BaseMediaPresenter(V view) { + super(view); + } + + /** + * 初始化 + * + * @param context 上下文 + */ + public abstract void init(Context context); + + /** + * 播放音乐 + * @param mediaInfoData 待播放音乐信息 + */ + public abstract void play(MediaInfoData mediaInfoData); + + /** + * 暂停播放 + * @param mediaInfoData 待暂停音乐信息 + */ + public abstract void pause(MediaInfoData mediaInfoData); + + /** + * 停止播放 + * @param mediaInfoData 待停止播放音乐信息 + */ + public abstract void stop(MediaInfoData mediaInfoData); + + /** + * 上一首 + */ + public abstract void pre(); + + /** + * 下一首 + */ + public abstract void next(); +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java new file mode 100644 index 0000000000..c56637d26b --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java @@ -0,0 +1,135 @@ +package com.mogo.module.media.presenter; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; + +import com.mogo.module.media.MediaConstants; +import com.mogo.module.media.constants.MusicConstant; +import com.mogo.module.media.model.MediaInfoData; +import com.mogo.module.media.view.IMusicView; +import com.mogo.utils.logger.Logger; +import com.tencent.wecarflow.flowoutside.sdk.BindListener; +import com.tencent.wecarflow.flowoutside.sdk.FlowPlayControl; +import com.tencent.wecarflow.flowoutside.sdk.MediaChangeListener; +import com.tencent.wecarflow.flowoutside.sdk.MediaInfo; +import com.tencent.wecarflow.flowoutside.sdk.PlayStateListener; + +/** + * 爱趣听presenter + * + * @author tongchenfei + */ +public class WeCarFlowPresenter extends BaseMediaPresenter { + private static final String TAG = "WeCarFlowPresenter"; + public WeCarFlowPresenter(IMusicView view) { + super(view); + } + + private Context context; + + private MediaInfoData currentMedia; + + @Override + public void init(Context context) { + this.context = context; + FlowPlayControl.getInstance().bindPlayService(context); + FlowPlayControl.getInstance().addBindListener(new BindListener() { + @Override + public void onServiceConnected() { + Logger.d(TAG, "onServiceConnected==="); + } + + @Override + public void onServiceDisconnected() { + Logger.e(TAG, "onServiceDisconnected==="); + } + + @Override + public void onBindDied() { + Logger.e(TAG, "onBindDied==="); + } + }); + + FlowPlayControl.getInstance().addMediaChangeListener(new MediaChangeListener() { + @Override + public void onMediaChange(MediaInfo mediaInfo) { + currentMedia = new MediaInfoData(); + currentMedia.setMediaName(mediaInfo.getMediaName()); + currentMedia.setMediaUrl(mediaInfo.getMediaImage()); + } + + @Override + public void onFavorChange(boolean b) { + + } + }); + + FlowPlayControl.getInstance().addPlayStateListener(new PlayStateListener() { + @Override + public void onStart() { + if (mView != null && currentMedia != null) { + currentMedia.setPlayState(MusicConstant.PLAY_STATE_PLAYING); + mView.onMusicPlaying(currentMedia); + } + } + + @Override + public void onPause() { + if (mView != null && currentMedia != null) { + currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); + mView.onMusicPause(currentMedia); + } + } + + @Override + public void onStop() { + if (mView != null && currentMedia != null) { + currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); + mView.onMusicStoped(currentMedia); + } + } + + @Override + public void onProgress(String s, long current, long total) { + if (mView != null) { + mView.onMusicProgress(current, total); + } + } + }); + } + + @Override + public void play(MediaInfoData mediaInfoData) { + FlowPlayControl.getInstance().doPlay(); + } + + @Override + public void pause(MediaInfoData mediaInfoData) { + FlowPlayControl.getInstance().doPause(); + } + + @Override + public void stop(MediaInfoData mediaInfoData) { + FlowPlayControl.getInstance().doStop(); + } + + @Override + public void pre() { + FlowPlayControl.getInstance().doPre(); + } + + @Override + public void next() { + FlowPlayControl.getInstance().doNext(); + } + + @Override + public void onDestroy(@NonNull LifecycleOwner owner) { + super.onDestroy(owner); + if (context != null) { + FlowPlayControl.getInstance().unbindPlayService(context); + } + } +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/MusicControlBroadCast.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/MusicControlBroadCast.java index 4a7a247c71..6ec22f102e 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/MusicControlBroadCast.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/MusicControlBroadCast.java @@ -459,21 +459,23 @@ public class MusicControlBroadCast { } } -// return null; - MediaInfoData mediaInfoData = new MediaInfoData(); - mediaInfoData.setMediaId("001jiOrk2g389Y"); - mediaInfoData.setBookInfo(""); - mediaInfoData.setType(1); - mediaInfoData.setMediaName("恭喜发财 (广场舞)"); - mediaInfoData.setMediaSinger("刘德华"); - mediaInfoData.setMediaType("物流派"); - mediaInfoData.setPlayState(0); - mediaInfoData.setLocalMedia(false); - mediaInfoData.setCurTime(0); - mediaInfoData.setMaxTime(410*1000); - mediaInfoData.setMediaUrl("http://isure.stream.qqmusic.qq.com/C200000s2wCd3pzdnA.m4a?guid=2000001271&vkey=8CE1A876F5079A6E4E9BCB8306252EF152F3D4F237B3BF4C1450B50BA7E065D3D55A0735FD2E957B129E83FF7D7D5D398479D53FE2171DF0&uin=&fromtag=50"); - mediaInfoData.setMediaImg("http://music.qq.com/musicbox/img/uccpic_error.jpg"); - return mediaInfoData;//刘德华的恭喜发财 + return null; + + // 测试代码吧? +// MediaInfoData mediaInfoData = new MediaInfoData(); +// mediaInfoData.setMediaId("001jiOrk2g389Y"); +// mediaInfoData.setBookInfo(""); +// mediaInfoData.setType(1); +// mediaInfoData.setMediaName("恭喜发财 (广场舞)"); +// mediaInfoData.setMediaSinger("刘德华"); +// mediaInfoData.setMediaType("物流派"); +// mediaInfoData.setPlayState(0); +// mediaInfoData.setLocalMedia(false); +// mediaInfoData.setCurTime(0); +// mediaInfoData.setMaxTime(410*1000); +// mediaInfoData.setMediaUrl("http://isure.stream.qqmusic.qq.com/C200000s2wCd3pzdnA.m4a?guid=2000001271&vkey=8CE1A876F5079A6E4E9BCB8306252EF152F3D4F237B3BF4C1450B50BA7E065D3D55A0735FD2E957B129E83FF7D7D5D398479D53FE2171DF0&uin=&fromtag=50"); +// mediaInfoData.setMediaImg("http://music.qq.com/musicbox/img/uccpic_error.jpg"); +// return mediaInfoData;//刘德华的恭喜发财 } /** diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java new file mode 100644 index 0000000000..853a9cde86 --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java @@ -0,0 +1,19 @@ +package com.mogo.module.media.view; + +import com.mogo.commons.mvp.IView; +import com.mogo.module.media.model.MediaInfoData; + +/** + * 音频显示类的接口 + * + * @author tongchenfei + */ +public interface IMusicView extends IView { + void onMusicPlaying(MediaInfoData mediaInfoData); + + void onMusicPause(MediaInfoData mediaInfoData); + + void onMusicStoped(MediaInfoData mediaInfoData); + + void onMusicProgress(long current,long total); +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java new file mode 100644 index 0000000000..64af4f4009 --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java @@ -0,0 +1,234 @@ +package com.mogo.module.media.widget; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.mogo.module.media.R; +import com.mogo.module.media.ServiceMediaHandler; +import com.mogo.module.media.constants.MusicConstant; +import com.mogo.module.media.listener.NoDoubleClickListener; +import com.mogo.module.media.model.MediaInfoData; +import com.mogo.module.media.presenter.WeCarFlowPresenter; +import com.mogo.module.media.utils.MusicControlBroadCast; +import com.mogo.module.media.utils.Utils; +import com.mogo.module.media.view.IMusicView; +import com.mogo.utils.glide.GlideApp; +import com.mogo.utils.logger.Logger; + +/** + * 适配爱趣听的window + * + * @author tongchenfei + */ +public class MediaWindow2 implements IMusicView { + + public static final String TAG = MediaWindow2.class.getName(); + private Context mContext; + private WeCarFlowPresenter mPresenter; + + private MediaInfoData mMediaInfoData = null; + + private View mWindowView; + private AnimCircleImageView mCircleImg; + private ScrollingTextView mScrollText; + private ImageView mWindowPlayPause; + private ImageView mWindowPlayNext; + private LinearLayout mWindowMediaCenter; + private TextView mWindowCurrTime; + private TextView mWindowMaxTime; + private NoScrollSeekBar mWindowProgress; + + private boolean mHasAddWindow = false; + private boolean mTwoChange = false; + private boolean isFirstPlay = false; + + private Runnable mRunnable = new Runnable() { + @Override + public void run() { + MusicControlBroadCast.sendGetMusicPlayStateBroadcast(); + } + }; + + public void initMedia(Context context) { + mContext = context; + mPresenter = new WeCarFlowPresenter(this); + mPresenter.init(context); + + isFirstPlay = true; + } + + private void addWindowView() { + if (ServiceMediaHandler.getMogoWindowManager() == null) { + return; + } + + if (!mHasAddWindow) { + mHasAddWindow = true; + mWindowView = + LayoutInflater.from(mContext).inflate(R.layout.module_media_music_window_alert_layout, null); + mWindowView.setVisibility(View.VISIBLE); + mCircleImg = mWindowView.findViewById(R.id.window_circle_img); + mScrollText = mWindowView.findViewById(R.id.window_scroll_txt); + mWindowPlayPause = mWindowView.findViewById(R.id.window_play_pause); + mWindowPlayNext = mWindowView.findViewById(R.id.window_music_next); + mWindowMediaCenter = mWindowView.findViewById(R.id.window_media_center); + mWindowCurrTime = mWindowView.findViewById(R.id.window_current_time); + mWindowMaxTime = mWindowView.findViewById(R.id.window_max_time); + mWindowProgress = mWindowView.findViewById(R.id.window_progress_bar); + if (mWindowPlayPause != null) { + mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); + } + int yPos = + getContext().getResources().getDimensionPixelOffset(R.dimen.module_media_music_state_location); + int xPos = + getContext().getResources().getDimensionPixelOffset(R.dimen.module_media_music_state_location_x); + ServiceMediaHandler.getMogoWindowManager().addView(mWindowView, xPos, yPos, false); + updateWindowUI(true); + mWindowMediaCenter.setOnClickListener(new NoDoubleClickListener() { + @Override + public void onClicks(View view) { + if (mMediaInfoData != null) { + MusicControlBroadCast.openMediaApp(mMediaInfoData.getType()); + } else { + MusicControlBroadCast.openMediaApp(1); + } + } + }); + + mWindowPlayPause.setOnClickListener(new NoDoubleClickListener() { + @Override + public void onClicks(View view) { + if (isFirstPlay) { + if (mMediaInfoData != null) { + MusicControlBroadCast.listeningSendData(mMediaInfoData); + } + } else { + if (mMediaInfoData != null) { + MusicControlBroadCast.commandPlayPause(mMediaInfoData.getType(), + mMediaInfoData.getPlayState()); + } + } + } + }); + + mWindowPlayNext.setOnClickListener(new NoDoubleClickListener() { + @Override + public void onClicks(View view) { + if (mMediaInfoData != null) { + MusicControlBroadCast.commandNext(mMediaInfoData.getType()); + } + } + }); + } + } + + private void updateWindowUI() { + updateWindowUI(false); + } + + private void updateWindowUI(boolean first) { + if (mWindowView == null) { + return; + } + if (mMediaInfoData != null) { + if (mMediaInfoData.getType() == 1 || mMediaInfoData.getType() == 2 || mMediaInfoData.getType() == 3) { + mWindowView.setVisibility(View.VISIBLE); + } + } else { + mWindowView.setVisibility(View.GONE); + return; + } + + if (mScrollText != null) { + mScrollText.setText(mMediaInfoData.getMediaName()); + } + + if (first || mMediaInfoData.getPlayState() == MusicConstant.PLAY_STATE_PLAYING || mMediaInfoData.getPlayState() == MusicConstant.PLAY_STATE_BUFF) { + if (mWindowMaxTime != null) { + mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime())); + } + if (mWindowCurrTime != null) { + mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime())); + } + } + + if (mCircleImg != null) { + com.bumptech.glide.request.RequestOptions options = + new com.bumptech.glide.request.RequestOptions() + .placeholder(R.drawable.module_media_share_default_icon); + GlideApp.with(mContext).applyDefaultRequestOptions(options).load(mMediaInfoData.getMediaImg()).into(mCircleImg); + } + + } + + @Override + public Context getContext() { + return mContext; + } + + @Override + public void onMusicPlaying(MediaInfoData mediaInfoData) { + Logger.d(TAG, "onMusicPlaying: " + mediaInfoData); + addWindowView(); + mMediaInfoData = mediaInfoData; + updateWindowUI(); + if (mWindowPlayPause != null) { + mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_play); + } + + if (mCircleImg != null) { + mCircleImg.startAnim(); + } + } + + @Override + public void onMusicPause(MediaInfoData mediaInfoData) { + Logger.d(TAG, "onMusicPause: " + mediaInfoData); + mMediaInfoData = mediaInfoData; + updateWindowUI(); + if (mWindowPlayPause != null) { + mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); + } + + if (mCircleImg != null) { + mCircleImg.stopAnim(); + } + } + + @Override + public void onMusicStoped(MediaInfoData mediaInfoData) { + Logger.d(TAG, "onMusicStoped: " + mediaInfoData); + mMediaInfoData = mediaInfoData; + updateWindowUI(); + if (mWindowPlayPause != null) { + mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); + } + + + if (mCircleImg != null) { + mCircleImg.stopAnim(); + } + } + + @Override + public void onMusicProgress(long current, long total) { + Logger.d(TAG, "onMusicProgress==current: " + current + " total: " + total); + if (mWindowCurrTime != null) { + mWindowCurrTime.setText(Utils.calculateTime((int) current)); + mWindowMaxTime.setText(Utils.calculateTime((int) total)); + } + try { + int progress = + (int) ((current * 1.0f * 100) / (total * 1.0f)); + if (mWindowProgress != null) { + mWindowProgress.setProgress(progress); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} From d65bf7a709a19184c2e0e8cfc87a550f30fb5062 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Fri, 5 Jun 2020 15:30:19 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E7=88=B1=E8=B6=A3=E5=90=AC=EF=BC=8C=E5=9F=BA=E6=9C=AC=E5=8F=AF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../com/mogo/module/apps/model/AppEnum.java | 3 +- .../module/media/MediaCardViewProvider.java | 2 - .../media/{widget => }/MediaWindow2.java | 86 +++++++++-------- .../module/media/model/MediaInfoData.java | 9 ++ .../media/presenter/WeCarFlowPresenter.java | 92 ++++++++++++++++--- .../mogo/module/media/utils/LaunchUtils.java | 29 ++++++ .../mogo/module/media/view/IMusicView.java | 8 +- 8 files changed, 170 insertions(+), 61 deletions(-) rename modules/mogo-module-media/src/main/java/com/mogo/module/media/{widget => }/MediaWindow2.java (79%) create mode 100644 modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/LaunchUtils.java diff --git a/app/build.gradle b/app/build.gradle index d6878216d1..8a69d4c097 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,7 +55,7 @@ android { sourceSets { main { - manifest.srcFile 'src/independent/AndroidManifest.xml' + manifest.srcFile 'src/main/AndroidManifest.xml' } launcher { manifest.srcFile 'src/launcher/AndroidManifest.xml' diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java index ac70be137a..8c545cc2dc 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java @@ -14,7 +14,8 @@ import com.mogo.module.apps.R; * 基础类:均衡器、方控学习、蓝牙、FM、车载设置、AUX */ public enum AppEnum { - + // 爱趣听 + WeCarFlow("爱趣听","com.tencent.wecarflow", R.drawable.module_apps_ic_qq_music ), //"QQ音乐", QQMusic( "QQ音乐", "com.pvetec.musics", R.drawable.module_apps_ic_qq_music ), diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java index fa467bc990..c2e341752b 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaCardViewProvider.java @@ -11,11 +11,9 @@ import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; -import com.mogo.module.media.widget.MediaWindow2; import com.mogo.service.module.IMogoModuleLifecycle; import com.mogo.service.module.IMogoModuleProvider; import com.mogo.service.module.ModuleType; -import com.mogo.utils.logger.Logger; @Route( path = MediaConstants.TAG ) public class MediaCardViewProvider implements IMogoModuleProvider { diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow2.java similarity index 79% rename from modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java rename to modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow2.java index 64af4f4009..359302f586 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/widget/MediaWindow2.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/MediaWindow2.java @@ -1,4 +1,4 @@ -package com.mogo.module.media.widget; +package com.mogo.module.media; import android.content.Context; import android.view.LayoutInflater; @@ -7,15 +7,18 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.mogo.module.media.R; -import com.mogo.module.media.ServiceMediaHandler; import com.mogo.module.media.constants.MusicConstant; import com.mogo.module.media.listener.NoDoubleClickListener; import com.mogo.module.media.model.MediaInfoData; import com.mogo.module.media.presenter.WeCarFlowPresenter; +import com.mogo.module.media.utils.LaunchUtils; import com.mogo.module.media.utils.MusicControlBroadCast; import com.mogo.module.media.utils.Utils; import com.mogo.module.media.view.IMusicView; +import com.mogo.module.media.widget.AnimCircleImageView; +import com.mogo.module.media.widget.NoScrollSeekBar; +import com.mogo.module.media.widget.ScrollingTextView; +import com.mogo.utils.TipToast; import com.mogo.utils.glide.GlideApp; import com.mogo.utils.logger.Logger; @@ -46,13 +49,6 @@ public class MediaWindow2 implements IMusicView { private boolean mTwoChange = false; private boolean isFirstPlay = false; - private Runnable mRunnable = new Runnable() { - @Override - public void run() { - MusicControlBroadCast.sendGetMusicPlayStateBroadcast(); - } - }; - public void initMedia(Context context) { mContext = context; mPresenter = new WeCarFlowPresenter(this); @@ -91,26 +87,22 @@ public class MediaWindow2 implements IMusicView { mWindowMediaCenter.setOnClickListener(new NoDoubleClickListener() { @Override public void onClicks(View view) { - if (mMediaInfoData != null) { - MusicControlBroadCast.openMediaApp(mMediaInfoData.getType()); - } else { - MusicControlBroadCast.openMediaApp(1); - } + openAqtApp(); } }); mWindowPlayPause.setOnClickListener(new NoDoubleClickListener() { @Override public void onClicks(View view) { - if (isFirstPlay) { - if (mMediaInfoData != null) { - MusicControlBroadCast.listeningSendData(mMediaInfoData); - } - } else { - if (mMediaInfoData != null) { - MusicControlBroadCast.commandPlayPause(mMediaInfoData.getType(), - mMediaInfoData.getPlayState()); + if (mMediaInfoData != null) { + if (mMediaInfoData.getPlayState() == MusicConstant.PLAY_STATE_PAUSE_OR_STOP) { + mPresenter.play(mMediaInfoData); + }else{ + // 没有做详细判断,不是暂停就是播放 + mPresenter.pause(mMediaInfoData); } + }else{ + openAqtApp(); } } }); @@ -118,8 +110,8 @@ public class MediaWindow2 implements IMusicView { mWindowPlayNext.setOnClickListener(new NoDoubleClickListener() { @Override public void onClicks(View view) { - if (mMediaInfoData != null) { - MusicControlBroadCast.commandNext(mMediaInfoData.getType()); + if (mPresenter != null) { + mPresenter.next(); } } }); @@ -171,11 +163,8 @@ public class MediaWindow2 implements IMusicView { } @Override - public void onMusicPlaying(MediaInfoData mediaInfoData) { - Logger.d(TAG, "onMusicPlaying: " + mediaInfoData); - addWindowView(); - mMediaInfoData = mediaInfoData; - updateWindowUI(); + public void onMusicPlaying() { + Logger.d(TAG, "onMusicPlaying"); if (mWindowPlayPause != null) { mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_play); } @@ -186,10 +175,8 @@ public class MediaWindow2 implements IMusicView { } @Override - public void onMusicPause(MediaInfoData mediaInfoData) { - Logger.d(TAG, "onMusicPause: " + mediaInfoData); - mMediaInfoData = mediaInfoData; - updateWindowUI(); + public void onMusicPause() { + Logger.d(TAG, "onMusicPause: "); if (mWindowPlayPause != null) { mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); } @@ -200,23 +187,34 @@ public class MediaWindow2 implements IMusicView { } @Override - public void onMusicStoped(MediaInfoData mediaInfoData) { - Logger.d(TAG, "onMusicStoped: " + mediaInfoData); - mMediaInfoData = mediaInfoData; - updateWindowUI(); + public void onMusicStopped() { + Logger.d(TAG, "onMusicStopped"); if (mWindowPlayPause != null) { mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause); } - if (mCircleImg != null) { mCircleImg.stopAnim(); } } + @Override + public void onMediaInfoChanged(MediaInfoData mediaInfoData) { + if(!isFirstPlay) { + mMediaInfoData = mediaInfoData; + addWindowView(); + updateWindowUI(); + } + isFirstPlay = false; + } + @Override public void onMusicProgress(long current, long total) { - Logger.d(TAG, "onMusicProgress==current: " + current + " total: " + total); +// Logger.d(TAG, "onMusicProgress==current: " + current + " total: " + total); + if(mMediaInfoData!=null) { + mMediaInfoData.setCurTime((int) current); + mMediaInfoData.setMaxTime((int) total); + } if (mWindowCurrTime != null) { mWindowCurrTime.setText(Utils.calculateTime((int) current)); mWindowMaxTime.setText(Utils.calculateTime((int) total)); @@ -231,4 +229,12 @@ public class MediaWindow2 implements IMusicView { e.printStackTrace(); } } + + private void openAqtApp(){ + try { + LaunchUtils.launchByPkg(mContext,"com.tencent.wecarflow"); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/model/MediaInfoData.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/model/MediaInfoData.java index aafffdbe03..826e47ae51 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/model/MediaInfoData.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/model/MediaInfoData.java @@ -142,4 +142,13 @@ public class MediaInfoData implements Serializable { public void setBookInfo(String bookInfo) { this.bookInfo = bookInfo; } + + @Override + public String toString() { + return "MediaInfoData{" + + "mediaName='" + mediaName + '\'' + + ", mediaImg='" + mediaImg + '\'' + + ", playState=" + playState + + '}'; + } } diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java index c56637d26b..3ebbc6e96f 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/presenter/WeCarFlowPresenter.java @@ -5,16 +5,22 @@ import android.content.Context; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.module.media.MediaConstants; import com.mogo.module.media.constants.MusicConstant; import com.mogo.module.media.model.MediaInfoData; import com.mogo.module.media.view.IMusicView; +import com.mogo.service.IMogoServiceApis; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.statusmanager.IMogoStatusChangedListener; +import com.mogo.service.statusmanager.StatusDescriptor; import com.mogo.utils.logger.Logger; import com.tencent.wecarflow.flowoutside.sdk.BindListener; import com.tencent.wecarflow.flowoutside.sdk.FlowPlayControl; import com.tencent.wecarflow.flowoutside.sdk.MediaChangeListener; import com.tencent.wecarflow.flowoutside.sdk.MediaInfo; import com.tencent.wecarflow.flowoutside.sdk.PlayStateListener; +import com.tencent.wecarflow.flowoutside.sdk.QueryCallback; /** * 爱趣听presenter @@ -31,33 +37,94 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { private MediaInfoData currentMedia; + private boolean isBind = true; + private IMogoServiceApis serviceApis; + + private QueryCallback isPlayingCallback = new QueryCallback() { + @Override + public void onError(int i) { + + } + + @Override + public void onSuccess(Boolean aBoolean) { + currentMedia.setPlayState(aBoolean ? MusicConstant.PLAY_STATE_PLAYING : + MusicConstant.PLAY_STATE_PAUSE_OR_STOP); + if (mView != null) { + mView.onMediaInfoChanged(currentMedia); + } + } + }; + + private QueryCallback currentCallback = new QueryCallback() { + @Override + public void onError(int i) { + + } + + @Override + public void onSuccess(MediaInfo mediaInfo) { + currentMedia.setMediaName(mediaInfo.getMediaName()); + currentMedia.setMediaImg(mediaInfo.getMediaImage()); + if (mView != null) { + mView.onMediaInfoChanged(currentMedia); + } + } + }; + @Override public void init(Context context) { this.context = context; - FlowPlayControl.getInstance().bindPlayService(context); + currentMedia = new MediaInfoData(); + currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); + + serviceApis = + (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context); + + serviceApis.getStatusManagerApi().registerStatusChangedListener(MediaConstants.MODULE_TYPE, StatusDescriptor.MAIN_PAGE_RESUME, new IMogoStatusChangedListener() { + @Override + public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) { + if (isTrue) { + Logger.d(TAG, "onResume, isBind: " + isBind); + // 需要在resume时候判断绑定关系是否正常 + if (!isBind) { + // 未绑定,需要重新绑定,同时第一次绑定初始化也是在此处 + FlowPlayControl.getInstance().bindPlayService(context); + } + } + } + }); + FlowPlayControl.getInstance().addBindListener(new BindListener() { @Override public void onServiceConnected() { Logger.d(TAG, "onServiceConnected==="); + isBind = true; + FlowPlayControl.getInstance().queryPlaying(isPlayingCallback); + FlowPlayControl.getInstance().queryCurrent(currentCallback); } @Override public void onServiceDisconnected() { Logger.e(TAG, "onServiceDisconnected==="); + isBind = false; } @Override public void onBindDied() { Logger.e(TAG, "onBindDied==="); + isBind = false; } }); FlowPlayControl.getInstance().addMediaChangeListener(new MediaChangeListener() { @Override public void onMediaChange(MediaInfo mediaInfo) { - currentMedia = new MediaInfoData(); + Logger.d(TAG, "onMediaChange: " + mediaInfo); + Logger.d(TAG, "onMediaChange, img: " + mediaInfo.getMediaImage()); currentMedia.setMediaName(mediaInfo.getMediaName()); - currentMedia.setMediaUrl(mediaInfo.getMediaImage()); + currentMedia.setMediaImg(mediaInfo.getMediaImage()); + mView.onMediaInfoChanged(currentMedia); } @Override @@ -71,7 +138,8 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { public void onStart() { if (mView != null && currentMedia != null) { currentMedia.setPlayState(MusicConstant.PLAY_STATE_PLAYING); - mView.onMusicPlaying(currentMedia); + mView.onMusicPlaying(); + mView.onMediaInfoChanged(currentMedia); } } @@ -79,7 +147,8 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { public void onPause() { if (mView != null && currentMedia != null) { currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); - mView.onMusicPause(currentMedia); + mView.onMusicPause(); + mView.onMediaInfoChanged(currentMedia); } } @@ -87,7 +156,8 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { public void onStop() { if (mView != null && currentMedia != null) { currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); - mView.onMusicStoped(currentMedia); + mView.onMusicStopped(); + mView.onMediaInfoChanged(currentMedia); } } @@ -98,6 +168,8 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { } } }); + + FlowPlayControl.getInstance().bindPlayService(context); } @Override @@ -124,12 +196,4 @@ public class WeCarFlowPresenter extends BaseMediaPresenter { public void next() { FlowPlayControl.getInstance().doNext(); } - - @Override - public void onDestroy(@NonNull LifecycleOwner owner) { - super.onDestroy(owner); - if (context != null) { - FlowPlayControl.getInstance().unbindPlayService(context); - } - } } diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/LaunchUtils.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/LaunchUtils.java new file mode 100644 index 0000000000..653a77601e --- /dev/null +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/utils/LaunchUtils.java @@ -0,0 +1,29 @@ +package com.mogo.module.media.utils; + +import android.content.Context; +import android.content.Intent; + +/** + * @author congtaowang + * @since 2020-02-03 + *

+ * 描述 + */ +public class LaunchUtils { + + /** + * 通过包名启动app + * + * @param context + * @param pkg 包名 + */ + public static void launchByPkg( Context context, String pkg ) throws Exception { + Intent intent = getLaunchIntentForPackage( context, pkg ); + intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); + context.startActivity( intent ); + } + + public static Intent getLaunchIntentForPackage( Context context, String pkg ) { + return context.getPackageManager().getLaunchIntentForPackage( pkg ); + } +} diff --git a/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java b/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java index 853a9cde86..d0379ff238 100644 --- a/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java +++ b/modules/mogo-module-media/src/main/java/com/mogo/module/media/view/IMusicView.java @@ -9,11 +9,13 @@ import com.mogo.module.media.model.MediaInfoData; * @author tongchenfei */ public interface IMusicView extends IView { - void onMusicPlaying(MediaInfoData mediaInfoData); + void onMediaInfoChanged(MediaInfoData mediaInfoData); - void onMusicPause(MediaInfoData mediaInfoData); + void onMusicPlaying(); - void onMusicStoped(MediaInfoData mediaInfoData); + void onMusicPause(); + + void onMusicStopped(); void onMusicProgress(long current,long total); } From 30847d81bf962cc1b96622138a05a4ac2b6d49b3 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Sat, 6 Jun 2020 18:05:40 +0800 Subject: [PATCH 3/9] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E6=89=93=E5=BC=80?= =?UTF-8?q?=E5=88=86=E4=BA=AB=E6=A1=86=E7=9A=84scheme=202.=20=E6=94=B9?= =?UTF-8?q?=E5=8F=98=E5=88=86=E4=BA=AB=E6=A1=86=E6=98=BE=E7=A4=BA=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=AE=9E=E7=8E=B0=E6=96=B9=E5=BC=8F=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E7=94=A8IProvider=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/AndroidManifest.xml | 9 ++++ .../independent/MainIndependentActivity.java | 2 + .../extensions/entrance/EntranceFragment.java | 20 ++++---- .../com/mogo/module/main/SchemeIntent.java | 6 +++ .../com/mogo/module/share/ShareControl.java | 46 ++++--------------- .../share/dialog/LaucherShareDialog.java | 2 +- .../com/mogo/service/IMogoServiceApis.java | 7 +++ .../com/mogo/service/MogoServicePaths.java | 7 +++ .../mogo/service/share/IMogoShareManager.java | 19 ++++++++ .../mogo/service/impl/MogoServiceApis.java | 8 +++- 10 files changed, 80 insertions(+), 46 deletions(-) create mode 100644 services/mogo-service-api/src/main/java/com/mogo/service/share/IMogoShareManager.java diff --git a/main-extensions/mogo-module-main-independent/src/main/AndroidManifest.xml b/main-extensions/mogo-module-main-independent/src/main/AndroidManifest.xml index fcfddb2b4a..0d4d401316 100644 --- a/main-extensions/mogo-module-main-independent/src/main/AndroidManifest.xml +++ b/main-extensions/mogo-module-main-independent/src/main/AndroidManifest.xml @@ -29,6 +29,15 @@ + + + + + + \ No newline at end of file diff --git a/main-extensions/mogo-module-main-independent/src/main/java/com/zhidao/mogo/module/main/independent/MainIndependentActivity.java b/main-extensions/mogo-module-main-independent/src/main/java/com/zhidao/mogo/module/main/independent/MainIndependentActivity.java index 52bf70be04..63c9099486 100644 --- a/main-extensions/mogo-module-main-independent/src/main/java/com/zhidao/mogo/module/main/independent/MainIndependentActivity.java +++ b/main-extensions/mogo-module-main-independent/src/main/java/com/zhidao/mogo/module/main/independent/MainIndependentActivity.java @@ -17,6 +17,8 @@ public class MainIndependentActivity extends MainActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + // 独立app需要在onCreate里面增加处理scheme的情况 + mPresenter.handleSchemeIntent(getIntent()); } @Override diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 9520ef3000..8240544ce2 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -222,13 +222,7 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent // } // }); // 原始逻辑 - isClickShare = true; - if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { - mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); - } else { - ShareControl.getInstance( getActivity() ).showDialog(); - traceData( "1" ); - } + showShareDialog(); } ); mDisplayOverview = findViewById( R.id.module_ext_id_display_overview ); @@ -348,6 +342,16 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent mNaviInfo.inflate( rootView ); } + public void showShareDialog() { + isClickShare = true; + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); + } else { + mApis.getShareManager().showShareDialog(); + traceData( "1" ); + } + } + private static final String AUTONAVI_STANDARD_BROADCAST_RECV = "AUTONAVI_STANDARD_BROADCAST_RECV"; @NonNull @@ -395,7 +399,7 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent public void authorizeSuccess() { Log.d( TAG, "authorizeSuccess --------> isClickShare = " + isClickShare ); if ( isClickShare ) { - ShareControl.getInstance( getActivity() ).showDialog(); + mApis.getShareManager().showShareDialog(); traceData( "1" ); } else { mEntrancePresenter.handleNeedAuthorizeCmd(); diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java index 14ec2be9ab..b477536dcf 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/SchemeIntent.java @@ -80,6 +80,12 @@ public class SchemeIntent implements IMogoStatusChangedListener { case "/main/switch2": handleSwitch2Action( target ); break; + case "/main/share": + Logger.d(TAG,"收到打开分享框的scheme,准备打开分享框"); + mApis.getShareManager().showShareDialog(); + break; + default: + break; } diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareControl.java b/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareControl.java index 5307736cd1..c20c764113 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareControl.java +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareControl.java @@ -2,10 +2,12 @@ package com.mogo.module.share; import android.content.Context; +import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.module.share.dialog.LaucherShareDialog; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; +import com.mogo.service.share.IMogoShareManager; import com.mogo.utils.logger.Logger; /** @@ -13,55 +15,27 @@ import com.mogo.utils.logger.Logger; * @description 分享弹框接口 * @since 2020-01-10 */ -public class ShareControl implements IShareControl { +@Route(path = MogoServicePaths.PATH_SHARE) +public class ShareControl implements IMogoShareManager { - private static volatile ShareControl sInstance; private Context mContext; private LaucherShareDialog mShareDialog; - private IMogoServiceApis mogoServiceApis; - - private ShareControl(Context context) { - mContext = context; - mogoServiceApis = - (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context); - } - - public IMogoServiceApis getMogoServiceApis(){ - return mogoServiceApis; - } - - public static ShareControl getInstance(Context context) { - if (sInstance == null) { - synchronized (ShareControl.class) { - if (sInstance == null) { - sInstance = new ShareControl(context); - } - } - } - return sInstance; - } - - @Override - public void showDialog() { - - boolean isAdasShow = mogoServiceApis.getStatusManagerApi().isADASShow(); - Logger.d("ShareControl", "showDialog 判断adas是否展示: " + isAdasShow); -// if (isAdasShow) { -// mogoServiceApis.getAdasControllerApi().closeADAS(); -// } - + public void showShareDialog() { mShareDialog = new LaucherShareDialog(mContext); -// mShareDialog.setCanceledOnTouchOutside(true); mShareDialog.show(); } @Override - public void dismissDialog() { + public void dismissShareDialog() { if (mShareDialog != null) { mShareDialog.dismiss(); } } + @Override + public void init(Context context) { + mContext = context; + } } diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/dialog/LaucherShareDialog.java b/modules/mogo-module-share/src/main/java/com/mogo/module/share/dialog/LaucherShareDialog.java index 056450ac89..519f098dea 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/dialog/LaucherShareDialog.java +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/dialog/LaucherShareDialog.java @@ -66,8 +66,8 @@ public class LaucherShareDialog implements View.OnClickListener { public LaucherShareDialog(@NonNull Context context) { this.mContext = context; - mAnalytics = ShareControl.getInstance(context).getMogoServiceApis().getAnalyticsApi(); mApis = (IMogoServiceApis) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation(context); + mAnalytics = mApis.getAnalyticsApi(); mStatusManager = mApis.getStatusManagerApi(); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java index 647a236561..73ba95f5a2 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java @@ -21,6 +21,7 @@ import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.module.IMogoSearchManager; import com.mogo.service.module.IMogoSettingManager; import com.mogo.service.network.IMogoNetwork; +import com.mogo.service.share.IMogoShareManager; import com.mogo.service.statusmanager.IMogoMsgCenter; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.service.strategy.IMogoRefreshStrategyController; @@ -194,4 +195,10 @@ public interface IMogoServiceApis extends IProvider { * @return */ IMogoMarkerService getMarkerService(); + + /** + * 其他模块调用分享框的显示和隐藏 + * @return + */ + IMogoShareManager getShareManager(); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java index 93986037c7..d511aaf799 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java @@ -170,6 +170,7 @@ public class MogoServicePaths { /** * 顶部1/2屏管理 */ + @Deprecated public static final String PATH_EXTENSIONS_TOP_VIEW_MANAGER = "/topview/api"; /** @@ -177,4 +178,10 @@ public class MogoServicePaths { */ @Deprecated public static final String PATH_MARKER_SERVICE = "/mogomarker/api"; + + /** + * 其他模块调用分享框 + */ + @Deprecated + public static final String PATH_SHARE = "/extensions/share"; } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/share/IMogoShareManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/share/IMogoShareManager.java new file mode 100644 index 0000000000..2ed5841ad8 --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/share/IMogoShareManager.java @@ -0,0 +1,19 @@ +package com.mogo.service.share; + +import com.alibaba.android.arouter.facade.template.IProvider; + +/** + * 分享框管理接口 + * @author tongchenfei + */ +public interface IMogoShareManager extends IProvider { + /** + * 显示分享框 + */ + void showShareDialog(); + + /** + * 隐藏分享框 + */ + void dismissShareDialog(); +} diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java index 534de90589..30f5a47ab1 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java @@ -30,6 +30,7 @@ import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.module.IMogoSearchManager; import com.mogo.service.module.IMogoSettingManager; import com.mogo.service.network.IMogoNetwork; +import com.mogo.service.share.IMogoShareManager; import com.mogo.service.statusmanager.IMogoMsgCenter; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.service.strategy.IMogoRefreshStrategyController; @@ -171,7 +172,12 @@ public class MogoServiceApis implements IMogoServiceApis { return getApiInstance( IMogoMarkerService.class, MogoServicePaths.PATH_MARKER_SERVICE ); } - private static < T extends IProvider > T getApiInstance( Class< T > clazz, String path ) { + @Override + public IMogoShareManager getShareManager() { + return getApiInstance(IMogoShareManager.class,MogoServicePaths.PATH_SHARE); + } + + private static < T extends IProvider > T getApiInstance(Class< T > clazz, String path ) { T inst = SingletonsHolder.get( clazz ); if ( inst == null ) { synchronized ( sLock ) { From 106e9011b329ecc92c71163ea30e6e8c677ac70f Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Mon, 8 Jun 2020 10:25:40 +0800 Subject: [PATCH 4/9] bug fix --- .../module/back/BackToMainHomeManager.java | 5 ++++- .../entrance/EntrancePresenter.java | 22 +++++++++---------- .../com/mogo/module/share/ShareControl.java | 2 ++ .../module/share/ShareVoiceCmdReceiver.kt | 22 +++++++++++++------ .../module/share/manager/SeekHelpManager.kt | 14 +++++------- .../share/manager/ServiceApisManager.kt | 17 ++++++++++++++ .../mogo/module/share/manager/UploadHelper.kt | 2 +- 7 files changed, 56 insertions(+), 28 deletions(-) create mode 100644 modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/ServiceApisManager.kt diff --git a/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToMainHomeManager.java b/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToMainHomeManager.java index 20818c844d..4ded331a36 100644 --- a/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToMainHomeManager.java +++ b/modules/mogo-module-back/src/main/java/com/mogo/module/back/BackToMainHomeManager.java @@ -34,7 +34,10 @@ public class BackToMainHomeManager { } public static void backToLauncher() { - + if (mStatusManager == null) { + Logger.e(TAG,"未初始化完成"); + return; + } if ( mStatusManager.isMainPageOnResume() ) { if ( mStatusManager.isSearchUIShow() ) { mFragmentManager.clearAll(); diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java index 5a921c613f..eab934bfcf 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java @@ -14,7 +14,6 @@ import com.mogo.commons.mvp.Presenter; import com.mogo.commons.voice.AIAssist; import com.mogo.commons.voice.IMogoVoiceCmdCallBack; import com.mogo.module.authorize.authprovider.module.IMogoAuthorizeModuleManager; -import com.mogo.module.authorize.model.BaseResponse; import com.mogo.module.extensions.ExtensionsModuleConst; import com.mogo.module.extensions.net.UserInfoNetApiServices; import com.mogo.module.extensions.userinfo.UserInfo; @@ -22,6 +21,7 @@ import com.mogo.module.extensions.userinfo.UserInfoConstant; import com.mogo.module.extensions.userinfo.UserInfoResponse; import com.mogo.module.extensions.utils.ExtensionsConfig; import com.mogo.module.share.ShareControl; +import com.mogo.module.share.manager.ServiceApisManager; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; import com.mogo.service.analytics.IMogoAnalytics; @@ -119,7 +119,7 @@ public class EntrancePresenter extends Presenter { if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); } else { - ShareControl.getInstance(mContext).dismissDialog(); + ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); } } else if (cmd.equals(ExtensionsModuleConst.UPLOAD_ROAD_BLOCK)) { //上报拥堵 if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { @@ -227,7 +227,7 @@ public class EntrancePresenter extends Presenter { if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); } else { - ShareControl.getInstance(mContext).showDialog(); + ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); Log.d(TAG, "mogoIntentListener 我要分享 ----> "); traceData("2"); } @@ -258,7 +258,7 @@ public class EntrancePresenter extends Presenter { if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); } else { - ShareControl.getInstance(mContext).dismissDialog(); + ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); Log.d(TAG, "mogoIntentListener 关闭分享框 唤醒 ----> "); } } else if (intentStr.equals(ExtensionsModuleConst.NO_REPLY_SHARE_DIALOG_CLOSE)) { @@ -266,7 +266,7 @@ public class EntrancePresenter extends Presenter { if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); } else { - ShareControl.getInstance(mContext).dismissDialog(); + ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); Logger.d(TAG, "mogoIntentListener 两次未回复关闭对话框"); } } else if (intentStr.equals(ExtensionsModuleConst.UPLOAD_ROAD_CONDITION)) { //上报路况 @@ -290,7 +290,7 @@ public class EntrancePresenter extends Presenter { if (!TextUtils.isEmpty(mVoiceCmdType)) { if (mVoiceCmdType.equals(ExtensionsModuleConst.CANCLE_SHARE) || mVoiceCmdType.equals(ExtensionsModuleConst.CLOSE) || mVoiceCmdType.equals(ExtensionsModuleConst.SHARE_DIALOG_CLOSE) || mVoiceCmdType.equals(ExtensionsModuleConst.NO_REPLY_SHARE_DIALOG_CLOSE)) { //关闭分享弹框 - ShareControl.getInstance(mContext).dismissDialog(); + ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); } else if (mVoiceCmdType.equals(ExtensionsModuleConst.GO_TO_SHARE)) { //打开分享弹框 if (!TextUtils.isEmpty(mVoiceCmdShareType)) { if (mVoiceCmdShareType.equals("封路")) { @@ -304,7 +304,7 @@ public class EntrancePresenter extends Presenter { uploadTrfficCheck(); } } else { - ShareControl.getInstance(mContext).showDialog(); + ServiceApisManager.serviceApis.getShareManager().showShareDialog(); Log.d(TAG, "handleNeedAuthorizeCmd 我要分享 ----> "); traceData("2"); } @@ -333,7 +333,7 @@ public class EntrancePresenter extends Presenter { sendShareReceiver(REPORT_TANLU_BLOCK); Logger.d("EntrancePresenter", "mogoIntentListener 上报路况 ----> "); traceTypeData("1"); - ShareControl.getInstance(mContext).dismissDialog(); + ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); } private void uploadTrfficCheck() { @@ -341,7 +341,7 @@ public class EntrancePresenter extends Presenter { sendShareReceiver(REPORT_TANLU_TRAFFIC_CHECK); Logger.d("EntrancePresenter", "mogoIntentListener 分享交通检查 ----> "); traceTypeData("3"); - ShareControl.getInstance(mContext).dismissDialog(); + ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); } private void uploadRoadClosed() { @@ -349,7 +349,7 @@ public class EntrancePresenter extends Presenter { sendShareReceiver(REPORT_TANLU_CLOSURE); Logger.d("EntrancePresenter", "mogoIntentListener 分享封路 ----> "); traceTypeData("4"); - ShareControl.getInstance(mContext).dismissDialog(); + ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); } /** @@ -368,7 +368,7 @@ public class EntrancePresenter extends Presenter { // intent.setData(Uri.parse("freshthing://com.zhidao.fresh.things/shareOilPrice")); // getContext().startActivity(intent); // traceTypeData("2"); -// ShareControl.getInstance(mContext).dismissDialog(); +// ServiceApisManager.serviceApis.getShareManager().dismissShareDialog(); } /** diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareControl.java b/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareControl.java index c20c764113..a5b5aba610 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareControl.java +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareControl.java @@ -5,6 +5,7 @@ import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.module.share.dialog.LaucherShareDialog; +import com.mogo.module.share.manager.ServiceApisManager; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; import com.mogo.service.share.IMogoShareManager; @@ -37,5 +38,6 @@ public class ShareControl implements IMogoShareManager { @Override public void init(Context context) { mContext = context; + ServiceApisManager.INSTANCE.init(context); } } diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareVoiceCmdReceiver.kt b/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareVoiceCmdReceiver.kt index 0d99d1655b..b8695ceb5d 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareVoiceCmdReceiver.kt +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/ShareVoiceCmdReceiver.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import com.mogo.module.share.constant.ShareConstants import com.mogo.module.share.constant.ShareConstants.* +import com.mogo.module.share.manager.ServiceApisManager import com.mogo.module.share.manager.UploadHelper import com.mogo.utils.logger.Logger import org.json.JSONObject @@ -24,7 +25,8 @@ class ShareVoiceCmdReceiver : BroadcastReceiver() { val seekHelp = Intent(context, VoiceCmdService::class.java) seekHelp.putExtra(ShareConstants.VOICE_CMD_SERVICE_EVENT_KEY, ShareConstants.VOICE_CMD_SERVICE_SEEK_HELP) context.startService(seekHelp) - ShareControl.getInstance(context).dismissDialog() + ServiceApisManager.serviceApis.shareManager.dismissShareDialog() +// ShareControl.getInstance(context).dismissDialog() } VOICE_CMD_GO_TO_SHARE ->{ val ob = JSONObject(intent.getStringExtra("data") ?: "").opt("ob") @@ -32,23 +34,28 @@ class ShareVoiceCmdReceiver : BroadcastReceiver() { when (ob) { "积水"->{ UploadHelper.upload(context, TYPE_STAGNANT_WATER) - ShareControl.getInstance(context).dismissDialog() + ServiceApisManager.serviceApis.shareManager.dismissShareDialog() +// ShareControl.getInstance(context).dismissDialog() } "积冰"->{ UploadHelper.upload(context, TYPE_ROAD_ICY) - ShareControl.getInstance(context).dismissDialog() + ServiceApisManager.serviceApis.shareManager.dismissShareDialog() +// ShareControl.getInstance(context).dismissDialog() } "雾"->{ UploadHelper.upload(context, TYPE_DENSE_FOG) - ShareControl.getInstance(context).dismissDialog() + ServiceApisManager.serviceApis.shareManager.dismissShareDialog() +// ShareControl.getInstance(context).dismissDialog() } "交通事故"->{ UploadHelper.upload(context, TYPE_ACCIDENT) - ShareControl.getInstance(context).dismissDialog() + ServiceApisManager.serviceApis.shareManager.dismissShareDialog() +// ShareControl.getInstance(context).dismissDialog() } "施工"->{ UploadHelper.upload(context, TYPE_ROAD_CONSTRUCTION) - ShareControl.getInstance(context).dismissDialog() + ServiceApisManager.serviceApis.shareManager.dismissShareDialog() +// ShareControl.getInstance(context).dismissDialog() } } } @@ -59,7 +66,8 @@ class ShareVoiceCmdReceiver : BroadcastReceiver() { // 上报实时路况 Logger.d(TAG, "分享框准备触发上报实时路况") UploadHelper.upload(context, TYPE_REAL_TIME_TRAFFIC) - ShareControl.getInstance(context).dismissDialog() + ServiceApisManager.serviceApis.shareManager.dismissShareDialog() +// ShareControl.getInstance(context).dismissDialog() } } } diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/SeekHelpManager.kt b/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/SeekHelpManager.kt index 70050fb729..9a9c1d949f 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/SeekHelpManager.kt +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/SeekHelpManager.kt @@ -7,7 +7,6 @@ import com.mogo.commons.data.BaseData import com.mogo.commons.network.SubscribeImpl import com.mogo.commons.voice.AIAssist import com.mogo.commons.voice.IMogoVoiceCmdCallBack -import com.mogo.module.share.ShareControl import com.mogo.module.share.bean.SeekRecord import com.mogo.module.share.bean.SeekRequest import com.mogo.module.share.bean.getJson @@ -20,7 +19,6 @@ import com.mogo.utils.storage.SharedPrefsMgr import com.zhidao.auto.platform.util.DeviceUtil import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers -import java.util.* /** * 故障求助管理类,相关故障求助操作的具体实现类 @@ -73,7 +71,6 @@ object SeekHelpManager { } - /** * 寻求帮助,是开始故障求助的入口 * 由于当前需求仅需要提供这一个方法,所以context的初始化放到了此方法,后面如果有增加,需要把这部分提出去 @@ -88,7 +85,8 @@ object SeekHelpManager { this.context = context } aiAssist = AIAssist.getInstance(context) - isSeekHelp = ShareControl.getInstance(SeekHelpManager.context).mogoServiceApis.statusManagerApi.isSeekHelping + + isSeekHelp = ServiceApisManager.serviceApis.statusManagerApi.isSeekHelping Logger.d(TAG, "开始故障求助上报---${isSeekHelp}") seekListenerList.add(seekHelpListener) when { @@ -157,11 +155,11 @@ object SeekHelpManager { val seekRequest = SeekRequest(DeviceUtil.getSn()) val param = mutableMapOf("data" to seekRequest.getJson()) - ShareControl.getInstance(context).mogoServiceApis.networkApi.create(ShareApiService::class.java, HttpConstant.getNetHost()).sendHelpSignal(param).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SubscribeImpl(RequestOptions.create(context)) { + ServiceApisManager.serviceApis.networkApi.create(ShareApiService::class.java, HttpConstant.getNetHost()).sendHelpSignal(param).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SubscribeImpl(RequestOptions.create(context)) { override fun onSuccess(o: BaseData?) { super.onSuccess(o) // 接口请求成功,内部同步v2x状态,通知adas,改变自车图标 - ShareControl.getInstance(context).mogoServiceApis.statusManagerApi.setSeekHelping("ShareDialog", true) + ServiceApisManager.serviceApis.statusManagerApi.setSeekHelping("ShareDialog", true) SharedPrefsMgr.getInstance(context!!).putLong("seek_help_time", System.currentTimeMillis()) isSeekHelp = true aiAssist?.speakTTSVoice("已发布求助信息,将为你通知其他车主") @@ -213,11 +211,11 @@ object SeekHelpManager { fun debugCancelSeek() { val seekRequest = SeekRequest(DeviceUtil.getSn(), 0) val param = mutableMapOf("data" to seekRequest.getJson()) - ShareControl.getInstance(context).mogoServiceApis.networkApi.create(ShareApiService::class.java, HttpConstant.getNetHost()).sendHelpSignal(param).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SubscribeImpl(RequestOptions.create(context)) { + ServiceApisManager.serviceApis.networkApi.create(ShareApiService::class.java, HttpConstant.getNetHost()).sendHelpSignal(param).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SubscribeImpl(RequestOptions.create(context)) { override fun onSuccess(o: BaseData?) { super.onSuccess(o) // 接口请求成功,内部同步v2x状态,通知adas,改变自车图标 - ShareControl.getInstance(context).mogoServiceApis.statusManagerApi.setSeekHelping("ShareDialog", false) + ServiceApisManager.serviceApis.statusManagerApi.setSeekHelping("ShareDialog", false) isSeekHelp = false } diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/ServiceApisManager.kt b/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/ServiceApisManager.kt new file mode 100644 index 0000000000..74c0ab300d --- /dev/null +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/ServiceApisManager.kt @@ -0,0 +1,17 @@ +package com.mogo.module.share.manager + +import android.content.Context +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.service.IMogoServiceApis +import com.mogo.service.MogoServicePaths + +/** + * 全局管理IMogoServiceApis + */ +object ServiceApisManager { + lateinit var serviceApis: IMogoServiceApis + + fun init(context: Context) { + serviceApis = ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context) as IMogoServiceApis + } +} \ No newline at end of file diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt b/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt index 906c291da8..e53473bacd 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt @@ -11,7 +11,7 @@ import com.mogo.utils.logger.Logger */ object UploadHelper { fun upload(context:Context, type: String) { - ShareControl.getInstance(context).mogoServiceApis.statusManagerApi.setUploadingStatus("CARD_TYPE_ROAD_CONDITION", true) + ServiceApisManager.serviceApis.statusManagerApi.setUploadingStatus("CARD_TYPE_ROAD_CONDITION", true) Logger.d("UploadHelper", "upload ----> $type") val intent = Intent() intent.action = "com.zhidao.roadcondition.share" From f975e362757972bc39fc658b15df1f9d73740637 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Mon, 8 Jun 2020 11:31:50 +0800 Subject: [PATCH 5/9] =?UTF-8?q?1.=20=E7=BB=BC=E5=90=88=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E4=BB=A5=E5=8F=8A=E7=88=B1=E8=B6=A3=E5=90=AC?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E8=83=BD=E5=8A=9B=EF=BC=8C=E6=9C=80=E7=BB=88?= =?UTF-8?q?=E5=92=8C=E4=BA=A7=E5=93=81=E7=A1=AE=E8=AE=A4=EF=BC=8C=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E7=8A=B6=E6=80=81=E9=9F=B3=E9=A2=91=E6=A1=86=E4=B8=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E7=94=A8=E6=88=B7=E4=B8=BB=E5=8A=A8?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E4=B8=80=E6=AC=A1=E5=90=8E=EF=BC=8C=E9=9F=B3?= =?UTF-8?q?=E9=A2=91=E6=B5=AE=E6=A1=86=E6=98=BE=E7=A4=BA=EF=BC=8C=E7=9B=B4?= =?UTF-8?q?=E5=88=B0acc-off=E6=89=8D=E6=B6=88=E5=A4=B1=EF=BC=8C=E4=B8=8B?= =?UTF-8?q?=E6=AC=A1acc-on=E5=90=8E=E4=B8=8D=E6=98=BE=E7=A4=BA=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/module/apps/model/AppEnum.java | 2 +- .../drawable/module_apps_ic_we_car_flow.png | Bin 0 -> 4161 bytes .../com/mogo/module/media/MediaWindow2.java | 34 +++++++++--------- .../module/media/model/MediaInfoData.java | 2 ++ .../media/presenter/WeCarFlowPresenter.java | 1 - 5 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 modules/mogo-module-apps/src/main/res/drawable/module_apps_ic_we_car_flow.png diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java index 8c545cc2dc..7eadd38ab6 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppEnum.java @@ -15,7 +15,7 @@ import com.mogo.module.apps.R; */ public enum AppEnum { // 爱趣听 - WeCarFlow("爱趣听","com.tencent.wecarflow", R.drawable.module_apps_ic_qq_music ), + WeCarFlow("爱趣听","com.tencent.wecarflow", R.drawable.module_apps_ic_we_car_flow ), //"QQ音乐", QQMusic( "QQ音乐", "com.pvetec.musics", R.drawable.module_apps_ic_qq_music ), diff --git a/modules/mogo-module-apps/src/main/res/drawable/module_apps_ic_we_car_flow.png b/modules/mogo-module-apps/src/main/res/drawable/module_apps_ic_we_car_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..95734bb594db3a56842405619901a85955004b84 GIT binary patch literal 4161 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 { public void init(Context context) { this.context = context; currentMedia = new MediaInfoData(); - currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP); serviceApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context); From c2b5e786c211f57bf89466cf2c9ffea99c697b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Mon, 8 Jun 2020 12:22:45 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E5=8D=87=E7=BA=A7V2X=E7=89=88=E6=9C=AC-?= =?UTF-8?q?=E4=BF=AE=E5=A4=8Danr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 2dc54c489f..707ee6e613 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a74df430a0..d93260870c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -70,7 +70,7 @@ MOGO_MODULE_GUIDESHOW_PROVIDER_VERSION=1.0.2-SNAPSHOT # 在线车辆F MOGO_MODULE_ONLINECAR_VERSION=1.0.3.2 # v2x -MOGO_MODULE_V2X_VERSION=1.0.23 +MOGO_MODULE_V2X_VERSION=1.0.24 # 媒体卡片 MOGO_MODULE_MEDIA_VERSION=1.0.4.11 # 推送 From 76bdc73611735812e68a735b4d367f65cd649b2b Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Mon, 8 Jun 2020 12:28:58 +0800 Subject: [PATCH 7/9] =?UTF-8?q?1.=20=E8=BF=81=E7=A7=BB=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=8E=B7=E5=8F=96=E4=BD=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E6=94=BE=E5=88=B0=E4=BA=86ExtensionsFragment=202.=20=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=9C=AA=E5=87=BA=E5=9B=BE=EF=BC=8C=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E6=9A=82=E6=9C=AA=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/extensions/ExtensionsFragment.java | 9 +++ .../extensions/ExtensionsPresenter.java | 72 +++++++++++++++++++ .../module/extensions/ExtensionsView.java | 7 ++ .../extensions/entrance/EntranceFragment.java | 5 -- .../entrance/EntrancePresenter.java | 52 -------------- .../extensions/entrance/EntranceView.java | 3 - .../module/extensions/userinfo/UserInfo.java | 15 ++++ 7 files changed, 103 insertions(+), 60 deletions(-) diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsFragment.java index 41dffb39d1..551ec8e41c 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsFragment.java @@ -11,8 +11,12 @@ import androidx.annotation.Nullable; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.MvpFragment; +import com.mogo.module.extensions.userinfo.UserInfo; +import com.mogo.utils.logger.Logger; /** + * 天气,消息,个人头像 + * * @author congtaowang * @since 2020-01-05 *

@@ -92,4 +96,9 @@ public class ExtensionsFragment extends MvpFragment< ExtensionsView, ExtensionsP mMsgContainer.setVisibility( hasMsg ? View.VISIBLE : View.GONE ); mMsgCounter.setText( amount > MAX_DISPLAY_MSG_AMOUNT ? getString( R.string.module_ext_str_dots ) : String.valueOf( amount ) ); } + + @Override + public void renderUserInfo(UserInfo userInfo) { + Logger.d(TAG, "renderUserInfo: " + userInfo); + } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java index f779f76aec..85d0463965 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java @@ -1,17 +1,36 @@ package com.mogo.module.extensions; +import android.util.ArrayMap; + import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.Presenter; +import com.mogo.module.extensions.net.UserInfoNetApiServices; +import com.mogo.module.extensions.userinfo.UserInfo; +import com.mogo.module.extensions.userinfo.UserInfoConstant; +import com.mogo.module.extensions.userinfo.UserInfoResponse; +import com.mogo.module.extensions.utils.ExtensionsConfig; import com.mogo.module.extensions.weather.Phenomena; import com.mogo.module.extensions.weather.WeatherCallback; import com.mogo.module.extensions.weather.WeatherInfo; import com.mogo.module.extensions.weather.WeatherModel; +import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; +import com.mogo.service.network.IMogoNetwork; import com.mogo.service.statusmanager.IMogoMsgCenter; import com.mogo.service.statusmanager.IMogoMsgCenterListener; +import com.mogo.utils.digest.DigestUtils; +import com.mogo.utils.logger.Logger; +import com.zhidao.auto.platform.util.DeviceUtil; + +import java.util.Map; + +import io.reactivex.SingleObserver; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; /** @@ -29,9 +48,13 @@ public class ExtensionsPresenter extends Presenter< ExtensionsView > implements private IMogoMsgCenter mMsgCenter; + private IMogoNetwork mNetWork; + public ExtensionsPresenter( ExtensionsView view ) { super( view ); mWeatherModel = new WeatherModel( getContext() ); + mNetWork = + ((IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(view.getContext())).getNetworkApi(); } @Override @@ -65,6 +88,10 @@ public class ExtensionsPresenter extends Presenter< ExtensionsView > implements @Override public void onResume( @NonNull LifecycleOwner owner ) { super.onResume( owner ); + if(ExtensionsConfig.needRequestUserInfo()){ + // 相当于每次onResume都会请求一下个人信息,目的是能够相对及时的同步手机端的个人信息修改 + requestUserInfo(); + } } @Override @@ -82,4 +109,49 @@ public class ExtensionsPresenter extends Presenter< ExtensionsView > implements mMsgCenter.unregisterMsgCenterListener( this ); } } + + private UserInfo userInfo; + public void requestUserInfo() { + Map params = new ArrayMap<>(); + params.put("sn", DeviceUtil.getSn()); + params.put("source", "2"); + String sign = createSign(params, "JGqZw9"); + params.put("sig", sign); + mNetWork.create(UserInfoNetApiServices.class, UserInfoConstant.getUserInfoBaseUrl()).requestUserInfo(params).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new SingleObserver() { + @Override + public void onSubscribe(Disposable d) { + } + + @Override + public void onSuccess(UserInfoResponse userInfoBaseResponse) { + userInfo = userInfoBaseResponse.getResult(); + Logger.d(TAG, "获取个人信息成功: " + userInfo); + mView.renderUserInfo(userInfo); + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + Logger.e(TAG, e, "获取个人信息失败=="); + } + }); + } + + private String createSign(Map map, String salt) { + try { + StringBuilder queryString = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { + queryString.append(entry.getKey()) + .append("=") + .append(entry.getValue()) + .append("&"); + } + queryString.append("key=").append(DigestUtils.shaHex(salt)); + return DigestUtils.shaHex(queryString.toString()).toUpperCase(); + } catch (Exception e) { + e.printStackTrace(); + Logger.e(TAG, e, "createSign()"); + return ""; + } + } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsView.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsView.java index fa1ef5e128..873761780f 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsView.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsView.java @@ -1,6 +1,7 @@ package com.mogo.module.extensions; import com.mogo.commons.mvp.IView; +import com.mogo.module.extensions.userinfo.UserInfo; import com.mogo.module.extensions.weather.WeatherInfo; /** @@ -27,4 +28,10 @@ public interface ExtensionsView extends IView { * @param amount 消息数量 */ void renderMsgInfo( boolean hasMsg, int amount ); + + /** + * 刷新个人信息 + * @param userInfo 个人信息 + */ + void renderUserInfo(UserInfo userInfo); } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 8240544ce2..465c4bff54 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -553,9 +553,4 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent // 30s 后无论成功与否,停止动画 mUploadFrameAnimHandler.sendEmptyMessageDelayed( MSG_STOP_ANIM, 30_000 ); } - - @Override - public void refreshUserInfo( UserInfo userInfo ) { - Logger.d( TAG, "刷新用户信息: " + userInfo ); - } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java index eab934bfcf..7d84b9bb31 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java @@ -65,9 +65,6 @@ public class EntrancePresenter extends Presenter { private String mVoiceCmdType; //一级命令 private String mVoiceCmdShareType; //对某些一级命令里面细分的类型做处理 private IMogoStatusManager mStatusManager; - private IMogoNetwork mNetWork; - - private UserInfo userInfo = null; public EntrancePresenter(Context context, EntranceView view, IMogoAuthorizeModuleManager authorizeModuleManager) { @@ -79,8 +76,6 @@ public class EntrancePresenter extends Presenter { mogoIntentManager = apis.getIntentManagerApi(); mIMogoAuthorizeModuleManager = authorizeModuleManager; mStatusManager = apis.getStatusManagerApi(); - mNetWork = apis.getNetworkApi(); - registerUnWake(); registerAwakeVoice(); @@ -100,9 +95,6 @@ public class EntrancePresenter extends Presenter { @Override public void onResume(@NonNull LifecycleOwner owner) { super.onResume(owner); - if (ExtensionsConfig.needRequestUserInfo() && userInfo == null) { - requestUserInfo(); - } } /** @@ -415,48 +407,4 @@ public class EntrancePresenter extends Presenter { AIAssist.getInstance(mContext).unregisterUnWakeupCommand(ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK); AIAssist.getInstance(mContext).unregisterUnWakeupCommand(ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE); } - - public void requestUserInfo() { - Map params = new ArrayMap<>(); - params.put("sn", DeviceUtil.getSn()); - params.put("source", "2"); - String sign = createSign(params, "JGqZw9"); - params.put("sig", sign); - mNetWork.create(UserInfoNetApiServices.class, UserInfoConstant.getUserInfoBaseUrl()).requestUserInfo(params).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new SingleObserver() { - @Override - public void onSubscribe(Disposable d) { - } - - @Override - public void onSuccess(UserInfoResponse userInfoBaseResponse) { - userInfo = userInfoBaseResponse.getResult(); - Logger.d(TAG, "获取个人信息成功: " + userInfo); - mView.refreshUserInfo(userInfo); - } - - @Override - public void onError(Throwable e) { - e.printStackTrace(); - Logger.e(TAG, e, "获取个人信息失败=="); - } - }); - } - - private String createSign(Map map, String salt) { - try { - StringBuilder queryString = new StringBuilder(); - for (Map.Entry entry : map.entrySet()) { - queryString.append(entry.getKey()) - .append("=") - .append(entry.getValue()) - .append("&"); - } - queryString.append("key=").append(DigestUtils.shaHex(salt)); - return DigestUtils.shaHex(queryString.toString()).toUpperCase(); - } catch (Exception e) { - e.printStackTrace(); - Logger.e(TAG, e, "createSign()"); - return ""; - } - } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceView.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceView.java index 51fe0b568f..5f37f0256d 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceView.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceView.java @@ -10,7 +10,4 @@ import com.mogo.module.extensions.userinfo.UserInfo; * 描述 */ public interface EntranceView extends IView { - - void refreshUserInfo(UserInfo userInfo); - } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/userinfo/UserInfo.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/userinfo/UserInfo.java index 9526e292a9..4a0fffd814 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/userinfo/UserInfo.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/userinfo/UserInfo.java @@ -95,4 +95,19 @@ public class UserInfo { public void setActiveTime(String activeTime) { this.activeTime = activeTime; } + + @Override + public String toString() { + return "UserInfo{" + + "userId='" + userId + '\'' + + ", phone='" + phone + '\'' + + ", displayName='" + displayName + '\'' + + ", additionalOne=" + additionalOne + + ", headImgurl='" + headImgurl + '\'' + + ", ownerAuthState=" + ownerAuthState + + ", score=" + score + + ", memberLevel='" + memberLevel + '\'' + + ", activeTime='" + activeTime + '\'' + + '}'; + } } From 520a981796ea8001bbf8c188788742008a50bfb7 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Mon, 8 Jun 2020 13:41:10 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E9=85=8D=E5=90=88=E6=8E=A2=E8=B7=AF?= =?UTF-8?q?=E5=90=88=E5=B9=B6=EF=BC=8C=E6=9B=B4=E6=8D=A2=E9=81=93=E8=B7=AF?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E4=B8=8A=E6=8A=A5=E5=B9=BF=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/extensions/entrance/EntrancePresenter.java | 8 ++------ .../java/com/mogo/module/share/manager/UploadHelper.kt | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java index 7d84b9bb31..80e64a0dd2 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java @@ -22,6 +22,7 @@ import com.mogo.module.extensions.userinfo.UserInfoResponse; import com.mogo.module.extensions.utils.ExtensionsConfig; import com.mogo.module.share.ShareControl; import com.mogo.module.share.manager.ServiceApisManager; +import com.mogo.module.share.manager.UploadHelper; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; import com.mogo.service.analytics.IMogoAnalytics; @@ -368,12 +369,7 @@ public class EntrancePresenter extends Presenter { */ private void sendShareReceiver(String type) { Logger.d("EntrancePresenter", "TanluCardViewFragment sendShareReceiver ---->"); - Intent intent = new Intent(); - intent.setAction("com.zhidao.roadcondition.share"); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); - intent.putExtra("type", type); - getContext().sendBroadcast(intent); + UploadHelper.INSTANCE.upload(getContext(),type); } /** diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt b/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt index e53473bacd..27133e2c38 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt @@ -14,7 +14,7 @@ object UploadHelper { ServiceApisManager.serviceApis.statusManagerApi.setUploadingStatus("CARD_TYPE_ROAD_CONDITION", true) Logger.d("UploadHelper", "upload ----> $type") val intent = Intent() - intent.action = "com.zhidao.roadcondition.share" + intent.action = "com.zhidao.share.roadcondition.action" intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND) intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES) intent.putExtra("type", type) From 699fc13f94bb49c363c161163231cc4fc28abd45 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Mon, 8 Jun 2020 14:12:15 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E2=80=9C=E5=85=A8=E8=A7=88=E2=80=9D=E2=80=9C?= =?UTF-8?q?=E6=AD=A3=E5=8C=97=E2=80=9D=E2=80=9C=E9=80=80=E5=87=BA=E5=AF=BC?= =?UTF-8?q?=E8=88=AA=E2=80=9D=E4=B8=89=E4=B8=AA=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/map/CustomNaviInterrupter.java | 6 +++++- .../extensions/entrance/EntranceFragment.java | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/CustomNaviInterrupter.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/CustomNaviInterrupter.java index c77dc49167..701bfa73c2 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/CustomNaviInterrupter.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/CustomNaviInterrupter.java @@ -36,10 +36,14 @@ class CustomNaviInterrupter implements Interrupter { sInstance = null; } + /** + * 判断是否用自己的导航 + * @return true-用高德公版车机版地图 false-用Launcher自己的导航 + */ @Override public boolean interrupt() { if ( AppUtils.isAppInstalled( AbsMogoApplication.getApp(), "com.autonavi.amapauto" ) - || DebugConfig.isUseCustomNavi() ) { + || !DebugConfig.isUseCustomNavi() ) { Logger.d( TAG, "do not use custom map function." ); return true; } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 465c4bff54..341cda917f 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -34,6 +34,7 @@ import com.mogo.module.authorize.authprovider.invoke.AuthorizeConstant; import com.mogo.module.authorize.authprovider.module.IMogoAcquireAuthorizeListener; import com.mogo.module.authorize.authprovider.module.IMogoAuthorizeModuleManager; import com.mogo.module.common.dialog.WMDialog; +import com.mogo.module.common.map.CustomNaviInterrupter; import com.mogo.module.common.map.MapCenterPointStrategy; import com.mogo.module.common.map.Scene; import com.mogo.module.extensions.ExtensionsModuleConst; @@ -432,13 +433,19 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent @Override public void onStartNavi() { TopViewAnimHelper.getInstance().showNaviView(); - mExitNavi.setVisibility( View.VISIBLE ); mMApUIController.changeMapMode( mCameraMode.isSelected() ? EnumMapUI.NorthUP_2D : EnumMapUI.CarUp_2D ); MapCenterPointStrategy.setMapCenterPointBySceneAndDelay( mMApUIController, Scene.NAVI, 500, () -> { return !mMogoNavi.isNaviing(); } ); - mDisplayOverview.setVisibility( View.VISIBLE ); - mCameraMode.setVisibility( View.VISIBLE ); + if(CustomNaviInterrupter.getInstance().interrupt()){ + mDisplayOverview.setVisibility(View.GONE); + mCameraMode.setVisibility(View.GONE); + mExitNavi.setVisibility( View.GONE ); + }else { + mExitNavi.setVisibility( View.VISIBLE ); + mDisplayOverview.setVisibility(View.VISIBLE); + mCameraMode.setVisibility( View.VISIBLE ); + } mApis.getAnalyticsApi().track( "Navigation_begin", new HashMap<>() ); } @@ -511,7 +518,11 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent } else { mDisplayOverviewText.setText( "全览" ); mDisplayOverviewText.setTextSize( TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize( R.dimen.module_ext_display_overview_textSize_large ) ); - mCameraMode.setVisibility( View.VISIBLE ); + if(CustomNaviInterrupter.getInstance().interrupt()){ + mCameraMode.setVisibility(View.GONE); + }else { + mCameraMode.setVisibility(View.VISIBLE); + } } } }