diff --git a/common/build.gradle b/common/build.gradle index 07e4653ee..2cd214fe1 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -189,4 +189,7 @@ dependencies { implementation 'com.github.tajchert:WaitingDots:0.6.1' //悬浮窗 api 'com.github.princekin-f:EasyFloat:2.0.4' + + +// api project(path: ':recognizer') } diff --git a/common/src/main/java/com/yunbao/common/manager/imrongcloud/RongcloudIMManager.java b/common/src/main/java/com/yunbao/common/manager/imrongcloud/RongcloudIMManager.java index d57e68412..3c5676c41 100644 --- a/common/src/main/java/com/yunbao/common/manager/imrongcloud/RongcloudIMManager.java +++ b/common/src/main/java/com/yunbao/common/manager/imrongcloud/RongcloudIMManager.java @@ -1,5 +1,7 @@ package com.yunbao.common.manager.imrongcloud; +import static com.yunbao.common.CommonAppContext.isReady; + import android.app.Application; import android.content.Context; import android.util.Log; @@ -17,8 +19,6 @@ import com.yunbao.common.manager.IMLoginManager; import org.greenrobot.eventbus.EventBus; -import java.util.ArrayList; - import io.rong.imkit.GlideKitImageEngine; import io.rong.imkit.IMCenter; import io.rong.imkit.RongIM; @@ -26,9 +26,7 @@ import io.rong.imkit.config.RongConfigCenter; import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; import io.rong.imlib.model.Message; -import io.rong.imlib.model.MessageContent; - -import static com.yunbao.common.CommonAppContext.isReady; +import io.rong.recognizer.Recognizer; /** * 会话列表 @@ -38,13 +36,14 @@ public class RongcloudIMManager { //融云开发者平台注册app唯一识别符 // public static final String RONG_IM_KEY = "uwd1c0sxu1p71"; //测试环境 - public static String RONG_IM_KEY = "pvxdm17jpd3hr"; + public static String RONG_IM_KEY = "pvxdm17jpd3hr"; private static final String CLASSNAME = "RongcloudIMManager"; + static {//自动切换key - if(CommonAppConfig.HOST.contains("ceshi")){ + if (CommonAppConfig.HOST.contains("ceshi")) { RONG_IM_KEY = "pvxdm17jpd3hr"; //测试服key - }else{ + } else { RONG_IM_KEY = "uwd1c0sxu1p71"; //正式服key } } @@ -61,13 +60,13 @@ public class RongcloudIMManager { Log.e(CLASSNAME, "initRongIM:"); initPhotoGlide(); - + //初始化科大讯飞语音转文字 + Recognizer.setAppId("af2efca9"); } private static RongIMClient.OnReceiveMessageWrapperListener mListener; /** - * * 设置消息接受监听器 */ public static void addRongcloudIMOnReceiveMessageListener(RongIMClient.OnReceiveMessageWrapperListener listener) { diff --git a/common/src/main/res/layout/view_live_total.xml b/common/src/main/res/layout/view_live_total.xml index 5ffcfb799..2fc96c2c4 100644 --- a/common/src/main/res/layout/view_live_total.xml +++ b/common/src/main/res/layout/view_live_total.xml @@ -266,6 +266,27 @@ android:textColor="#FF9A9A9A" android:textSize="12sp" /> + + + + + + %s星挑战 恭喜 %s,完成了%s %s星 挑戰,快去一睹主播芳容吧! + 小窗播放設置 + 小窗播放 + APP內小窗播放 + 讓直播間內容在本APP主頁面中小窗播放 + APP全應用小窗播放 + 讓直播間內容在所有APP及頁面中小窗播放 diff --git a/live/src/main/AndroidManifest.xml b/live/src/main/AndroidManifest.xml index e04abfdfa..ebe6a3ed9 100644 --- a/live/src/main/AndroidManifest.xml +++ b/live/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ android:name=".activity.LiveAudienceActivity" android:screenOrientation="portrait" android:theme="@style/AppTheme" + android:launchMode="singleTask" android:windowSoftInputMode="adjustPan|stateAlwaysHidden" /> { + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.FLOAT_SETTING)); + dismiss(); + } + ); } @Override diff --git a/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java b/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java index 55d09883e..6ba536c79 100644 --- a/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java +++ b/live/src/main/java/com/yunbao/live/event/LiveAudienceEvent.java @@ -4,8 +4,8 @@ import com.yunbao.common.bean.ActiveModel; import com.yunbao.common.bean.AiAutomaticSpeechModel; import com.yunbao.common.bean.AnchorRecommendItemModel; import com.yunbao.common.bean.BaseModel; -import com.yunbao.common.bean.MsgModel; import com.yunbao.common.bean.LiveBean; +import com.yunbao.common.bean.MsgModel; import com.yunbao.live.bean.OpenParametersModel; public class LiveAudienceEvent extends BaseModel { @@ -148,7 +148,8 @@ public class LiveAudienceEvent extends BaseModel { START_MESSAGE(25, "星级消息"), AI_AUTOMATIC_SPEECH(26, "机器人助手"), STAR_CHALLENGE_UPGRADE_NOTIFY(27, "星级挑战成功"), - MESSAGE_BOTTOM(28, "聊天消息滚动到底部"); + MESSAGE_BOTTOM(28, "聊天消息滚动到底部"), + FLOAT_SETTING(29, "悬浮窗设置"); private int type; private String name; diff --git a/live/src/main/java/com/yunbao/live/views/LiveFloatView.java b/live/src/main/java/com/yunbao/live/views/LiveFloatView.java deleted file mode 100644 index 3f4117eaa..000000000 --- a/live/src/main/java/com/yunbao/live/views/LiveFloatView.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.yunbao.live.views; - -import android.app.Activity; -import android.text.TextUtils; -import android.util.Log; -import android.view.Gravity; -import android.view.View; - -import com.lzf.easyfloat.EasyFloat; -import com.lzf.easyfloat.enums.ShowPattern; -import com.lzf.easyfloat.interfaces.FloatCallbacks; -import com.lzf.easyfloat.interfaces.OnInvokeView; -import com.tencent.live2.V2TXLivePlayer; -import com.tencent.live2.impl.V2TXLivePlayerImpl; -import com.tencent.rtmp.ui.TXCloudVideoView; -import com.yunbao.common.bean.LiveBean; -import com.yunbao.common.utils.RouteUtil; -import com.yunbao.common.views.weight.ViewClicksAntiShake; -import com.yunbao.live.R; - -import kotlin.Unit; -import kotlin.jvm.functions.Function0; -import kotlin.jvm.functions.Function1; - -/** - * 直播间悬浮窗管理 - */ -public class LiveFloatView implements Function1 { - - private static LiveFloatView instance; - private LiveOnInvokeView liveOnInvokeView = null; - private Activity mContext; - private String url; - private LiveBean mLiveBean; - private int mLiveType; - private int mLiveSDK; - private int mLiveTypeVal; - private FloatCallbacks.Builder builder; - private String TAG = "LiveFloatView"; - private V2TXLivePlayer mPlayer; - - public static LiveFloatView getInstance() { - if (instance == null) { - instance = new LiveFloatView(); - } - - return instance; - } - - public void builderFloat(Activity mContext, String url) { - liveOnInvokeView = new LiveOnInvokeView(); - this.mContext = mContext; - this.url = url; - EasyFloat.with(mContext) - .setTag(TAG) - .setLayout(R.layout.view_flaot_live, liveOnInvokeView) - .setShowPattern(ShowPattern.CURRENT_ACTIVITY) - .setGravity(Gravity.END | Gravity.CENTER_VERTICAL, 0, 200) - .registerCallback(this) - .show(); - } - - public void builderSystemFloat(Activity mContext, String url) { - liveOnInvokeView = new LiveOnInvokeView(); - this.mContext = mContext; - this.url = url; - EasyFloat.with(mContext) - .setTag(TAG) - .setLayout(R.layout.view_flaot_live, liveOnInvokeView) - .setShowPattern(ShowPattern.ALL_TIME) - .setGravity(Gravity.END | Gravity.CENTER_VERTICAL, 0, 200) - .registerCallback(this) - .show(); - } - - public LiveFloatView cacheLiveData(LiveBean mLiveBean, int mLiveType, int mLiveSDK, int mLiveTypeVal) { - this.mLiveBean = mLiveBean; - this.mLiveType = mLiveType; - this.mLiveSDK = mLiveSDK; - this.mLiveTypeVal = mLiveTypeVal; - return instance; - } - - @Override - public Unit invoke(FloatCallbacks.Builder builder) { - this.builder = builder; - builder.createResult((aBoolean, s, view) -> { - Log.e("LiveFloatView", "aBoolean:" + aBoolean + "---------------------s:" + s); - if (callback != null) { - callback.invoke(aBoolean); - } - builder.dismiss(() -> { - if (mPlayer != null && mPlayer.isPlaying() == 1) { - mPlayer.stopPlay(); - } - return null; - }); - builder.hide(view12 -> { - if (mPlayer != null && mPlayer.isPlaying() == 1) { - mPlayer.pauseAudio(); - mPlayer.pauseVideo(); - } - return null; - }); - - return null; - }); - return null; - } - - /** - * 悬浮窗布局管理 - */ - private class LiveOnInvokeView implements OnInvokeView { - - @Override - public void invoke(View view) { - TXCloudVideoView videoView = view.findViewById(R.id.video_view); - mPlayer = new V2TXLivePlayerImpl(mContext); - mPlayer.setRenderView(videoView); - mPlayer.startPlay(url); - ViewClicksAntiShake.clicksAntiShake(view.findViewById(R.id.btn_close), new ViewClicksAntiShake.ViewClicksCallBack() { - @Override - public void onViewClicks() { - mPlayer.stopPlay(); - EasyFloat.dismiss("LiveFloatView", true); - } - }); - ViewClicksAntiShake.clicksAntiShake(videoView, () -> { - mPlayer.stopPlay(); - RouteUtil.forwardLiveAudienceActivity(mLiveBean, mLiveType, mLiveSDK, mLiveTypeVal); - }); - } - } - - private LiveFloatViewCallback callback; - - public LiveFloatView setCallback(LiveFloatViewCallback callback) { - this.callback = callback; - return this; - } - - public interface LiveFloatViewCallback { - void invoke(Boolean aBoolean); - - } - -} diff --git a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java index ce308eed3..3cccdcb31 100644 --- a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java +++ b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java @@ -30,6 +30,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.blankj.utilcode.util.GsonUtils; import com.facebook.appevents.AppEventsLogger; +import com.lzf.easyfloat.EasyFloat; import com.lzf.easyfloat.permission.PermissionUtils; import com.tencent.imsdk.v2.V2TIMCallback; import com.tencent.imsdk.v2.V2TIMManager; @@ -57,6 +58,7 @@ import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.common.utils.formatBigNum; +import com.yunbao.common.views.weight.LiveFloatView; import com.yunbao.live.R; import com.yunbao.live.activity.LiveActivity; import com.yunbao.live.activity.LiveAudienceActivity; @@ -175,6 +177,13 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe private OpenParametersModel openParametersModel = null; //星级活动地址 private String activityUrl = ""; + //标记是调用正常退出还是手动切后台 + private boolean isQuitF = false; + + public PortraitLiveManager setQuitF(boolean quitF) { + isQuitF = quitF; + return this; + } public PortraitLiveManager(Activity context, Intent intent) { this.mContext = context; @@ -348,70 +357,23 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe mLiveRyLinkMicPkPresenter.release(); } if (isQuit) { - + isQuitF = true; if (PermissionUtils.checkPermission(mContext)) { LiveFloatView.getInstance() .cacheLiveData(mLiveBean, mLiveType, mLiveSDK, mLiveTypeVal) .builderSystemFloat(mContext, mLiveBean.getPull()); mContext.finish(); } else { - if (mContext instanceof LiveAudienceActivity) { - if (IMLoginManager.get(mContext).isFloat()) { - DialogUitl.showSimpleDialog(mContext, null, "您未打开悬浮窗权限,是否打开", false, new DialogUitl.SimpleCallback3() { - @Override - public void onConfirmClick(Dialog dialog) { - LiveFloatView.getInstance() - .setCallback(new LiveFloatView.LiveFloatViewCallback() { - @Override - public void invoke(Boolean aBoolean) { - if (aBoolean) { - mContext.finish(); - } else { - EventBus.getDefault() - .post(new LiveFloatEvent() - .setmLiveBean(mLiveBean) - .setmLiveSDK(mLiveSDK) - .setmLiveType(mLiveType) - .setmLiveTypeVal(mLiveTypeVal)); - mContext.finish(); - IMLoginManager.get(mContext).initFloat(true); - } - } - }) - .cacheLiveData(mLiveBean, mLiveType, mLiveSDK, mLiveTypeVal) - .builderSystemFloat(mContext, mLiveBean.getPull()); - - } - - @Override - public void onCancel() { - EventBus.getDefault() - .post(new LiveFloatEvent() - .setmLiveBean(mLiveBean) - .setmLiveSDK(mLiveSDK) - .setmLiveType(mLiveType) - .setmLiveTypeVal(mLiveTypeVal)); - mContext.finish(); - IMLoginManager.get(mContext).initFloat(false); - } - }); - } else { - EventBus.getDefault() - .post(new LiveFloatEvent() - .setmLiveBean(mLiveBean) - .setmLiveSDK(mLiveSDK) - .setmLiveType(mLiveType) - .setmLiveTypeVal(mLiveTypeVal)); - mContext.finish(); - } - + if (IMLoginManager.get(mContext).isFloat()) { + EventBus.getDefault() + .post(new LiveFloatEvent() + .setmLiveBean(mLiveBean) + .setmLiveSDK(mLiveSDK) + .setmLiveType(mLiveType) + .setmLiveTypeVal(mLiveTypeVal)); } -// PermissionUtils.requestPermission(mContext, new OnPermissionResult() { -// @Override -// public void permissionResult(boolean b) { -// ToastUtil.show("悬浮窗权限:"+b); -// } -// }); + + mContext.finish(); } } } @@ -430,12 +392,23 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe public void onResume() { // if (mLivePlayViewHolder != null) // mLivePlayViewHolder.onResume(); + //判断是否有直播悬浮窗,有直接关闭 + if (EasyFloat.isShow("LiveFloatView")) { + EasyFloat.dismiss("LiveFloatView", true); + } } @Override public void onPause() { // if (mLivePlayViewHolder != null) // mLivePlayViewHolder.onPause(); + if (mLiveBean != null && !isQuitF) { + LiveFloatView.getInstance() + .cacheLiveData(mLiveBean, mLiveType, mLiveSDK, mLiveTypeVal) + .builderSystemFloat(mContext, mLiveBean.getPull()); + mContext.finish(); + } + isQuitF = false; } @Override @@ -1033,7 +1006,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe @Override public void onHourRank(LiveChatBean bean, JSONObject ranks) { - if (mLiveRoomViewHolder != null) { + if (mLiveRoomViewHolder != null && !TextUtils.isEmpty(liveID)) { mLiveRoomViewHolder.setHourRankData(ranks.getInteger(liveID)); } } diff --git a/live/src/main/java/com/yunbao/live/views/SidebarViewHoler.java b/live/src/main/java/com/yunbao/live/views/SidebarViewHoler.java index dbc88476a..a20442623 100644 --- a/live/src/main/java/com/yunbao/live/views/SidebarViewHoler.java +++ b/live/src/main/java/com/yunbao/live/views/SidebarViewHoler.java @@ -1,6 +1,7 @@ package com.yunbao.live.views; import android.app.Activity; +import android.app.Dialog; import android.view.View; import androidx.annotation.NonNull; @@ -11,6 +12,7 @@ import com.ms.banner.Banner; import com.yunbao.common.activity.WebViewActivity; import com.yunbao.common.bean.SlideInfoModel; import com.yunbao.common.http.HttpCallback; +import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.views.SlideInBannerViewHolder; import com.yunbao.live.R; @@ -26,11 +28,13 @@ import java.util.Map; public class SidebarViewHoler extends RecyclerView.ViewHolder { //侧边栏轮播 private Banner mBanner; + private Dialog mShowLoadingDialog; public SidebarViewHoler(@NonNull View itemView) { super(itemView); //侧边栏轮播 mBanner = itemView.findViewById(R.id.banner); + mShowLoadingDialog = DialogUitl.loadingDialog(itemView.getContext()); } @@ -52,6 +56,7 @@ public class SidebarViewHoler extends RecyclerView.ViewHolder { if (p >= 0 && p < data.size()) { SlideInfoModel bean = data.get(p); if (bean != null) { + showLoadingDialog(); String link = bean.getSlideUrl(); if (link.contains("http")) { WebViewActivity.forward(itemView.getContext(), link, true); @@ -76,6 +81,7 @@ public class SidebarViewHoler extends RecyclerView.ViewHolder { LiveBean liveBean = JSON.parseObject(info[0], LiveBean.class); LiveRoomCheckLivePresenter mCheckLivePresenter = new LiveRoomCheckLivePresenter(itemView.getContext(), (liveBean1, liveType, liveTypeVal, liveSdk) -> { if (liveBean1 == null) { + mShowLoadingDialog.dismiss(); return; } Map map = null; @@ -84,15 +90,23 @@ public class SidebarViewHoler extends RecyclerView.ViewHolder { map.put("OPEN", "NEWUSER"); } LiveAudienceActivity.forward(itemView.getContext(), liveBean1, liveType, liveTypeVal, "", map, 0, liveSdk); + mShowLoadingDialog.dismiss(); ((Activity) itemView.getContext()).finish(); }); mCheckLivePresenter.checkLive(liveBean); } else { + mShowLoadingDialog.dismiss(); RouteUtil.forwardUserHome(itemView.getContext(), liveId, 0); ((Activity) itemView.getContext()).finish(); } } }); } + /** + * Banner双击可能会导致进入两次直播间,点击Banner后需要展示加载中动画 + */ + private void showLoadingDialog(){ + mShowLoadingDialog.show(); + } } diff --git a/live/src/main/res/layout/view_flaot_live.xml b/live/src/main/res/layout/view_flaot_live.xml deleted file mode 100644 index e97d21e66..000000000 --- a/live/src/main/res/layout/view_flaot_live.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/main/src/main/java/com/yunbao/main/activity/MainActivity.java b/main/src/main/java/com/yunbao/main/activity/MainActivity.java index 4c85e94d1..8aba50b6b 100644 --- a/main/src/main/java/com/yunbao/main/activity/MainActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/MainActivity.java @@ -91,7 +91,7 @@ import com.yunbao.live.http.LiveHttpUtil; import com.yunbao.live.presenter.LiveRoomCheckLivePresenter; import com.yunbao.live.utils.LiveStorge; import com.yunbao.live.views.ChatListViewHolder; -import com.yunbao.live.views.LiveFloatView; +import com.yunbao.common.views.weight.LiveFloatView; import com.yunbao.main.R; import com.yunbao.main.dialog.MainStartDialogFragment; import com.yunbao.main.dialog.ReturnUserDialog; diff --git a/main/src/main/java/com/yunbao/main/activity/PDLiveConversationListActivity.java b/main/src/main/java/com/yunbao/main/activity/PDLiveConversationListActivity.java index 1209c17a2..80efdcf6e 100644 --- a/main/src/main/java/com/yunbao/main/activity/PDLiveConversationListActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/PDLiveConversationListActivity.java @@ -36,9 +36,7 @@ import com.opensource.svgaplayer.SVGAVideoEntity; import com.yunbao.common.activity.AbsActivity; import com.yunbao.common.activity.WebViewActivity; import com.yunbao.common.bean.ImUserInfoModel; -import com.yunbao.common.bean.LiveBean; import com.yunbao.common.custom.TabButtonGroup; -import com.yunbao.common.event.LiveFloatEvent; import com.yunbao.common.event.MessageIMEvent; import com.yunbao.common.event.UpdateTablePointMe; import com.yunbao.common.glide.ImgLoader; @@ -50,18 +48,12 @@ import com.yunbao.common.manager.imrongcloud.MessageIMManager; import com.yunbao.common.utils.DeviceUtils; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.ProcessResultUtil; -import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.SVGAViewUtils; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.weight.ViewClicksAntiShake; -import com.yunbao.live.activity.LiveAudienceActivity; import com.yunbao.live.activity.SystemMessageActivity; import com.yunbao.live.bean.ImUserBean; -import com.yunbao.live.event.RecommendLiveRoomEvent; import com.yunbao.live.http.ImHttpUtil; -import com.yunbao.live.http.LiveHttpUtil; -import com.yunbao.live.presenter.LiveRoomCheckLivePresenter; -import com.yunbao.live.views.LiveFloatView; import com.yunbao.main.R; import com.yunbao.main.adapter.SystemMessageAdapter; import com.yunbao.main.dialog.MainStartDialogFragment; diff --git a/settings.gradle b/settings.gradle index 6356c17f6..80fd1059a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,4 @@ -include ':app', ':video', ':common', ':main', ':live', ':lib_country_code' +include ':app', ':video', ':common', ':main', ':baidu', ':live', ':lib_country_code' include ':FaceUnity' -//include ':baidu' \ No newline at end of file +//include ':baidu' +//include ':recognizer'//融云语音转文字模块 \ No newline at end of file