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 10  
11 11 public class CNLiveApplication extends Application {
12 12  
  13 + public static final String secret = "c2faeb120f0ea2e2d47020d4b03cb8a93bed2585897a94";
  14 +
13 15 @Override
14 16 public void onCreate() {
15 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 private String rates;
19 19 private String type;
20 20 private String category;//点播用
  21 + private int isHorizontalScreen = 1;//屏幕方向,0:垂直即竖屏 /1:水平即横屏 ,默认为1 |
21 22  
22 23 public VideoListProgram() {
23 24 }
24 25  
25 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 28 this.vId = vId;
28 29 this.title = title;
29 30 this.subTitle = subTitle;
30 31 this.img = img;
31 32 this.rates = rates;
32 33 this.type = type;
  34 + this.isHorizontalScreen = isHorizontalScreen;
33 35 }
34 36  
35 37 //直播使用
... ... @@ -41,6 +43,16 @@ public class VideoListProgram implements Serializable {
41 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 56 public String getvId() {
45 57 return vId;
46 58 }
... ... @@ -104,4 +116,20 @@ public class VideoListProgram implements Serializable {
104 116 public void setType(String type) {
105 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 22 TextView toolbarTitle = (TextView) findViewById(R.id.toolbarTitle);
23 23 toolbarTitle.setText(title);
24 24 toolbar.setVisibility(View.VISIBLE);
25   - toolbar.setNavigationIcon(R.drawable.btn_cancel);
  25 + toolbar.setNavigationIcon(R.drawable.user_page_back);
26 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 79 @Override
80 80 public void onResume() {
81 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 65  
66 66 private void loadData() {
67 67 Map<String, String> params = new HashMap<>();
68   - //TODO 传多个播放状态
69 68 params.put("appId", Config.getAppId());
70   - params.put("activityStatus", "2");
  69 + params.put("activityStatus", "1,2");
71 70 params.put("pageNo", "1");
72 71 params.put("pageSize", "15");
73 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 2  
3 3 import android.content.Context;
4 4 import android.content.Intent;
5   -import android.util.Log;
6 5 import android.widget.Toast;
7 6  
8 7 import com.cnlive.gundam.R;
... ... @@ -50,7 +49,6 @@ public class ActivityJumpUtil {
50 49  
51 50 @Override
52 51 public void onFailure(Call<ActivePlayInfo> call, Throwable t) {
53   - Log.e("11111111111111", "onFailure: "+call.request().toString() );
54 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 57 private static void jumpByStatus(Context context, ActivePlayInfo.ActiveModel model) {
60 58 if (model == null) return;
61 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 63 } else {
66 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 30 DataBindingViewHolder viewHolder = new DataBindingViewHolder(binding.getRoot());
31 31 viewHolder.setBinding(binding);
32 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 38 }else{
34 39 return super.onCreateViewHolder(parent, viewType);
35 40 }
... ... @@ -43,6 +48,12 @@ public class PersonalAdapter extends DataBindingAdapter&lt;PersonalData&gt;{
43 48 if (l != null)
44 49 videoListViewHolder.getBinding().setVariable(BR.viewClickListner, l);
45 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 57 }else{
47 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 16 import com.cnlive.gundam.user.model.User;
17 17 import com.cnlive.libs.user.IUserService;
18 18 import com.cnlive.libs.user.UserUtil;
  19 +import com.cnlive.libs.user.model.UserData;
19 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 89 title = "修改地址";
89 90 break;
90 91 }
91   - ((UserPersonalActivity)getActivity()).setTitle(title);
  92 + ((UserPersonalActivity) getActivity()).setTitle(title);
92 93 }
93 94  
94 95 @Override
... ... @@ -109,7 +110,6 @@ public class UserPersonalEditFragment extends Fragment implements Callback, View
109 110 break;
110 111 }
111 112 } else if (v.getId() == R.id.get_verify) {
112   - //TODO 获取验证码
113 113 UserUtil.sendMessage(IUserService.REGISTER_OR_MODIFY_MOBILE, binding.includeMobileLayout.edtLoginNumber.getText().toString(), new Callback() {
114 114 @Override
115 115 public void onState(int i, String s, Object o) {
... ... @@ -127,11 +127,23 @@ public class UserPersonalEditFragment extends Fragment implements Callback, View
127 127 @Override
128 128 public void onState(int i, String s, Object o) {
129 129 if (i == IUserService.SUCCESS) {
  130 + updateUserInfo();
130 131 Toast.makeText(getActivity(), "提交成功", Toast.LENGTH_LONG).show();
131 132 } else {
132 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 1 package com.cnlive.gundam.user.fragment;
2 2  
  3 +import android.Manifest;
  4 +import android.app.Activity;
3 5 import android.content.Intent;
  6 +import android.content.pm.PackageManager;
4 7 import android.databinding.DataBindingUtil;
  8 +import android.net.Uri;
  9 +import android.os.Build;
5 10 import android.os.Bundle;
  11 +import android.provider.MediaStore;
6 12 import android.support.annotation.Nullable;
7 13 import android.support.v4.app.Fragment;
  14 +import android.support.v4.content.ContextCompat;
8 15 import android.support.v7.widget.LinearLayoutManager;
  16 +import android.text.TextUtils;
  17 +import android.view.Gravity;
9 18 import android.view.LayoutInflater;
10 19 import android.view.View;
11 20 import android.view.ViewGroup;
... ... @@ -14,13 +23,21 @@ import android.widget.Toast;
14 23 import com.cnlive.gundam.BR;
15 24 import com.cnlive.gundam.R;
16 25 import com.cnlive.gundam.databinding.FragmentUserPersonalBinding;
  26 +import com.cnlive.gundam.main.application.CNLiveApplication;
17 27 import com.cnlive.gundam.main.ui.adapter.DataBindingAdapter;
18 28 import com.cnlive.gundam.user.activity.UserPersonalActivity;
19 29 import com.cnlive.gundam.user.adapter.PersonalAdapter;
20 30 import com.cnlive.gundam.user.auth.UserService;
21 31 import com.cnlive.gundam.user.model.PersonalData;
22 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 41 import java.util.ArrayList;
25 42 import java.util.List;
26 43  
... ... @@ -30,7 +47,15 @@ import java.util.List;
30 47 * @time 2017/6/28 13:06
31 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 60 private FragmentUserPersonalBinding binding;
36 61  
... ... @@ -38,6 +63,11 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter
38 63  
39 64 private List<PersonalData> personalData;
40 65  
  66 + //上传头像和修改性别的PopupWindow
  67 + private SelectPopupWindow menuWindow;
  68 +
  69 + private User user;
  70 +
41 71 public static UserPersonalFragment newInstance() {
42 72  
43 73 Bundle args = new Bundle();
... ... @@ -57,27 +87,34 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter
57 87 @Override
58 88 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
59 89 super.onViewCreated(view, savedInstanceState);
60   - initData();
61 90 init();
62 91 }
63 92  
  93 + @Override
  94 + public void onResume() {
  95 + super.onResume();
  96 + initData();
  97 + }
  98 +
64 99 private void initData() {
65 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 103 personalData = new ArrayList<>();
68 104 personalData.add(new PersonalData("头像", user.getFaceurl(), PersonalData.TYPE_HEADER));
69 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 107 personalData.add(new PersonalData("手机号", user.getMobile(), PersonalData.TYPE_MOBILE));
72 108 personalData.add(new PersonalData("邮箱", user.getEmail(), PersonalData.TYPE_EMAIL));
73 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 114 private void init() {
77   - ((UserPersonalActivity)getActivity()).setTitle("个人资料");
  115 + ((UserPersonalActivity) getActivity()).setTitle("个人资料");
78 116 binding.setListAdapter(adapter = new PersonalAdapter(getActivity(), R.layout.layout_personal_item, BR.data));
79 117 binding.setLayoutManager(new LinearLayoutManager(getActivity()));
80   - adapter.updateItems(personalData);
81 118 adapter.setOnViewClickListener(this);
82 119 }
83 120  
... ... @@ -87,36 +124,200 @@ public class UserPersonalFragment extends Fragment implements DataBindingAdapter
87 124 Intent intent = null;
88 125 switch (program.getItemType()) {
89 126 case PersonalData.TYPE_HEADER:
90   - Toast.makeText(getActivity(), "头像点击", Toast.LENGTH_LONG).show();
  127 + showTakePhoto();
91 128 break;
92 129 case PersonalData.TYPE_NICK:
93 130 intent = new Intent(getActivity(), UserPersonalActivity.class);
94   - intent.putExtra("isEdit",true);
  131 + intent.putExtra("isEdit", true);
95 132 intent.putExtra("type", UserPersonalEditFragment.TYPE_NICK);
96 133 startActivity(intent);
97 134 break;
98 135 case PersonalData.TYPE_GENDER:
99   - Toast.makeText(getActivity(), "性别点击", Toast.LENGTH_LONG).show();
  136 + showSelectGender();
100 137 break;
101 138 case PersonalData.TYPE_MOBILE:
102 139 intent = new Intent(getActivity(), UserPersonalActivity.class);
103   - intent.putExtra("isEdit",true);
  140 + intent.putExtra("isEdit", true);
104 141 intent.putExtra("type", UserPersonalEditFragment.TYPE_MOBILE);
105 142 startActivity(intent);
106 143 break;
107 144 case PersonalData.TYPE_EMAIL:
108 145 intent = new Intent(getActivity(), UserPersonalActivity.class);
109   - intent.putExtra("isEdit",true);
  146 + intent.putExtra("isEdit", true);
110 147 intent.putExtra("type", UserPersonalEditFragment.TYPE_EMAIL);
111 148 startActivity(intent);
112 149 break;
113 150 case PersonalData.TYPE_ADDRESS:
114 151 intent = new Intent(getActivity(), UserPersonalActivity.class);
115   - intent.putExtra("isEdit",true);
  152 + intent.putExtra("isEdit", true);
116 153 intent.putExtra("type", UserPersonalEditFragment.TYPE_ADDRESS);
117 154 startActivity(intent);
118 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 17 public static final int TYPE_MOBILE = 0x1004;
18 18 public static final int TYPE_EMAIL = 0x1005;
19 19 public static final int TYPE_ADDRESS = 0x1006;
  20 + public static final int TYPE_LOGOUT = 0x1007;
20 21  
21 22 public PersonalData(String itemName, String itemMessage, int itemType) {
22 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 22 */
23 23  
24 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 26 private Fragment fragment;
29 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 31 @Override
35 32 protected void onCreate(@Nullable Bundle savedInstanceState) {
... ... @@ -69,10 +66,8 @@ public class PlayerActivity extends AppCompatActivity {
69 66 }
70 67  
71 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 71 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
77 72 } else {
78 73 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
... ...
app/src/main/java/com/cnlive/gundam/video/fragment/PlayerUgcLiveFragment.java
1 1 package com.cnlive.gundam.video.fragment;
2 2  
  3 +import android.Manifest;
  4 +import android.content.pm.PackageManager;
3 5 import android.content.res.Configuration;
4 6 import android.databinding.DataBindingUtil;
5 7 import android.os.Bundle;
  8 +import android.support.annotation.NonNull;
6 9 import android.support.annotation.Nullable;
7 10 import android.support.v4.app.Fragment;
8 11 import android.view.LayoutInflater;
9 12 import android.view.View;
10 13 import android.view.ViewGroup;
  14 +import android.widget.Toast;
11 15  
12 16 import com.cnlive.gundam.R;
13   -import com.cnlive.gundam.databinding.FragmentPlayerUgcVodBinding;
  17 +import com.cnlive.gundam.databinding.FragmentPlayerUgcLiveBinding;
14 18 import com.cnlive.gundam.main.model.VideoListProgram;
15 19 import com.cnlive.gundam.video.model.VideoModel;
16 20 import com.cnlive.gundam.video.utils.PlayerUtils;
  21 +import com.cnlive.gundam.video.view.BaseVideoView;
17 22 import com.cnlive.gundam.video.view.VideoView;
18 23  
19 24 /**
20 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 32 private VideoListProgram program;
27 33 private String title;
... ... @@ -57,6 +63,7 @@ public class PlayerUgcLiveFragment extends Fragment {
57 63 @Override
58 64 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
59 65 super.onViewCreated(view, savedInstanceState);
  66 + binding.videoView.setUgcLiveStatusPermissionListener(this);//必须在设置播放数据前调用
60 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 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 1 package com.cnlive.gundam.video.view;
2 2  
  3 +import android.Manifest;
3 4 import android.content.Context;
  5 +import android.content.pm.PackageManager;
4 6 import android.databinding.DataBindingUtil;
  7 +import android.os.Build;
  8 +import android.support.v4.content.ContextCompat;
5 9 import android.util.AttributeSet;
6 10 import android.util.Log;
7 11 import android.view.LayoutInflater;
... ... @@ -59,8 +63,12 @@ public abstract class BaseVideoView extends RelativeLayout implements
59 63  
60 64 private DataSource curDataSource;
61 65  
  66 + //播放器播放状态的监听
62 67 private OnVideoViewPlayStatusListener l;
63 68  
  69 + //ugclive需要权限监听
  70 + private OnUgcLiveStatusPermissionListener ugcLivePermissionListener;
  71 +
64 72 public BaseVideoView(Context context) {
65 73 this(context, null);
66 74 }
... ... @@ -99,8 +107,17 @@ public abstract class BaseVideoView extends RelativeLayout implements
99 107 public void setDataSource() {
100 108 //只有ugcLive视频才有状态监听
101 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 123 if (isLive) {
... ... @@ -113,7 +130,21 @@ public abstract class BaseVideoView extends RelativeLayout implements
113 130  
114 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 343 public interface OnVideoViewPlayStatusListener {
313 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 13  
14 14 <RelativeLayout
15 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 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 41 <Button
29 42 android:id="@+id/submit"
  43 + style="@style/LoginButtonStyle"
30 44 android:layout_width="match_parent"
31 45 android:layout_height="50dp"
32 46 android:layout_alignParentBottom="true"
33 47 android:layout_marginBottom="200dp"
34 48 android:onClick="@{userPersonalEditFragment.onClick}"
  49 + android:background="@drawable/user_btn_login"
35 50 android:text="提交" />
36 51  
37 52 </RelativeLayout>
... ...
app/src/main/res/layout/fragment_player_ugc_live.xml
... ... @@ -23,9 +23,8 @@
23 23  
24 24 <RelativeLayout
25 25 android:id="@+id/contentLayout"
26   - android:background="@android:color/black"
27 26 android:layout_width="match_parent"
28   - android:layout_height="400dp"
  27 + android:layout_height="match_parent"
29 28 android:layout_alignParentBottom="true">
30 29  
31 30 </RelativeLayout>
... ...
app/src/main/res/layout/fragment_user_personal.xml
... ... @@ -17,6 +17,7 @@
17 17 </data>
18 18  
19 19 <RelativeLayout
  20 + android:id="@+id/layout"
20 21 android:layout_width="match_parent"
21 22 android:layout_height="match_parent">
22 23  
... ... @@ -27,7 +28,7 @@
27 28 android:clipToPadding="true"
28 29 android:clipChildren="true"
29 30 android:paddingTop="5dp"
30   - android:background="@color/list_divider"
  31 + android:background="@color/gray_bg"
31 32 app:adapter="@{listAdapter}"
32 33 app:layoutManager="@{layoutManager}"/>
33 34  
... ...
app/src/main/res/layout/layout_actionbar_back.xml
... ... @@ -8,6 +8,7 @@
8 8 android:layout_height="?attr/actionBarSize"
9 9 android:theme="@style/ThemeOverlay.AppCompat.Light"
10 10 app:contentInsetEnd="?attr/actionBarSize"
  11 + android:background="@android:color/white"
11 12 android:visibility="gone"
12 13 tools:visibility="visible">
13 14  
... ...
app/src/main/res/layout/layout_personal_header_item.xml
... ... @@ -38,6 +38,7 @@
38 38 android:text="@{data.getItemName()}"
39 39 android:textColor="@color/black"
40 40 android:textSize="18sp"
  41 + android:layout_marginLeft="10dp"
41 42 tools:text="nick" />
42 43  
43 44 <ImageView
... ...
app/src/main/res/layout/layout_personal_item.xml
... ... @@ -37,6 +37,7 @@
37 37 android:text="@{data.getItemName()}"
38 38 android:textColor="@color/black"
39 39 android:textSize="18sp"
  40 + android:layout_marginLeft="10dp"
40 41 tools:text="nick" />
41 42  
42 43 <TextView
... ... @@ -48,7 +49,7 @@
48 49 android:layout_toRightOf="@+id/itemName"
49 50 android:gravity="center_vertical|right"
50 51 android:text="@{data.getItemMessage()}"
51   - android:textColor="@color/black"
  52 + android:textColor="@color/gray"
52 53 android:textSize="18sp"
53 54 tools:text="haha" />
54 55  
... ... @@ -56,7 +57,9 @@
56 57 android:layout_width="wrap_content"
57 58 android:layout_height="wrap_content"
58 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 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 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 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 100 \ No newline at end of file
... ...
app/src/main/res/values/colors.xml
... ... @@ -8,4 +8,7 @@
8 8  
9 9 <color name="rate_sel">#ff0000</color>
10 10 <color name="rate_nor">#ffffff</color>
  11 +
  12 + <color name="gray">#9e9e9e</color>
  13 + <color name="gray_bg">#dedbdb</color>
11 14 </resources>
... ...