Commit f88e6950 by mReturn

直播调试

parent b8338b29
Showing with 753 additions and 245 deletions
...@@ -103,6 +103,7 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin ...@@ -103,6 +103,7 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
@Override @Override
public void initView() { public void initView() {
LiveUtils.initEnv(Constants.ENVIROMENT);
if (getIntent().hasExtra(Constants.ORDER_ID)) { if (getIntent().hasExtra(Constants.ORDER_ID)) {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt(Constants.ORDER_ID, Integer.parseInt(getIntent().getStringExtra(Constants.ORDER_ID))); bundle.putInt(Constants.ORDER_ID, Integer.parseInt(getIntent().getStringExtra(Constants.ORDER_ID)));
......
...@@ -49,6 +49,17 @@ public interface APIService { ...@@ -49,6 +49,17 @@ public interface APIService {
@POST(Constants.UP_PHOTO) @POST(Constants.UP_PHOTO)
Observable<BaseResponse<List<String>>> uploadPhoto( Observable<BaseResponse<List<String>>> uploadPhoto(
@Part MultipartBody.Part part); @Part MultipartBody.Part part);
/**
* 上传图片单张.
*
* @param part
* @param style nowatermark 无水印
* @return
*/
@Multipart
@POST(Constants.UP_PHOTO)
Observable<BaseResponse<List<String>>> uploadPhoto(
@Part MultipartBody.Part part, @Query("style") String style);
/** /**
* 上传单个视频. * 上传单个视频.
......
...@@ -23,6 +23,9 @@ public class BaseApiFactory { ...@@ -23,6 +23,9 @@ public class BaseApiFactory {
public static Observable<List<String>> uploadPhoto(MultipartBody.Part part) { public static Observable<List<String>> uploadPhoto(MultipartBody.Part part) {
return Api.getService(APIService.class).uploadPhoto(part).compose(Api.applySchedulers()); return Api.getService(APIService.class).uploadPhoto(part).compose(Api.applySchedulers());
} }
public static Observable<List<String>> uploadPhoto(MultipartBody.Part part, String style) {
return Api.getService(APIService.class).uploadPhoto(part,style).compose(Api.applySchedulers());
}
public static Observable<String> uploadVideo(MultipartBody.Part part) { public static Observable<String> uploadVideo(MultipartBody.Part part) {
return Api.getService(APIService.class).uploadVideo(part).compose(Api.applySchedulers()); return Api.getService(APIService.class).uploadVideo(part).compose(Api.applySchedulers());
......
...@@ -32,40 +32,42 @@ public class Constants { ...@@ -32,40 +32,42 @@ public class Constants {
public static final String PROGRAM_PATH = "pages/mallDetail/main?goodsId=gid&userId=uid&type=1"; //小程序路径 public static final String PROGRAM_PATH = "pages/mallDetail/main?goodsId=gid&userId=uid&type=1"; //小程序路径
public static final String INVITE_NEW_SHARE_URL = "http://app.dl.kf.ai/ext/#/shareMaster?code="; //邀请新人分享链接 public static final String INVITE_NEW_SHARE_URL = "http://app.dl.kf.ai/ext/#/shareMaster?code="; //邀请新人分享链接
public static final String INVITE_NEW_SHARE_URL_BUSINESS = "http://app.dl.kf.ai/ext/#/merchants?code="; //邀请商家分享链接 public static final String INVITE_NEW_SHARE_URL_BUSINESS = "http://app.dl.kf.ai/ext/#/merchants?code="; //邀请商家分享链接
// public static String VIDEO_SHARE_URL = "http://app.dl.kf.ai/ext/#/shareVideo?type=_type&id="; //学习视频分享链接 type(课程: course 直播: live)
public static String VIDEO_SHARE_URL = "http://uat.kf.ai:9099/#/shareVideo?type=_type&id="; //uat 学习视频分享链接 type(课程: course 直播: live)
/** /**
* dev环境配置. * dev环境配置.
*/ */
public static String ENVIROMENT = "debug"; // public static String ENVIROMENT = "debug";
public static final int LOG_LEVEL = LogUtils.LEVEL_ALL; // public static final int LOG_LEVEL = LogUtils.LEVEL_ALL;
public static String BASE_URL = "http://47.94.101.239:3112"; // public static String BASE_URL = "http://47.94.101.239:3112";
public static String WEB_SOP = "http://47.94.101.239:9004/#/sop"; // public static String WEB_SOP = "http://47.94.101.239:9004/#/sop";
public static String CHECK_MULTI_WEB_SOP = "http://47.94.101.239:9004/#/manyServiceResult"; // public static String CHECK_MULTI_WEB_SOP = "http://47.94.101.239:9004/#/manyServiceResult";
public static String MULTI_WEB_SOP = "http://47.94.101.239:9004/#/manySop"; // public static String MULTI_WEB_SOP = "http://47.94.101.239:9004/#/manySop";
public static String WEB_SOP_DETAIL = "http://47.94.101.239:9004/#/sopdetail"; // public static String WEB_SOP_DETAIL = "http://47.94.101.239:9004/#/sopdetail";
public static String WEB_ZHI_SHI = "http://47.94.101.239:9004/#/detail"; // public static String WEB_ZHI_SHI = "http://47.94.101.239:9004/#/detail";
public static final String UP_PHOTO = "/file/uploadMore?targetPath=test/sp/mobile/android/business/checkApply"; // public static final String UP_PHOTO = "/file/uploadMore?targetPath=test/sp/mobile/android/business/checkApply";
public static final String UP_VIDEO = "/file/uploadVideoOne?targetPath=dev/video"; // public static final String UP_VIDEO = "/file/uploadVideoOne?targetPath=dev/video";
public static final boolean IS_DEBUG = true; // public static final boolean IS_DEBUG = true;
public static final boolean CAN_CHANGE_ENV = true; //是否显示切换开发环境菜单 // public static final boolean CAN_CHANGE_ENV = true; //是否显示切换开发环境菜单
/** /**
* uat测试环境配置. * uat测试环境配置.
*/ */
// public static String ENVIROMENT = "uat"; public static String ENVIROMENT = "uat";
// public static int LOG_LEVEL = LogUtils.LEVEL_ALL; public static int LOG_LEVEL = LogUtils.LEVEL_ALL;
// public static String BASE_URL = "http://47.95.223.6:3112"; public static String BASE_URL = "http://47.95.223.6:3112";
// public static String WEB_SOP = "http://47.95.223.6:9004/#/sop"; public static String WEB_SOP = "http://47.95.223.6:9004/#/sop";
// public static String WEB_SOP_DETAIL = "http://47.95.223.6:9004/#/sopdetail"; public static String WEB_SOP_DETAIL = "http://47.95.223.6:9004/#/sopdetail";
// public static String WEB_ZHI_SHI = "http://47.95.223.6:9004/#/detail"; public static String WEB_ZHI_SHI = "http://47.95.223.6:9004/#/detail";
// public static String CHECK_MULTI_WEB_SOP = "http://47.95.223.6:9004/#/manyServiceResult"; public static String CHECK_MULTI_WEB_SOP = "http://47.95.223.6:9004/#/manyServiceResult";
// public static String MULTI_WEB_SOP = "http://47.95.223.6:9004/#/manySop"; public static String MULTI_WEB_SOP = "http://47.95.223.6:9004/#/manySop";
// public static final String UP_PHOTO = "/file/uploadMore?targetPath=test/sp/mobile/android/business/checkApply"; public static final String UP_PHOTO = "/file/uploadMore?targetPath=test/sp/mobile/android/business/checkApply";
// public static final String UP_VIDEO = "/file/uploadVideoOne?targetPath=test/video"; public static final String UP_VIDEO = "/file/uploadVideoOne?targetPath=test/video";
// public static final boolean IS_DEBUG = true; public static final boolean IS_DEBUG = true;
// public static final boolean CAN_CHANGE_ENV = false; //是否显示切换开发环境菜单 public static final boolean CAN_CHANGE_ENV = false; //是否显示切换开发环境菜单
/** /**
* 正式环境. * 正式环境.
......
...@@ -37,6 +37,16 @@ public class UserInfo { ...@@ -37,6 +37,16 @@ public class UserInfo {
private List<Integer> roles; private List<Integer> roles;
private String mobile; private String mobile;
private int liveStatus; //1.开启主播权限
public int getLiveStatus() {
return liveStatus;
}
public void setLiveStatus(int liveStatus) {
this.liveStatus = liveStatus;
}
//不为空时弹出邀请码弹框 //不为空时弹出邀请码弹框
private String newAccount; private String newAccount;
......
...@@ -5,10 +5,8 @@ import android.content.pm.PackageInfo; ...@@ -5,10 +5,8 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import com.alibaba.android.arouter.launcher.ARouter;
import com.dayu.baselibrary.R; import com.dayu.baselibrary.R;
import com.dayu.common.BaseApplication; import com.dayu.common.BaseApplication;
import com.dayu.common.BaseConstant;
import com.dayu.common.Constants; import com.dayu.common.Constants;
import com.hyphenate.chat.EMClient; import com.hyphenate.chat.EMClient;
......
...@@ -283,11 +283,10 @@ public class CommonUtils { ...@@ -283,11 +283,10 @@ public class CommonUtils {
UMWeb web = new UMWeb(url); UMWeb web = new UMWeb(url);
web.setTitle(title); web.setTitle(title);
if (TextUtils.isEmpty(imgUrl)) { if (TextUtils.isEmpty(imgUrl)) {
web.setThumb(new UMImage(activity, R.drawable.icon_app_logo)); web.setThumb(new UMImage(activity, Constants.AppLogoUrl));
} else { } else {
web.setThumb(new UMImage(activity, imgUrl)); web.setThumb(new UMImage(activity, imgUrl));
} }
web.setThumb(new UMImage(activity, imgUrl));
web.setDescription(description); web.setDescription(description);
new ShareAction(activity).withMedia(web) new ShareAction(activity).withMedia(web)
.setDisplayList(SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE) .setDisplayList(SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE)
......
...@@ -19,10 +19,10 @@ public class MediaChooseUtils { ...@@ -19,10 +19,10 @@ public class MediaChooseUtils {
public static void chooseSigleImg(Activity activity) { public static void chooseSigleImg(Activity activity) {
chooseMedia(activity,PictureMimeType.ofImage(),1,0); chooseMedia(activity,PictureMimeType.ofImage(),1,0);
} }
public static void chooseCropSigleImg(Activity activity) { public static void chooseLiveImg(Activity activity) {
PictureSelectionModel selector = getPictureSelectionModel(activity, PictureMimeType.ofImage(), 1, 0); PictureSelectionModel selector = getPictureSelectionModel(activity, PictureMimeType.ofImage(), 1, 0);
selector.enableCrop(true)//是否裁剪 selector.enableCrop(true)//是否裁剪
.withAspectRatio(1, 1) .withAspectRatio(3, 2)
.freeStyleCropEnabled(true); .freeStyleCropEnabled(true);
selector.forResult(PictureConfig.CHOOSE_REQUEST); selector.forResult(PictureConfig.CHOOSE_REQUEST);
} }
......
...@@ -2,7 +2,6 @@ package com.dayu.widgets; ...@@ -2,7 +2,6 @@ package com.dayu.widgets;
import android.content.Context; import android.content.Context;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log;
import com.dayu.baselibrary.R; import com.dayu.baselibrary.R;
import com.dayu.utils.ToastUtils; import com.dayu.utils.ToastUtils;
...@@ -13,6 +12,7 @@ public class MyJzvdStd extends JzvdStd { ...@@ -13,6 +12,7 @@ public class MyJzvdStd extends JzvdStd {
public int curProgress; public int curProgress;
public long curPosition; public long curPosition;
private PlayCallBack callBack; private PlayCallBack callBack;
private startPlayCallBack startPlayCallBack;
public MyJzvdStd(Context context) { public MyJzvdStd(Context context) {
super(context); super(context);
...@@ -34,6 +34,8 @@ public class MyJzvdStd extends JzvdStd { ...@@ -34,6 +34,8 @@ public class MyJzvdStd extends JzvdStd {
curPosition = 0; curPosition = 0;
if (callBack != null) if (callBack != null)
callBack.onstart(); callBack.onstart();
if (startPlayCallBack != null)
startPlayCallBack.onstart();
} }
//onState 代表了播放器引擎的回调,播放视频各个过程的状态的回调 //onState 代表了播放器引擎的回调,播放视频各个过程的状态的回调
...@@ -111,6 +113,9 @@ public class MyJzvdStd extends JzvdStd { ...@@ -111,6 +113,9 @@ public class MyJzvdStd extends JzvdStd {
public void setPlayCallBack(PlayCallBack callBack) { public void setPlayCallBack(PlayCallBack callBack) {
this.callBack = callBack; this.callBack = callBack;
} }
public void setStartCallBack(startPlayCallBack callBack) {
this.startPlayCallBack = callBack;
}
public interface PlayCallBack { public interface PlayCallBack {
void onstart(); void onstart();
...@@ -121,4 +126,7 @@ public class MyJzvdStd extends JzvdStd { ...@@ -121,4 +126,7 @@ public class MyJzvdStd extends JzvdStd {
void onComplete(); void onComplete();
} }
public interface startPlayCallBack {
void onstart();
}
} }
...@@ -995,9 +995,9 @@ C) 在甲方使用大鱼平台服务过程中产生的业务数据,客户数 ...@@ -995,9 +995,9 @@ C) 在甲方使用大鱼平台服务过程中产生的业务数据,客户数
<string name="find_course">查找课程</string> <string name="find_course">查找课程</string>
<array name="learn_top_tab_item"> <array name="learn_top_tab_item">
<item>公开课</item> <item>公开课</item>
<item>直播</item>
<item>已学习</item> <item>已学习</item>
<item>已发布</item> <item>已发布</item>
<item>直播</item>
</array> </array>
<string name="pub_course_title">我要开课</string> <string name="pub_course_title">我要开课</string>
<string name="course_theme">课程主题:</string> <string name="course_theme">课程主题:</string>
......
...@@ -5,8 +5,8 @@ buildscript { ...@@ -5,8 +5,8 @@ buildscript {
ext.build_tools_version = "27.0.3" ext.build_tools_version = "27.0.3"
ext.min_sdk_version = 17 ext.min_sdk_version = 17
ext.target_sdk_version = 26 ext.target_sdk_version = 26
ext.version_code = 255 ext.version_code = 257
ext.verson_name = "2.5.5" ext.verson_name = "2.5.7"
ext.gradle_version = '3.1.4' ext.gradle_version = '3.1.4'
ext.isReleaseMinify = false ext.isReleaseMinify = false
ext.isDebugMinify = false ext.isDebugMinify = false
......
...@@ -9,7 +9,7 @@ import com.dayu.common.Constants; ...@@ -9,7 +9,7 @@ import com.dayu.common.Constants;
import com.dayu.learncenter.api.bean.CommonLearnBean; import com.dayu.learncenter.api.bean.CommonLearnBean;
import com.dayu.learncenter.api.bean.CourseDeatilBean; import com.dayu.learncenter.api.bean.CourseDeatilBean;
import com.dayu.learncenter.api.bean.LearnTabBean; import com.dayu.learncenter.api.bean.LearnTabBean;
import com.dayu.learncenter.api.bean.LiveVideosBean; import com.dayu.learncenter.api.bean.LiveBackVideosBean;
import com.dayu.learncenter.api.data.EditCourseData; import com.dayu.learncenter.api.data.EditCourseData;
import com.dayu.learncenter.api.data.LiveData; import com.dayu.learncenter.api.data.LiveData;
import com.dayu.learncenter.api.data.PubCourseData; import com.dayu.learncenter.api.data.PubCourseData;
...@@ -105,13 +105,14 @@ public interface LearnService { ...@@ -105,13 +105,14 @@ public interface LearnService {
/** /**
* 课程 点赞/取消点赞 * 课程 点赞/取消点赞
*
* @param type 1点赞 2取消点赞 * @param type 1点赞 2取消点赞
* @return * @return
*/ */
@GET(Constants.API_7900 + "/courses/point/courseId/{courseId}/engineerId/{engineerId}/type/{type}") @GET(Constants.API_7900 + "/courses/point/courseId/{courseId}/engineerId/{engineerId}/type/{type}")
Observable<BaseResponse<Boolean>> pointCourse(@Path("courseId") int courseId, Observable<BaseResponse<Boolean>> pointCourse(@Path("courseId") int courseId,
@Path("engineerId") int engineerId, @Path("engineerId") int engineerId,
@Path("type") int type); @Path("type") int type);
/** /**
...@@ -129,6 +130,7 @@ public interface LearnService { ...@@ -129,6 +130,7 @@ public interface LearnService {
*/ */
@POST(Constants.API_7400 + "/leaveMessage/courses/engineer") @POST(Constants.API_7400 + "/leaveMessage/courses/engineer")
Observable<BaseResponse<Boolean>> addComment(@Body CommentPostData data); Observable<BaseResponse<Boolean>> addComment(@Body CommentPostData data);
/** /**
* 回复 * 回复
*/ */
...@@ -144,15 +146,34 @@ public interface LearnService { ...@@ -144,15 +146,34 @@ public interface LearnService {
/** /**
* 获取直播视频列表 * 获取直播视频列表
* @param liveStatus 1.直播中 2.已停止 *
* @param status 1.正常 2.删除 * @param liveStatus 1.直播中 2.已停止
* @param liveStreamType 1.主播 2.连麦 * @param status 1.正常 2.删除
* @param liveStreamType 1.主播 2.连麦
* @return * @return
*/ */
@GET(Constants.API_7900 + "/live") @GET(Constants.API_7900 + "/live/all")
Observable<BaseResponse<BasePageBean<LiveVideosBean>>> getLiveVideos(@Query("liveStatus") int liveStatus, Observable<BaseResponse<BasePageBean<LiveBackVideosBean>>> getLiveVideos(@Query("engineerId") int engineerId,
@Query("status") int status, @Query("liveStatus") int liveStatus,
@Query("liveStreamType") int liveStreamType, @Query("status") int status,
@Query("page") int page, @Query("liveStreamType") int liveStreamType,
@Query("pageSize") int pageSize); @Query("isNullVideUrl") int isNullVideUrl,
@Query("page") int page,
@Query("pageSize") int pageSize);
/**
* 回放视频点赞
*
* @param type 点赞:1 取消点赞:2
*/
@GET(Constants.API_7900 + "/live/point/liveId/{liveId}/engineerId/{engineerId}/type/{type}")
Observable<BaseResponse<Boolean>> pointBackVideo(@Path("liveId") int liveId,
@Path("engineerId") int engineerId,
@Path("type") int type);
/**
* 回放视频观看
*/
@GET(Constants.API_7900 + "/live/watcher/{liveId}")
Observable<BaseResponse<Boolean>> playBackVideo(@Path("liveId") int liveId);
} }
...@@ -11,6 +11,15 @@ public class LearnTabBean { ...@@ -11,6 +11,15 @@ public class LearnTabBean {
private int leaners; private int leaners;
private int publishes; private int publishes;
private int totalCourses; private int totalCourses;
private int lives;
public int getLives() {
return lives;
}
public void setLives(int lives) {
this.lives = lives;
}
public int getLeaners() { public int getLeaners() {
return leaners; return leaners;
......
package com.dayu.learncenter.api.bean; package com.dayu.learncenter.api.bean;
public class LiveVideosBean { import java.io.Serializable;
public class LiveBackVideosBean implements Serializable {
/** /**
* id : 33 * id : 33
...@@ -35,7 +37,7 @@ public class LiveVideosBean { ...@@ -35,7 +37,7 @@ public class LiveVideosBean {
private String endTime; private String endTime;
private String createTime; private String createTime;
private String created; private String created;
private Object watchNum; private int watchNum;
private int playBackNum; private int playBackNum;
private Object msgNum; private Object msgNum;
private int pointNum; private int pointNum;
...@@ -50,7 +52,16 @@ public class LiveVideosBean { ...@@ -50,7 +52,16 @@ public class LiveVideosBean {
private int status; private int status;
private int liveErrCode; private int liveErrCode;
private String liveErrMsg; private String liveErrMsg;
private Object liveStreamPic; private String liveStreamPic;
private int pointStatus;
public int getPointStatus() {
return pointStatus;
}
public void setPointStatus(int pointStatus) {
this.pointStatus = pointStatus;
}
public int getId() { public int getId() {
return id; return id;
...@@ -108,11 +119,11 @@ public class LiveVideosBean { ...@@ -108,11 +119,11 @@ public class LiveVideosBean {
this.created = created; this.created = created;
} }
public Object getWatchNum() { public int getWatchNum() {
return watchNum; return watchNum;
} }
public void setWatchNum(Object watchNum) { public void setWatchNum(int watchNum) {
this.watchNum = watchNum; this.watchNum = watchNum;
} }
...@@ -228,11 +239,11 @@ public class LiveVideosBean { ...@@ -228,11 +239,11 @@ public class LiveVideosBean {
this.liveErrMsg = liveErrMsg; this.liveErrMsg = liveErrMsg;
} }
public Object getLiveStreamPic() { public String getLiveStreamPic() {
return liveStreamPic; return liveStreamPic;
} }
public void setLiveStreamPic(Object liveStreamPic) { public void setLiveStreamPic(String liveStreamPic) {
this.liveStreamPic = liveStreamPic; this.liveStreamPic = liveStreamPic;
} }
} }
...@@ -3,6 +3,9 @@ package com.dayu.learncenter.api.data; ...@@ -3,6 +3,9 @@ package com.dayu.learncenter.api.data;
public class LiveData { public class LiveData {
public int liveStreamType; public int liveStreamType;
public String pushUrl; public String pushUrl;
public String title;
public String liveStreamPic;
public LiveData(int liveStreamType, String pushUrl) { public LiveData(int liveStreamType, String pushUrl) {
this.liveStreamType = liveStreamType; this.liveStreamType = liveStreamType;
......
package com.dayu.learncenter.ui.activity; package com.dayu.learncenter.ui.activity;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Intent;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
...@@ -25,6 +26,7 @@ import com.dayu.widgets.JZMediaIjk; ...@@ -25,6 +26,7 @@ import com.dayu.widgets.JZMediaIjk;
import com.dayu.widgets.KeyboardStateObserver; import com.dayu.widgets.KeyboardStateObserver;
import com.dayu.widgets.MyJzvdStd; import com.dayu.widgets.MyJzvdStd;
import com.umeng.analytics.MobclickAgent; import com.umeng.analytics.MobclickAgent;
import com.umeng.socialize.UMShareAPI;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -61,6 +63,7 @@ public class CourseDetailActivity extends BaseActivity<SImplePresenter, Activity ...@@ -61,6 +63,7 @@ public class CourseDetailActivity extends BaseActivity<SImplePresenter, Activity
initUser(); initUser();
mBind.titleBack.setOnClickListener(v -> dumpBack()); mBind.titleBack.setOnClickListener(v -> dumpBack());
mBind.ivLike.setOnClickListener(v -> pointVideo()); mBind.ivLike.setOnClickListener(v -> pointVideo());
mBind.ibShare.setOnClickListener(v -> shareVideo());
courseId = getBundle().getInt(Constants.ID, 0); courseId = getBundle().getInt(Constants.ID, 0);
showDialog(); showDialog();
initData(); initData();
...@@ -304,4 +307,17 @@ public class CourseDetailActivity extends BaseActivity<SImplePresenter, Activity ...@@ -304,4 +307,17 @@ public class CourseDetailActivity extends BaseActivity<SImplePresenter, Activity
super.onBackPressed(); super.onBackPressed();
} }
} }
public void shareVideo() {
if (courseDetail != null){
String url = Constants.VIDEO_SHARE_URL.replace("_type","course")+courseDetail.getId();
CommonUtils.shareWxUrl(mActivity,url,"",courseDetail.getName(),courseDetail.getBrief(),null);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
} }
...@@ -2,10 +2,8 @@ package com.dayu.learncenter.ui.activity; ...@@ -2,10 +2,8 @@ package com.dayu.learncenter.ui.activity;
import android.content.Intent; import android.content.Intent;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View;
import com.bumptech.glide.Glide; import com.alibaba.android.arouter.facade.annotation.Route;
import com.bumptech.glide.RequestManager;
import com.dayu.base.api.BaseApiFactory; import com.dayu.base.api.BaseApiFactory;
import com.dayu.base.ui.activity.BaseActivity; import com.dayu.base.ui.activity.BaseActivity;
import com.dayu.base.ui.presenter.SImplePresenter; import com.dayu.base.ui.presenter.SImplePresenter;
...@@ -14,6 +12,8 @@ import com.dayu.learncenter.databinding.ActivityPrepareLiveBinding; ...@@ -14,6 +12,8 @@ import com.dayu.learncenter.databinding.ActivityPrepareLiveBinding;
import com.dayu.livemodule.xiaozhibo.anchor.TCCameraAnchorActivity; import com.dayu.livemodule.xiaozhibo.anchor.TCCameraAnchorActivity;
import com.dayu.livemodule.xiaozhibo.common.utils.TCConstants; import com.dayu.livemodule.xiaozhibo.common.utils.TCConstants;
import com.dayu.livemodule.xiaozhibo.login.TCUserMgr; import com.dayu.livemodule.xiaozhibo.login.TCUserMgr;
import com.dayu.provider.router.RouterPath;
import com.dayu.utils.GlideImageLoader;
import com.dayu.utils.MediaChooseUtils; import com.dayu.utils.MediaChooseUtils;
import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureConfig;
...@@ -26,6 +26,7 @@ import okhttp3.MediaType; ...@@ -26,6 +26,7 @@ import okhttp3.MediaType;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
import okhttp3.RequestBody; import okhttp3.RequestBody;
@Route(path = RouterPath.PATH_PREPARELIVE)
public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityPrepareLiveBinding> { public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityPrepareLiveBinding> {
String title; String title;
...@@ -44,13 +45,15 @@ public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityP ...@@ -44,13 +45,15 @@ public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityP
public void initView() { public void initView() {
mBind.titleBack.setOnClickListener(view -> dumpBack()); mBind.titleBack.setOnClickListener(view -> dumpBack());
mBind.ivCover.setOnClickListener(view -> { mBind.ivCover.setOnClickListener(view -> {
MediaChooseUtils.chooseCropSigleImg(this); MediaChooseUtils.chooseLiveImg(this);
}); });
mBind.btnConfirm.setOnClickListener(v->{ mBind.btnConfirm.setOnClickListener(v->{
title = mBind.edtTitle.getText().toString().trim(); title = mBind.edtTitle.getText().toString().trim();
if (TextUtils.isEmpty(title)){ if (TextUtils.isEmpty(TCUserMgr.getInstance().getCoverPic())){
showToast("请上传封面");
}else if (TextUtils.isEmpty(title)){
showToast("请输入标题"); showToast("请输入标题");
}else { }else {
startPublish(); startPublish();
} }
}); });
...@@ -64,9 +67,8 @@ public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityP ...@@ -64,9 +67,8 @@ public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityP
private void initCover() { private void initCover() {
String strCover = TCUserMgr.getInstance().getCoverPic(); String strCover = TCUserMgr.getInstance().getCoverPic();
if (!TextUtils.isEmpty(strCover)) { if (!TextUtils.isEmpty(strCover)) {
RequestManager req = Glide.with(this); GlideImageLoader.load(this,mBind.ivCover,strCover,R.drawable.publish_background);
req.load(strCover).into(mBind.ivCover); // mBind.tvTips.setVisibility(View.GONE);
mBind.tvTips.setVisibility(View.GONE);
} else { } else {
mBind.ivCover.setImageResource(com.dayu.livemodule.R.drawable.publish_background); mBind.ivCover.setImageResource(com.dayu.livemodule.R.drawable.publish_background);
} }
...@@ -79,10 +81,10 @@ public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityP ...@@ -79,10 +81,10 @@ public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityP
switch (requestCode) { switch (requestCode) {
case PictureConfig.CHOOSE_REQUEST: case PictureConfig.CHOOSE_REQUEST:
List<LocalMedia> mSelectList = PictureSelector.obtainMultipleResult(data); List<LocalMedia> mSelectList = PictureSelector.obtainMultipleResult(data);
if (mSelectList != null) { if (mSelectList != null && mSelectList.size()>0) {
for (int a = 0; a < mSelectList.size(); a++) { uploadPic(mSelectList.get(0).getCutPath());
uploadPic(mSelectList.get(a).getCutPath()); // TCUserMgr.getInstance().setCoverPic(mSelectList.get(0).getCutPath(), null);
} // initCover();
} }
break; break;
} }
...@@ -95,7 +97,7 @@ public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityP ...@@ -95,7 +97,7 @@ public class PrepareLiveActivity extends BaseActivity<SImplePresenter, ActivityP
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("fileUpload", file.getName(), requestFile); MultipartBody.Part body = MultipartBody.Part.createFormData("fileUpload", file.getName(), requestFile);
showDialog(); showDialog();
BaseApiFactory.uploadPhoto(body).subscribe(mPresenter.baseObserver(list -> { BaseApiFactory.uploadPhoto(body,"nowatermark").subscribe(mPresenter.baseObserver(list -> {
if (list != null && list.size() > 0) { if (list != null && list.size() > 0) {
TCUserMgr.getInstance().setCoverPic(list.get(0), null); TCUserMgr.getInstance().setCoverPic(list.get(0), null);
initCover(); initCover();
......
package com.dayu.learncenter.ui.activity;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.widget.ImageView;
import com.dayu.base.ui.activity.BaseActivity;
import com.dayu.base.ui.presenter.SImplePresenter;
import com.dayu.learncenter.R;
import com.dayu.learncenter.api.bean.LiveBackVideosBean;
import com.dayu.learncenter.databinding.ActivityVideoPlayBinding;
import com.dayu.utils.GlideImageLoader;
import cn.jzvd.JzvdStd;
public class VideoPlayActivity extends BaseActivity<SImplePresenter, ActivityVideoPlayBinding> {
LiveBackVideosBean videoData;
@Override
public void setPresenter() {
}
public static void launch(Context context, LiveBackVideosBean videosBean) {
Intent intent = new Intent(context, VideoPlayActivity.class);
intent.putExtra("data", videosBean);
context.startActivity(intent);
}
@Override
public int getLayoutId() {
return R.layout.activity_video_play;
}
@Override
public void initView() {
if (getIntent().hasExtra("data"))
videoData = (LiveBackVideosBean) getIntent().getSerializableExtra("data");
mBind.jzVideo.fullscreenButton.setVisibility(View.GONE);
mBind.ivBack.setOnClickListener(v->dumpBack());
if (videoData != null) {
String videoUrl = videoData.getVideoUrl();
mBind.jzVideo.setUp(videoUrl, "");
mBind.jzVideo.thumbImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
GlideImageLoader.loadNoDeal(this, mBind.jzVideo.thumbImageView,
videoData.getLiveStreamPic(), R.drawable.icon_video_default);
mBind.jzVideo.startVideo();
}
}
@Override
public void onPause() {
super.onPause();
JzvdStd.goOnPlayOnPause();
}
}
...@@ -165,6 +165,7 @@ public class CommonLearnFragment extends BaseFragment<CommonLearnPresenter, Frag ...@@ -165,6 +165,7 @@ public class CommonLearnFragment extends BaseFragment<CommonLearnPresenter, Frag
@Override @Override
public void shareVideo(CommonLearnBean item) { public void shareVideo(CommonLearnBean item) {
CommonUtils.shareWxVideo(mActivity,item.getUrl(),"",item.getName(),item.getBrief(),null); String url = Constants.VIDEO_SHARE_URL.replace("_type","course")+item.getId();
CommonUtils.shareWxUrl(mActivity,url,"",item.getName(),item.getBrief(),null);
} }
} }
...@@ -4,6 +4,7 @@ import android.content.res.AssetManager; ...@@ -4,6 +4,7 @@ import android.content.res.AssetManager;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.support.design.widget.TabLayout; import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
...@@ -18,9 +19,9 @@ import com.dayu.learncenter.api.bean.LearnTabBean; ...@@ -18,9 +19,9 @@ import com.dayu.learncenter.api.bean.LearnTabBean;
import com.dayu.learncenter.api.data.LiveData; import com.dayu.learncenter.api.data.LiveData;
import com.dayu.learncenter.databinding.FragmentHomeLearnBinding; import com.dayu.learncenter.databinding.FragmentHomeLearnBinding;
import com.dayu.learncenter.event.RefreshLeanTabEvent; import com.dayu.learncenter.event.RefreshLeanTabEvent;
import com.dayu.learncenter.ui.activity.PrepareLiveActivity; import com.dayu.learncenter.ui.activity.PubCourseActivity;
import com.dayu.livemodule.StartPushEvent; import com.dayu.livemodule.event.StartPushEvent;
import com.dayu.livemodule.xiaozhibo.anchor.prepare.TCAnchorPrepareActivity; import com.dayu.livemodule.event.UserKickOutEvent;
import com.dayu.utils.TabLayoutUtils; import com.dayu.utils.TabLayoutUtils;
import com.dayu.utils.UIUtils; import com.dayu.utils.UIUtils;
import com.umeng.analytics.MobclickAgent; import com.umeng.analytics.MobclickAgent;
...@@ -28,6 +29,7 @@ import com.youth.banner.WeakHandler; ...@@ -28,6 +29,7 @@ import com.youth.banner.WeakHandler;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
import org.json.JSONObject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -57,8 +59,9 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom ...@@ -57,8 +59,9 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom
public void initView() { public void initView() {
initUser(); initUser();
tabDesc = UIUtils.getStrings(R.array.learn_top_tab_item); tabDesc = UIUtils.getStrings(R.array.learn_top_tab_item);
mBind.ivPubCourse.setOnClickListener(view -> startActivity(TCAnchorPrepareActivity.class)); // mBind.ivPubCourse.setOnClickListener(view -> startActivity(TCAnchorPrepareActivity.class));
mBind.ivPubCourse.setOnClickListener(view -> startActivity(PrepareLiveActivity.class)); mBind.ivPubCourse.setOnClickListener(view -> startActivity(PubCourseActivity.class));
// mBind.ivPubCourse.setOnClickListener(view -> startActivity(PrepareLiveActivity.class));
initTabPage(); initTabPage();
getTabData(); getTabData();
EventBus.getDefault().register(this); EventBus.getDefault().register(this);
...@@ -77,10 +80,10 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom ...@@ -77,10 +80,10 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom
private void initTabPage() { private void initTabPage() {
list_fragments = new ArrayList<>(); list_fragments = new ArrayList<>();
list_fragments.add(CommonLearnFragment.newInstance(1)); list_fragments.add(CommonLearnFragment.newInstance(1));
list_fragments.add(new LiveListFragment());
list_fragments.add(CommonLearnFragment.newInstance(2)); list_fragments.add(CommonLearnFragment.newInstance(2));
list_fragments.add(CommonLearnFragment.newInstance(3)); list_fragments.add(CommonLearnFragment.newInstance(3));
// list_fragments.add(new TCVideoListFragment()); // list_fragments.add(new TCVideoListFragment());
list_fragments.add(new LiveListFragment());
adapter = new FragmentAdapter(getFragmentManager(), list_fragments); adapter = new FragmentAdapter(getFragmentManager(), list_fragments);
mBind.vpLearn.setAdapter(adapter); mBind.vpLearn.setAdapter(adapter);
mBind.tabLearn.setupWithViewPager(mBind.vpLearn); mBind.tabLearn.setupWithViewPager(mBind.vpLearn);
...@@ -98,8 +101,13 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom ...@@ -98,8 +101,13 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom
} }
mTabNumTv = tab.getCustomView().findViewById(R.id.tabtext); mTabNumTv = tab.getCustomView().findViewById(R.id.tabtext);
mTabTextTv = tab.getCustomView().findViewById(R.id.tabicon); mTabTextTv = tab.getCustomView().findViewById(R.id.tabicon);
mTabNumTv.setTextColor(getResources().getColor(R.color.bg_button)); if (temp == 1){
mTabTextTv.setTextColor(getResources().getColor(R.color.bg_button)); mTabNumTv.setTextColor(getResources().getColor(R.color.common_red));
mTabTextTv.setTextColor(getResources().getColor(R.color.common_red));
}else{
mTabNumTv.setTextColor(getResources().getColor(R.color.bg_button));
mTabTextTv.setTextColor(getResources().getColor(R.color.bg_button));
}
mBind.vpLearn.setCurrentItem(temp); mBind.vpLearn.setCurrentItem(temp);
MobclickAgent.onPageStart("HomeLearnFragment" + temp); MobclickAgent.onPageStart("HomeLearnFragment" + temp);
} }
...@@ -127,16 +135,16 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom ...@@ -127,16 +135,16 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom
// EventBus.getDefault().post(new LearnTabNumEvent(1)); // EventBus.getDefault().post(new LearnTabNumEvent(1));
int[] tabNum; int[] tabNum;
if (tabBean != null) { if (tabBean != null) {
tabNum = new int[]{tabBean.getTotalCourses(), tabBean.getLeaners(), tabBean.getPublishes()}; tabNum = new int[]{tabBean.getTotalCourses(),tabBean.getLives(), tabBean.getLeaners(), tabBean.getPublishes()};
} else { } else {
tabNum = new int[]{0, 0, 0}; tabNum = new int[]{0, 0, 0,0};
} }
if (isFirstAddTab) { if (isFirstAddTab) {
mBind.tabLearn.removeAllTabs(); mBind.tabLearn.removeAllTabs();
mBind.tabLearn.addTab(mBind.tabLearn.newTab().setCustomView(CreatTab(0, tabNum[0], tabDesc[0]))); mBind.tabLearn.addTab(mBind.tabLearn.newTab().setCustomView(CreatTab(0, tabNum[0], tabDesc[0])));
mBind.tabLearn.addTab(mBind.tabLearn.newTab().setCustomView(CreatTab(1, tabNum[1], tabDesc[1]))); mBind.tabLearn.addTab(mBind.tabLearn.newTab().setCustomView(CreatTab(1, tabNum[1], tabDesc[1])));
mBind.tabLearn.addTab(mBind.tabLearn.newTab().setCustomView(CreatTab(2, tabNum[2], tabDesc[2]))); mBind.tabLearn.addTab(mBind.tabLearn.newTab().setCustomView(CreatTab(2, tabNum[2], tabDesc[2])));
mBind.tabLearn.addTab(mBind.tabLearn.newTab().setCustomView(CreatTab(3, 0, tabDesc[3]))); mBind.tabLearn.addTab(mBind.tabLearn.newTab().setCustomView(CreatTab(3, tabNum[3], tabDesc[3])));
isFirstAddTab = false; isFirstAddTab = false;
} else { } else {
for (int i = 0; i < mBind.tabLearn.getTabCount(); i++) { for (int i = 0; i < mBind.tabLearn.getTabCount(); i++) {
...@@ -175,6 +183,14 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom ...@@ -175,6 +183,14 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom
} }
@Subscribe @Subscribe
public void kickOutUser(UserKickOutEvent event) {
showLoginDialog();
// UserManager.getInstance().clearUserInfo();
// AppManager.getInstance().finishAllActivity();
// ARouter.getInstance().build(BaseConstant.PATH_LOGIN).navigation();
}
@Subscribe
public void startPush(StartPushEvent event) { public void startPush(StartPushEvent event) {
sendLiveData(event); sendLiveData(event);
weakHandler.postDelayed(() -> { weakHandler.postDelayed(() -> {
...@@ -186,6 +202,16 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom ...@@ -186,6 +202,16 @@ public class HomeLearnFragment extends BaseFragment<SImplePresenter, FragmentHom
private void sendLiveData(StartPushEvent event) { private void sendLiveData(StartPushEvent event) {
int type = event.isMain?1:2; int type = event.isMain?1:2;
LiveData liveData = new LiveData(type,event.pushUrl); LiveData liveData = new LiveData(type,event.pushUrl);
if (!TextUtils.isEmpty(event.roomInfo)){
try {
JSONObject jsonRoomInfo = new JSONObject(event.roomInfo);
liveData.title = jsonRoomInfo.optString("title");
liveData.liveStreamPic = jsonRoomInfo.optString("frontcover");
} catch (Exception e) {
e.printStackTrace();
}
}
Api.getService(LearnService.class).sendLiveData(liveData).compose(Api.applySchedulers()) Api.getService(LearnService.class).sendLiveData(liveData).compose(Api.applySchedulers())
.subscribe(mPresenter.baseObserver(result->{})); .subscribe(mPresenter.baseObserver(result->{}));
} }
......
...@@ -13,27 +13,29 @@ import com.dayu.base.ui.presenter.SImplePresenter; ...@@ -13,27 +13,29 @@ import com.dayu.base.ui.presenter.SImplePresenter;
import com.dayu.common.Constants; import com.dayu.common.Constants;
import com.dayu.learncenter.R; import com.dayu.learncenter.R;
import com.dayu.learncenter.api.LearnService; import com.dayu.learncenter.api.LearnService;
import com.dayu.learncenter.api.bean.LiveVideosBean; import com.dayu.learncenter.api.bean.LiveBackVideosBean;
import com.dayu.learncenter.databinding.FragmentLiveListBinding; import com.dayu.learncenter.databinding.FragmentLiveListBinding;
import com.dayu.learncenter.event.RefreshLeanTabEvent;
import com.dayu.learncenter.ui.activity.VideoPlayActivity;
import com.dayu.livemodule.event.LiveFinishEvent;
import com.dayu.livemodule.xiaozhibo.audience.TCAudienceActivity; import com.dayu.livemodule.xiaozhibo.audience.TCAudienceActivity;
import com.dayu.livemodule.xiaozhibo.common.utils.TCConstants; import com.dayu.livemodule.xiaozhibo.common.utils.TCConstants;
import com.dayu.livemodule.xiaozhibo.main.videolist.utils.TCVideoInfo; import com.dayu.livemodule.xiaozhibo.main.videolist.utils.TCVideoInfo;
import com.dayu.livemodule.xiaozhibo.main.videolist.utils.TCVideoListMgr; import com.dayu.livemodule.xiaozhibo.main.videolist.utils.TCVideoListMgr;
import com.dayu.utils.CommonUtils; import com.dayu.utils.CommonUtils;
import com.dayu.utils.GlideImageLoader; import com.dayu.utils.GlideImageLoader;
import com.dayu.widgets.JZMediaIjk;
import com.dayu.widgets.MyJzvdStd; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import cn.jzvd.JzvdStd;
public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLiveListBinding> { public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLiveListBinding> {
List<TCVideoInfo> liveList = new ArrayList<>(); List<TCVideoInfo> liveList = new ArrayList<>();
List<LiveVideosBean> playBackList = new ArrayList<>(); List<LiveBackVideosBean> playBackList = new ArrayList<>();
BaseQuickAdapter<LiveVideosBean, BaseViewHolder> playBackAdapter; BaseQuickAdapter<LiveBackVideosBean, BaseViewHolder> playBackAdapter;
int mPage = 1; int mPage = 1;
...@@ -49,15 +51,23 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive ...@@ -49,15 +51,23 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive
@Override @Override
public void initView() { public void initView() {
initUser();
mBind.rvLive.setNestedScrollingEnabled(false); mBind.rvLive.setNestedScrollingEnabled(false);
mBind.rvVideo.setNestedScrollingEnabled(false); mBind.rvVideo.setNestedScrollingEnabled(false);
mBind.rvVideo.setFocusable(false);
mBind.rvVideo.setFocusableInTouchMode(false);
mBind.rvLive.setFocusable(false);
mBind.rvLive.setFocusableInTouchMode(false);
mBind.refreshLayout.setOnRefreshListener(refreshLayout -> { mBind.refreshLayout.setOnRefreshListener(refreshLayout -> {
mPage =1; mPage = 1;
initData(); initData();
EventBus.getDefault().post(new RefreshLeanTabEvent());
}); });
mBind.refreshLayout.setOnLoadMoreListener(refreshLayout -> { mBind.refreshLayout.setOnLoadMoreListener(refreshLayout -> {
getPlayBackVideos(); getPlayBackVideos();
}); });
EventBus.getDefault().register(this);
} }
@Override @Override
...@@ -66,6 +76,12 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive ...@@ -66,6 +76,12 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive
initData(); initData();
} }
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
private void initData() { private void initData() {
getLiveList(); getLiveList();
getPlayBackVideos(); getPlayBackVideos();
...@@ -85,25 +101,6 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive ...@@ -85,25 +101,6 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive
}); });
} }
//回放列表
private void getPlayBackVideos() {
Api.getService(LearnService.class).getLiveVideos(2,1,1,mPage, Constants.PAGESIZE).compose(Api.applySchedulers())
.subscribe(mPresenter.baseObserver(data ->{
mBind.refreshLayout.finishRefresh();
mBind.refreshLayout.finishLoadMore();
if (mPage == 1) {
playBackList.clear();
}
playBackList.addAll(data.getData());
setPlaybackAdapter();
mBind.refreshLayout.setEnableLoadMore(mPage < data.getTotalPages());
mPage += 1;
}, responeThrowable -> {
mBind.refreshLayout.finishRefresh();
mBind.refreshLayout.finishLoadMore();
}));
}
private void setLiveAdapter() { private void setLiveAdapter() {
BaseQuickAdapter<TCVideoInfo, BaseViewHolder> liveAdapter = new BaseQuickAdapter BaseQuickAdapter<TCVideoInfo, BaseViewHolder> liveAdapter = new BaseQuickAdapter
<TCVideoInfo, BaseViewHolder>(R.layout.item_video_live, liveList) { <TCVideoInfo, BaseViewHolder>(R.layout.item_video_live, liveList) {
...@@ -139,20 +136,59 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive ...@@ -139,20 +136,59 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive
intent.putExtra(TCConstants.COVER_PIC, item.frontCover); intent.putExtra(TCConstants.COVER_PIC, item.frontCover);
intent.putExtra(TCConstants.TIMESTAMP, item.createTime); intent.putExtra(TCConstants.TIMESTAMP, item.createTime);
intent.putExtra(TCConstants.ROOM_TITLE, item.title); intent.putExtra(TCConstants.ROOM_TITLE, item.title);
intent.putExtra(TCConstants.ROOM_INFO, item.roomInfo);
mActivity.startActivity(intent); mActivity.startActivity(intent);
} }
//回放列表
private void getPlayBackVideos() {
Api.getService(LearnService.class).getLiveVideos(mUserId, 2, 1, 1,1, mPage, Constants.PAGESIZE).compose(Api.applySchedulers())
.subscribe(mPresenter.baseObserver(data -> {
mBind.refreshLayout.finishRefresh();
mBind.refreshLayout.finishLoadMore();
if (mPage == 1) {
playBackList.clear();
}
playBackList.addAll(data.getData());
setPlaybackAdapter();
mBind.refreshLayout.setEnableLoadMore(mPage < data.getTotalPages());
mPage += 1;
}, responeThrowable -> {
mBind.refreshLayout.finishRefresh();
mBind.refreshLayout.finishLoadMore();
}));
}
private void setPlaybackAdapter() { private void setPlaybackAdapter() {
if (playBackAdapter != null){ if (playBackAdapter != null) {
playBackAdapter.notifyDataSetChanged(); playBackAdapter.notifyDataSetChanged();
}else{ } else {
playBackAdapter = new BaseQuickAdapter<LiveVideosBean, BaseViewHolder>(R.layout.item_live_play_back, playBackList) { playBackAdapter = new BaseQuickAdapter<LiveBackVideosBean, BaseViewHolder>(R.layout.item_live_play_back, playBackList) {
@Override @Override
protected void convert(BaseViewHolder helper, LiveVideosBean item) { protected void convert(BaseViewHolder helper, LiveBackVideosBean item) {
ImageView ivLike = helper.getView(R.id.iv_like);
ivLike.setImageResource(item.getPointStatus() == 1 ? R.drawable.icon_like_red : R.drawable.icon_like_gray);
helper.setText(R.id.tv_title, item.getTitle()); helper.setText(R.id.tv_title, item.getTitle());
MyJzvdStd jzVideo = helper.getView(R.id.jz_video); helper.setText(R.id.tv_looks, item.getPlayBackNum() + "");
jzVideo.setUp(item.getVideoUrl(), "", JzvdStd.SCREEN_NORMAL, JZMediaIjk.class); helper.setText(R.id.tv_like, item.getPointNum() + "");
CommonUtils.setVideoThumb(mContext, jzVideo, item.getVideoUrl());
ivLike.setOnClickListener(v -> pointBackVideo(item));
helper.setOnClickListener(R.id.ib_share, v ->shareBackVideo(item));
ImageView ivCover = helper.getView(R.id.iv_cover);
GlideImageLoader.load(mActivity, ivCover, item.getLiveStreamPic(), R.drawable.icon_video_default);
ivCover.setOnClickListener(v->{
VideoPlayActivity.launch(mActivity,item);
playBackVideo(item.getId());
});
// MyJzvdStd jzVideo = helper.getView(R.id.jz_video);
// jzVideo.setUp(item.getVideoUrl(), "", JzvdStd.SCREEN_NORMAL, JZMediaIjk.class);
// CommonUtils.setVideoThumb(mContext, jzVideo, item.getVideoUrl());
// jzVideo.setStartCallBack(() ->{
// playBackVideo(item.getId());
//// showToast("play: "+jzVideo.curPosition);
// });
} }
}; };
mBind.rvVideo.setLayoutManager(new LinearLayoutManager(mActivity)); mBind.rvVideo.setLayoutManager(new LinearLayoutManager(mActivity));
...@@ -160,4 +196,37 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive ...@@ -160,4 +196,37 @@ public class LiveListFragment extends BaseFragment<SImplePresenter, FragmentLive
} }
} }
//回放视频点赞
private void pointBackVideo(LiveBackVideosBean item) {
int type = item.getPointStatus() == 1 ? 2 : 1;
showDialog();
Api.getService(LearnService.class).pointBackVideo(item.getId(), mUserId, type).compose(Api.applySchedulers())
.subscribe(mPresenter.baseObserver(success -> {
if (success) {
item.setPointStatus(type);
item.setPointNum(type == 1 ? item.getPointNum() + 1 : item.getPointNum() - 1);
setPlaybackAdapter();
} else {
showToast("操作失败");
}
}));
}
//观看回放视频
private void playBackVideo(int id) {
Api.getService(LearnService.class).playBackVideo(id).compose(Api.applySchedulers())
.subscribe(mPresenter.baseObserver(success -> {
}));
}
//分享回放视频
private void shareBackVideo(LiveBackVideosBean item) {
String url = Constants.VIDEO_SHARE_URL.replace("_type", "live") + item.getId();
CommonUtils.shareWxUrl(mActivity, url, item.getLiveStreamPic(), item.getTitle(), " ", null);
}
@Subscribe
public void liveEnd(LiveFinishEvent event){
initData();
}
} }
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
<activity android:name=".ui.activity.PrepareLiveActivity" <activity android:name=".ui.activity.PrepareLiveActivity"
android:screenOrientation="portrait" android:screenOrientation="portrait"
/> />
<activity android:name=".ui.activity.VideoPlayActivity"
android:screenOrientation="portrait"
/>
</application> </application>
</manifest> </manifest>
......
...@@ -143,6 +143,12 @@ ...@@ -143,6 +143,12 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:gravity="center" android:gravity="center"
android:text="0" /> android:text="0" />
<ImageButton
android:id="@+id/ib_share"
android:layout_width="40dp"
android:background="@color/transparent"
android:layout_height="match_parent"
android:src="@drawable/icon_share_gray" />
</LinearLayout> </LinearLayout>
......
...@@ -33,9 +33,11 @@ ...@@ -33,9 +33,11 @@
<ImageView <ImageView
android:id="@+id/iv_cover" android:id="@+id/iv_cover"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="250dp" android:layout_height="200dp"
android:onClick="onClick" android:onClick="onClick"
android:scaleType="fitXY" /> android:background="@color/black"
android:scaleType="centerCrop"
/>
<TextView <TextView
android:id="@+id/tv_tips" android:id="@+id/tv_tips"
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cl_bg"
>
<com.dayu.widgets.MyJzvdStd
android:id="@+id/jz_video"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/iv_back"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="5dp"
android:layout_marginTop="6dp"
android:scaleType="centerInside"
android:src="@drawable/jz_click_back_selector" />
</RelativeLayout>
</layout>
\ No newline at end of file
...@@ -17,10 +17,13 @@ ...@@ -17,10 +17,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="180dp"> android:layout_height="180dp">
<com.dayu.widgets.MyJzvdStd <ImageView
android:id="@+id/jz_video" android:id="@+id/iv_cover"
android:scaleType="centerCrop"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:background="@color/black"
/>
<RelativeLayout <RelativeLayout
android:id="@+id/rl_cover" android:id="@+id/rl_cover"
...@@ -28,17 +31,12 @@ ...@@ -28,17 +31,12 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/transparent"> android:background="@color/transparent">
<TextView <ImageView
android:id="@+id/tv_progress" android:layout_width="45dp"
style="@style/common_text_style" android:layout_height="45dp"
android:layout_centerHorizontal="true" android:src="@drawable/jz_play_normal"
android:layout_marginTop="15dp" android:layout_centerInParent="true"
android:padding="10dp" />
android:text="@string/learn_progress"
android:textColor="@color/text_common_blue"
android:textSize="20sp"
android:visibility="gone" />
<TextView <TextView
android:id="@+id/tv_disable" android:id="@+id/tv_disable"
......
...@@ -19,7 +19,8 @@ ...@@ -19,7 +19,8 @@
<ImageView <ImageView
android:id="@+id/iv_cover" android:id="@+id/iv_cover"
android:scaleType="fitXY" android:scaleType="centerCrop"
android:background="@color/black"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
......
package com.dayu.livemodule; package com.dayu.livemodule;
import android.content.Context; import android.content.Context;
import android.os.Bundle;
import com.dayu.livemodule.roomutil.commondef.AnchorInfo;
import com.dayu.livemodule.roomutil.commondef.AudienceInfo;
import com.dayu.livemodule.roomutil.commondef.MLVBCommonDef;
import com.dayu.livemodule.xiaozhibo.TCGlobalConfig; import com.dayu.livemodule.xiaozhibo.TCGlobalConfig;
import com.dayu.livemodule.xiaozhibo.common.net.TCHTTPMgr; import com.dayu.livemodule.xiaozhibo.common.net.TCHTTPMgr;
import com.dayu.livemodule.xiaozhibo.common.utils.TCUtils;
import com.dayu.livemodule.xiaozhibo.login.TCUserMgr; import com.dayu.livemodule.xiaozhibo.login.TCUserMgr;
import com.tencent.rtmp.TXLiveBase; import com.tencent.rtmp.TXLiveBase;
...@@ -19,6 +24,8 @@ public class LiveUtils { ...@@ -19,6 +24,8 @@ public class LiveUtils {
// 必须:初始化全局的 用户信息管理类,记录个人信息。 // 必须:初始化全局的 用户信息管理类,记录个人信息。
TCUserMgr.getInstance().initContext(context); TCUserMgr.getInstance().initContext(context);
initSingUserListener(context);
} }
...@@ -53,4 +60,96 @@ public class LiveUtils { ...@@ -53,4 +60,96 @@ public class LiveUtils {
} }
public static void initEnv(String enviroment) {
TCGlobalConfig.ENVIRONMENT = enviroment;
switch (enviroment){
case "debug":
TCGlobalConfig.pushURLPrefix = "rtmp://push.dev.kf.ai";
break;
case "uat":
TCGlobalConfig.pushURLPrefix = "rtmp://push.uat.kf.ai";
break;
case "release":
TCGlobalConfig.pushURLPrefix = "rtmp://push.kf.ai";
break;
}
}
private static void initSingUserListener(Context context){
MLVBLiveRoom.sharedInstance(context).setListener(new IMLVBLiveRoomListener() {
@Override
public void onError(int errCode, String errMsg, Bundle extraInfo) {
if (errCode == MLVBCommonDef.LiveRoomErrorCode.ERROR_IM_FORCE_OFFLINE) {
TCUtils.showKickOut(context);
}
}
@Override
public void onWarning(int warningCode, String warningMsg, Bundle extraInfo) {
}
@Override
public void onDebugLog(String log) {
}
@Override
public void onRoomDestroy(String roomID) {
}
@Override
public void onAnchorEnter(AnchorInfo anchorInfo) {
}
@Override
public void onAnchorExit(AnchorInfo anchorInfo) {
}
@Override
public void onAudienceEnter(AudienceInfo audienceInfo) {
}
@Override
public void onAudienceExit(AudienceInfo audienceInfo) {
}
@Override
public void onRequestJoinAnchor(AnchorInfo anchorInfo, String reason) {
}
@Override
public void onKickoutJoinAnchor() {
}
@Override
public void onRequestRoomPK(AnchorInfo anchorInfo) {
}
@Override
public void onQuitRoomPK(AnchorInfo anchorInfo) {
}
@Override
public void onRecvRoomTextMsg(String roomID, String userID, String userName, String userAvatar, String message) {
}
@Override
public void onRecvRoomCustomMsg(String roomID, String userID, String userName, String userAvatar, String cmd, String message) {
}
});
}
} }
...@@ -251,7 +251,7 @@ public abstract class MLVBLiveRoom { ...@@ -251,7 +251,7 @@ public abstract class MLVBLiveRoom {
* @param callback 进入连麦的结果回调 * @param callback 进入连麦的结果回调
* *
*/ */
public abstract void joinAnchor(final IMLVBLiveRoomListener.JoinAnchorCallback callback); public abstract void joinAnchor(String roomInfo,final IMLVBLiveRoomListener.JoinAnchorCallback callback);
/** /**
* 观众退出连麦 * 观众退出连麦
......
...@@ -13,6 +13,7 @@ import android.text.TextUtils; ...@@ -13,6 +13,7 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import com.dayu.livemodule.event.StartPushEvent;
import com.dayu.livemodule.roomutil.commondef.AnchorInfo; import com.dayu.livemodule.roomutil.commondef.AnchorInfo;
import com.dayu.livemodule.roomutil.commondef.AudienceInfo; import com.dayu.livemodule.roomutil.commondef.AudienceInfo;
import com.dayu.livemodule.roomutil.commondef.LoginInfo; import com.dayu.livemodule.roomutil.commondef.LoginInfo;
...@@ -21,6 +22,7 @@ import com.dayu.livemodule.roomutil.commondef.RoomInfo; ...@@ -21,6 +22,7 @@ import com.dayu.livemodule.roomutil.commondef.RoomInfo;
import com.dayu.livemodule.roomutil.http.HttpRequests; import com.dayu.livemodule.roomutil.http.HttpRequests;
import com.dayu.livemodule.roomutil.http.HttpResponse; import com.dayu.livemodule.roomutil.http.HttpResponse;
import com.dayu.livemodule.roomutil.im.IMMessageMgr; import com.dayu.livemodule.roomutil.im.IMMessageMgr;
import com.dayu.livemodule.xiaozhibo.TCGlobalConfig;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.tencent.imsdk.TIMUserProfile; import com.tencent.imsdk.TIMUserProfile;
...@@ -316,8 +318,8 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -316,8 +318,8 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
*/ */
@Override @Override
public void getAudienceList(final IMLVBLiveRoomListener.GetAudienceListCallback callback) { public void getAudienceList(final IMLVBLiveRoomListener.GetAudienceListCallback callback) {
TXCLog.i(TAG, "API -> getAudienceList"); TXCLog.i(TAG, "API -> getAudienceList " +mCurrRoomID);
if (mCurrRoomID == null || mCurrRoomID.length() > 0) { if (mCurrRoomID == null || mCurrRoomID.length() == 0) {
callbackOnThread(callback, "onError", MLVBCommonDef.LiveRoomErrorCode.ERROR_NOT_IN_ROOM, "[LiveRoom] getAudienceList 失败[房间号为空]"); callbackOnThread(callback, "onError", MLVBCommonDef.LiveRoomErrorCode.ERROR_NOT_IN_ROOM, "[LiveRoom] getAudienceList 失败[房间号为空]");
return; return;
} }
...@@ -338,17 +340,14 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -338,17 +340,14 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
@Override @Override
public void onSuccess(List<TIMUserProfile> timUserProfiles) { public void onSuccess(List<TIMUserProfile> timUserProfiles) {
final ArrayList<AudienceInfo> audienceList = new ArrayList<>();
for (TIMUserProfile userProfile : timUserProfiles) { for (TIMUserProfile userProfile : timUserProfiles) {
AudienceInfo audienceInfo = new AudienceInfo(); AudienceInfo audienceInfo = new AudienceInfo();
audienceInfo.userID = userProfile.getIdentifier(); audienceInfo.userID = userProfile.getIdentifier();
audienceInfo.userName = userProfile.getNickName(); audienceInfo.userName = userProfile.getNickName();
audienceInfo.userAvatar = userProfile.getFaceUrl(); audienceInfo.userAvatar = userProfile.getFaceUrl();
mAudiences.put(userProfile.getIdentifier(), audienceInfo); audienceList.add(audienceInfo);
}
final ArrayList<AudienceInfo> audienceList = new ArrayList<>();
for (Map.Entry<String, AudienceInfo> item : mAudiences.entrySet()) {
audienceList.add(item.getValue());
} }
callbackOnThread(callback, "onSuccess", audienceList); callbackOnThread(callback, "onSuccess", audienceList);
} }
...@@ -381,13 +380,13 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -381,13 +380,13 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
@Override @Override
public void onResponse(int retcode, String retmsg, HttpResponse.PushUrl data) { public void onResponse(int retcode, String retmsg, HttpResponse.PushUrl data) {
if (retcode == HttpResponse.CODE_OK && data != null && data.pushURL != null) { if (retcode == HttpResponse.CODE_OK && data != null && data.pushURL != null) {
final String pushURL = data.pushURL; // final String pushURL = data.pushURL;
// final String pushURL = ""; final String pushURL = TCGlobalConfig.pushURLPrefix +data.pushURL.substring(data.pushURL.indexOf("/live"),data.pushURL.length());
mSelfPushUrl = data.pushURL; mSelfPushUrl = pushURL;
mSelfAccelerateURL = data.accelerateURL; mSelfAccelerateURL = data.accelerateURL;
TXCLog.i(TAG, "API -> createRoom push url:" +pushURL); TXCLog.i(TAG, "API -> createRoom push url:" +pushURL);
TXCLog.i(TAG, "API -> createRoom push url2:" +mSelfAccelerateURL); TXCLog.i(TAG, "API -> createRoom push url2:" +data.pushURL);
//3.开始推流 //3.开始推流
startPushStream(pushURL, TXLiveConstants.VIDEO_QUALITY_HIGH_DEFINITION, new StandardCallback() { startPushStream(pushURL, TXLiveConstants.VIDEO_QUALITY_HIGH_DEFINITION, new StandardCallback() {
...@@ -409,7 +408,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -409,7 +408,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
mTXLivePusher.setConfig(config); mTXLivePusher.setConfig(config);
} }
EventBus.getDefault().post(new StartPushEvent(true,mSelfPushUrl)); EventBus.getDefault().post(new StartPushEvent(true,mSelfPushUrl,roomInfo));
mBackground = false; mBackground = false;
//4.推流成功,请求CGI:create_room,获取roomID、roomSig //4.推流成功,请求CGI:create_room,获取roomID、roomSig
String mRoomInfo = roomInfo; String mRoomInfo = roomInfo;
...@@ -522,6 +521,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -522,6 +521,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
int playType = getPlayType(mixedPlayUrl); int playType = getPlayType(mixedPlayUrl);
mTXLivePlayer.setPlayerView(view); mTXLivePlayer.setPlayerView(view);
mTXLivePlayer.startPlay(mixedPlayUrl, playType); mTXLivePlayer.startPlay(mixedPlayUrl, playType);
TXCLog.i(TAG, "startPlay "+mixedPlayUrl+" "+playType);
if (mHttpRequest != null) { if (mHttpRequest != null) {
String userInfo = ""; String userInfo = "";
...@@ -533,7 +533,12 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -533,7 +533,12 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
} catch (JSONException e) { } catch (JSONException e) {
userInfo = ""; userInfo = "";
} }
mHttpRequest.addAudience(roomID, mSelfAccountInfo.userID, userInfo, null); mHttpRequest.addAudience(roomID, mSelfAccountInfo.userID, userInfo, new HttpRequests.OnResponseCallback<HttpResponse>() {
@Override
public void onResponse(int retcode, @Nullable String retmsg, @Nullable HttpResponse data) {
TXCLog.i(TAG, "addAudience "+roomID+" "+retcode+" "+retmsg);
}
});
} }
callbackOnThread(callback, "onSuccess"); callbackOnThread(callback, "onSuccess");
} else { } else {
...@@ -873,7 +878,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -873,7 +878,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
* @param callback 进入连麦的结果回调 * @param callback 进入连麦的结果回调
*/ */
@Override @Override
public void joinAnchor(final IMLVBLiveRoomListener.JoinAnchorCallback callback) { public void joinAnchor(String roomInfo,final IMLVBLiveRoomListener.JoinAnchorCallback callback) {
TXCLog.i(TAG, "API -> joinAnchor"); TXCLog.i(TAG, "API -> joinAnchor");
if (mCurrRoomID == null || mCurrRoomID.length() == 0) { if (mCurrRoomID == null || mCurrRoomID.length() == 0) {
callbackOnThread(callback, "onError", MLVBCommonDef.LiveRoomErrorCode.ERROR_NOT_IN_ROOM, "[LiveRoom] 观众进入连麦失败[房间号为空,请确认是否已经进房]"); callbackOnThread(callback, "onError", MLVBCommonDef.LiveRoomErrorCode.ERROR_NOT_IN_ROOM, "[LiveRoom] 观众进入连麦失败[房间号为空,请确认是否已经进房]");
...@@ -904,11 +909,18 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -904,11 +909,18 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
@Override @Override
public void onResponse(int retcode, String retmsg, final HttpResponse.PushUrl data) { public void onResponse(int retcode, String retmsg, final HttpResponse.PushUrl data) {
if (retcode == HttpResponse.CODE_OK && data != null && data.pushURL != null) { if (retcode == HttpResponse.CODE_OK && data != null && data.pushURL != null) {
mSelfPushUrl = data.pushURL; // mSelfPushUrl = data.pushURL;
// mSelfAccelerateURL = data.accelerateURL;
final String pushURL = TCGlobalConfig.pushURLPrefix+data.pushURL.substring(data.pushURL.indexOf("/live"),data.pushURL.length());
mSelfPushUrl = pushURL;
mSelfAccelerateURL = data.accelerateURL; mSelfAccelerateURL = data.accelerateURL;
TXCLog.i(TAG, "API -> createRoom push join url:" +pushURL);
TXCLog.i(TAG, "API -> createRoom push join url2:" +data.pushURL+" "+roomInfo);
//5. 开始推流 //5. 开始推流
startPushStream(data.pushURL, TXLiveConstants.VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER, new StandardCallback() { startPushStream(pushURL, TXLiveConstants.VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER, new StandardCallback() {
@Override @Override
public void onError(final int code, final String info) { public void onError(final int code, final String info) {
callbackOnThread(callback, "onError", code, info); callbackOnThread(callback, "onError", code, info);
...@@ -917,7 +929,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -917,7 +929,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
@Override @Override
public void onSuccess() { public void onSuccess() {
mBackground = false; mBackground = false;
EventBus.getDefault().post(new StartPushEvent(false,mSelfPushUrl)); EventBus.getDefault().post(new StartPushEvent(false,mSelfPushUrl,roomInfo));
//6. 推流成功,请求CGI:add_pusher,把自己加入房间成员列表 //6. 推流成功,请求CGI:add_pusher,把自己加入房间成员列表
addAnchor(mCurrRoomID, data.pushURL, new StandardCallback() { addAnchor(mCurrRoomID, data.pushURL, new StandardCallback() {
@Override @Override
...@@ -2319,6 +2331,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart ...@@ -2319,6 +2331,7 @@ public class MLVBLiveRoomImpl extends MLVBLiveRoom implements HttpRequests.Heart
TXLivePushConfig config = new TXLivePushConfig(); TXLivePushConfig config = new TXLivePushConfig();
config.setFrontCamera(frontCamera); config.setFrontCamera(frontCamera);
config.enableScreenCaptureAutoRotate(mScreenAutoEnable);// 是否开启屏幕自适应 config.enableScreenCaptureAutoRotate(mScreenAutoEnable);// 是否开启屏幕自适应
// config.setHomeOrientation(TXLiveConstants.VIDEO_ANGLE_HOME_RIGHT); //横屏推流
config.setPauseFlag(TXLiveConstants.PAUSE_FLAG_PAUSE_VIDEO | TXLiveConstants.PAUSE_FLAG_PAUSE_AUDIO); config.setPauseFlag(TXLiveConstants.PAUSE_FLAG_PAUSE_VIDEO | TXLiveConstants.PAUSE_FLAG_PAUSE_AUDIO);
mTXLivePusher.setConfig(config); mTXLivePusher.setConfig(config);
mTXLivePusher.setBeautyFilter(TXLiveConstants.BEAUTY_STYLE_SMOOTH, 5, 3, 2); mTXLivePusher.setBeautyFilter(TXLiveConstants.BEAUTY_STYLE_SMOOTH, 5, 3, 2);
......
package com.dayu.livemodule.event;
//直播结束
public class LiveFinishEvent {
}
package com.dayu.livemodule; package com.dayu.livemodule.event;
public class StartPushEvent { public class StartPushEvent {
public boolean isMain; public boolean isMain;
public String pushUrl; public String pushUrl;
public String roomInfo; public String roomInfo;
public StartPushEvent(boolean isMain, String pushUrl) { public StartPushEvent(boolean isMain, String pushUrl, String roomInfo) {
this.isMain = isMain; this.isMain = isMain;
this.pushUrl = pushUrl; this.pushUrl = pushUrl;
this.roomInfo = roomInfo;
} }
} }
package com.dayu.livemodule.event;
//用户被顶替下线
public class UserKickOutEvent {
}
...@@ -2,9 +2,9 @@ package com.dayu.livemodule.xiaozhibo; ...@@ -2,9 +2,9 @@ package com.dayu.livemodule.xiaozhibo;
/** /**
* Module: TCGlobalConfig * Module: TCGlobalConfig
* * <p>
* Function: 小直播 的全局配置类 * Function: 小直播 的全局配置类
* * <p>
* 1. LiteAVSDK Licence * 1. LiteAVSDK Licence
* 2. 计算腾讯云 UserSig 的 SDKAppId、加密密钥、签名过期时间 * 2. 计算腾讯云 UserSig 的 SDKAppId、加密密钥、签名过期时间
* 3. 小直播后台服务器地址 * 3. 小直播后台服务器地址
...@@ -15,9 +15,25 @@ package com.dayu.livemodule.xiaozhibo; ...@@ -15,9 +15,25 @@ package com.dayu.livemodule.xiaozhibo;
public class TCGlobalConfig { public class TCGlobalConfig {
/** /**
* 1. LiteAVSDK Licence。 用于直播推流鉴权。 * 自定义推流域名
* */
* 获取License,请参考官网指引 https://cloud.tencent.com/document/product/454/34750
// public static String pushURLPrefix = "rtmp://push.dev.kf.ai"; //dev
// public static String ENVIRONMENT = "debug"; //dev
public static String pushURLPrefix = "rtmp://push.uat.kf.ai"; //uat
public static String ENVIRONMENT = "uat"; //dev
// public static String pushURLPrefix = "rtmp://push.kf.ai"; //release
// public static String ENVIRONMENT = "release"; //release
public static final String LIVE_ENVIRONMENT = "environment";
/**
* 1. LiteAVSDK Licence。 用于直播推流鉴权。
* <p>
* 获取License,请参考官网指引 https://cloud.tencent.com/document/product/454/34750
*/ */
public static final String LICENCE_URL = "http://license.vod2.myqcloud.com/license/v1/39b40793d12654ed50ea2609252b38ea/TXLiveSDK.licence"; public static final String LICENCE_URL = "http://license.vod2.myqcloud.com/license/v1/39b40793d12654ed50ea2609252b38ea/TXLiveSDK.licence";
public static final String LICENCE_KEY = "b89b0a2d023fd96d04b6888c39eb3e6b"; public static final String LICENCE_KEY = "b89b0a2d023fd96d04b6888c39eb3e6b";
...@@ -25,7 +41,7 @@ public class TCGlobalConfig { ...@@ -25,7 +41,7 @@ public class TCGlobalConfig {
/** /**
* 2.1 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。 * 2.1 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。
* * <p>
* 进入腾讯云直播[控制台-直播SDK-应用管理](https://console.cloud.tencent.com/live/license/appmanage) 创建应用,即可看到 SDKAppId, * 进入腾讯云直播[控制台-直播SDK-应用管理](https://console.cloud.tencent.com/live/license/appmanage) 创建应用,即可看到 SDKAppId,
* 它是腾讯云用于区分客户的唯一标识。 * 它是腾讯云用于区分客户的唯一标识。
*/ */
...@@ -33,12 +49,12 @@ public class TCGlobalConfig { ...@@ -33,12 +49,12 @@ public class TCGlobalConfig {
/** /**
* 2.2 计算签名用的加密密钥,获取步骤如下: * 2.2 计算签名用的加密密钥,获取步骤如下:
* * <p>
* step1. 进入腾讯云直播[控制台-直播SDK-应用管理](https://console.cloud.tencent.com/live/license/appmanage),如果还没有应用就创建一个, * step1. 进入腾讯云直播[控制台-直播SDK-应用管理](https://console.cloud.tencent.com/live/license/appmanage),如果还没有应用就创建一个,
* step2. 单击您的应用,进入"应用管理"页面。 * step2. 单击您的应用,进入"应用管理"页面。
* step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中。 * step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中。
* 如果提示"请先添加管理员才能生成公私钥",点击"编辑",输入管理员名称,如"admin",点"确定"添加管理员。然后再查看密钥。 * 如果提示"请先添加管理员才能生成公私钥",点击"编辑",输入管理员名称,如"admin",点"确定"添加管理员。然后再查看密钥。
* * <p>
* 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。 * 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
* 文档:https://cloud.tencent.com/document/product/647/17275#Server * 文档:https://cloud.tencent.com/document/product/647/17275#Server
*/ */
...@@ -55,37 +71,37 @@ public class TCGlobalConfig { ...@@ -55,37 +71,37 @@ public class TCGlobalConfig {
/** /**
* 3. 小直播后台服务器地址 * 3. 小直播后台服务器地址
* * <p>
* 3.1 您可以不填写后台服务器地址: * 3.1 您可以不填写后台服务器地址:
* 小直播 App 单靠客户端源码运行,方便快速跑通体验小直播。 * 小直播 App 单靠客户端源码运行,方便快速跑通体验小直播。
* 不过在这种模式下运行的“小直播”,没有注册登录、回放列表等功能,仅有基本的直播推拉流、聊天室、连麦等功能。 * 不过在这种模式下运行的“小直播”,没有注册登录、回放列表等功能,仅有基本的直播推拉流、聊天室、连麦等功能。
* 另外在这种模式下,腾讯云安全签名 UserSig 是使用本地 GenerateTestUserSig 模块计算的,存在 SECRETKEY 被破解的导致腾讯云流量被盗用的风险。 * 另外在这种模式下,腾讯云安全签名 UserSig 是使用本地 GenerateTestUserSig 模块计算的,存在 SECRETKEY 被破解的导致腾讯云流量被盗用的风险。
* * <p>
* 3.2 您可以填写后台服务器地址: * 3.2 您可以填写后台服务器地址:
* 服务器需要您参考文档 https://cloud.tencent.com/document/product/454/15187 自行搭建。 * 服务器需要您参考文档 https://cloud.tencent.com/document/product/454/15187 自行搭建。
* 服务器提供注册登录、回放列表、计算 UserSig 等服务。 * 服务器提供注册登录、回放列表、计算 UserSig 等服务。
* 这种情况下 {@link #SDKAPPID} 和 {@link #SECRETKEY} 可以设置为任意值。 * 这种情况下 {@link #SDKAPPID} 和 {@link #SECRETKEY} 可以设置为任意值。
* * <p>
* 注意: * 注意:
* 后台服务器地址(APP_SVR_URL)和 (SDKAPPID,SECRETKEY)一定要填一项。 * 后台服务器地址(APP_SVR_URL)和 (SDKAPPID,SECRETKEY)一定要填一项。
* 要么填写后台服务器地址(@link #APP_SVR_URL),要么填写 {@link #SDKAPPID} 和 {@link #SECRETKEY}。 * 要么填写后台服务器地址(@link #APP_SVR_URL),要么填写 {@link #SDKAPPID} 和 {@link #SECRETKEY}。
* * <p>
* 详情请参考: * 详情请参考:
*/ */
public static final String APP_SVR_URL = ""; public static final String APP_SVR_URL = "";
/** /**
* 4. App 主色调。 * 4. App 主色调。
*/ */
public static final int MAIN_COLOR = 0xff222B48; public static final int MAIN_COLOR = 0xff222B48;
/** /**
* 5. 是否启用连麦。 * 5. 是否启用连麦。
* * <p>
* 由于连麦功能使用了比较昂贵的 BGP 专用线路,所以是按照通话时长进行收费的。最初级的体验包包含 3000 分钟的连麦时长,只需要 9.8 元。 * 由于连麦功能使用了比较昂贵的 BGP 专用线路,所以是按照通话时长进行收费的。最初级的体验包包含 3000 分钟的连麦时长,只需要 9.8 元。
* 购买链接:https://buy.cloud.tencent.com/mobilelive?urlctr=yes&micconn=3000m## * 购买链接:https://buy.cloud.tencent.com/mobilelive?urlctr=yes&micconn=3000m##
*/ */
public static final boolean ENABLE_LINKMIC = true; public static final boolean ENABLE_LINKMIC = true;
......
...@@ -47,7 +47,6 @@ import org.json.JSONObject; ...@@ -47,7 +47,6 @@ import org.json.JSONObject;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Locale;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
...@@ -233,6 +232,7 @@ public class TCBaseAnchorActivity extends Activity implements IMLVBLiveRoomListe ...@@ -233,6 +232,7 @@ public class TCBaseAnchorActivity extends Activity implements IMLVBLiveRoomListe
.put("title", mTitle) .put("title", mTitle)
.put("frontcover", mCoverPicUrl) .put("frontcover", mCoverPicUrl)
.put("location", mLocation) .put("location", mLocation)
.put(TCGlobalConfig.LIVE_ENVIRONMENT, TCGlobalConfig.ENVIRONMENT)
.toString(); .toString();
} catch (JSONException e) { } catch (JSONException e) {
roomInfo = mTitle; roomInfo = mTitle;
...@@ -374,6 +374,7 @@ public class TCBaseAnchorActivity extends Activity implements IMLVBLiveRoomListe ...@@ -374,6 +374,7 @@ public class TCBaseAnchorActivity extends Activity implements IMLVBLiveRoomListe
@Override @Override
public void onError(int errorCode, String errorMessage, Bundle extraInfo) { public void onError(int errorCode, String errorMessage, Bundle extraInfo) {
if (errorCode == MLVBCommonDef.LiveRoomErrorCode.ERROR_IM_FORCE_OFFLINE) { if (errorCode == MLVBCommonDef.LiveRoomErrorCode.ERROR_IM_FORCE_OFFLINE) {
finish();
TCUtils.showKickOut(TCBaseAnchorActivity.this); TCUtils.showKickOut(TCBaseAnchorActivity.this);
} else { } else {
showErrorAndQuit(errorCode, errorMessage); showErrorAndQuit(errorCode, errorMessage);
...@@ -590,18 +591,20 @@ public class TCBaseAnchorActivity extends Activity implements IMLVBLiveRoomListe ...@@ -590,18 +591,20 @@ public class TCBaseAnchorActivity extends Activity implements IMLVBLiveRoomListe
* 如:观看数量、点赞数量、直播时长数 * 如:观看数量、点赞数量、直播时长数
*/ */
protected void showPublishFinishDetailsDialog() { protected void showPublishFinishDetailsDialog() {
//确认则显示观看detail finish();
FinishDetailDialogFragment dialogFragment = new FinishDetailDialogFragment();
Bundle args = new Bundle(); // //确认则显示观看detail
args.putString("time", TCUtils.formattedTime(mSecond)); // FinishDetailDialogFragment dialogFragment = new FinishDetailDialogFragment();
args.putString("heartCount", String.format(Locale.CHINA, "%d", mHeartCount)); // Bundle args = new Bundle();
args.putString("totalMemberCount", String.format(Locale.CHINA, "%d", mTotalMemberCount)); // args.putString("time", TCUtils.formattedTime(mSecond));
dialogFragment.setArguments(args); // args.putString("heartCount", String.format(Locale.CHINA, "%d", mHeartCount));
dialogFragment.setCancelable(false); // args.putString("totalMemberCount", String.format(Locale.CHINA, "%d", mTotalMemberCount));
if (dialogFragment.isAdded()) // dialogFragment.setArguments(args);
dialogFragment.dismiss(); // dialogFragment.setCancelable(false);
else // if (dialogFragment.isAdded())
dialogFragment.show(getFragmentManager(), ""); // dialogFragment.dismiss();
// else
// dialogFragment.show(getFragmentManager(), "");
} }
/** /**
......
...@@ -233,19 +233,21 @@ public class TCAudioControl extends LinearLayout implements SeekBar.OnSeekBarCha ...@@ -233,19 +233,21 @@ public class TCAudioControl extends LinearLayout implements SeekBar.OnSeekBarCha
} }
if (R.id.btn_stop_bgm != v.getId() && v.getId() != mLastReverbIndex && if (R.id.btn_stop_bgm != v.getId()&&
(v.getId() == R.id.btn_reverb_default || v.getId() == R.id.btn_reverb_1 || (v.getId() == R.id.btn_reverb_default || v.getId() == R.id.btn_reverb_1 ||
v.getId() == R.id.btn_reverb_2 || v.getId() == R.id.btn_reverb_3 || v.getId() == R.id.btn_reverb_2 || v.getId() == R.id.btn_reverb_3 ||
v.getId() == R.id.btn_reverb_4 || v.getId() == R.id.btn_reverb_5 || v.getId() == R.id.btn_reverb_4 || v.getId() == R.id.btn_reverb_5 ||
v.getId() == R.id.btn_reverb_6)) { // 混响 v.getId() == R.id.btn_reverb_6)) { // 混响
v.setBackgroundDrawable( getResources().getDrawable(R.drawable.round_button_3)); if (v.getId() != mLastReverbIndex){
v.setBackgroundDrawable( getResources().getDrawable(R.drawable.round_button_3));
View lastV = findViewById(mLastReverbIndex); View lastV = findViewById(mLastReverbIndex);
if (null != lastV) { if (null != lastV) {
lastV.setBackgroundDrawable( getResources().getDrawable(R.drawable.round_button_2)); lastV.setBackgroundDrawable( getResources().getDrawable(R.drawable.round_button_2));
} }
mLastReverbIndex = v.getId(); mLastReverbIndex = v.getId();
}
} else if (R.id.btn_stop_bgm != v.getId() && v.getId() != mLastVoiceChangerIndex) { // 变声 } else if (R.id.btn_stop_bgm != v.getId() && v.getId() != mLastVoiceChangerIndex) { // 变声
v.setBackgroundDrawable( getResources().getDrawable(R.drawable.round_button_3)); v.setBackgroundDrawable( getResources().getDrawable(R.drawable.round_button_3));
......
...@@ -28,6 +28,7 @@ import android.widget.Toast; ...@@ -28,6 +28,7 @@ import android.widget.Toast;
import com.dayu.livemodule.IMLVBLiveRoomListener; import com.dayu.livemodule.IMLVBLiveRoomListener;
import com.dayu.livemodule.MLVBLiveRoom; import com.dayu.livemodule.MLVBLiveRoom;
import com.dayu.livemodule.R; import com.dayu.livemodule.R;
import com.dayu.livemodule.event.LiveFinishEvent;
import com.dayu.livemodule.roomutil.commondef.AnchorInfo; import com.dayu.livemodule.roomutil.commondef.AnchorInfo;
import com.dayu.livemodule.roomutil.commondef.AudienceInfo; import com.dayu.livemodule.roomutil.commondef.AudienceInfo;
import com.dayu.livemodule.roomutil.commondef.MLVBCommonDef; import com.dayu.livemodule.roomutil.commondef.MLVBCommonDef;
...@@ -49,12 +50,15 @@ import com.dayu.livemodule.xiaozhibo.common.widget.video.TCVideoView; ...@@ -49,12 +50,15 @@ import com.dayu.livemodule.xiaozhibo.common.widget.video.TCVideoView;
import com.dayu.livemodule.xiaozhibo.common.widget.video.TCVideoViewMgr; import com.dayu.livemodule.xiaozhibo.common.widget.video.TCVideoViewMgr;
import com.dayu.livemodule.xiaozhibo.login.TCUserMgr; import com.dayu.livemodule.xiaozhibo.login.TCUserMgr;
import com.dayu.livemodule.xiaozhibo.main.videolist.ui.TCVideoListFragment; import com.dayu.livemodule.xiaozhibo.main.videolist.ui.TCVideoListFragment;
import com.tencent.liteav.basic.log.TXCLog;
import com.tencent.liteav.demo.beauty.BeautyPanel; import com.tencent.liteav.demo.beauty.BeautyPanel;
import com.tencent.liteav.demo.beauty.BeautyParams; import com.tencent.liteav.demo.beauty.BeautyParams;
import com.tencent.rtmp.TXLiveConstants; import com.tencent.rtmp.TXLiveConstants;
import com.tencent.rtmp.TXLog; import com.tencent.rtmp.TXLog;
import com.tencent.rtmp.ui.TXCloudVideoView; import com.tencent.rtmp.ui.TXCloudVideoView;
import org.greenrobot.eventbus.EventBus;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
...@@ -138,6 +142,7 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene ...@@ -138,6 +142,7 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene
//分享相关 //分享相关
private String mCoverUrl = ""; private String mCoverUrl = "";
private String mTitle = ""; //标题 private String mTitle = ""; //标题
private String mRoomInfo = "";
//log相关 //log相关
private boolean mShowLog; private boolean mShowLog;
...@@ -178,6 +183,7 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene ...@@ -178,6 +183,7 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene
mFileId = intent.getStringExtra(TCConstants.FILE_ID); mFileId = intent.getStringExtra(TCConstants.FILE_ID);
mTimeStamp = intent.getStringExtra(TCConstants.TIMESTAMP); mTimeStamp = intent.getStringExtra(TCConstants.TIMESTAMP);
mTitle = intent.getStringExtra(TCConstants.ROOM_TITLE); mTitle = intent.getStringExtra(TCConstants.ROOM_TITLE);
mRoomInfo = intent.getStringExtra(TCConstants.ROOM_INFO);
mUserId = TCUserMgr.getInstance().getUserId(); mUserId = TCUserMgr.getInstance().getUserId();
mNickname = TCUserMgr.getInstance().getNickname(); mNickname = TCUserMgr.getInstance().getNickname();
mAvatar = TCUserMgr.getInstance().getAvatar(); mAvatar = TCUserMgr.getInstance().getAvatar();
...@@ -355,14 +361,46 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene ...@@ -355,14 +361,46 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene
mLiveRoom.enterRoom(mGroupId, mTXCloudVideoView, new IMLVBLiveRoomListener.EnterRoomCallback() { mLiveRoom.enterRoom(mGroupId, mTXCloudVideoView, new IMLVBLiveRoomListener.EnterRoomCallback() {
@Override @Override
public void onError(int errCode, String errInfo) { public void onError(int errCode, String errInfo) {
showErrorAndQuit("加入房间失败,Error:" + errCode); if (errCode == 10010){
showErrorAndQuit("直播已结束");
EventBus.getDefault().post(new LiveFinishEvent());
}else {
showErrorAndQuit("加入房间失败,Error:" + errCode);
}
TCELKReportMgr.getInstance().reportELK(TCConstants.ELK_ACTION_LIVE_PLAY, TCUserMgr.getInstance().getUserId(), -10001, "进入LiveRoom失败", null); TCELKReportMgr.getInstance().reportELK(TCConstants.ELK_ACTION_LIVE_PLAY, TCUserMgr.getInstance().getUserId(), -10001, "进入LiveRoom失败", null);
} }
@Override @Override
public void onSuccess() { public void onSuccess() {
TXCLog.i(TAG, "startPlay successs ");
mBgImageView.setVisibility(View.GONE); mBgImageView.setVisibility(View.GONE);
mLiveRoom.sendRoomCustomMsg(String.valueOf(TCConstants.IMCMD_ENTER_LIVE), "", null); mLiveRoom.sendRoomCustomMsg(String.valueOf(TCConstants.IMCMD_ENTER_LIVE), "", null);
mLiveRoom.getAudienceList(new GetAudienceListCallback() {
@Override
public void onError(int errCode, String errInfo) {
TXCLog.i(TAG, "startPlay error "+errCode+" "+errInfo);
}
@Override
public void onSuccess(ArrayList<AudienceInfo> audienceInfoList) {
if (audienceInfoList != null && mAvatarListAdapter != null){
int addedCount = 0;
for (AudienceInfo audience :audienceInfoList){
TCSimpleUserInfo userInfo = new TCSimpleUserInfo(audience.userID,audience.userName,audience.userAvatar);
if (mAvatarListAdapter.addItem(userInfo)){
if (addedCount != 0){
mCurrentAudienceCount++;
mMemberCount.setText(String.format(Locale.CHINA,"%d", mCurrentAudienceCount));
}
addedCount+=1;
}
}
}
}
});
TCELKReportMgr.getInstance().reportELK(TCConstants.ELK_ACTION_LIVE_PLAY, TCUserMgr.getInstance().getUserId(), 10000, "进入LiveRoom成功", null); TCELKReportMgr.getInstance().reportELK(TCConstants.ELK_ACTION_LIVE_PLAY, TCUserMgr.getInstance().getUserId(), 10000, "进入LiveRoom成功", null);
} }
}); });
...@@ -462,7 +500,7 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene ...@@ -462,7 +500,7 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene
mLiveRoom.getBeautyManager().setWhitenessLevel(beautyParams.mWhiteLevel); mLiveRoom.getBeautyManager().setWhitenessLevel(beautyParams.mWhiteLevel);
mLiveRoom.getBeautyManager().setRuddyLevel(beautyParams.mRuddyLevel); mLiveRoom.getBeautyManager().setRuddyLevel(beautyParams.mRuddyLevel);
mLiveRoom.joinAnchor(new IMLVBLiveRoomListener.JoinAnchorCallback() { mLiveRoom.joinAnchor(mRoomInfo,new IMLVBLiveRoomListener.JoinAnchorCallback() {
@Override @Override
public void onError(int errCode, String errInfo) { public void onError(int errCode, String errInfo) {
stopLinkMic(); stopLinkMic();
...@@ -669,11 +707,13 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene ...@@ -669,11 +707,13 @@ public class TCAudienceActivity extends Activity implements IMLVBLiveRoomListene
public void onRoomDestroy(String roomID) { public void onRoomDestroy(String roomID) {
stopLinkMic(); stopLinkMic();
showErrorAndQuit("直播已结束"); showErrorAndQuit("直播已结束");
EventBus.getDefault().post(new LiveFinishEvent());
} }
@Override @Override
public void onError(int errorCode, String errorMessage, Bundle extraInfo) { public void onError(int errorCode, String errorMessage, Bundle extraInfo) {
if (errorCode == MLVBCommonDef.LiveRoomErrorCode.ERROR_IM_FORCE_OFFLINE) { // IM 被强制下线。 if (errorCode == MLVBCommonDef.LiveRoomErrorCode.ERROR_IM_FORCE_OFFLINE) { // IM 被强制下线。
finish();
TCUtils.showKickOut(TCAudienceActivity.this); TCUtils.showKickOut(TCAudienceActivity.this);
} else { } else {
showErrorAndQuit("视频流播放失败,Error:"); showErrorAndQuit("视频流播放失败,Error:");
......
...@@ -37,6 +37,7 @@ public class TCConstants { ...@@ -37,6 +37,7 @@ public class TCConstants {
public static final int WRITE_PERMISSION_REQ_CODE = 2; public static final int WRITE_PERMISSION_REQ_CODE = 2;
public static final int CAMERA_PERMISSION_REQ_CODE = 3; public static final int CAMERA_PERMISSION_REQ_CODE = 3;
public static final String ROOM_INFO = "room_info";
public static final String ROOM_TITLE = "room_title"; public static final String ROOM_TITLE = "room_title";
public static final String COVER_PIC = "cover_pic"; public static final String COVER_PIC = "cover_pic";
public static final String GROUP_ID = "group_id"; public static final String GROUP_ID = "group_id";
......
...@@ -38,7 +38,6 @@ import android.support.v4.content.PermissionChecker; ...@@ -38,7 +38,6 @@ import android.support.v4.content.PermissionChecker;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.TypedValue; import android.util.TypedValue;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Toast;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager; import com.bumptech.glide.RequestManager;
...@@ -46,9 +45,11 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; ...@@ -46,9 +45,11 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.dayu.livemodule.R; import com.dayu.livemodule.R;
import com.dayu.livemodule.xiaozhibo.login.TCLoginActivity; import com.dayu.livemodule.event.UserKickOutEvent;
import com.dayu.livemodule.xiaozhibo.login.TCUserMgr; import com.dayu.livemodule.xiaozhibo.login.TCUserMgr;
import org.greenrobot.eventbus.EventBus;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
...@@ -503,11 +504,12 @@ public class TCUtils { ...@@ -503,11 +504,12 @@ public class TCUtils {
* @param context activity * @param context activity
*/ */
public static void showKickOut(final Context context) { public static void showKickOut(final Context context) {
Toast.makeText(context, "您的账号已在其他地方登录,您被迫下线。", Toast.LENGTH_SHORT).show(); // Toast.makeText(context, "您的账号已在其他地方登录,您被迫下线。", Toast.LENGTH_SHORT).show();
TCUserMgr.getInstance().logout(); TCUserMgr.getInstance().logout();
Intent intent = new Intent(context, TCLoginActivity.class); EventBus.getDefault().post(new UserKickOutEvent());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Intent intent = new Intent(context, TCLoginActivity.class);
context.startActivity(intent); // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
// context.startActivity(intent);
} }
/** /**
......
...@@ -69,7 +69,7 @@ public class TCInputTextMsgDialog extends Dialog { ...@@ -69,7 +69,7 @@ public class TCInputTextMsgDialog extends Dialog {
messageTextView.setText(""); messageTextView.setText("");
dismiss(); dismiss();
} else { } else {
Toast.makeText(mContext, "input can not be empty!", Toast.LENGTH_LONG).show(); Toast.makeText(mContext, "请输入内容!", Toast.LENGTH_LONG).show();
} }
messageTextView.setText(null); messageTextView.setText(null);
} }
...@@ -115,7 +115,7 @@ public class TCInputTextMsgDialog extends Dialog { ...@@ -115,7 +115,7 @@ public class TCInputTextMsgDialog extends Dialog {
// messageTextView.setText(""); // messageTextView.setText("");
dismiss(); dismiss();
} else { } else {
Toast.makeText(mContext, "input can not be empty!", Toast.LENGTH_LONG).show(); Toast.makeText(mContext, "请输入内容!", Toast.LENGTH_LONG).show();
} }
return true; return true;
case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_BACK:
...@@ -140,7 +140,7 @@ public class TCInputTextMsgDialog extends Dialog { ...@@ -140,7 +140,7 @@ public class TCInputTextMsgDialog extends Dialog {
messageTextView.setText(""); messageTextView.setText("");
dismiss(); dismiss();
} else { } else {
Toast.makeText(mContext, "input can not be empty!", Toast.LENGTH_LONG).show(); Toast.makeText(mContext, "请输入内容!", Toast.LENGTH_LONG).show();
} }
messageTextView.setText(null); messageTextView.setText(null);
} }
......
...@@ -6,7 +6,6 @@ import android.view.LayoutInflater; ...@@ -6,7 +6,6 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Toast;
import com.dayu.livemodule.R; import com.dayu.livemodule.R;
import com.dayu.livemodule.xiaozhibo.common.msg.TCSimpleUserInfo; import com.dayu.livemodule.xiaozhibo.common.msg.TCSimpleUserInfo;
...@@ -28,6 +27,9 @@ public class TCUserAvatarListAdapter extends RecyclerView.Adapter<RecyclerView.V ...@@ -28,6 +27,9 @@ public class TCUserAvatarListAdapter extends RecyclerView.Adapter<RecyclerView.V
//最大容纳量 //最大容纳量
private final static int TOP_STORGE_MEMBER = 50; private final static int TOP_STORGE_MEMBER = 50;
public LinkedList<TCSimpleUserInfo> getmUserAvatarList() {
return mUserAvatarList;
}
public TCUserAvatarListAdapter(Context context, String pusherId) { public TCUserAvatarListAdapter(Context context, String pusherId) {
this.mContext = context; this.mContext = context;
...@@ -87,7 +89,7 @@ public class TCUserAvatarListAdapter extends RecyclerView.Adapter<RecyclerView.V ...@@ -87,7 +89,7 @@ public class TCUserAvatarListAdapter extends RecyclerView.Adapter<RecyclerView.V
@Override @Override
public void onClick(View view) { public void onClick(View view) {
TCSimpleUserInfo userInfo = mUserAvatarList.get(avatarViewHolder.getAdapterPosition()); TCSimpleUserInfo userInfo = mUserAvatarList.get(avatarViewHolder.getAdapterPosition());
Toast.makeText(mContext.getApplicationContext(),"当前点击用户: " + userInfo.userid, Toast.LENGTH_SHORT).show(); // Toast.makeText(mContext.getApplicationContext(),"当前点击用户: " + userInfo.userid, Toast.LENGTH_SHORT).show();
} }
}); });
......
...@@ -23,6 +23,7 @@ public class TCVideoInfo { ...@@ -23,6 +23,7 @@ public class TCVideoInfo {
public String avatar; // 头像 public String avatar; // 头像
public String createTime; // 开播时间 public String createTime; // 开播时间
public String hlsPlayUrl; // HLS播放链接 public String hlsPlayUrl; // HLS播放链接
public String roomInfo; // HLS播放链接
public TCVideoInfo() {} public TCVideoInfo() {}
......
...@@ -16,15 +16,15 @@ import org.json.JSONObject; ...@@ -16,15 +16,15 @@ import org.json.JSONObject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* Module: TCVideoListMgr * Module: TCVideoListMgr
* * <p>
* Function: 获取当前正在直播的房间列表或者视频回放列表 * Function: 获取当前正在直播的房间列表或者视频回放列表
* * <p>
* 1. 获取当前正在直播的列表,通过 MLVB 组件获取正在直播的房间列表。 {@link TCVideoListMgr#fetchLiveList(Context, Listener)} * 1. 获取当前正在直播的列表,通过 MLVB 组件获取正在直播的房间列表。 {@link TCVideoListMgr#fetchLiveList(Context, Listener)}
* * <p>
* 2. 获取回放视频的列表,向您部署的小直播后台发起获取视频回放的列表。{@link TCVideoListMgr#fetchVodList(Listener)} (Context)} * 2. 获取回放视频的列表,向您部署的小直播后台发起获取视频回放的列表。{@link TCVideoListMgr#fetchVodList(Listener)} (Context)}
*
*/ */
public class TCVideoListMgr { public class TCVideoListMgr {
private static final String TAG = TCVideoListMgr.class.getSimpleName(); private static final String TAG = TCVideoListMgr.class.getSimpleName();
...@@ -51,7 +51,7 @@ public class TCVideoListMgr { ...@@ -51,7 +51,7 @@ public class TCVideoListMgr {
if (listener != null) { if (listener != null) {
listener.onVideoList(errCode, null, false); listener.onVideoList(errCode, null, false);
} }
TXLog.w(TAG, "xzb_process: get_live_list error, code:"+errCode+", errInfo:"+errInfo); TXLog.w(TAG, "xzb_process: get_live_list error, code:" + errCode + ", errInfo:" + errInfo);
} }
@Override @Override
...@@ -61,28 +61,27 @@ public class TCVideoListMgr { ...@@ -61,28 +61,27 @@ public class TCVideoListMgr {
for (RoomInfo value : data) { for (RoomInfo value : data) {
List<AnchorInfo> pushers = value.pushers; List<AnchorInfo> pushers = value.pushers;
String envStr = "";
TCVideoInfo info = new TCVideoInfo(); TCVideoInfo info = new TCVideoInfo();
info.playUrl = value.mixedPlayURL; info.playUrl = value.mixedPlayURL;
info.title = value.roomName; info.title = value.roomName;
info.userId = value.roomCreator; info.userId = value.roomCreator;
info.groupId = value.roomID; info.groupId = value.roomID;
info.viewerCount= value.audienceCount; info.viewerCount = value.audienceCount;
info.livePlay = true; info.livePlay = true;
info.roomInfo = value.roomInfo;
if (pushers != null && !pushers.isEmpty()) { if (pushers != null && !pushers.isEmpty()) {
AnchorInfo pusher = pushers.get(0); AnchorInfo pusher = pushers.get(0);
info.nickname = pusher.userName; info.nickname = pusher.userName;
info.avatar = pusher.userAvatar; info.avatar = pusher.userAvatar;
} }
try { try {
JSONObject jsonRoomInfo = new JSONObject(value.roomInfo); JSONObject jsonRoomInfo = new JSONObject(value.roomInfo);
info.title = jsonRoomInfo.optString("title"); info.title = jsonRoomInfo.optString("title");
info.frontCover = jsonRoomInfo.optString("frontcover"); info.frontCover = jsonRoomInfo.optString("frontcover");
info.location = jsonRoomInfo.optString("location"); info.location = jsonRoomInfo.optString("location");
// if (!TextUtils.isEmpty(jsonRoomInfo.optString("playurl"))){ envStr = jsonRoomInfo.optString(TCGlobalConfig.LIVE_ENVIRONMENT);
// info.playUrl = jsonRoomInfo.optString("playurl");
// value.mixedPlayURL = jsonRoomInfo.optString("playurl");
// }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
if (!TextUtils.isEmpty(value.roomInfo)) { if (!TextUtils.isEmpty(value.roomInfo)) {
...@@ -92,18 +91,18 @@ public class TCVideoListMgr { ...@@ -92,18 +91,18 @@ public class TCVideoListMgr {
try { try {
JSONObject jsonCunstomInfo = new JSONObject(value.custom); JSONObject jsonCunstomInfo = new JSONObject(value.custom);
info.likeCount = jsonCunstomInfo.optInt("praise"); info.likeCount = jsonCunstomInfo.optInt("praise");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
if (envStr.equals(TCGlobalConfig.ENVIRONMENT))
infos.add(info); infos.add(info);
} }
} }
if (listener != null) { if (listener != null) {
listener.onVideoList(0, infos, true); listener.onVideoList(0, infos, true);
} }
TXLog.w(TAG, "xzb_process: get_live_list success "+infos.size()); TXLog.w(TAG, "xzb_process: get_live_list success " + infos.size());
} }
}); });
} }
...@@ -115,7 +114,7 @@ public class TCVideoListMgr { ...@@ -115,7 +114,7 @@ public class TCVideoListMgr {
*/ */
public void fetchVodList(final Listener listener) { public void fetchVodList(final Listener listener) {
try { try {
JSONObject body = new JSONObject().put("index","0").put("count", PAGE_SIZE); JSONObject body = new JSONObject().put("index", "0").put("count", PAGE_SIZE);
TCHTTPMgr.getInstance().requestWithSign(TCGlobalConfig.APP_SVR_URL + "/get_vod_list", body, new TCHTTPMgr.Callback() { TCHTTPMgr.getInstance().requestWithSign(TCGlobalConfig.APP_SVR_URL + "/get_vod_list", body, new TCHTTPMgr.Callback() {
@Override @Override
public void onSuccess(JSONObject data) { public void onSuccess(JSONObject data) {
...@@ -123,10 +122,10 @@ public class TCVideoListMgr { ...@@ -123,10 +122,10 @@ public class TCVideoListMgr {
if (data != null) { if (data != null) {
JSONArray list = data.optJSONArray("list"); JSONArray list = data.optJSONArray("list");
if (list != null) { if (list != null) {
for (int i = 0; i<list.length(); i++) { for (int i = 0; i < list.length(); i++) {
JSONObject obj = list.optJSONObject(i); JSONObject obj = list.optJSONObject(i);
if (obj != null) { if (obj != null) {
TCVideoInfo video = new TCVideoInfo(obj); TCVideoInfo video = new TCVideoInfo(obj);
videoList.add(video); videoList.add(video);
} }
} }
...@@ -150,7 +149,6 @@ public class TCVideoListMgr { ...@@ -150,7 +149,6 @@ public class TCVideoListMgr {
} }
/** /**
* 视频列表获取结果回调 * 视频列表获取结果回调
*/ */
......
...@@ -225,6 +225,7 @@ ...@@ -225,6 +225,7 @@
</FrameLayout> </FrameLayout>
<FrameLayout <FrameLayout
android:visibility="gone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"> android:layout_weight="1">
...@@ -292,7 +293,8 @@ ...@@ -292,7 +293,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="10dp" android:layout_marginBottom="10dp"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:visibility="gone"> android:visibility="gone"
>
<ProgressBar <ProgressBar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="5dp" android:layout_height="5dp"
......
...@@ -249,7 +249,8 @@ ...@@ -249,7 +249,8 @@
android:orientation="horizontal" android:orientation="horizontal"
android:weightSum="10" android:weightSum="10"
android:id="@+id/anchor_ll_audio_plugin" android:id="@+id/anchor_ll_audio_plugin"
android:visibility="gone"> android:visibility="gone"
>
<Button <Button
android:layout_width="0dp" android:layout_width="0dp"
android:layout_weight="5" android:layout_weight="5"
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<!-- permission check--> <!-- permission check-->
<string name="float_window_not_allow">悬浮窗权限未开启 请在应用-权限中打开悬浮窗权限</string> <string name="float_window_not_allow">悬浮窗权限未开启 请在应用-权限中打开悬浮窗权限</string>
<string name="dialog_input_text_hint">开启弹幕互动</string> <string name="dialog_input_text_hint">和大家说点什么</string>
<string name="dialog_selectSex">请选择</string> <string name="dialog_selectSex">请选择</string>
<!-- live fragment--> <!-- live fragment-->
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
<style name="PlayerTheme" parent="Theme.AppCompat.Light.NoActionBar"> <style name="PlayerTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowAnimationStyle">@style/PlayerAnimation</item> <item name="android:windowAnimationStyle">@style/PlayerAnimation</item>
<item name="android:windowNoTitle">true</item>
</style> </style>
<style name="PlayerAnimation" parent="android:Animation.Activity"> <style name="PlayerAnimation" parent="android:Animation.Activity">
......
...@@ -26,6 +26,10 @@ public class RouterPath { ...@@ -26,6 +26,10 @@ public class RouterPath {
* 我的模块. * 我的模块.
*/ */
public final static String PATH_CERTIFICAITON = "/user/certificaiton"; public final static String PATH_CERTIFICAITON = "/user/certificaiton";
/**
* 学习模块.
*/
public final static String PATH_PREPARELIVE = "/learn/prepare_live";
/** /**
* 店长模块 * 店长模块
......
...@@ -34,6 +34,15 @@ public class EngineerInfo extends BaseObservable implements Serializable { ...@@ -34,6 +34,15 @@ public class EngineerInfo extends BaseObservable implements Serializable {
private Object providerTypeList; private Object providerTypeList;
private Object messageCheckcode; private Object messageCheckcode;
private String invitationCode; private String invitationCode;
private int liveStatus;
public int getLiveStatus() {
return liveStatus;
}
public void setLiveStatus(int liveStatus) {
this.liveStatus = liveStatus;
}
public String getInvitationCode() { public String getInvitationCode() {
return invitationCode; return invitationCode;
......
package com.dayu.usercenter.ui.fragment; package com.dayu.usercenter.ui.fragment;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
...@@ -74,6 +72,7 @@ public class HomeUserFragment extends BaseFragment<HomeUserPresenter, FragmentHo ...@@ -74,6 +72,7 @@ public class HomeUserFragment extends BaseFragment<HomeUserPresenter, FragmentHo
// mPresenter.getAlipayAccount(userId); // mPresenter.getAlipayAccount(userId);
mBind.refreshLayout.setEnableLoadMore(false); mBind.refreshLayout.setEnableLoadMore(false);
mBind.refreshLayout.setOnRefreshListener(refreshLayout -> mPresenter.getAllData(mUserId)); mBind.refreshLayout.setOnRefreshListener(refreshLayout -> mPresenter.getAllData(mUserId));
mBind.tvStartLive.setOnClickListener(view -> ARouter.getInstance().build(RouterPath.PATH_PREPARELIVE).navigation());
} }
@Override @Override
...@@ -96,6 +95,8 @@ public class HomeUserFragment extends BaseFragment<HomeUserPresenter, FragmentHo ...@@ -96,6 +95,8 @@ public class HomeUserFragment extends BaseFragment<HomeUserPresenter, FragmentHo
@Override @Override
public void getPersonalInfoSuccess(EngineerInfo info) { public void getPersonalInfoSuccess(EngineerInfo info) {
// mBind.tvStartLive.setVisibility(View.VISIBLE);
mBind.tvStartLive.setVisibility(info.getLiveStatus() == 1?View.VISIBLE:View.GONE);
if (TextUtils.isEmpty(info.getIdentity())) { if (TextUtils.isEmpty(info.getIdentity())) {
SPUtils.put("USER_IDENTITY", ""); SPUtils.put("USER_IDENTITY", "");
} else { } else {
...@@ -130,6 +131,7 @@ public class HomeUserFragment extends BaseFragment<HomeUserPresenter, FragmentHo ...@@ -130,6 +131,7 @@ public class HomeUserFragment extends BaseFragment<HomeUserPresenter, FragmentHo
UserInfo userInfo = UserManager.getInstance().getUser(); UserInfo userInfo = UserManager.getInstance().getUser();
if (userInfo != null) { if (userInfo != null) {
userInfo.setHeaderImg(info.getAccountUrl()); userInfo.setHeaderImg(info.getAccountUrl());
userInfo.setLiveStatus(info.getLiveStatus());
UserManager.getInstance().saveUser(userInfo); UserManager.getInstance().saveUser(userInfo);
} }
} }
......
...@@ -16,6 +16,16 @@ ...@@ -16,6 +16,16 @@
<RelativeLayout <RelativeLayout
android:id="@+id/rl_title" android:id="@+id/rl_title"
style="@style/title"> style="@style/title">
<TextView
android:visibility="gone"
android:id="@+id/tv_start_live"
android:layout_width="100dp"
android:layout_height="match_parent"
android:textColor="@color/common_text_color"
android:textSize="16sp"
android:gravity="center"
android:text="开始直播"
/>
<TextView <TextView
style="@style/text_title" style="@style/text_title"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment