From 8cb2ecd11380d645840f31db2ea8d76aaebc3e56 Mon Sep 17 00:00:00 2001 From: khy <18814188563@163.com> Date: Fri, 11 Nov 2016 18:17:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E8=AF=84=E8=AE=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 12 +- .../gh/common/util/ConcernContentUtils.java | 98 +++ .../com/gh/common/util/MessageShareUtils.java | 49 +- .../java/com/gh/common/util/NewsUtils.java | 16 + .../com/gh/common/util/PostCommentUtils.java | 87 +++ .../java/com/gh/common/util/TokenUtils.java | 3 +- .../gh/gamecenter/MessageDetailActivity.java | 292 +++++++++ .../adapter/MessageDetailAdapter.java | 585 ++++++++++++++++++ .../viewholder/CommentHeadViewHolder.java | 26 + .../adapter/viewholder/CommentViewHolder.java | 38 ++ .../adapter/viewholder/FooterViewHolder.java | 3 + .../com/gh/gamecenter/db/DatabaseHelper.java | 5 +- .../java/com/gh/gamecenter/db/VoteDao.java | 45 ++ .../com/gh/gamecenter/db/info/VoteInfo.java | 36 ++ .../gh/gamecenter/entity/CommentEntity.java | 60 ++ .../gh/gamecenter/entity/ConcernEntity.java | 8 + .../com/gh/gamecenter/entity/UserEntity.java | 37 ++ .../gamecenter/news/News1FragmentAdapter.java | 124 ++-- .../news/NewsConcernViewHolder.java | 6 + .../main/res/drawable-hdpi/comment_icon.png | Bin 0 -> 1792 bytes .../res/drawable-hdpi/comment_like_select.png | Bin 0 -> 598 bytes .../drawable-hdpi/comment_like_unselect.png | Bin 0 -> 598 bytes .../res/drawable-hdpi/share_icon_gray.png | Bin 683 -> 1687 bytes app/src/main/res/drawable/cursor_color.xml | 5 + app/src/main/res/drawable/et_line.xml | 8 + .../drawable/textview_comment_send_style.xml | 9 + .../res/layout/activity_message_detail.xml | 108 ++++ app/src/main/res/layout/comment_head_item.xml | 37 ++ app/src/main/res/layout/comment_item.xml | 91 +++ app/src/main/res/layout/concern_rv_item.xml | 34 +- .../main/res/layout/refresh_footerview.xml | 1 + 31 files changed, 1684 insertions(+), 139 deletions(-) create mode 100644 app/src/main/java/com/gh/common/util/ConcernContentUtils.java create mode 100644 app/src/main/java/com/gh/common/util/PostCommentUtils.java create mode 100644 app/src/main/java/com/gh/gamecenter/MessageDetailActivity.java create mode 100644 app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java create mode 100644 app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentHeadViewHolder.java create mode 100644 app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentViewHolder.java create mode 100644 app/src/main/java/com/gh/gamecenter/db/VoteDao.java create mode 100644 app/src/main/java/com/gh/gamecenter/db/info/VoteInfo.java create mode 100644 app/src/main/java/com/gh/gamecenter/entity/CommentEntity.java create mode 100644 app/src/main/java/com/gh/gamecenter/entity/UserEntity.java create mode 100644 app/src/main/res/drawable-hdpi/comment_icon.png create mode 100644 app/src/main/res/drawable-hdpi/comment_like_select.png create mode 100644 app/src/main/res/drawable-hdpi/comment_like_unselect.png create mode 100644 app/src/main/res/drawable/cursor_color.xml create mode 100644 app/src/main/res/drawable/et_line.xml create mode 100644 app/src/main/res/drawable/textview_comment_send_style.xml create mode 100644 app/src/main/res/layout/activity_message_detail.xml create mode 100644 app/src/main/res/layout/comment_head_item.xml create mode 100644 app/src/main/res/layout/comment_item.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 63e9eec1fc..a0f6f20642 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -131,11 +131,17 @@ - - - + list, Context context) { + int count = list.size(); + LinearLayout ll; + int index = 0; + for (int i = 0, size = (int) Math.ceil(list.size() / 3.0f); i < size; i++) { + switch (count % 3) { + case 0: + ll = new LinearLayout(context); + ll.setOrientation(LinearLayout.HORIZONTAL); + for (int j = 0; j < 3; j++) { + ll.addView(getImageView(list, index, width, 0, context)); + index += 1; + } + linearLayout.addView(ll); + count -= 3; + break; + case 1: + linearLayout.addView(getImageView(list, index, width, 1, context)); + count -= 1; + index += 1; + break; + case 2: + ll = new LinearLayout(context); + ll.setOrientation(LinearLayout.HORIZONTAL); + for (int j = 0; j < 2; j++) { + ll.addView(getImageView(list, index, width, 2, context)); + index += 1; + } + linearLayout.addView(ll); + count -= 2; + break; + } + } + } + + private static SimpleDraweeView getImageView(final List list, final int position, int width, int type, final Context context) { + SimpleDraweeView imageView; + if (type == 0) { + imageView = new SimpleDraweeView(context); + LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( + 0, width / 3 - DisplayUtils.dip2px(context, 4)); + lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, + DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); + lparams.weight = 1; + imageView.setLayoutParams(lparams); + ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); + } else if (type == 1) { + imageView = new SimpleDraweeView(context); + LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(width, width / 2); + lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, + DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); + imageView.setLayoutParams(lparams); + ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); + } else { + imageView = new SimpleDraweeView(context); + LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( + 0, width / 2 - DisplayUtils.dip2px(context, 4)); + lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, + DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); + lparams.weight = 1; + imageView.setLayoutParams(lparams); + ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); + } + imageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent checkIntent = new Intent(context, ViewImageActivity.class); + checkIntent.putExtra("urls", (ArrayList) list); + checkIntent.putExtra("current", position); + checkIntent.putExtra("ScaleType", "FIT_CENTER"); + context.startActivity(checkIntent); + } + }); + return imageView; + } +} diff --git a/app/src/main/java/com/gh/common/util/MessageShareUtils.java b/app/src/main/java/com/gh/common/util/MessageShareUtils.java index 2114768aa9..752b75aecd 100644 --- a/app/src/main/java/com/gh/common/util/MessageShareUtils.java +++ b/app/src/main/java/com/gh/common/util/MessageShareUtils.java @@ -5,7 +5,6 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; -import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.os.Bundle; @@ -23,10 +22,6 @@ import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; -import com.facebook.common.references.CloseableReference; -import com.facebook.datasource.DataSource; -import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; -import com.facebook.imagepipeline.image.CloseableImage; import com.gh.gamecenter.R; import com.tencent.connect.share.QQShare; import com.tencent.mm.sdk.openapi.IWXAPI; @@ -92,7 +87,7 @@ public class MessageShareUtils { contentView.setFocusableInTouchMode(true); RecyclerView shareRecyclerView = new RecyclerView(context); - shareRecyclerView.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 10), DisplayUtils.dip2px(context, 20), 0); + shareRecyclerView.setPadding(DisplayUtils.dip2px(context, 10), DisplayUtils.dip2px(context, 10), DisplayUtils.dip2px(context, 10), 0); shareRecyclerView.setBackgroundColor(Color.WHITE); //RecyclerView禁止滑动 @@ -115,7 +110,7 @@ public class MessageShareUtils { } RelativeLayout.LayoutParams rlParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT - , DisplayUtils.dip2px(context, 100)); + , DisplayUtils.dip2px(context, 106)); rlParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); contentView.addView(shareRecyclerView,rlParams); @@ -156,7 +151,7 @@ public class MessageShareUtils { linearLayout.setBackgroundResource(R.drawable.cardview_item_style); ImageView shareLogo = new ImageView(context); - LinearLayout.LayoutParams logoParams = new LinearLayout.LayoutParams(DisplayUtils.dip2px(context, 45), DisplayUtils.dip2px(context, 45)); + LinearLayout.LayoutParams logoParams = new LinearLayout.LayoutParams(DisplayUtils.dip2px(context, 43), DisplayUtils.dip2px(context, 43)); logoParams.setMargins(0, DisplayUtils.dip2px(context, 10), 0, 0); shareLogo.setLayoutParams(logoParams); @@ -309,44 +304,6 @@ public class MessageShareUtils { return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis(); } - private void loadBitMap(final String iconUrl, final WXMediaMessage msg, final SendMessageToWX.Req req){ - ImageUtils.getInstance(context).display(iconUrl, new BaseBitmapDataSubscriber() { - @Override - protected void onNewResultImpl(Bitmap bitmap) { - Bitmap compressBp = compressBitmap(bitmap); - Bitmap resultBp = addBackGround(compressBp); - msg.thumbData = Util.bmpToByteArray(resultBp, true); - api.sendReq(req); - } - - @Override - protected void onFailureImpl(DataSource> dataSource) { - Utils.log("分享获取bitmap失败"); - } - }, context); - } - - //添加背景,防止图片格式为PNG的图片分享出现黑框问题 - private Bitmap addBackGround(Bitmap result) { - Bitmap bgBitmap; - int[] colors = new int[result.getWidth()*result.getHeight()]; - for (int i = 0; i < colors.length; i++) { - colors[i] = Color.WHITE; - } - bgBitmap = Bitmap.createBitmap(colors, result.getWidth(), result.getHeight(), Bitmap.Config.ARGB_8888); - - Bitmap newmap = Bitmap - .createBitmap(result.getWidth(), result.getHeight(), Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(newmap); - canvas.drawBitmap(bgBitmap, 0, 0, null); - canvas.drawBitmap(result, (result.getHeight() - result.getWidth()) / 2, - (result.getHeight() - result.getWidth()) / 2, null); - canvas.save(Canvas.ALL_SAVE_FLAG); - canvas.restore(); - - return newmap; - } - //压缩图片 private Bitmap compressBitmap(Bitmap bitmap) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); diff --git a/app/src/main/java/com/gh/common/util/NewsUtils.java b/app/src/main/java/com/gh/common/util/NewsUtils.java index 23bf3b7806..abdb70b474 100644 --- a/app/src/main/java/com/gh/common/util/NewsUtils.java +++ b/app/src/main/java/com/gh/common/util/NewsUtils.java @@ -6,8 +6,10 @@ import android.content.Intent; import com.android.volley.Request; import com.gh.base.AppController; import com.gh.common.constant.Config; +import com.gh.gamecenter.MessageDetailActivity; import com.gh.gamecenter.NewsDetailActivity; import com.gh.gamecenter.R; +import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; @@ -49,6 +51,20 @@ public class NewsUtils { context.startActivity(intent); } + /* + * 启动消息详情页面 + */ + + public static void startMessageActivity(Context context, ConcernEntity concernEntity, String entrance) { + AppController.put("ConcernEntity", concernEntity); + Intent intent = new Intent(context, MessageDetailActivity.class); + intent.putExtra("entrance", entrance); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + + /** * 统计阅读量 * @param news_id diff --git a/app/src/main/java/com/gh/common/util/PostCommentUtils.java b/app/src/main/java/com/gh/common/util/PostCommentUtils.java new file mode 100644 index 0000000000..4210070e05 --- /dev/null +++ b/app/src/main/java/com/gh/common/util/PostCommentUtils.java @@ -0,0 +1,87 @@ +package com.gh.common.util; + +import android.content.Context; +import android.util.Log; + +import com.android.volley.Request; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.gh.base.AppController; +import com.gh.common.constant.Config; +import com.gh.gamecenter.volley.extended.StringExtendedRequest; + +/** + * Created by khy on 2016/11/9. + */ +public class PostCommentUtils { + public static void addCommentData(final String url, final String content, final Context context, final PostCommentListener listener) { + new Thread(new Runnable() { + @Override + public void run() { + Utils.log("url::" + url, "/ content::" + content); + StringExtendedRequest request = new StringExtendedRequest( + Request.Method.POST, url, content, + new Response.Listener() { + @Override + public void onResponse(String response) { + if (listener != null){ + listener.postSucced(response.toString()); + } + } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + if (listener != null){ + listener.postFailed(error); + } + } + }); + request.setShouldCache(false); + request.addHeader("TOKEN",TokenUtils.getToken(context)); + AppController.addToRequestQueue(request); + } + }).start(); + + } + + public static void addCommentVoto(final String newsId, final Context context, final PostCommentListener listener) { + new Thread(new Runnable() { + @Override + public void run() { + + StringExtendedRequest request = new StringExtendedRequest( + Request.Method.POST, Config.COMMENT_HOST + "comment/" + newsId + "/vote" , + new Response.Listener() { + @Override + public void onResponse(String response) { + Log.e("======onResponse", "onResponse"); + if (listener != null){ + listener.postSucced(response.toString()); + } + } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + Log.e("======onErrorResponse", new String(error.networkResponse.data)); + if (listener != null){ + listener.postFailed(error); + } + } + }); + request.setShouldCache(false); + request.addHeader("TOKEN",TokenUtils.getToken(context)); + AppController.addToRequestQueue(request); + } + }).start(); + + } + + public interface PostCommentListener { + void postSucced(String str); + void postFailed(VolleyError error); + } + + +} diff --git a/app/src/main/java/com/gh/common/util/TokenUtils.java b/app/src/main/java/com/gh/common/util/TokenUtils.java index ce61ad383c..3c67eb3f25 100644 --- a/app/src/main/java/com/gh/common/util/TokenUtils.java +++ b/app/src/main/java/com/gh/common/util/TokenUtils.java @@ -105,12 +105,13 @@ public class TokenUtils { // 获取用户token public static synchronized String getToken(Context context) { + //TODO 时间准确判断 SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE); String token = sp.getString("token", null); if (token != null) { long expire = sp.getLong("token_expire", 0) * 1000 - 10 * 1000; - long time = System.currentTimeMillis(); + long time = System.currentTimeMillis();//TODO 用户有可能修改手机时间,导致没能判断Token是否过期 // 判断token是否过期 if (time < expire) { // token未过期 diff --git a/app/src/main/java/com/gh/gamecenter/MessageDetailActivity.java b/app/src/main/java/com/gh/gamecenter/MessageDetailActivity.java new file mode 100644 index 0000000000..b81be0b6f8 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/MessageDetailActivity.java @@ -0,0 +1,292 @@ +package com.gh.gamecenter; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.android.volley.VolleyError; +import com.android.volley.toolbox.DiskBasedCache; +import com.facebook.drawee.view.SimpleDraweeView; +import com.gh.base.BaseActivity; +import com.gh.common.constant.Config; +import com.gh.common.util.GzipUtils; +import com.gh.common.util.PostCommentUtils; +import com.gh.common.util.TimestampUtils; +import com.gh.common.util.TokenUtils; +import com.gh.common.util.Utils; +import com.gh.gamecenter.adapter.MessageDetailAdapter; +import com.gh.gamecenter.entity.CommentEntity; +import com.gh.gamecenter.entity.UserEntity; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.util.Date; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import butterknife.OnTouch; + +/** + * Created by khy on 2016/11/8. + */ +public class MessageDetailActivity extends BaseActivity{ + + @BindView(R.id.message_detail_rv) RecyclerView mMessageDetailRv; + @BindView(R.id.message_detail_user_rl) RelativeLayout mMessageDetailUserRl; + @BindView(R.id.message_detail_comment_rl) RelativeLayout mMessageDetailCommentRl; + @BindView(R.id.comment_user_icon) SimpleDraweeView mMessageDetailIconDv; + @BindView(R.id.comment_user_name) TextView mMessageDetailUserNameTv; + @BindView(R.id.comment_send) TextView mMessageDetailCommentSend; + @BindView(R.id.message_detail_comment_et) EditText mMessageDetailEt; + @BindView(R.id.message_detail_comment_hint) TextView mMessageDetailCommentHint; + + private LinearLayoutManager mLayoutManager; + + private MessageDetailAdapter mMessageDetailAdapter; + + private SharedPreferences sp; + + private boolean isDone; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + View contentView = View.inflate(this, R.layout.activity_message_detail, null); + init(contentView, "消息详情"); + + ButterKnife.bind(this); + + sp = getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE); + + isDone = false; + + mMessageDetailAdapter = new MessageDetailAdapter(this); + mLayoutManager = new LinearLayoutManager(this); + mMessageDetailRv.setLayoutManager(mLayoutManager); + mMessageDetailRv.setAdapter(mMessageDetailAdapter); + + mMessageDetailIconDv.setImageURI(sp.getString("user_icon", null)); + mMessageDetailUserNameTv.setText(sp.getString("user_name", "光环用户")); + + mMessageDetailEt.addTextChangedListener(watcher); + mMessageDetailCommentSend.setEnabled(false); + + mMessageDetailRv.setOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (newState == RecyclerView.SCROLL_STATE_IDLE && !isDone && !mMessageDetailAdapter.isLoading() && + mLayoutManager.findLastVisibleItemPosition() == mMessageDetailAdapter.getItemCount() -1) { + + mMessageDetailAdapter.addNormalComment(mMessageDetailAdapter.getItemCount() + - mMessageDetailAdapter.getHotCommentListSize() - 3); + + } + } + }); + } + + private TextWatcher watcher = new TextWatcher() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (s.toString().trim().length() > 0 ) { + mMessageDetailCommentSend.setEnabled(true); + + if (count > 140) { + mMessageDetailEt.setText(""); + String newText = s.toString().substring(0, 140); + mMessageDetailEt.setText(newText); + Utils.toast(MessageDetailActivity.this, "评论不能多于140字"); + } + } else { + mMessageDetailCommentSend.setEnabled(false); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void afterTextChanged(Editable s) { + } + }; + + + @OnClick(R.id.message_detail_comment_hint) + public void OnHintClikListener() { + mMessageDetailCommentHint.setVisibility(View.GONE); + mMessageDetailCommentRl.setVisibility(View.VISIBLE); + mMessageDetailUserRl.setVisibility(View.VISIBLE); + mMessageDetailEt.setFocusable(true); + mMessageDetailEt.setFocusableInTouchMode(true); + mMessageDetailEt.requestFocus(); + setSoftInput(true); + } + + @OnTouch(R.id.message_detail_rv) + public boolean OnRecyclerTouchListener () { + if (mMessageDetailCommentRl.getVisibility() == View.VISIBLE) { + mMessageDetailCommentHint.setVisibility(View.VISIBLE); + mMessageDetailCommentRl.setVisibility(View.GONE); + mMessageDetailUserRl.setVisibility(View.GONE); + mMessageDetailEt.setText(""); + setSoftInput(false); + } + return false; + } + + @OnClick(R.id.comment_send) + public void OnSendCommentListener() { + final String content = mMessageDetailEt.getText().toString(); + + if (content.length() ==0) { + Utils.toast(MessageDetailActivity.this, "评论内容不能为空!"); + return; + } + JSONObject jsonObject = new JSONObject(); + try { + jsonObject.put("content", content); + } catch (JSONException e) { + e.printStackTrace(); + } + + final String newsId = mMessageDetailAdapter.getNewsId(); + PostCommentUtils.addCommentData(Config.COMMENT_HOST + "article/" + newsId + "/comment" + , jsonObject.toString(), MessageDetailActivity.this, new PostCommentUtils.PostCommentListener() { + @Override + public void postSucced(String str) { + if (str == null) return; + + JSONObject succedJson; + String commentId = null; + try { + succedJson = new JSONObject(str); + commentId = succedJson.getString("_id"); + } catch (JSONException e) { + e.printStackTrace(); + } + Utils.toast(MessageDetailActivity.this, "发表成功"); + mMessageDetailCommentHint.setVisibility(View.VISIBLE); + mMessageDetailCommentRl.setVisibility(View.GONE); + mMessageDetailUserRl.setVisibility(View.GONE); + mMessageDetailEt.setText(""); + setSoftInput(false); + + + List normalCommentList = mMessageDetailAdapter.getNormalCommentList(); + CommentEntity commentEntity = new CommentEntity(); + UserEntity userEntity = new UserEntity(); + userEntity.setIcon(sp.getString("user_icon", null)); + userEntity.setName(sp.getString("user_name", "光环用户")); + userEntity.setId(TokenUtils.getDeviceId(MessageDetailActivity.this)); + commentEntity.setContent(content); + commentEntity.setId(commentId); + commentEntity.setVote(0); + commentEntity.setTime(new Date().getTime()/1000); + commentEntity.setUser(userEntity); + normalCommentList.add(0, commentEntity); + JSONObject cacheObject = new JSONObject(); + + try { + JSONObject cacheUser = new JSONObject(); + cacheUser.put("_id", TokenUtils.getDeviceId(MessageDetailActivity.this)); + cacheUser.put("icon", sp.getString("user_icon", null)); + cacheUser.put("name", sp.getString("user_name", "光环用户")); + cacheObject.put("_id", commentId); + cacheObject.put("content", content); + cacheObject.put("time", new Date().getTime()/1000); + cacheObject.put("vote", 0); + cacheObject.put("user", cacheUser); + + } catch (JSONException e) { + e.printStackTrace(); + } + modifyNewsCommentVolleyCache(0, cacheObject, newsId); + mMessageDetailAdapter.notifyItemInserted(mMessageDetailAdapter.getHotCommentListSize() + 2); + } + + @Override + public void postFailed(VolleyError error) { + Utils.log("提交失败" + new String(error.networkResponse.data)); + + if (error.networkResponse.data == null) return; + + String errorData = new String(error.networkResponse.data); + try { + JSONObject errorJson = new JSONObject(errorData); + String detail = errorJson.getString("detail"); + if ("too frequent".equals(detail)) { + Utils.toast(MessageDetailActivity.this, "@_@ 别话痨哦~休息一会再来评论吧~"); + } else if ("silence".equals(detail)) { + Utils.toast(MessageDetailActivity.this, "账号状态异常,暂时无法发表评论"); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + } + }); + } + + private static final String DEFAULT_CACHE_DIR = "volley"; + private void modifyNewsCommentVolleyCache(int offset, JSONObject commentData, String id) { + File cacheDir = new File(getCacheDir(), DEFAULT_CACHE_DIR); + DiskBasedCache cache = new DiskBasedCache(cacheDir); + String key = TimestampUtils.addTimestamp(Config.COMMENT_HOST + "article/" + id + "/comment?limit=10&offset=" + offset); + byte[] data = cache.getData(key); + if (data != null) { + try { + JSONArray jsonArray = new JSONArray(new String(GzipUtils.decompressBytes(data))); + JSONArray newComment = new JSONArray(); + newComment.put(commentData); + for (int i = 0, size = jsonArray.length() > 9 ? 9 : jsonArray.length(); i < size; i++) { + newComment.put(jsonArray.get(i)); + } + Utils.log(newComment.toString()); + cache.modify(key, GzipUtils.compressBytes(newComment.toString().getBytes())); + if (jsonArray.length() == 10) { + modifyNewsCommentVolleyCache(offset + 10, jsonArray.getJSONObject(9), id); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } else { + Utils.log("modifyNewsCommentVolleyCache is null"); + } + } + + + @Override + public void loadDone() { + super.loadDone(); + isDone = true; + } + + //软键盘控制 + private void setSoftInput(boolean isShow) { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + if (isShow){ + imm.showSoftInputFromInputMethod(mMessageDetailEt.getWindowToken(), 0); + imm.toggleSoftInputFromWindow(mMessageDetailEt.getWindowToken(), 0, InputMethodManager.HIDE_NOT_ALWAYS); + } else { + imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); + } + + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java new file mode 100644 index 0000000000..2140eb90e8 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java @@ -0,0 +1,585 @@ +package com.gh.gamecenter.adapter; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.RecyclerView; +import android.text.Html; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import com.android.volley.Request; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.android.volley.toolbox.DiskBasedCache; +import com.gh.base.AppController; +import com.gh.common.constant.Config; +import com.gh.common.util.ConcernContentUtils; +import com.gh.common.util.DataUtils; +import com.gh.common.util.DisplayUtils; +import com.gh.common.util.GzipUtils; +import com.gh.common.util.PostCommentUtils; +import com.gh.common.util.Utils; +import com.gh.common.view.CardLinearLayout; +import com.gh.gamecenter.GameNewsActivity; +import com.gh.gamecenter.MessageDetailActivity; +import com.gh.gamecenter.NewsDetailActivity; +import com.gh.gamecenter.R; +import com.gh.gamecenter.ShareCardActivity; +import com.gh.gamecenter.ShareCardPicActivity; +import com.gh.gamecenter.WebActivity; +import com.gh.gamecenter.adapter.viewholder.CommentHeadViewHolder; +import com.gh.gamecenter.adapter.viewholder.CommentViewHolder; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.db.VoteDao; +import com.gh.gamecenter.db.info.VoteInfo; +import com.gh.gamecenter.entity.CommentEntity; +import com.gh.gamecenter.entity.ConcernEntity; +import com.gh.gamecenter.eventbus.EBReuse; +import com.gh.gamecenter.listener.OnCallBackListener; +import com.gh.gamecenter.manager.DataCollectionManager; +import com.gh.gamecenter.news.News1Fragment; +import com.gh.gamecenter.news.NewsConcernViewHolder; +import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; +import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import de.greenrobot.event.EventBus; + +/** + * Created by khy on 2016/11/8. + */ +public class MessageDetailAdapter extends RecyclerView.Adapter { + + private Context mContext; + private ConcernEntity mConcernEntity; + + private List mHotCommentList; + private List mNormalCommentList; + + private OnCallBackListener listener; + + private VoteDao mVoteDao; + + private List mVoteList; + + private boolean isDone; + private boolean isLoading; + private boolean isloadError; + + private static final int ITEM_TOP = 100; + private static final int ITEM_TITLE = 101; + private static final int ITEM_COMMENT = 102; + private static final int ITEM_FOOTER = 103; + + public MessageDetailAdapter(MessageDetailActivity context) { + this.listener = context; + this.mContext = context; + + mVoteDao = new VoteDao(context); + mVoteList = mVoteDao.getAll(); + + isDone = false; + isLoading = false; + isloadError = false; + + mHotCommentList = new ArrayList<>(); + mNormalCommentList = new ArrayList<>(); + + mConcernEntity = (ConcernEntity) AppController.get("ConcernEntity", true); + + addHotComment(0); +} + + private void addHotComment(int offset) { + + String hotCommentUrl = Config.COMMENT_HOST + "article/" + mConcernEntity.getId() + + "/comment?order=hot&limit=" + 10 + "&offset=" + offset; + + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(hotCommentUrl, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + List list = gson.fromJson(response.toString(), listType); + + if (list.size() != 0) { + mHotCommentList.addAll(list); +// notifyItemRangeInserted(1, mHotCommentList.size() + 1); + notifyDataSetChanged(); + } + addNormalComment(mNormalCommentList.size()); + } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + addNormalComment(mNormalCommentList.size()); + } + }); + + AppController.addToRequestQueue(request, GameNewsActivity.TAG); + } + public void addNormalComment(int offset) { + + isLoading = true; + String commentUrl = Config.COMMENT_HOST + "article/" + mConcernEntity.getId() + + "/comment?limit=" + 10 + "&offset=" + offset; + + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( commentUrl, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + List list = gson.fromJson(response.toString(), listType); + + if (list.size() < 10) { + isDone = true; + listener.loadDone(); + } + + if (list.size() != 0) { + mNormalCommentList.addAll(list); + } + + isLoading = false; + notifyDataSetChanged(); + } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + isDone = true; + isLoading = false; + isloadError = true; + notifyDataSetChanged(); + } + }); + + AppController.addToRequestQueue(request, GameNewsActivity.TAG); + } + + + @Override + public int getItemViewType(int position) { + int index; + if (mHotCommentList.size() == 0) { + index = 1; + } else { + index = 2; + } + + if (position == 0 && mConcernEntity != null) { + return ITEM_TOP; + } else if (mHotCommentList.size() != 0 && position == 1 || + mNormalCommentList.size() != 0 && mHotCommentList.size() + index == position ) { + return ITEM_TITLE; + } else if (getItemCount() == position + 1) { + return ITEM_FOOTER; + } + return ITEM_COMMENT; + } + + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case ITEM_TOP: + view = LayoutInflater.from(mContext).inflate(R.layout.concern_rv_item, parent, false); + return new NewsConcernViewHolder(view); + case ITEM_TITLE: + view = LayoutInflater.from(mContext).inflate(R.layout.comment_head_item, parent, false); + return new CommentHeadViewHolder(view); + case ITEM_COMMENT: + view = LayoutInflater.from(mContext).inflate(R.layout.comment_item, parent, false); + return new CommentViewHolder(view); + case ITEM_FOOTER: + view = LayoutInflater.from(mContext).inflate(R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view); + default: + return null; + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + + if (holder instanceof NewsConcernViewHolder) { + initConcernViewHolder((NewsConcernViewHolder) holder); + } else if (holder instanceof CommentHeadViewHolder) { + if (mHotCommentList.size() != 0 && position == 1) { + ((CommentHeadViewHolder) holder).commentHeadTitleTv.setText("热门评论"); + } else { + ((CommentHeadViewHolder) holder).commentHeadTitleTv.setText("最新评论"); + } + } else if (holder instanceof CommentViewHolder) { + + int index; + if (mHotCommentList.size() == 0) { + index = 2; + } else { + index = 3; + } + int commentPosition = 0; + boolean isHotComment = false; + CommentEntity commentEntity = null; + if (mHotCommentList.size() != 0 && mHotCommentList.size() >= position -2) { + commentEntity = mHotCommentList.get(position -2); + commentPosition = position - 2; + isHotComment = true; + } else if (mNormalCommentList.size() != 0 && + mNormalCommentList.size() >= position - mHotCommentList.size() - index) { + commentPosition = position - mHotCommentList.size() - index; + commentEntity = mNormalCommentList.get(position - mHotCommentList.size() - index); + isHotComment = false; + } + + initCommentViewHolder((CommentViewHolder) holder, commentEntity, commentPosition, isHotComment); + } else if (holder instanceof FooterViewHolder) { + FooterViewHolder viewHolder = (FooterViewHolder) holder; + initFooterViewHolder(viewHolder); + } + } + + @Override + public int getItemCount() { + int itemCount = 0; + if (mHotCommentList.size() != 0) { + itemCount = itemCount + mHotCommentList.size() + 1; + } + if (mNormalCommentList.size() != 0) { + itemCount = itemCount + mNormalCommentList.size() + 1; + } + if (mConcernEntity != null) { + itemCount = itemCount + 1; + } + + return itemCount + 1; + } + private void initFooterViewHolder(final FooterViewHolder viewHolder) { + if (!isDone) { + viewHolder.footerview_tv_loading.setText("加载中..."); + viewHolder.footerview_progressbar.setVisibility(View.VISIBLE); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + viewHolder.footerview_item.setLayoutParams(params); + } else if (isloadError || mNormalCommentList.size() == 0 && mHotCommentList.size() == 0) { + viewHolder.footerview_progressbar.setVisibility(View.GONE); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(mContext, 185)); + if (isloadError) { + viewHolder.footerview_tv_loading.setText("网络错误,点击重试!"); + } else { + viewHolder.footerview_item.setLayoutParams(params); + viewHolder.footerview_tv_loading.setText("目前还没有评论"); + } + } else{ + viewHolder.footerview_tv_loading.setText("没有更多评论啦.."); + viewHolder.footerview_progressbar.setVisibility(View.GONE); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + viewHolder.footerview_item.setLayoutParams(params); + } + + viewHolder.footerview_item.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (isloadError) { + viewHolder.footerview_progressbar.setVisibility(View.VISIBLE); + viewHolder.footerview_tv_loading.setText("加载中..."); + addHotComment(0); + } + } + }); + } + + private void initConcernViewHolder(NewsConcernViewHolder viewHolder) { + ((CardLinearLayout) viewHolder.itemView).setmTop(DisplayUtils.dip2px(mContext, 8)); + ((CardLinearLayout) viewHolder.itemView).setmBottom(0); + + if (mConcernEntity.getMessageDetailViews() != 0) { + viewHolder.concernRead.setText("阅读 " +mConcernEntity.getMessageDetailViews() ); + } + + if (mConcernEntity.getLink() != null) { + viewHolder.concernLinkIcon.setImageResource(R.drawable.link_iv); + } else { + viewHolder.concernLinkIcon.setImageResource(R.drawable.concern_message_icon); + } + + if (mConcernEntity.getBrief() != null) { + viewHolder.concernContent.setText(Html.fromHtml(mConcernEntity.getBrief())); + viewHolder.concernContent.setMaxLines(100); + } else { + viewHolder.concernContent.setText(Html.fromHtml(mConcernEntity.getContent())); + viewHolder.concernContent.setMaxLines(5); + } + + if (mConcernEntity.getImg().size() == 0) { + viewHolder.contentPicLl.setVisibility(View.GONE); + viewHolder.contentPicLl.removeAllViews(); + } else { + viewHolder.contentPicLl.setVisibility(View.VISIBLE); + viewHolder.contentPicLl.removeAllViews(); + ConcernContentUtils.addContentPic(mContext.getResources().getDisplayMetrics().widthPixels + - DisplayUtils.dip2px(mContext, 34), viewHolder.contentPicLl, mConcernEntity.getImg(), mContext); + } + + viewHolder.concernThumb.setImageURI(mConcernEntity.getGameIcon()); + viewHolder.concernTitle.setText(mConcernEntity.getGameName()); + SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); + + try { + long today = format.parse(format.format(new Date())).getTime(); + long day = Long.valueOf(mConcernEntity.getTime() + "000"); + if (day >= today && day < today + 86400 * 1000) { + format.applyPattern("HH:mm"); + viewHolder.concerntTime.setText("今天 " + format.format(day)); + } else if (day >= today - 86400 * 1000 && day < today) { + format.applyPattern("HH:mm"); + viewHolder.concerntTime.setText("昨天 " + format.format(day)); + } else { + format.applyPattern("yyyy年MM月dd日 HH:mm"); + viewHolder.concerntTime.setText(format.format(day)); + } + } catch (ParseException e) { + e.printStackTrace(); + format.applyPattern("yyyy年MM月dd日 HH:mm"); + viewHolder.concerntTime.setText(format.format(Long.valueOf(mConcernEntity.getTime() + "000"))); + } + + viewHolder.concernShareIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mConcernEntity.getImg() != null && mConcernEntity.getImg().size() > 0) { + Intent intent = new Intent(mContext, ShareCardPicActivity.class); + Bundle bundle = new Bundle(); + bundle.putString("gameName", mConcernEntity.getGameName()); + bundle.putString("gameIconUrl", mConcernEntity.getGameIcon()); + bundle.putString("shareContent", mConcernEntity.getContent()); + bundle.putStringArrayList("shareArrImg", (ArrayList) mConcernEntity.getImg()); + intent.putExtras(bundle); + mContext.startActivity(intent); + } else { + Intent intent = new Intent(mContext, ShareCardActivity.class); + Bundle bundle = new Bundle(); + bundle.putString("gameName", mConcernEntity.getGameName()); + bundle.putString("gameIconUrl", mConcernEntity.getGameIcon()); + bundle.putString("shareContent", mConcernEntity.getContent()); + intent.putExtras(bundle); + mContext.startActivity(intent); + } + } + }); + + viewHolder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Map kv = new HashMap<>(); + kv.put("名字", mConcernEntity.getTitle()); +// kv.put("位置", String.valueOf(viewHolder.getPosition() + 1)); + DataUtils.onEvent(mContext, "点击", "消息详情", kv); + + Map map = new HashMap<>(); +// map.put("location", "列表"); + map.put("page", "消息详情"); + map.put("news", mConcernEntity.getTitle()); + map.put("news_id", mConcernEntity.getId()); + DataCollectionManager.onEvent(mContext, "click-item", map); + + //统计阅读量 + statNewsViews(mConcernEntity.getId()); + + if (mConcernEntity.getLink() != null){ + Intent intent = new Intent(mContext, WebActivity.class); + intent.putExtra("url", + mConcernEntity.getLink()); + intent.putExtra("gameName", mConcernEntity.getGameName()); + mContext.startActivity(intent); + }else { + Intent intent = new Intent(mContext, NewsDetailActivity.class); + intent.putExtra("newsId", mConcernEntity.getId()); + intent.putExtra("entrance", "(消息详情)"); + mContext.startActivity(intent); + } + EventBus.getDefault().post(new EBReuse("statNewsViews")); + + } + }); + } + + private void initCommentViewHolder(final CommentViewHolder holder, final CommentEntity commentEntity, final int position, final boolean isHotComment) { + holder.commentContentTv.setText(commentEntity.getContent()); + if (commentEntity.getVote() == 0) { + holder.commentLikeCountTv.setVisibility(View.GONE); + } else { + for (VoteInfo voteInfo : mVoteList) { + if (voteInfo.getCommentId().equals(commentEntity.getId())) { + holder.commentLikeCountTv.setTextColor(mContext.getResources().getColor(R.color.theme)); + holder.commentLikeIv.setImageResource(R.drawable.comment_like_select); + break; + } else { + holder.commentLikeCountTv.setTextColor(mContext.getResources().getColor(R.color.hint)); + holder.commentLikeIv.setImageResource(R.drawable.comment_like_unselect); + } + } + holder.commentLikeCountTv.setVisibility(View.VISIBLE); + holder.commentLikeCountTv.setText(commentEntity.getVote() + ""); + } + + holder.commentUserNameTv.setText(commentEntity.getUser().getName()); + holder.commentUserIconDv.setImageURI(commentEntity.getUser().getIcon()); + SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); + try { + long today = format.parse(format.format(new Date())).getTime(); + long day = Long.valueOf(commentEntity.getTime() + "000"); + if (day >= today && day < today + 86400 * 1000) { + long min = new Date().getTime()/1000 - day/1000; + int hour = (int) (min/ (60 * 60)); + if (hour == 0) { + if (min < 60) { + holder.commentTimeTv.setText("刚刚"); + } else { + holder.commentTimeTv.setText((int)(min/60) + "分钟前"); + } + } else { + holder.commentTimeTv.setText(hour + "小时前"); + } + } else if (day >= today - 86400 * 1000 && day < today) { + format.applyPattern("HH:mm"); + holder.commentTimeTv.setText("昨天 "); + } else { + format.applyPattern("yyyy-MM-dd"); + holder.commentTimeTv.setText(format.format(day)); + } + } catch (ParseException e) { + e.printStackTrace(); + format.applyPattern("yyyy-MM-dd"); + holder.commentTimeTv.setText(format.format(Long.valueOf(mConcernEntity.getTime() + "000"))); + } + + holder.commentLikeIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (holder.commentLikeCountTv.getCurrentTextColor() == mContext.getResources().getColor(R.color.theme)) { + Utils.toast(mContext, "已经点过赞啦!"); + return; + } + PostCommentUtils.addCommentVoto(commentEntity.getId(), mContext, null); + holder.commentLikeCountTv.setTextColor(mContext.getResources().getColor(R.color.theme)); + holder.commentLikeIv.setImageResource(R.drawable.comment_like_select); + holder.commentLikeCountTv.setText((commentEntity.getVote() +1) + ""); + holder.commentLikeCountTv.setVisibility(View.VISIBLE); + + mVoteDao.add(new VoteInfo(commentEntity.getId())); + + int index = (position/10) * 10; + + String cacheUrl; + if (isHotComment) { + cacheUrl = Config.COMMENT_HOST + "article/" + mConcernEntity.getId() + + "/comment?order=hot&limit=" + 10 + "&offset=" + index; + } else { + cacheUrl = Config.COMMENT_HOST + "article/" + mConcernEntity.getId() + + "/comment?limit=" + 10 + "&offset=" + index; + } + + modifyVolleyCache(commentEntity.getId(), cacheUrl); + } + }); + } + + private void statNewsViews(final String news_id) { + String url = Config.DATA_HOST + "news/stat?news_id=" + news_id; + JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( + Request.Method.POST, url, + new Response.Listener() { + @Override + public void onResponse(JSONObject response) { + try { + if ("success".equals(response.getString("status"))) { + + mConcernEntity.setMessageDetailViews(mConcernEntity.getMessageDetailViews() +1); + notifyItemChanged(0); + + //TODO 修改关注资讯volley缓存 + + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }, null); + request.setShouldCache(false); + AppController.addToRequestQueue(request, News1Fragment.TAG); + } + + private static final String DEFAULT_CACHE_DIR = "volley"; + + private void modifyVolleyCache(String id, String url) { + if (url == null) { + return; + } + File cacheDir = new File(mContext.getCacheDir(), DEFAULT_CACHE_DIR); + DiskBasedCache cache = new DiskBasedCache(cacheDir); + byte[] data = cache.getData(url); + if (data != null) { + try { + JSONArray jsonArray = new JSONArray(new String(GzipUtils.decompressBytes(data))); + Log.e("modifyVolleyCache11111", jsonArray.toString()); + JSONObject jsonObject; + for (int i = 0, size = jsonArray.length(); i < size; i++) { + jsonObject = jsonArray.getJSONObject(i); + if (jsonObject.getString("_id").equals(id)) { + jsonObject.put("vote", jsonObject.getInt("vote") + 1); + break; + } + } + Utils.log(jsonArray.toString()); + Log.e("modifyVolleyCache2222", jsonArray.toString()); + cache.modify(url, GzipUtils.compressBytes(jsonArray.toString().getBytes())); + } catch (JSONException e) { + e.printStackTrace(); + } + } else { + Utils.log("modifyVolleyCache is null"); + } + } + + public String getNewsId (){ + return mConcernEntity.getId(); + } + public boolean isLoading() { + return isLoading; + } + public List getNormalCommentList (){ + return mNormalCommentList; + } + + public int getHotCommentListSize (){ + int index = 0; + if (mHotCommentList.size() != 0) { + index = mHotCommentList.size() + 1; + } + return index; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentHeadViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentHeadViewHolder.java new file mode 100644 index 0000000000..111ca06bef --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentHeadViewHolder.java @@ -0,0 +1,26 @@ +package com.gh.gamecenter.adapter.viewholder; + +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.TextView; + +import com.gh.gamecenter.R; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * Created by khy on 2016/11/9. + */ +public class CommentHeadViewHolder extends RecyclerView.ViewHolder { + + @BindView(R.id.comment_head_line) + public View commentHeadLine; + @BindView(R.id.comment_head_title) + public TextView commentHeadTitleTv; + + public CommentHeadViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentViewHolder.java new file mode 100644 index 0000000000..487753aaf3 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/CommentViewHolder.java @@ -0,0 +1,38 @@ +package com.gh.gamecenter.adapter.viewholder; + +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.facebook.drawee.view.SimpleDraweeView; +import com.gh.gamecenter.R; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * Created by khy on 2016/11/9. + */ +public class CommentViewHolder extends RecyclerView.ViewHolder { + + @BindView(R.id.comment_line) + public View commentLine; + @BindView(R.id.comment_content) + public TextView commentContentTv; + @BindView(R.id.comment_like) + public ImageView commentLikeIv; + @BindView(R.id.comment_like_count) + public TextView commentLikeCountTv; + @BindView(R.id.comment_time) + public TextView commentTimeTv; + @BindView(R.id.comment_user_icon) + public SimpleDraweeView commentUserIconDv; + @BindView(R.id.comment_user_name) + public TextView commentUserNameTv; + + public CommentViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/FooterViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/FooterViewHolder.java index e8fc4bc749..739f6cc282 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/FooterViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/FooterViewHolder.java @@ -3,6 +3,7 @@ package com.gh.gamecenter.adapter.viewholder; import android.support.v4.widget.ContentLoadingProgressBar; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.View; +import android.widget.LinearLayout; import android.widget.TextView; import com.gh.gamecenter.R; @@ -18,6 +19,7 @@ import com.gh.gamecenter.R; public class FooterViewHolder extends ViewHolder { public ContentLoadingProgressBar footerview_progressbar; + public LinearLayout footerview_item; public TextView footerview_tv_loading; public View footerview_line1; public View footerview_line2; @@ -29,6 +31,7 @@ public class FooterViewHolder extends ViewHolder { footerview_tv_loading = (TextView) view.findViewById(R.id.footerview_tv_loading); footerview_line1 = view.findViewById(R.id.footerview_line1); footerview_line2 = view.findViewById(R.id.footerview_line2); + footerview_item = (LinearLayout) view.findViewById(R.id.footerview_item); } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/db/DatabaseHelper.java b/app/src/main/java/com/gh/gamecenter/db/DatabaseHelper.java index 86a48e0827..c74ad54603 100644 --- a/app/src/main/java/com/gh/gamecenter/db/DatabaseHelper.java +++ b/app/src/main/java/com/gh/gamecenter/db/DatabaseHelper.java @@ -10,6 +10,7 @@ import com.gh.gamecenter.db.info.DataCollectionInfo; import com.gh.gamecenter.db.info.FilterInfo; import com.gh.gamecenter.db.info.GameInfo; import com.gh.gamecenter.db.info.SearchHistoryInfo; +import com.gh.gamecenter.db.info.VoteInfo; import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.support.ConnectionSource; @@ -20,7 +21,7 @@ import java.sql.SQLException; public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final String DATABASE_NAME = "gh_assist.db"; - private static final int DATABASE_VERSION = 2; + private static final int DATABASE_VERSION = 3; private static DatabaseHelper instance; private ArrayMap daos = new ArrayMap(); @@ -58,6 +59,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { TableUtils.createTable(connectionSource, GameInfo.class); TableUtils.createTable(connectionSource, FilterInfo.class); TableUtils.createTable(connectionSource, DataCollectionInfo.class); + TableUtils.createTable(connectionSource, VoteInfo.class); } catch (SQLException e) { e.printStackTrace(); @@ -75,6 +77,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { TableUtils.dropTable(connectionSource, GameInfo.class, true); TableUtils.dropTable(connectionSource, FilterInfo.class, true); TableUtils.dropTable(connectionSource, DataCollectionInfo.class, true); + TableUtils.dropTable(connectionSource, VoteInfo.class, true); onCreate(database, connectionSource); } catch (SQLException e) { diff --git a/app/src/main/java/com/gh/gamecenter/db/VoteDao.java b/app/src/main/java/com/gh/gamecenter/db/VoteDao.java new file mode 100644 index 0000000000..75fdc30709 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/db/VoteDao.java @@ -0,0 +1,45 @@ +package com.gh.gamecenter.db; + +import android.content.Context; + +import com.gh.gamecenter.db.info.VoteInfo; +import com.j256.ormlite.dao.Dao; + +import java.sql.SQLException; +import java.util.List; + +/** + * Created by khy on 2016/11/11. + */ + +public class VoteDao { + private DatabaseHelper helper; + private Dao dao; + + public VoteDao(Context context) { + try { + helper = DatabaseHelper.getHelper(context); + dao = helper.getDao(VoteInfo.class); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void add(VoteInfo vote) { + try { + dao.create(vote); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public List getAll() { + try { + return dao.queryForAll(); + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/db/info/VoteInfo.java b/app/src/main/java/com/gh/gamecenter/db/info/VoteInfo.java new file mode 100644 index 0000000000..f79f89549c --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/db/info/VoteInfo.java @@ -0,0 +1,36 @@ +package com.gh.gamecenter.db.info; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +import java.io.Serializable; + +/** + * Created by khy on 2016/11/11. + */ + +@DatabaseTable(tableName = "tb_vote") +public class VoteInfo implements Serializable { + + @DatabaseField(id = true, columnName = "commentId") + private String commentId; + + public String getCommentId() { + return commentId; + } + + public void setCommentId(String commentId) { + this.commentId = commentId; + } + + public VoteInfo(String commentId) { + this.commentId = commentId; + } + + public VoteInfo() {} + + @Override + public String toString() { + return "VoteEntity [commentId=" + commentId + "]"; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/entity/CommentEntity.java b/app/src/main/java/com/gh/gamecenter/entity/CommentEntity.java new file mode 100644 index 0000000000..0c32fca87c --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/CommentEntity.java @@ -0,0 +1,60 @@ +package com.gh.gamecenter.entity; + +import com.google.gson.annotations.SerializedName; + +/** + * Created by khy on 2016/11/8. + */ +public class CommentEntity { + + @SerializedName("_id") + private String Id; + + private UserEntity user; + + private String content; + + private int vote; + + private long time; + + public String getId() { + return Id; + } + + public void setId(String id) { + Id = id; + } + + public UserEntity getUser() { + return user; + } + + public void setUser(UserEntity user) { + this.user = user; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public int getVote() { + return vote; + } + + public void setVote(int vote) { + this.vote = vote; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/entity/ConcernEntity.java b/app/src/main/java/com/gh/gamecenter/entity/ConcernEntity.java index cbc1d8cd85..cc09e9ef74 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ConcernEntity.java +++ b/app/src/main/java/com/gh/gamecenter/entity/ConcernEntity.java @@ -20,6 +20,14 @@ public class ConcernEntity { private List img; private String link; private String brief; + private int messageDetailViews; + + public int getMessageDetailViews() { + return messageDetailViews; + } + public void setMessageDetailViews(int messageDetailViews) { + this.messageDetailViews = messageDetailViews; + } public String getBrief() { return brief; diff --git a/app/src/main/java/com/gh/gamecenter/entity/UserEntity.java b/app/src/main/java/com/gh/gamecenter/entity/UserEntity.java new file mode 100644 index 0000000000..2a5d912f24 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/UserEntity.java @@ -0,0 +1,37 @@ +package com.gh.gamecenter.entity; + +import com.google.gson.annotations.SerializedName; + +/** + * Created by khy on 2016/11/8. + */ +public class UserEntity { + + @SerializedName("_id") + private String Id; + + private String icon; + + private String name; + + public void setId(String Id) { + this.Id = Id; + } + public String getId() { + return Id; + } + + public void setIcon(String icon) { + this.icon = icon; + } + public String getIcon() { + return icon; + } + + public void setName(String name) { + this.name = name; + } + public String getName() { + return name; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java index 9924e8d877..ba98fdedf6 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java @@ -2,13 +2,13 @@ package com.gh.gamecenter.news; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.support.v4.util.ArrayMap; import android.support.v7.widget.RecyclerView; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.LinearLayout; import android.widget.Toast; import com.android.volley.NoConnectionError; @@ -17,23 +17,23 @@ import com.android.volley.Response; import com.android.volley.TimeoutError; import com.android.volley.VolleyError; import com.android.volley.toolbox.DiskBasedCache; -import com.facebook.drawee.drawable.ScalingUtils; -import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.AppController; import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; +import com.gh.common.util.ConcernContentUtils; import com.gh.common.util.ConcernUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.GzipUtils; -import com.gh.common.util.ImageUtils; import com.gh.common.util.MD5Utils; +import com.gh.common.util.NewsUtils; import com.gh.common.util.TokenUtils; import com.gh.common.util.Utils; import com.gh.common.view.CardLinearLayout; import com.gh.gamecenter.NewsDetailActivity; import com.gh.gamecenter.R; -import com.gh.gamecenter.ViewImageActivity; +import com.gh.gamecenter.ShareCardActivity; +import com.gh.gamecenter.ShareCardPicActivity; import com.gh.gamecenter.WebActivity; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.db.info.ConcernInfo; @@ -505,8 +505,8 @@ public class News1FragmentAdapter extends RecyclerView.Adapter 0) { + Intent intent = new Intent(context, ShareCardPicActivity.class); + Bundle bundle = new Bundle(); + bundle.putString("gameName", concernEntity.getGameName()); + bundle.putString("gameIconUrl", concernEntity.getGameIcon()); + bundle.putString("shareContent", concernEntity.getContent()); + bundle.putStringArrayList("shareArrImg", (ArrayList) concernEntity.getImg()); + intent.putExtras(bundle); + context.startActivity(intent); + } else { + Intent intent = new Intent(context, ShareCardActivity.class); + Bundle bundle = new Bundle(); + bundle.putString("gameName", concernEntity.getGameName()); + bundle.putString("gameIconUrl", concernEntity.getGameIcon()); + bundle.putString("shareContent", concernEntity.getContent()); + intent.putExtras(bundle); + context.startActivity(intent); + } + } + }); + + viewHolder.concernCommentIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (viewsMap.size() != 0) { + concernEntity.setMessageDetailViews(viewsMap.get(concernEntity.getId())); + } + NewsUtils.startMessageActivity(context, concernEntity, "资讯-关注"); + } + }); + viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -603,80 +637,4 @@ public class News1FragmentAdapter extends RecyclerView.Adapter list) { - int count = list.size(); - LinearLayout ll; - int index = 0; - for (int i = 0, size = (int) Math.ceil(list.size() / 3.0f); i < size; i++) { - switch (count % 3) { - case 0: - ll = new LinearLayout(context); - ll.setOrientation(LinearLayout.HORIZONTAL); - for (int j = 0; j < 3; j++) { - ll.addView(getImageView(list, index, width, 0)); - index += 1; - } - linearLayout.addView(ll); - count -= 3; - break; - case 1: - linearLayout.addView(getImageView(list, index, width, 1)); - count -= 1; - index += 1; - break; - case 2: - ll = new LinearLayout(context); - ll.setOrientation(LinearLayout.HORIZONTAL); - for (int j = 0; j < 2; j++) { - ll.addView(getImageView(list, index, width, 2)); - index += 1; - } - linearLayout.addView(ll); - count -= 2; - break; - } - } - } - - private SimpleDraweeView getImageView(final List list, final int position, int width, int type) { - SimpleDraweeView imageView; - if (type == 0) { - imageView = new SimpleDraweeView(context); - LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( - 0, width / 3 - DisplayUtils.dip2px(context, 4)); - lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, - DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); - lparams.weight = 1; - imageView.setLayoutParams(lparams); - ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); - } else if (type == 1) { - imageView = new SimpleDraweeView(context); - LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(width, width / 2); - lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, - DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); - imageView.setLayoutParams(lparams); - ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); - } else { - imageView = new SimpleDraweeView(context); - LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( - 0, width / 2 - DisplayUtils.dip2px(context, 4)); - lparams.setMargins(DisplayUtils.dip2px(context, 2), 0, - DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4)); - lparams.weight = 1; - imageView.setLayoutParams(lparams); - ImageUtils.getInstance(context).display(list.get(position), imageView, ScalingUtils.ScaleType.CENTER_CROP, context); - } - imageView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent checkIntent = new Intent(context, ViewImageActivity.class); - checkIntent.putExtra("urls", (ArrayList) list); - checkIntent.putExtra("current", position); - checkIntent.putExtra("ScaleType", "FIT_CENTER"); - context.startActivity(checkIntent); - } - }); - return imageView; - } - } diff --git a/app/src/main/java/com/gh/gamecenter/news/NewsConcernViewHolder.java b/app/src/main/java/com/gh/gamecenter/news/NewsConcernViewHolder.java index bb02ae8bbf..cb9853e59f 100644 --- a/app/src/main/java/com/gh/gamecenter/news/NewsConcernViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/news/NewsConcernViewHolder.java @@ -20,6 +20,9 @@ public class NewsConcernViewHolder extends RecyclerView.ViewHolder { public TextView concerntTime; public TextView concernContent; public TextView concernRead; + public TextView concernCommentCountTv; + public ImageView concernShareIv; + public ImageView concernCommentIv; public ImageView concernLinkIcon; public NewsConcernViewHolder(View itemView) { @@ -32,6 +35,9 @@ public class NewsConcernViewHolder extends RecyclerView.ViewHolder { concernTitle = (TextView) itemView.findViewById(R.id.concern_rv_item_title); contentPicLl = (LinearLayout) itemView.findViewById(R.id.concern_rv_item_iv_ll); concernLinkIcon = (ImageView) itemView.findViewById(R.id.conern_link_icon); + concernCommentCountTv = (TextView) itemView.findViewById(R.id.concern_comment_count); + concernCommentIv = (ImageView) itemView.findViewById(R.id.concern_comment_icon); + concernShareIv = (ImageView) itemView.findViewById(R.id.concern_share_icon); } } diff --git a/app/src/main/res/drawable-hdpi/comment_icon.png b/app/src/main/res/drawable-hdpi/comment_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf67a5ff8932bab4c6144505ce6ff699bac92e8 GIT binary patch literal 1792 zcmaJ?X;2eq7>-C05kv|epq6zJ1~8k=eXK#usR5E|$RHloEZGf2l5CnRCg6A_VnM7I z-Ur&&qbevPt#?H#D9E5#?bxFAqFSXWQlyG!H%hEO9Cvp2`@VPI=Xvkh;z^nbAwf|= zG#V{LHBqjm)>!Wo7(l)2%7DJq5=kmD$#lXHm=1{EdR>}Tuh_& zU1HK@l9}o>#6VaWs8@&Kve+mzjV4ZZ*-%3+P6AnYw#k|Vb{ww;0TY%4PT{GUYMTtt zF-6B=8L{LhZd`7zEy^khw|VTcfE#{nLL4;fe-HXsl&SUeG1$fW~pCW{XVtfp8++nbrY@~^>0$xTm zi^wCBK+4m%Ay{l`^*ds#qc>4h%3v32gINqFY_WLbdZXt9)kzOPcd0B!s$rx z7V2%>a@=m3gJViNVFBJ`8Zmvq3n9-aF!I?#C<~`DAP{g-D2p%TK)8_4<5Q(!OE3IT(#N>rDMlactGNA5+`< z6n|fyx1v!tT)JUpO6HYa{X-d@fSBr})LM^g(BU&%1HV^DaU$;0HCjej=ym_0HBnciQ;s&D{bhULQjcYOkhwuRY44Cb9s6=% z&2!7+^%**7=+14YN6@ZHoUo zOJVt^&(t?#Huz^C8E1yA0ke}EMH1H5<{allR-5nSJ}BDAvdz1>hEN3D^nD z1GCoX51|QE25=9s0G!+uuL4J`(MzF8(#o_4{RS+GT>!3zCdmRG_v~}l=+i(&{Hbn& z2R!?;=y#&`cN3f>|L()!Ybpu|3=qIhnbJZnH1 zcxa8TDT=ir+*0*=lQb{}T%fr^eF7$FKG7B6c)$ZB@&-8DhpRjX0)FrqcetvX;;&MI zPXIR*#agRZVFP%H+tcS;O|V9zqIehWw{0)*2si}%@F%|j9*BKU^c~g!53D3^;iIaNp z7kHZ|_>}1P*68(Iz$%Idag`8U+04`kWRY z+HMCP^z1+XOH@&O5Ev4--YEDViD_JWv*E=q0{hw|ZaGYIul>3)(E793Nhw;R&nHd~ k@U+XoRp2)64_;mV0q+EK7UIu}cmMzZ07*qoM6N<$f_obb=l}o! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/comment_like_unselect.png b/app/src/main/res/drawable-hdpi/comment_like_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..9585f4c2aa553612a242c5112c73dc6ddee72783 GIT binary patch literal 598 zcmV-c0;&CpP)N3ZWwgCCVDcq{eo^l$Kbi*Z^8Ujnw9?Z1b+Os{4E-VNL^`z!Fk z8yhgaoHn=wJOO&lzm1)%s`da!tiK!=+#X}jAaEb(GrtPl^u{j(1+$N->SU8Rt3U;K zBqBcxK@fD~wyMpWv;{Z-j8ab)0B?aIHs9zfa6HBWLYW7K+i{s^UyKJH<1Sb2kNy`e zf=>XqiV@H?U>Z0Jj5mNHBG+*5@6L#}A9!t#o%hdp3V3Mtgz0<0m8d0%$d{-&KuuL= zfkQx-f2-dBlh#6MIWa`YVbdRyq|8L3s%^OQ1t{kR#%*z!^(uLS2Ru916^HrY7w{@i z@F~-aBJwR4u&Q?AG9kFMnWzv*BK_3!c{xw8pYL-8hv!=Z-p2udPYE1WrWFxcZwBu4 z>>vM2RMmq(x49dIg8z{i!<9E{Uf(%jZ$#jK4Hwv4YtJ>s4)Bg;1sp!oG)Y^UjH;yt;j}yo0$S%tlTZq@>DrVQm>xr3 zq7&V4asx%D=uQR2%_kG53>nHMICX-ro8sIi+dLc!Y`CRBoqu@dlKg(ZZ@!<;_kCHL zl(5L#GuV^I<9Wx&Db?H>?s(i^=H4CK09S4aVq-Gc6ef$c5oVevrx+~_#2W}5t)>a8 z;Jq$7ipO&;*QaK%8LA~X$ruELLq}jYm^d_#7q!4{BFJ2t1+=tIZY(2#X^puRB zE>;OuCIy|Xk1I6ODTN8CWMM9eQTzq-fhar95g2He0PKc5qXoCi_!GQ1w|9skJ}{xe z=F0e!PGzW)00m>F0kJ>=k}!$@k(dA$V~A8V4?u*l1QLoM7z1Gx=WdY@n7a6!H8Yik ztCg`+wz!jwpUtu+9D-~%o4|$&7_*MUVi+VuAOrz94bW0xWC=THw1hetl(dC3>rJel zF#--oLd#fL8K3iXG6aK3rFu$iv`i(6OBrM*Ob{#(LI#5)t_f`mtET^V-dLIM`il#}Oqc)19}gmO75kBmiNI7T8BD`FIIG)ES#kSn9b zPHeo(HtX|gD%Q*xfQd}w`sa8d6=y|eNf0ThrMV15Mv4efE0LlgEtQBR+(}E3 z7=H>+J(I!7PUR$ABqparxL7JdX$p~m7>o!(7^Wp4AtDGzW)TsIaC9OqAL3ku9L@7g zGdV?EhdQ=TM}s>&9WL6)O_Z4%9d%dYTprJ5PrOo|YVRMc)l{mI13T|^V`!DxD{nd(`oUry@Y|#won%dNU z1I_*&E9^1d*3F?gudP>`ulsGX%s8_&ywC4)cv~{qkuQc8>Xe_Iwa4xls6A91(lmB@ z*I=(#{E%N%+L!;$sq&&C!`9{{i?qhGPH# literal 683 zcmV;c0#yBpP)}k_$^A#6*^C7teF*%oxr)bI$4f>h%7f=l?(N|NHFETa(M>R8ZTn4A;U^o&? z!oU{(4??5%WHAnh;-B6{$Gaj4E~Nzijqmsslm77cD9psPEH*@l`$G46IN zM*mj)P3T%suFqmfENm|WL$5SNMk8 zcw9}8o5CLQtx^zaK`3%yl|$`0^eUo4kPcO&5J2*m=FwHiKO#P#Ww8&dh10YN2mRv~ zRYrBe9L$U512wr^t_v;-pN7@YRZPeTtsjlGc%%%strYr=2f~Ng*d$55`~h32f!n4k RSPTFF002ovPDHLkV1hCuIotpM diff --git a/app/src/main/res/drawable/cursor_color.xml b/app/src/main/res/drawable/cursor_color.xml new file mode 100644 index 0000000000..c7b3d75b5c --- /dev/null +++ b/app/src/main/res/drawable/cursor_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/et_line.xml b/app/src/main/res/drawable/et_line.xml new file mode 100644 index 0000000000..1d6d3a99d7 --- /dev/null +++ b/app/src/main/res/drawable/et_line.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/app/src/main/res/drawable/textview_comment_send_style.xml b/app/src/main/res/drawable/textview_comment_send_style.xml new file mode 100644 index 0000000000..49dbda50eb --- /dev/null +++ b/app/src/main/res/drawable/textview_comment_send_style.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_message_detail.xml b/app/src/main/res/layout/activity_message_detail.xml new file mode 100644 index 0000000000..77eca9faa2 --- /dev/null +++ b/app/src/main/res/layout/activity_message_detail.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/comment_head_item.xml b/app/src/main/res/layout/comment_head_item.xml new file mode 100644 index 0000000000..09fddc224c --- /dev/null +++ b/app/src/main/res/layout/comment_head_item.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/comment_item.xml b/app/src/main/res/layout/comment_item.xml new file mode 100644 index 0000000000..5717577158 --- /dev/null +++ b/app/src/main/res/layout/comment_item.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/concern_rv_item.xml b/app/src/main/res/layout/concern_rv_item.xml index e3815bd690..6d407f764f 100644 --- a/app/src/main/res/layout/concern_rv_item.xml +++ b/app/src/main/res/layout/concern_rv_item.xml @@ -9,7 +9,6 @@ android:paddingLeft="12dp" android:paddingRight="12dp" android:paddingTop="15dp" - android:paddingBottom="15dp" app:left="8dp" app:bottom="8dp" app:right="8dp"> @@ -37,7 +36,6 @@ android:id="@+id/concern_rv_item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="少年三国志" android:textColor="@color/theme" android:textSize="16sp" android:layout_marginBottom="5dp"/> @@ -46,7 +44,6 @@ android:id="@+id/concern_rv_item_time" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="09:56" android:textColor="@color/hint" android:textSize="12sp"/> @@ -76,17 +73,44 @@ + android:gravity="center_vertical" + android:paddingTop="8dp" + android:paddingBottom="8dp"> + + + + + + +