Commit 0f74eae9119a7de92427dbea1edf12a6c782d760

Authored by 谷俊
1 parent 15f895b0

修改用户信息编辑页面和修复播放器权限问题

Showing 27 changed files with 858 additions and 55 deletions
app/src/main/java/com/cnlive/gundam/main/application/CNLiveApplication.java
@@ -10,6 +10,8 @@ import com.cnlive.libs.util.Config; @@ -10,6 +10,8 @@ import com.cnlive.libs.util.Config;
10 10
11 public class CNLiveApplication extends Application { 11 public class CNLiveApplication extends Application {
12 12
  13 + public static final String secret = "c2faeb120f0ea2e2d47020d4b03cb8a93bed2585897a94";
  14 +
13 @Override 15 @Override
14 public void onCreate() { 16 public void onCreate() {
15 super.onCreate(); 17 super.onCreate();
app/src/main/java/com/cnlive/gundam/main/model/VideoListProgram.java
@@ -18,18 +18,20 @@ public class VideoListProgram implements Serializable { @@ -18,18 +18,20 @@ public class VideoListProgram implements Serializable {
18 private String rates; 18 private String rates;
19 private String type; 19 private String type;
20 private String category;//点播用 20 private String category;//点播用
  21 + private int isHorizontalScreen = 1;//屏幕方向,0:垂直即竖屏 /1:水平即横屏 ,默认为1 |
21 22
22 public VideoListProgram() { 23 public VideoListProgram() {
23 } 24 }
24 25
25 //ugc点播使用 26 //ugc点播使用
26 - public VideoListProgram(String vId, String title, String img, String subTitle, String rates, String type) { 27 + public VideoListProgram(String vId, String title, String img, String subTitle, String rates, String type, int isHorizontalScreen) {
27 this.vId = vId; 28 this.vId = vId;
28 this.title = title; 29 this.title = title;
29 this.subTitle = subTitle; 30 this.subTitle = subTitle;
30 this.img = img; 31 this.img = img;
31 this.rates = rates; 32 this.rates = rates;
32 this.type = type; 33 this.type = type;
  34 + this.isHorizontalScreen = isHorizontalScreen;
33 } 35 }
34 36
35 //直播使用 37 //直播使用
@@ -41,6 +43,16 @@ public class VideoListProgram implements Serializable { @@ -41,6 +43,16 @@ public class VideoListProgram implements Serializable {
41 this.type = type; 43 this.type = type;
42 } 44 }
43 45
  46 + //ugc直播使用
  47 + public VideoListProgram(String channelId, String title, String img, String docID, String type, int isHorizontalScreen) {
  48 + this.channelId = channelId;
  49 + this.title = title;
  50 + this.img = img;
  51 + this.docID = docID;
  52 + this.type = type;
  53 + this.isHorizontalScreen = isHorizontalScreen;
  54 + }
  55 +
44 public String getvId() { 56 public String getvId() {
45 return vId; 57 return vId;
46 } 58 }
@@ -104,4 +116,20 @@ public class VideoListProgram implements Serializable { @@ -104,4 +116,20 @@ public class VideoListProgram implements Serializable {
104 public void setType(String type) { 116 public void setType(String type) {
105 this.type = type; 117 this.type = type;
106 } 118 }
  119 +
  120 + public String getCategory() {
  121 + return category;
  122 + }
  123 +
  124 + public void setCategory(String category) {
  125 + this.category = category;
  126 + }
  127 +
  128 + public int getIsHorizontalScreen() {
  129 + return isHorizontalScreen;
  130 + }
  131 +
  132 + public void setIsHorizontalScreen(int isHorizontalScreen) {
  133 + this.isHorizontalScreen = isHorizontalScreen;
  134 + }
107 } 135 }
app/src/main/java/com/cnlive/gundam/main/ui/activity/BackBaseActivity.java
@@ -22,7 +22,7 @@ public class BackBaseActivity extends AppCompatActivity { @@ -22,7 +22,7 @@ public class BackBaseActivity extends AppCompatActivity {
22 TextView toolbarTitle = (TextView) findViewById(R.id.toolbarTitle); 22 TextView toolbarTitle = (TextView) findViewById(R.id.toolbarTitle);
23 toolbarTitle.setText(title); 23 toolbarTitle.setText(title);
24 toolbar.setVisibility(View.VISIBLE); 24 toolbar.setVisibility(View.VISIBLE);
25 - toolbar.setNavigationIcon(R.drawable.btn_cancel); 25 + toolbar.setNavigationIcon(R.drawable.user_page_back);
26 setSupportActionBar(toolbar); 26 setSupportActionBar(toolbar);
27 27
28 } 28 }
app/src/main/java/com/cnlive/gundam/main/ui/fragment/ConfigFragment.java
@@ -79,12 +79,17 @@ public class ConfigFragment extends Fragment implements View.OnClickListener { @@ -79,12 +79,17 @@ public class ConfigFragment extends Fragment implements View.OnClickListener {
79 @Override 79 @Override
80 public void onResume() { 80 public void onResume() {
81 super.onResume(); 81 super.onResume();
82 - if (UserService.getInstance(getActivity()).getActiveAccountInfo().getUid() != 0) notifyUI(); 82 + notifyUI(UserService.getInstance(getActivity()).getActiveAccountInfo().getUid() != 0);
83 } 83 }
84 84
85 - private void notifyUI() {  
86 - User activeAccountInfo = UserService.getInstance(getActivity()).getActiveAccountInfo();  
87 - Glide.with(getActivity()).load(activeAccountInfo.getFaceurl()).into(binding.headImg);  
88 - binding.tvNickname.setText(activeAccountInfo.getNickname()); 85 + private void notifyUI(boolean isLogin) {
  86 + if(isLogin){
  87 + User activeAccountInfo = UserService.getInstance(getActivity()).getActiveAccountInfo();
  88 + Glide.with(getActivity()).load(activeAccountInfo.getFaceurl()).into(binding.headImg);
  89 + binding.tvNickname.setText(activeAccountInfo.getNickname());
  90 + }else{
  91 + Glide.with(getActivity()).load(R.drawable.cnlive_user_header).into(binding.headImg);
  92 + binding.tvNickname.setText(getString(R.string.click_login));
  93 + }
89 } 94 }
90 } 95 }
app/src/main/java/com/cnlive/gundam/main/ui/fragment/UGCListFragment.java
@@ -65,9 +65,8 @@ public class UGCListFragment extends Fragment implements SwipeRefreshLayout.OnRe @@ -65,9 +65,8 @@ public class UGCListFragment extends Fragment implements SwipeRefreshLayout.OnRe
65 65
66 private void loadData() { 66 private void loadData() {
67 Map<String, String> params = new HashMap<>(); 67 Map<String, String> params = new HashMap<>();
68 - //TODO 传多个播放状态  
69 params.put("appId", Config.getAppId()); 68 params.put("appId", Config.getAppId());
70 - params.put("activityStatus", "2"); 69 + params.put("activityStatus", "1,2");
71 params.put("pageNo", "1"); 70 params.put("pageNo", "1");
72 params.put("pageSize", "15"); 71 params.put("pageSize", "15");
73 RetrofitUtil.getApiService().getSpActivityList(SignUtil.getSignParamM(getActivity(), params)).enqueue(this); 72 RetrofitUtil.getApiService().getSpActivityList(SignUtil.getSignParamM(getActivity(), params)).enqueue(this);
app/src/main/java/com/cnlive/gundam/main/utils/ActivityJumpUtil.java
@@ -2,7 +2,6 @@ package com.cnlive.gundam.main.utils; @@ -2,7 +2,6 @@ package com.cnlive.gundam.main.utils;
2 2
3 import android.content.Context; 3 import android.content.Context;
4 import android.content.Intent; 4 import android.content.Intent;
5 -import android.util.Log;  
6 import android.widget.Toast; 5 import android.widget.Toast;
7 6
8 import com.cnlive.gundam.R; 7 import com.cnlive.gundam.R;
@@ -50,7 +49,6 @@ public class ActivityJumpUtil { @@ -50,7 +49,6 @@ public class ActivityJumpUtil {
50 49
51 @Override 50 @Override
52 public void onFailure(Call<ActivePlayInfo> call, Throwable t) { 51 public void onFailure(Call<ActivePlayInfo> call, Throwable t) {
53 - Log.e("11111111111111", "onFailure: "+call.request().toString() );  
54 Toast.makeText(context, context.getString(R.string.request_state_error), Toast.LENGTH_LONG).show(); 52 Toast.makeText(context, context.getString(R.string.request_state_error), Toast.LENGTH_LONG).show();
55 } 53 }
56 }); 54 });
@@ -59,9 +57,9 @@ public class ActivityJumpUtil { @@ -59,9 +57,9 @@ public class ActivityJumpUtil {
59 private static void jumpByStatus(Context context, ActivePlayInfo.ActiveModel model) { 57 private static void jumpByStatus(Context context, ActivePlayInfo.ActiveModel model) {
60 if (model == null) return; 58 if (model == null) return;
61 if (model.getActivityStatus() == 1) {//直播中 59 if (model.getActivityStatus() == 1) {//直播中
62 - jumpByProgramType(context, new VideoListProgram(model.getChannelId(), model.getActivityName(), model.getCoverImgUrl(), model.getRates(), VideoView.TYPE_UGC_LIVE));  
63 - } else if (model.getActivityStatus() == 3) {//已结束  
64 - jumpByProgramType(context, new VideoListProgram(model.getActivityId(), model.getActivityName(), model.getCoverImgUrl(), model.getActivityName(), model.getRates(), VideoView.TYPE_UGC_VOD)); 60 + jumpByProgramType(context, new VideoListProgram(model.getChannelId(), model.getActivityName(), model.getCoverImgUrl(), model.getRates(), VideoView.TYPE_UGC_LIVE, model.getIsHorizontalScreen()));
  61 + } else if (model.getActivityStatus() == 4) {//回放状态
  62 + jumpByProgramType(context, new VideoListProgram(model.getActivityId(), model.getActivityName(), model.getCoverImgUrl(), model.getActivityName(), model.getRates(), VideoView.TYPE_UGC_VOD, model.getIsHorizontalScreen()));
65 } else { 63 } else {
66 Toast.makeText(context, context.getString(R.string.request_state_play_error), Toast.LENGTH_LONG).show(); 64 Toast.makeText(context, context.getString(R.string.request_state_play_error), Toast.LENGTH_LONG).show();
67 } 65 }
app/src/main/java/com/cnlive/gundam/user/adapter/PersonalAdapter.java
@@ -30,6 +30,11 @@ public class PersonalAdapter extends DataBindingAdapter&lt;PersonalData&gt;{ @@ -30,6 +30,11 @@ public class PersonalAdapter extends DataBindingAdapter&lt;PersonalData&gt;{
30 DataBindingViewHolder viewHolder = new DataBindingViewHolder(binding.getRoot()); 30 DataBindingViewHolder viewHolder = new DataBindingViewHolder(binding.getRoot());
31 viewHolder.setBinding(binding); 31 viewHolder.setBinding(binding);
32 return viewHolder; 32 return viewHolder;
  33 + }else if(viewType == PersonalData.TYPE_LOGOUT){
  34 + ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.layout_personal_logout_item, parent, false);
  35 + DataBindingViewHolder viewHolder = new DataBindingViewHolder(binding.getRoot());
  36 + viewHolder.setBinding(binding);
  37 + return viewHolder;
33 }else{ 38 }else{
34 return super.onCreateViewHolder(parent, viewType); 39 return super.onCreateViewHolder(parent, viewType);
35 } 40 }
@@ -43,6 +48,12 @@ public class PersonalAdapter extends DataBindingAdapter&lt;PersonalData&gt;{ @@ -43,6 +48,12 @@ public class PersonalAdapter extends DataBindingAdapter&lt;PersonalData&gt;{
43 if (l != null) 48 if (l != null)
44 videoListViewHolder.getBinding().setVariable(BR.viewClickListner, l); 49 videoListViewHolder.getBinding().setVariable(BR.viewClickListner, l);
45 videoListViewHolder.getBinding().executePendingBindings(); 50 videoListViewHolder.getBinding().executePendingBindings();
  51 + }else if(getItem(position).getItemType() == PersonalData.TYPE_LOGOUT){
  52 + DataBindingViewHolder videoListViewHolder = (DataBindingViewHolder) holder;
  53 + videoListViewHolder.getBinding().setVariable(itemBRId, getItem(position));
  54 + if (l != null)
  55 + videoListViewHolder.getBinding().setVariable(BR.viewClickListner, l);
  56 + videoListViewHolder.getBinding().executePendingBindings();
46 }else{ 57 }else{
47 super.onBindViewHolder(holder, position); 58 super.onBindViewHolder(holder, position);
48 } 59 }
app/src/main/java/com/cnlive/gundam/user/fragment/UserPersonalEditFragment.java
@@ -16,6 +16,7 @@ import com.cnlive.gundam.user.auth.UserService; @@ -16,6 +16,7 @@ import com.cnlive.gundam.user.auth.UserService;
16 import com.cnlive.gundam.user.model.User; 16 import com.cnlive.gundam.user.model.User;
17 import com.cnlive.libs.user.IUserService; 17 import com.cnlive.libs.user.IUserService;
18 import com.cnlive.libs.user.UserUtil; 18 import com.cnlive.libs.user.UserUtil;
  19 +import com.cnlive.libs.user.model.UserData;
19 import com.cnlive.libs.util.data.network.Callback; 20 import com.cnlive.libs.util.data.network.Callback;
20 21
21 /** 22 /**
@@ -88,7 +89,7 @@ public class UserPersonalEditFragment extends Fragment implements Callback, View @@ -88,7 +89,7 @@ public class UserPersonalEditFragment extends Fragment implements Callback, View
88 title = "修改地址"; 89 title = "修改地址";
89 break; 90 break;
90 } 91 }
91 - ((UserPersonalActivity)getActivity()).setTitle(title); 92 + ((UserPersonalActivity) getActivity()).setTitle(title);
92 } 93 }
93 94
94 @Override 95 @Override
@@ -109,7 +110,6 @@ public class UserPersonalEditFragment extends Fragment implements Callback, View @@ -109,7 +110,6 @@ public class UserPersonalEditFragment extends Fragment implements Callback, View
109 break; 110 break;
110 } 111 }
111 } else if (v.getId() == R.id.get_verify) { 112 } else if (v.getId() == R.id.get_verify) {
112 - //TODO 获取验证码  
113 UserUtil.sendMessage(IUserService.REGISTER_OR_MODIFY_MOBILE, binding.includeMobileLayout.edtLoginNumber.getText().toString(), new Callback() { 113 UserUtil.sendMessage(IUserService.REGISTER_OR_MODIFY_MOBILE, binding.includeMobileLayout.edtLoginNumber.getText().toString(), new Callback() {
114 @Override 114 @Override
115 public void onState(int i, String s, Object o) { 115 public void onState(int i, String s, Object o) {
@@ -127,11 +127,23 @@ public class UserPersonalEditFragment extends Fragment implements Callback, View @@ -127,11 +127,23 @@ public class UserPersonalEditFragment extends Fragment implements Callback, View
127 @Override 127 @Override
128 public void onState(int i, String s, Object o) { 128 public void onState(int i, String s, Object o) {
129 if (i == IUserService.SUCCESS) { 129 if (i == IUserService.SUCCESS) {
  130 + updateUserInfo();
130 Toast.makeText(getActivity(), "提交成功", Toast.LENGTH_LONG).show(); 131 Toast.makeText(getActivity(), "提交成功", Toast.LENGTH_LONG).show();
131 } else { 132 } else {
132 Toast.makeText(getActivity(), "提交失败" + s, Toast.LENGTH_LONG).show(); 133 Toast.makeText(getActivity(), "提交失败" + s, Toast.LENGTH_LONG).show();
133 } 134 }
  135 + }
134 136
135 - //TODO 更新一下本地数据 137 + private void updateUserInfo() {
  138 + UserUtil.queryUserInfo(String.valueOf(user.getUid()), String.valueOf(user.getUid()), new Callback() {
  139 + @Override
  140 + public void onState(int i, String s, Object obj) {
  141 + if (i == IUserService.SUCCESS) {
  142 + UserData userData = (UserData) obj;
  143 + UserService userService = UserService.getInstance(getActivity());
  144 + userService.setActiveAccountInfo(userData.getData());
  145 + }
  146 + }
  147 + });
136 } 148 }
137 } 149 }
app/src/main/java/com/cnlive/gundam/user/fragment/UserPersonalFragment.java
1 package com.cnlive.gundam.user.fragment; 1 package com.cnlive.gundam.user.fragment;
2 2
  3 +import android.Manifest;
  4 +import android.app.Activity;
3 import android.content.Intent; 5 import android.content.Intent;
  6 +import android.content.pm.PackageManager;
4 import android.databinding.DataBindingUtil; 7 import android.databinding.DataBindingUtil;
  8 +import android.net.Uri;
  9 +import android.os.Build;
5 import android.os.Bundle; 10 import android.os.Bundle;
  11 +import android.provider.MediaStore;
6 import android.support.annotation.Nullable; 12 import android.support.annotation.Nullable;
7 import android.support.v4.app.Fragment; 13 import android.support.v4.app.Fragment;
  14 +import android.support.v4.content.ContextCompat;
8 import android.support.v7.widget.LinearLayoutManager; 15 import android.support.v7.widget.LinearLayoutManager;
  16 +import android.text.TextUtils;
  17 +import android.view.Gravity;
9 import android.view.LayoutInflater; 18 import android.view.LayoutInflater;
10 import android.view.View; 19 import android.view.View;
11 import android.view.ViewGroup; 20 import android.view.ViewGroup;
@@ -14,13 +23,21 @@ import android.widget.Toast; @@ -14,13 +23,21 @@ import android.widget.Toast;
14 import com.cnlive.gundam.BR; 23 import com.cnlive.gundam.BR;
15 import com.cnlive.gundam.R; 24 import com.cnlive.gundam.R;
16 import com.cnlive.gundam.databinding.FragmentUserPersonalBinding; 25 import com.cnlive.gundam.databinding.FragmentUserPersonalBinding;
  26 +import com.cnlive.gundam.main.application.CNLiveApplication;
17 import com.cnlive.gundam.main.ui.adapter.DataBindingAdapter; 27 import com.cnlive.gundam.main.ui.adapter.DataBindingAdapter;
18 import com.cnlive.gundam.user.activity.UserPersonalActivity; 28 import com.cnlive.gundam.user.activity.UserPersonalActivity;
19 import com.cnlive.gundam.user.adapter.PersonalAdapter; 29 import com.cnlive.gundam.user.adapter.PersonalAdapter;
20 import com.cnlive.gundam.user.auth.UserService; 30 import com.cnlive.gundam.user.auth.UserService;
21 import com.cnlive.gundam.user.model.PersonalData; 31 import com.cnlive.gundam.user.model.PersonalData;
22 import com.cnlive.gundam.user.model.User; 32 import com.cnlive.gundam.user.model.User;
  33 +import com.cnlive.gundam.user.util.PictureUtil;
  34 +import com.cnlive.gundam.user.view.SelectPopupWindow;
  35 +import com.cnlive.libs.user.IUserService;
  36 +import com.cnlive.libs.user.UserUtil;
  37 +import com.cnlive.libs.user.model.UserData;
  38 +import com.cnlive.libs.util.data.network.Callback;
23 39
  40 +import java.io.File;
24 import java.util.ArrayList; 41 import java.util.ArrayList;
25 import java.util.List; 42 import java.util.List;
26 43
@@ -30,7 +47,15 @@ import java.util.List; @@ -30,7 +47,15 @@ import java.util.List;
30 * @time 2017/6/28 13:06 47 * @time 2017/6/28 13:06
31 * @desc ${TODD} 48 * @desc ${TODD}
32 */ 49 */
33 -public class UserPersonalFragment extends Fragment implements DataBindingAdapter.OnAdapterViewClickListener<PersonalData> { 50 +public class UserPersonalFragment extends Fragment implements DataBindingAdapter.OnAdapterViewClickListener<PersonalData>, Callback {
  51 +
  52 + public static final int IMG_FROM_PICTURE = 0x1001;
  53 + public static final int IMG_FROM_CAMERA = 0x1002;
  54 + public static final int PICTURE_REQUEST_CODE = 0x1003;
  55 + public static final int CAMERA_REQUEST_CODE = 0x1004;
  56 +
  57 + //从相机获取的图片地址
  58 + private String cameraImagePath = "";
34 59
35 private FragmentUserPersonalBinding binding; 60 private FragmentUserPersonalBinding binding;
36 61
@@ -38,6 +63,11 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter @@ -38,6 +63,11 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter
38 63
39 private List<PersonalData> personalData; 64 private List<PersonalData> personalData;
40 65
  66 + //上传头像和修改性别的PopupWindow
  67 + private SelectPopupWindow menuWindow;
  68 +
  69 + private User user;
  70 +
41 public static UserPersonalFragment newInstance() { 71 public static UserPersonalFragment newInstance() {
42 72
43 Bundle args = new Bundle(); 73 Bundle args = new Bundle();
@@ -57,27 +87,34 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter @@ -57,27 +87,34 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter
57 @Override 87 @Override
58 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 88 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
59 super.onViewCreated(view, savedInstanceState); 89 super.onViewCreated(view, savedInstanceState);
60 - initData();  
61 init(); 90 init();
62 } 91 }
63 92
  93 + @Override
  94 + public void onResume() {
  95 + super.onResume();
  96 + initData();
  97 + }
  98 +
64 private void initData() { 99 private void initData() {
65 UserService userService = UserService.getInstance(getActivity()); 100 UserService userService = UserService.getInstance(getActivity());
66 - User user = userService.getActiveAccountInfo(); 101 + user = userService.getActiveAccountInfo();
  102 + String gender = user.getGender().equals("f") ? "女" : (user.getGender().equals("m") ? "男" : "未知");
67 personalData = new ArrayList<>(); 103 personalData = new ArrayList<>();
68 personalData.add(new PersonalData("头像", user.getFaceurl(), PersonalData.TYPE_HEADER)); 104 personalData.add(new PersonalData("头像", user.getFaceurl(), PersonalData.TYPE_HEADER));
69 personalData.add(new PersonalData("昵称", user.getNickname(), PersonalData.TYPE_NICK)); 105 personalData.add(new PersonalData("昵称", user.getNickname(), PersonalData.TYPE_NICK));
70 - personalData.add(new PersonalData("性别", user.getGender(), PersonalData.TYPE_GENDER)); 106 + personalData.add(new PersonalData("性别", gender, PersonalData.TYPE_GENDER));
71 personalData.add(new PersonalData("手机号", user.getMobile(), PersonalData.TYPE_MOBILE)); 107 personalData.add(new PersonalData("手机号", user.getMobile(), PersonalData.TYPE_MOBILE));
72 personalData.add(new PersonalData("邮箱", user.getEmail(), PersonalData.TYPE_EMAIL)); 108 personalData.add(new PersonalData("邮箱", user.getEmail(), PersonalData.TYPE_EMAIL));
73 personalData.add(new PersonalData("联系地址", user.getLocation(), PersonalData.TYPE_ADDRESS)); 109 personalData.add(new PersonalData("联系地址", user.getLocation(), PersonalData.TYPE_ADDRESS));
  110 + personalData.add(new PersonalData("", "退出", PersonalData.TYPE_LOGOUT));
  111 + adapter.updateItems(personalData);
74 } 112 }
75 113
76 private void init() { 114 private void init() {
77 - ((UserPersonalActivity)getActivity()).setTitle("个人资料"); 115 + ((UserPersonalActivity) getActivity()).setTitle("个人资料");
78 binding.setListAdapter(adapter = new PersonalAdapter(getActivity(), R.layout.layout_personal_item, BR.data)); 116 binding.setListAdapter(adapter = new PersonalAdapter(getActivity(), R.layout.layout_personal_item, BR.data));
79 binding.setLayoutManager(new LinearLayoutManager(getActivity())); 117 binding.setLayoutManager(new LinearLayoutManager(getActivity()));
80 - adapter.updateItems(personalData);  
81 adapter.setOnViewClickListener(this); 118 adapter.setOnViewClickListener(this);
82 } 119 }
83 120
@@ -87,36 +124,200 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter @@ -87,36 +124,200 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter
87 Intent intent = null; 124 Intent intent = null;
88 switch (program.getItemType()) { 125 switch (program.getItemType()) {
89 case PersonalData.TYPE_HEADER: 126 case PersonalData.TYPE_HEADER:
90 - Toast.makeText(getActivity(), "头像点击", Toast.LENGTH_LONG).show(); 127 + showTakePhoto();
91 break; 128 break;
92 case PersonalData.TYPE_NICK: 129 case PersonalData.TYPE_NICK:
93 intent = new Intent(getActivity(), UserPersonalActivity.class); 130 intent = new Intent(getActivity(), UserPersonalActivity.class);
94 - intent.putExtra("isEdit",true); 131 + intent.putExtra("isEdit", true);
95 intent.putExtra("type", UserPersonalEditFragment.TYPE_NICK); 132 intent.putExtra("type", UserPersonalEditFragment.TYPE_NICK);
96 startActivity(intent); 133 startActivity(intent);
97 break; 134 break;
98 case PersonalData.TYPE_GENDER: 135 case PersonalData.TYPE_GENDER:
99 - Toast.makeText(getActivity(), "性别点击", Toast.LENGTH_LONG).show(); 136 + showSelectGender();
100 break; 137 break;
101 case PersonalData.TYPE_MOBILE: 138 case PersonalData.TYPE_MOBILE:
102 intent = new Intent(getActivity(), UserPersonalActivity.class); 139 intent = new Intent(getActivity(), UserPersonalActivity.class);
103 - intent.putExtra("isEdit",true); 140 + intent.putExtra("isEdit", true);
104 intent.putExtra("type", UserPersonalEditFragment.TYPE_MOBILE); 141 intent.putExtra("type", UserPersonalEditFragment.TYPE_MOBILE);
105 startActivity(intent); 142 startActivity(intent);
106 break; 143 break;
107 case PersonalData.TYPE_EMAIL: 144 case PersonalData.TYPE_EMAIL:
108 intent = new Intent(getActivity(), UserPersonalActivity.class); 145 intent = new Intent(getActivity(), UserPersonalActivity.class);
109 - intent.putExtra("isEdit",true); 146 + intent.putExtra("isEdit", true);
110 intent.putExtra("type", UserPersonalEditFragment.TYPE_EMAIL); 147 intent.putExtra("type", UserPersonalEditFragment.TYPE_EMAIL);
111 startActivity(intent); 148 startActivity(intent);
112 break; 149 break;
113 case PersonalData.TYPE_ADDRESS: 150 case PersonalData.TYPE_ADDRESS:
114 intent = new Intent(getActivity(), UserPersonalActivity.class); 151 intent = new Intent(getActivity(), UserPersonalActivity.class);
115 - intent.putExtra("isEdit",true); 152 + intent.putExtra("isEdit", true);
116 intent.putExtra("type", UserPersonalEditFragment.TYPE_ADDRESS); 153 intent.putExtra("type", UserPersonalEditFragment.TYPE_ADDRESS);
117 startActivity(intent); 154 startActivity(intent);
118 break; 155 break;
119 } 156 }
  157 + } else if (v.getId() == R.id.logout) {
  158 + UserService userService = UserService.getInstance(getActivity());
  159 + userService.clearUser();
  160 + getActivity().finish();
  161 + }
  162 + }
  163 +
  164 + /**
  165 + * 底部弹出上传头像的PopupWindow
  166 + */
  167 + public void showTakePhoto() {
  168 + menuWindow = new SelectPopupWindow(getActivity(), R.layout.pop_take_photo);
  169 + menuWindow.showAtLocation(getView().findViewById(R.id.layout), Gravity.BOTTOM, 0, 0);
  170 + menuWindow.getContentView().findViewById(R.id.ll_pick_photo).setOnClickListener(itemsOnClick);
  171 + menuWindow.getContentView().findViewById(R.id.ll_take_photo).setOnClickListener(itemsOnClick);
  172 + }
  173 +
  174 + /**
  175 + * 底部弹出修改性别的PopupWindow
  176 + */
  177 + public void showSelectGender() {
  178 + menuWindow = new SelectPopupWindow(getActivity(), R.layout.pop_modify_gender);
  179 + menuWindow.showAtLocation(getView().findViewById(R.id.layout), Gravity.BOTTOM, 0, 0);
  180 + menuWindow.getContentView().findViewById(R.id.boy).setOnClickListener(itemsOnClick);
  181 + menuWindow.getContentView().findViewById(R.id.girl).setOnClickListener(itemsOnClick);
  182 + }
  183 +
  184 + //为弹出窗口实现监听类
  185 + private View.OnClickListener itemsOnClick = new View.OnClickListener() {
  186 +
  187 + public void onClick(View v) {
  188 + if (menuWindow != null && menuWindow.isShowing()) {
  189 + menuWindow.dismiss();
  190 + }
  191 + switch (v.getId()) {
  192 + case R.id.ll_take_photo:
  193 + fromCamera();
  194 + break;
  195 + case R.id.ll_pick_photo:
  196 + fromPicture();
  197 + break;
  198 + case R.id.girl:
  199 + UserUtil.modifyUserInfo(String.valueOf(user.getUid()), "gender", "f", UserPersonalFragment.this);
  200 + break;
  201 + case R.id.boy:
  202 + UserUtil.modifyUserInfo(String.valueOf(user.getUid()), "gender", "m", UserPersonalFragment.this);
  203 + break;
  204 + default:
  205 + break;
  206 + }
  207 + }
  208 + };
  209 +
  210 + public void fromPicture() {
  211 + if (Build.VERSION.SDK_INT >= 23) {
  212 + int checkCallPhonePermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
  213 + if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
  214 + requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PICTURE_REQUEST_CODE);
  215 + return;
  216 + } else {
  217 + toIntentPicture();
  218 + }
  219 + } else {
  220 + toIntentPicture();
  221 + }
  222 + }
  223 +
  224 + private void toIntentPicture() {
  225 + Intent intent = new Intent();
  226 + intent.setType("image/*");
  227 + intent.setAction(Intent.ACTION_GET_CONTENT);
  228 + startActivityForResult(intent, IMG_FROM_PICTURE);
  229 + }
  230 +
  231 + public void fromCamera() {
  232 + if (Build.VERSION.SDK_INT >= 23) {
  233 + int checkCallPhonePermissionStorage = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA);
  234 + if (checkCallPhonePermissionStorage != PackageManager.PERMISSION_GRANTED) {
  235 + requestPermissions(new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
  236 + } else {
  237 + toIntentCamera();
  238 + }
  239 + } else {
  240 + toIntentCamera();
  241 + }
  242 + }
  243 +
  244 + private void toIntentCamera() {
  245 + cameraImagePath = PictureUtil.getImagePath(getActivity());
  246 + if (!TextUtils.isEmpty(cameraImagePath)) {
  247 + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  248 + File tmpFile = new File(cameraImagePath);
  249 + intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tmpFile));
  250 + startActivityForResult(intent, IMG_FROM_CAMERA);
  251 + }
  252 + }
  253 +
  254 +
  255 + @Override
  256 + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  257 + super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  258 + switch (requestCode) {
  259 + case PICTURE_REQUEST_CODE:
  260 + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  261 + toIntentPicture();
  262 + } else {
  263 + Toast.makeText(getActivity(), "权限已被禁止,请打开,再使用此功能", Toast.LENGTH_LONG).show();
  264 + }
  265 + break;
  266 + case CAMERA_REQUEST_CODE:
  267 + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  268 + toIntentCamera();
  269 + } else {
  270 + Toast.makeText(getActivity(), "权限已被禁止,请打开,再使用此功能", Toast.LENGTH_LONG).show();
  271 + }
  272 + break;
  273 + }
  274 + }
  275 +
  276 + @Override
  277 + public void onState(int i, String s, Object o) {
  278 + if (i == IUserService.SUCCESS) {
  279 + updateUserInfo();
  280 + Toast.makeText(getActivity(), "提交成功", Toast.LENGTH_LONG).show();
  281 + } else {
  282 + Toast.makeText(getActivity(), "提交失败" + s, Toast.LENGTH_LONG).show();
  283 + }
  284 + }
  285 +
  286 + private void updateUserInfo() {
  287 + UserUtil.queryUserInfo(String.valueOf(user.getUid()), String.valueOf(user.getUid()), new Callback() {
  288 + @Override
  289 + public void onState(int i, String s, Object obj) {
  290 +
  291 + if (i == IUserService.SUCCESS) {
  292 + UserData userData = (UserData) obj;
  293 + UserService userService = UserService.getInstance(getActivity());
  294 + userService.setActiveAccountInfo(userData.getData());
  295 + initData();
  296 + } else {
  297 + Toast.makeText(getActivity(), "提交失败1111" + s, Toast.LENGTH_LONG).show();
  298 + }
  299 + }
  300 + });
  301 + }
  302 +
  303 + @Override
  304 + public void onActivityResult(int requestCode, int resultCode, Intent data) {
  305 + super.onActivityResult(requestCode, resultCode, data);
  306 + if (resultCode == Activity.RESULT_OK) {
  307 + File file = null;
  308 + switch (requestCode) {
  309 + case IMG_FROM_CAMERA:
  310 + file = new File(cameraImagePath);
  311 + UserUtil.uploadFace(String.valueOf(user.getUid()), CNLiveApplication.secret, file, this);
  312 + break;
  313 + case IMG_FROM_PICTURE:
  314 + Uri uri = data.getData();
  315 + file = new File(PictureUtil.getPath(getActivity(), uri));
  316 + UserUtil.uploadFace(String.valueOf(user.getUid()), CNLiveApplication.secret, file, this);
  317 + break;
  318 + default:
  319 + break;
  320 + }
120 } 321 }
121 } 322 }
122 } 323 }
app/src/main/java/com/cnlive/gundam/user/model/PersonalData.java
@@ -17,6 +17,7 @@ public class PersonalData { @@ -17,6 +17,7 @@ public class PersonalData {
17 public static final int TYPE_MOBILE = 0x1004; 17 public static final int TYPE_MOBILE = 0x1004;
18 public static final int TYPE_EMAIL = 0x1005; 18 public static final int TYPE_EMAIL = 0x1005;
19 public static final int TYPE_ADDRESS = 0x1006; 19 public static final int TYPE_ADDRESS = 0x1006;
  20 + public static final int TYPE_LOGOUT = 0x1007;
20 21
21 public PersonalData(String itemName, String itemMessage, int itemType) { 22 public PersonalData(String itemName, String itemMessage, int itemType) {
22 this.itemName = itemName; 23 this.itemName = itemName;
app/src/main/java/com/cnlive/gundam/user/util/PictureUtil.java 0 → 100644
  1 +package com.cnlive.gundam.user.util;
  2 +
  3 +import android.annotation.TargetApi;
  4 +import android.content.ContentUris;
  5 +import android.content.Context;
  6 +import android.database.Cursor;
  7 +import android.net.Uri;
  8 +import android.os.Build;
  9 +import android.os.Environment;
  10 +import android.provider.DocumentsContract;
  11 +import android.provider.MediaStore;
  12 +import android.widget.Toast;
  13 +
  14 +import java.io.File;
  15 +
  16 +/**
  17 + * Created by gujun on 2017/6/29.
  18 + */
  19 +
  20 +public class PictureUtil {
  21 + private static final String IMAGE_PATH = "/com.cnlive.gundam/image/";
  22 +
  23 + public static String getImagePath(Context context){
  24 + String status = Environment.getExternalStorageState();
  25 + String path = "";
  26 + if (status.equals(Environment.MEDIA_MOUNTED)) {
  27 + String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + IMAGE_PATH;
  28 + File file = new File(rootPath);
  29 + if(!file.exists()){
  30 + file.mkdirs();
  31 + }
  32 + path = rootPath + System.currentTimeMillis() + ".png";
  33 + }else {
  34 + Toast.makeText(context,"未插入SD卡",Toast.LENGTH_LONG).show();
  35 + }
  36 + return path;
  37 +
  38 + }
  39 +
  40 + @TargetApi(Build.VERSION_CODES.KITKAT)
  41 + public static String getPath(final Context context, final Uri uri) {
  42 +
  43 + final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
  44 +
  45 + // DocumentProvider
  46 + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
  47 + // ExternalStorageProvider
  48 + if (isExternalStorageDocument(uri)) {
  49 + final String docId = DocumentsContract.getDocumentId(uri);
  50 + final String[] split = docId.split(":");
  51 + final String type = split[0];
  52 +
  53 + if ("primary".equalsIgnoreCase(type)) {
  54 + return Environment.getExternalStorageDirectory() + "/" + split[1];
  55 + }
  56 +
  57 + // TODO handle non-primary volumes
  58 + }
  59 + // DownloadsProvider
  60 + else if (isDownloadsDocument(uri)) {
  61 +
  62 + final String id = DocumentsContract.getDocumentId(uri);
  63 + final Uri contentUri = ContentUris.withAppendedId(
  64 + Uri.parse("content://downloads/public_downloads"), Long.parseLong(id));
  65 +
  66 + return getDataColumn(context, contentUri, null, null);
  67 + }
  68 + // MediaProvider
  69 + else if (isMediaDocument(uri)) {
  70 + final String docId = DocumentsContract.getDocumentId(uri);
  71 + final String[] split = docId.split(":");
  72 + final String type = split[0];
  73 +
  74 + Uri contentUri = null;
  75 + if ("image".equals(type)) {
  76 + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  77 + } else if ("video".equals(type)) {
  78 + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
  79 + } else if ("audio".equals(type)) {
  80 + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  81 + }
  82 +
  83 + final String selection = "_id=?";
  84 + final String[] selectionArgs = new String[]{
  85 + split[1]
  86 + };
  87 +
  88 + return getDataColumn(context, contentUri, selection, selectionArgs);
  89 + }
  90 + }
  91 + // MediaStore (and general)
  92 + else if ("content".equalsIgnoreCase(uri.getScheme())) {
  93 +
  94 + // Return the remote address
  95 + if (isGooglePhotosUri(uri))
  96 + return uri.getLastPathSegment();
  97 +
  98 + return getDataColumn(context, uri, null, null);
  99 + }
  100 + // File
  101 + else if ("file".equalsIgnoreCase(uri.getScheme())) {
  102 + return uri.getPath();
  103 + }
  104 +
  105 + return null;
  106 + }
  107 +
  108 + /**
  109 + * Get the value of the data column for this Uri. This is useful for
  110 + * MediaStore Uris, and other file-based ContentProviders.
  111 + *
  112 + * @param context The context.
  113 + * @param uri The Uri to query.
  114 + * @param selection (Optional) Filter used in the query.
  115 + * @param selectionArgs (Optional) Selection arguments used in the query.
  116 + * @return The value of the _data column, which is typically a file path.
  117 + */
  118 + public static String getDataColumn(Context context, Uri uri, String selection,
  119 + String[] selectionArgs) {
  120 +
  121 + Cursor cursor = null;
  122 + final String column = "_data";
  123 + final String[] projection = {
  124 + column
  125 + };
  126 +
  127 + try {
  128 + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
  129 + null);
  130 + if (cursor != null && cursor.moveToFirst()) {
  131 + final int index = cursor.getColumnIndexOrThrow(column);
  132 + return cursor.getString(index);
  133 + }
  134 + } finally {
  135 + if (cursor != null)
  136 + cursor.close();
  137 + }
  138 + return null;
  139 + }
  140 +
  141 + /**
  142 + * @param uri The Uri to check.
  143 + * @return Whether the Uri authority is ExternalStorageProvider.
  144 + */
  145 + public static boolean isExternalStorageDocument(Uri uri) {
  146 + return "com.android.externalstorage.documents".equals(uri.getAuthority());
  147 + }
  148 +
  149 + /**
  150 + * @param uri The Uri to check.
  151 + * @return Whether the Uri authority is DownloadsProvider.
  152 + */
  153 + public static boolean isDownloadsDocument(Uri uri) {
  154 + return "com.android.providers.downloads.documents".equals(uri.getAuthority());
  155 + }
  156 +
  157 + /**
  158 + * @param uri The Uri to check.
  159 + * @return Whether the Uri authority is MediaProvider.
  160 + */
  161 + public static boolean isMediaDocument(Uri uri) {
  162 + return "com.android.providers.media.documents".equals(uri.getAuthority());
  163 + }
  164 +
  165 + /**
  166 + * @param uri The Uri to check.
  167 + * @return Whether the Uri authority is Google Photos.
  168 + */
  169 + public static boolean isGooglePhotosUri(Uri uri) {
  170 + return "com.google.android.apps.photos.content".equals(uri.getAuthority());
  171 + }
  172 +}
app/src/main/java/com/cnlive/gundam/user/view/SelectPopupWindow.java 0 → 100644
  1 +package com.cnlive.gundam.user.view;
  2 +
  3 +import android.content.Context;
  4 +import android.graphics.drawable.ColorDrawable;
  5 +import android.view.LayoutInflater;
  6 +import android.view.MotionEvent;
  7 +import android.view.View;
  8 +import android.widget.PopupWindow;
  9 +import android.widget.RelativeLayout;
  10 +
  11 +import com.cnlive.gundam.R;
  12 +
  13 +
  14 +public class SelectPopupWindow extends PopupWindow {
  15 +
  16 + private View view;
  17 + private View tv_cancel;
  18 +
  19 + public SelectPopupWindow(Context mContext, int layout) {
  20 +
  21 + this.view = LayoutInflater.from(mContext).inflate(layout, null);
  22 +
  23 + tv_cancel = view.findViewById(R.id.tv_cancel);
  24 +
  25 + tv_cancel.setOnClickListener(new View.OnClickListener() {
  26 +
  27 + public void onClick(View v) {
  28 + dismiss();
  29 + }
  30 + });
  31 +
  32 + this.setOutsideTouchable(true);
  33 + this.view.setOnTouchListener(new View.OnTouchListener() {
  34 +
  35 + public boolean onTouch(View v, MotionEvent event) {
  36 + int height = view.findViewById(R.id.pop_layout).getTop();
  37 + int y = (int) event.getY();
  38 + if (event.getAction() == MotionEvent.ACTION_UP) {
  39 + if (y < height) {
  40 + dismiss();
  41 + }
  42 + }
  43 + return true;
  44 + }
  45 + });
  46 +
  47 + /* 设置弹出窗口特征 */
  48 + // 设置视图
  49 + this.setContentView(this.view);
  50 + // 设置弹出窗体的宽和高
  51 + this.setHeight(RelativeLayout.LayoutParams.MATCH_PARENT);
  52 + this.setWidth(RelativeLayout.LayoutParams.MATCH_PARENT);
  53 + // 设置弹出窗体可点击
  54 + this.setFocusable(true);
  55 + // 实例化一个ColorDrawable颜色为透明
  56 + ColorDrawable dw = new ColorDrawable(0x30000000);
  57 + // 设置弹出窗体的背景
  58 + this.setBackgroundDrawable(dw);
  59 + // 设置弹出窗体显示时的动画,从底部向上弹出
  60 + this.setAnimationStyle(R.style.take_photo_anim);
  61 + }
  62 +}
app/src/main/java/com/cnlive/gundam/video/activity/PlayerActivity.java
@@ -22,14 +22,11 @@ import com.cnlive.gundam.video.utils.PlayerUtils; @@ -22,14 +22,11 @@ import com.cnlive.gundam.video.utils.PlayerUtils;
22 */ 22 */
23 23
24 public class PlayerActivity extends AppCompatActivity { 24 public class PlayerActivity extends AppCompatActivity {
25 - private final String SCREEN_DIRECT_P = "0";  
26 - private final String SCREEN_DIRECT_L = "1";  
27 25
28 private Fragment fragment; 26 private Fragment fragment;
29 private VideoListProgram program; 27 private VideoListProgram program;
30 //默认横屏 28 //默认横屏
31 - private String screenDirect = SCREEN_DIRECT_L;  
32 - private String screenDirectName = "screenDirect"; 29 + private int screenDirect = 1;
33 30
34 @Override 31 @Override
35 protected void onCreate(@Nullable Bundle savedInstanceState) { 32 protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -69,10 +66,8 @@ public class PlayerActivity extends AppCompatActivity { @@ -69,10 +66,8 @@ public class PlayerActivity extends AppCompatActivity {
69 } 66 }
70 67
71 if (fragment instanceof PlayerUgcLiveFragment || fragment instanceof PlayerUgcVodFragment) { 68 if (fragment instanceof PlayerUgcLiveFragment || fragment instanceof PlayerUgcVodFragment) {
72 - if (intent.hasExtra(screenDirectName)) {  
73 - screenDirect = intent.getStringExtra(screenDirectName);  
74 - }  
75 - if (SCREEN_DIRECT_P.equals(screenDirect)) { 69 + screenDirect = program.getIsHorizontalScreen();
  70 + if (screenDirect == 0) {
76 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 71 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
77 } else { 72 } else {
78 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 73 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
app/src/main/java/com/cnlive/gundam/video/fragment/PlayerUgcLiveFragment.java
1 package com.cnlive.gundam.video.fragment; 1 package com.cnlive.gundam.video.fragment;
2 2
  3 +import android.Manifest;
  4 +import android.content.pm.PackageManager;
3 import android.content.res.Configuration; 5 import android.content.res.Configuration;
4 import android.databinding.DataBindingUtil; 6 import android.databinding.DataBindingUtil;
5 import android.os.Bundle; 7 import android.os.Bundle;
  8 +import android.support.annotation.NonNull;
6 import android.support.annotation.Nullable; 9 import android.support.annotation.Nullable;
7 import android.support.v4.app.Fragment; 10 import android.support.v4.app.Fragment;
8 import android.view.LayoutInflater; 11 import android.view.LayoutInflater;
9 import android.view.View; 12 import android.view.View;
10 import android.view.ViewGroup; 13 import android.view.ViewGroup;
  14 +import android.widget.Toast;
11 15
12 import com.cnlive.gundam.R; 16 import com.cnlive.gundam.R;
13 -import com.cnlive.gundam.databinding.FragmentPlayerUgcVodBinding; 17 +import com.cnlive.gundam.databinding.FragmentPlayerUgcLiveBinding;
14 import com.cnlive.gundam.main.model.VideoListProgram; 18 import com.cnlive.gundam.main.model.VideoListProgram;
15 import com.cnlive.gundam.video.model.VideoModel; 19 import com.cnlive.gundam.video.model.VideoModel;
16 import com.cnlive.gundam.video.utils.PlayerUtils; 20 import com.cnlive.gundam.video.utils.PlayerUtils;
  21 +import com.cnlive.gundam.video.view.BaseVideoView;
17 import com.cnlive.gundam.video.view.VideoView; 22 import com.cnlive.gundam.video.view.VideoView;
18 23
19 /** 24 /**
20 * Created by gujun on 2017/4/5. 25 * Created by gujun on 2017/4/5.
21 */ 26 */
22 27
23 -public class PlayerUgcLiveFragment extends Fragment {  
24 - private FragmentPlayerUgcVodBinding binding; 28 +public class PlayerUgcLiveFragment extends Fragment implements BaseVideoView.OnUgcLiveStatusPermissionListener{
  29 + private final int PERMISSION_REQUEST_CODE = 0x1001;
  30 + private FragmentPlayerUgcLiveBinding binding;
25 31
26 private VideoListProgram program; 32 private VideoListProgram program;
27 private String title; 33 private String title;
@@ -57,6 +63,7 @@ public class PlayerUgcLiveFragment extends Fragment { @@ -57,6 +63,7 @@ public class PlayerUgcLiveFragment extends Fragment {
57 @Override 63 @Override
58 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 64 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
59 super.onViewCreated(view, savedInstanceState); 65 super.onViewCreated(view, savedInstanceState);
  66 + binding.videoView.setUgcLiveStatusPermissionListener(this);//必须在设置播放数据前调用
60 binding.videoView.setVideoInfo(new VideoModel(title, id, VideoView.TYPE_UGC_LIVE, rates)); 67 binding.videoView.setVideoInfo(new VideoModel(title, id, VideoView.TYPE_UGC_LIVE, rates));
61 } 68 }
62 69
@@ -85,4 +92,21 @@ public class PlayerUgcLiveFragment extends Fragment { @@ -85,4 +92,21 @@ public class PlayerUgcLiveFragment extends Fragment {
85 super.onDestroyView(); 92 super.onDestroyView();
86 } 93 }
87 94
  95 + @Override
  96 + public void onShouldRequestPermission() {
  97 + requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, PERMISSION_REQUEST_CODE);
  98 + }
  99 +
  100 + @Override
  101 + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  102 + super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  103 + if(requestCode == PERMISSION_REQUEST_CODE){
  104 + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  105 + if(binding != null && binding.videoView != null)
  106 + binding.videoView.addUgcLiveStatus();
  107 + } else {
  108 + Toast.makeText(getActivity(), "权限已被禁止,您将接收不到直播状态", Toast.LENGTH_LONG).show();
  109 + }
  110 + }
  111 + }
88 } 112 }
app/src/main/java/com/cnlive/gundam/video/view/BaseVideoView.java
1 package com.cnlive.gundam.video.view; 1 package com.cnlive.gundam.video.view;
2 2
  3 +import android.Manifest;
3 import android.content.Context; 4 import android.content.Context;
  5 +import android.content.pm.PackageManager;
4 import android.databinding.DataBindingUtil; 6 import android.databinding.DataBindingUtil;
  7 +import android.os.Build;
  8 +import android.support.v4.content.ContextCompat;
5 import android.util.AttributeSet; 9 import android.util.AttributeSet;
6 import android.util.Log; 10 import android.util.Log;
7 import android.view.LayoutInflater; 11 import android.view.LayoutInflater;
@@ -59,8 +63,12 @@ public abstract class BaseVideoView extends RelativeLayout implements @@ -59,8 +63,12 @@ public abstract class BaseVideoView extends RelativeLayout implements
59 63
60 private DataSource curDataSource; 64 private DataSource curDataSource;
61 65
  66 + //播放器播放状态的监听
62 private OnVideoViewPlayStatusListener l; 67 private OnVideoViewPlayStatusListener l;
63 68
  69 + //ugclive需要权限监听
  70 + private OnUgcLiveStatusPermissionListener ugcLivePermissionListener;
  71 +
64 public BaseVideoView(Context context) { 72 public BaseVideoView(Context context) {
65 this(context, null); 73 this(context, null);
66 } 74 }
@@ -99,8 +107,17 @@ public abstract class BaseVideoView extends RelativeLayout implements @@ -99,8 +107,17 @@ public abstract class BaseVideoView extends RelativeLayout implements
99 public void setDataSource() { 107 public void setDataSource() {
100 //只有ugcLive视频才有状态监听 108 //只有ugcLive视频才有状态监听
101 if (videoModel.getType().equals(VideoView.TYPE_UGC_LIVE)) { 109 if (videoModel.getType().equals(VideoView.TYPE_UGC_LIVE)) {
102 - VideoStatusUtil.setOnVideoPlayStatusCallback(mOnVideoStatusCallback);  
103 - VideoStatusUtil.init(videoModel.getId()); 110 + if (Build.VERSION.SDK_INT >= 23) {
  111 + int checkCallPhonePermission = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_PHONE_STATE);
  112 + if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
  113 + if(ugcLivePermissionListener != null)
  114 + ugcLivePermissionListener.onShouldRequestPermission();
  115 + } else {
  116 + addUgcLiveStatus();
  117 + }
  118 + } else {
  119 + addUgcLiveStatus();
  120 + }
104 } 121 }
105 122
106 if (isLive) { 123 if (isLive) {
@@ -113,7 +130,21 @@ public abstract class BaseVideoView extends RelativeLayout implements @@ -113,7 +130,21 @@ public abstract class BaseVideoView extends RelativeLayout implements
113 130
114 preRate = Config.TYPE_PLAY_RATE_2; 131 preRate = Config.TYPE_PLAY_RATE_2;
115 132
  133 + }
116 134
  135 + /**
  136 + * 设置UGC LIVE的直播状态监听
  137 + */
  138 + public void setUgcLiveStatusPermissionListener(OnUgcLiveStatusPermissionListener l){
  139 + ugcLivePermissionListener = l;
  140 + }
  141 +
  142 + /**
  143 + * 添加UGC LIVE的直播状态监听
  144 + */
  145 + public void addUgcLiveStatus(){
  146 + VideoStatusUtil.setOnVideoPlayStatusCallback(mOnVideoStatusCallback);
  147 + VideoStatusUtil.init(videoModel.getId());
117 } 148 }
118 149
119 /** 150 /**
@@ -312,4 +343,9 @@ public abstract class BaseVideoView extends RelativeLayout implements @@ -312,4 +343,9 @@ public abstract class BaseVideoView extends RelativeLayout implements
312 public interface OnVideoViewPlayStatusListener { 343 public interface OnVideoViewPlayStatusListener {
313 void onVideoViewPlayStatus(boolean isPlay); 344 void onVideoViewPlayStatus(boolean isPlay);
314 } 345 }
  346 +
  347 + //ugc live 监听直播状态得需要android.permission.READ_PHONE_STATE
  348 + public interface OnUgcLiveStatusPermissionListener{
  349 + void onShouldRequestPermission();
  350 + }
315 } 351 }
app/src/main/res/drawable-xhdpi/user_list_arrows.png 0 → 100644

680 Bytes

app/src/main/res/drawable-xxhdpi/user_page_back.png 0 → 100644

1.2 KB

app/src/main/res/layout/fragment_personal_edit.xml
@@ -13,25 +13,40 @@ @@ -13,25 +13,40 @@
13 13
14 <RelativeLayout 14 <RelativeLayout
15 android:layout_width="match_parent" 15 android:layout_width="match_parent"
16 - android:layout_height="match_parent"> 16 + android:layout_height="match_parent"
  17 + android:background="@color/gray_bg"
  18 + android:paddingTop="10dp">
17 19
18 - <EditText  
19 - android:id="@+id/editText" 20 + <LinearLayout
20 android:layout_width="match_parent" 21 android:layout_width="match_parent"
21 - android:layout_height="50dp"  
22 - android:visibility="gone"/> 22 + android:layout_height="wrap_content"
  23 + android:orientation="vertical"
  24 + android:background="@android:color/white">
  25 +
  26 + <EditText
  27 + android:id="@+id/editText"
  28 + style="@style/LoginContentStyle"
  29 + android:layout_width="match_parent"
  30 + android:layout_height="50dp"
  31 + android:layout_marginLeft="11dp"
  32 + android:layout_marginRight="11dp"
  33 + android:visibility="gone" />
  34 +
  35 + <include
  36 + android:id="@+id/includeMobileLayout"
  37 + layout="@layout/mobile_keycode_layout" />
23 38
24 - <include  
25 - android:id="@+id/includeMobileLayout"  
26 - layout="@layout/mobile_keycode_layout"/> 39 + </LinearLayout>
27 40
28 <Button 41 <Button
29 android:id="@+id/submit" 42 android:id="@+id/submit"
  43 + style="@style/LoginButtonStyle"
30 android:layout_width="match_parent" 44 android:layout_width="match_parent"
31 android:layout_height="50dp" 45 android:layout_height="50dp"
32 android:layout_alignParentBottom="true" 46 android:layout_alignParentBottom="true"
33 android:layout_marginBottom="200dp" 47 android:layout_marginBottom="200dp"
34 android:onClick="@{userPersonalEditFragment.onClick}" 48 android:onClick="@{userPersonalEditFragment.onClick}"
  49 + android:background="@drawable/user_btn_login"
35 android:text="提交" /> 50 android:text="提交" />
36 51
37 </RelativeLayout> 52 </RelativeLayout>
app/src/main/res/layout/fragment_player_ugc_live.xml
@@ -23,9 +23,8 @@ @@ -23,9 +23,8 @@
23 23
24 <RelativeLayout 24 <RelativeLayout
25 android:id="@+id/contentLayout" 25 android:id="@+id/contentLayout"
26 - android:background="@android:color/black"  
27 android:layout_width="match_parent" 26 android:layout_width="match_parent"
28 - android:layout_height="400dp" 27 + android:layout_height="match_parent"
29 android:layout_alignParentBottom="true"> 28 android:layout_alignParentBottom="true">
30 29
31 </RelativeLayout> 30 </RelativeLayout>
app/src/main/res/layout/fragment_user_personal.xml
@@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
17 </data> 17 </data>
18 18
19 <RelativeLayout 19 <RelativeLayout
  20 + android:id="@+id/layout"
20 android:layout_width="match_parent" 21 android:layout_width="match_parent"
21 android:layout_height="match_parent"> 22 android:layout_height="match_parent">
22 23
@@ -27,7 +28,7 @@ @@ -27,7 +28,7 @@
27 android:clipToPadding="true" 28 android:clipToPadding="true"
28 android:clipChildren="true" 29 android:clipChildren="true"
29 android:paddingTop="5dp" 30 android:paddingTop="5dp"
30 - android:background="@color/list_divider" 31 + android:background="@color/gray_bg"
31 app:adapter="@{listAdapter}" 32 app:adapter="@{listAdapter}"
32 app:layoutManager="@{layoutManager}"/> 33 app:layoutManager="@{layoutManager}"/>
33 34
app/src/main/res/layout/layout_actionbar_back.xml
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 android:layout_height="?attr/actionBarSize" 8 android:layout_height="?attr/actionBarSize"
9 android:theme="@style/ThemeOverlay.AppCompat.Light" 9 android:theme="@style/ThemeOverlay.AppCompat.Light"
10 app:contentInsetEnd="?attr/actionBarSize" 10 app:contentInsetEnd="?attr/actionBarSize"
  11 + android:background="@android:color/white"
11 android:visibility="gone" 12 android:visibility="gone"
12 tools:visibility="visible"> 13 tools:visibility="visible">
13 14
app/src/main/res/layout/layout_personal_header_item.xml
@@ -38,6 +38,7 @@ @@ -38,6 +38,7 @@
38 android:text="@{data.getItemName()}" 38 android:text="@{data.getItemName()}"
39 android:textColor="@color/black" 39 android:textColor="@color/black"
40 android:textSize="18sp" 40 android:textSize="18sp"
  41 + android:layout_marginLeft="10dp"
41 tools:text="nick" /> 42 tools:text="nick" />
42 43
43 <ImageView 44 <ImageView
app/src/main/res/layout/layout_personal_item.xml
@@ -37,6 +37,7 @@ @@ -37,6 +37,7 @@
37 android:text="@{data.getItemName()}" 37 android:text="@{data.getItemName()}"
38 android:textColor="@color/black" 38 android:textColor="@color/black"
39 android:textSize="18sp" 39 android:textSize="18sp"
  40 + android:layout_marginLeft="10dp"
40 tools:text="nick" /> 41 tools:text="nick" />
41 42
42 <TextView 43 <TextView
@@ -48,7 +49,7 @@ @@ -48,7 +49,7 @@
48 android:layout_toRightOf="@+id/itemName" 49 android:layout_toRightOf="@+id/itemName"
49 android:gravity="center_vertical|right" 50 android:gravity="center_vertical|right"
50 android:text="@{data.getItemMessage()}" 51 android:text="@{data.getItemMessage()}"
51 - android:textColor="@color/black" 52 + android:textColor="@color/gray"
52 android:textSize="18sp" 53 android:textSize="18sp"
53 tools:text="haha" /> 54 tools:text="haha" />
54 55
@@ -56,7 +57,9 @@ @@ -56,7 +57,9 @@
56 android:layout_width="wrap_content" 57 android:layout_width="wrap_content"
57 android:layout_height="wrap_content" 58 android:layout_height="wrap_content"
58 android:layout_alignParentRight="true" 59 android:layout_alignParentRight="true"
59 - android:layout_centerVertical="true"/> 60 + android:layout_centerVertical="true"
  61 + android:src="@drawable/user_list_arrows"
  62 + android:layout_marginRight="10dp"/>
60 63
61 </RelativeLayout> 64 </RelativeLayout>
62 65
app/src/main/res/layout/layout_personal_logout_item.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<layout xmlns:android="http://schemas.android.com/apk/res/android">
  3 +
  4 + <data>
  5 +
  6 + <import type="com.cnlive.gundam.user.model.PersonalData" />
  7 + <import type="com.cnlive.gundam.main.ui.adapter.DataBindingAdapter.OnAdapterViewClickListener"/>
  8 +
  9 + <variable
  10 + name="data"
  11 + type="PersonalData"/>
  12 +
  13 + <variable
  14 + name="viewClickListner"
  15 + type="OnAdapterViewClickListener&lt;PersonalData>"/>
  16 +
  17 + </data>
  18 +
  19 + <RelativeLayout
  20 + android:id="@+id/itemLayout"
  21 + android:layout_width="match_parent"
  22 + android:layout_height="wrap_content">
  23 +
  24 + <Button
  25 + android:id="@+id/logout"
  26 + style="@style/LoginButtonStyle"
  27 + android:layout_width="match_parent"
  28 + android:layout_height="50dp"
  29 + android:background="@drawable/user_btn_login"
  30 + android:layout_marginTop="50dp"
  31 + android:onClick="@{(view)->viewClickListner.onViewClick(view,data)}"
  32 + android:text="退出" />
  33 +
  34 + </RelativeLayout>
  35 +
  36 +</layout>
0 \ No newline at end of file 37 \ No newline at end of file
app/src/main/res/layout/pop_modify_gender.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="fill_parent"
  4 + android:layout_height="wrap_content"
  5 + android:gravity="center_horizontal"
  6 + android:orientation="vertical">
  7 +
  8 + <RelativeLayout
  9 + android:id="@+id/pop_layout"
  10 + android:layout_width="fill_parent"
  11 + android:layout_height="wrap_content">
  12 +
  13 + <TextView
  14 + android:id="@+id/tv_cancel"
  15 + android:layout_width="match_parent"
  16 + android:layout_height="58dp"
  17 + android:layout_alignParentBottom="true"
  18 + android:background="#ffffff"
  19 + android:gravity="center"
  20 + android:text="取消"
  21 + android:textColor="#FF6633"
  22 + android:textSize="16sp" />
  23 +
  24 + <LinearLayout
  25 + android:id="@+id/boy"
  26 + android:layout_width="match_parent"
  27 + android:layout_height="58dp"
  28 + android:layout_above="@id/tv_cancel"
  29 + android:background="#ffffff"
  30 + android:orientation="vertical">
  31 +
  32 + <TextView
  33 + android:layout_width="match_parent"
  34 + android:layout_height="50dp"
  35 + android:layout_alignParentBottom="true"
  36 + android:gravity="center"
  37 + android:text="男"
  38 + android:textColor="#333333"
  39 + android:textSize="16sp" />
  40 +
  41 + <View
  42 + android:layout_width="match_parent"
  43 + android:layout_height="10dp"
  44 + android:background="#D8D8D8" />
  45 + </LinearLayout>
  46 +
  47 +
  48 + <LinearLayout
  49 + android:id="@+id/girl"
  50 + android:layout_width="match_parent"
  51 + android:layout_height="58dp"
  52 + android:layout_above="@id/boy"
  53 + android:background="#ffffff"
  54 + android:orientation="vertical">
  55 +
  56 + <TextView
  57 + android:layout_width="match_parent"
  58 + android:layout_height="50dp"
  59 + android:layout_alignParentBottom="true"
  60 + android:gravity="center"
  61 + android:text="女"
  62 + android:textColor="#333333"
  63 + android:textSize="16sp" />
  64 +
  65 + <View
  66 + android:layout_width="match_parent"
  67 + android:layout_height="1dp"
  68 + android:background="#D8D8D8" />
  69 + </LinearLayout>
  70 +
  71 +
  72 + <LinearLayout
  73 + android:id="@+id/ll_changeHead"
  74 + android:layout_width="match_parent"
  75 + android:layout_height="51dp"
  76 + android:layout_above="@id/girl"
  77 + android:background="#ffffff"
  78 + android:orientation="vertical">
  79 +
  80 + <TextView
  81 + android:id="@+id/changeTitleTag"
  82 + android:layout_width="match_parent"
  83 + android:layout_height="50dp"
  84 + android:layout_alignParentBottom="true"
  85 + android:gravity="center"
  86 + android:text="性别修改"
  87 + android:textColor="@color/black"
  88 + android:textSize="18sp" />
  89 +
  90 + <View
  91 + android:layout_width="match_parent"
  92 + android:layout_height="1dp"
  93 + android:background="@color/color_list_bg" />
  94 +
  95 + </LinearLayout>
  96 +
  97 + </RelativeLayout>
  98 +
  99 +</RelativeLayout>
0 \ No newline at end of file 100 \ No newline at end of file
app/src/main/res/layout/pop_take_photo.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="fill_parent"
  4 + android:layout_height="wrap_content"
  5 + android:gravity="center_horizontal"
  6 + android:orientation="vertical">
  7 +
  8 + <RelativeLayout
  9 + android:id="@+id/pop_layout"
  10 + android:layout_width="fill_parent"
  11 + android:layout_height="wrap_content">
  12 +
  13 + <TextView
  14 + android:id="@+id/tv_cancel"
  15 + android:layout_width="match_parent"
  16 + android:layout_height="58dp"
  17 + android:layout_alignParentBottom="true"
  18 + android:background="#ffffff"
  19 + android:gravity="center"
  20 + android:text="取消"
  21 + android:textColor="#FF6633"
  22 + android:textSize="16sp" />
  23 +
  24 + <LinearLayout
  25 + android:id="@+id/ll_pick_photo"
  26 + android:layout_width="match_parent"
  27 + android:layout_height="58dp"
  28 + android:layout_above="@id/tv_cancel"
  29 + android:background="#ffffff"
  30 + android:orientation="vertical">
  31 +
  32 + <TextView
  33 + android:layout_width="match_parent"
  34 + android:layout_height="50dp"
  35 + android:layout_alignParentBottom="true"
  36 + android:gravity="center"
  37 + android:text="从手机相册中选取"
  38 + android:textColor="#333333"
  39 + android:textSize="16sp" />
  40 +
  41 + <View
  42 + android:layout_width="match_parent"
  43 + android:layout_height="10dp"
  44 + android:background="#D8D8D8" />
  45 + </LinearLayout>
  46 +
  47 +
  48 + <LinearLayout
  49 + android:id="@+id/ll_take_photo"
  50 + android:layout_width="match_parent"
  51 + android:layout_height="58dp"
  52 + android:layout_above="@id/ll_pick_photo"
  53 + android:background="#ffffff"
  54 + android:orientation="vertical">
  55 +
  56 + <TextView
  57 + android:layout_width="match_parent"
  58 + android:layout_height="50dp"
  59 + android:layout_alignParentBottom="true"
  60 + android:gravity="center"
  61 + android:text="拍照"
  62 + android:textColor="#333333"
  63 + android:textSize="16sp" />
  64 +
  65 + <View
  66 + android:layout_width="match_parent"
  67 + android:layout_height="1dp"
  68 + android:background="#D8D8D8" />
  69 + </LinearLayout>
  70 +
  71 +
  72 + <LinearLayout
  73 + android:id="@+id/ll_changeHead"
  74 + android:layout_width="match_parent"
  75 + android:layout_height="51dp"
  76 + android:layout_above="@id/ll_take_photo"
  77 + android:background="#ffffff"
  78 + android:orientation="vertical">
  79 +
  80 + <TextView
  81 + android:id="@+id/changeTitleTag"
  82 + android:layout_width="match_parent"
  83 + android:layout_height="50dp"
  84 + android:layout_alignParentBottom="true"
  85 + android:gravity="center"
  86 + android:text="头像修改"
  87 + android:textColor="@color/black"
  88 + android:textSize="18sp" />
  89 +
  90 + <View
  91 + android:layout_width="match_parent"
  92 + android:layout_height="1dp"
  93 + android:background="@color/color_list_bg" />
  94 +
  95 + </LinearLayout>
  96 +
  97 + </RelativeLayout>
  98 +
  99 +</RelativeLayout>
0 \ No newline at end of file 100 \ No newline at end of file
app/src/main/res/values/colors.xml
@@ -8,4 +8,7 @@ @@ -8,4 +8,7 @@
8 8
9 <color name="rate_sel">#ff0000</color> 9 <color name="rate_sel">#ff0000</color>
10 <color name="rate_nor">#ffffff</color> 10 <color name="rate_nor">#ffffff</color>
  11 +
  12 + <color name="gray">#9e9e9e</color>
  13 + <color name="gray_bg">#dedbdb</color>
11 </resources> 14 </resources>