From 02cfb7515b0f8497f021d48ef10e88cc0ef8588e Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Tue, 22 Sep 2020 10:40:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=E5=85=89?= =?UTF-8?q?=E7=8E=AF=E5=8A=A9=E6=89=8BV4.3.0-=E4=B8=AA=E4=BA=BA=E4=B8=BB?= =?UTF-8?q?=E9=A1=B5=E4=BC=98=E5=8C=96https://gitlab.ghzs.com/pm/halo-app-?= =?UTF-8?q?issues/-/issues/1004?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 + .../java/com/gh/common/util/ShareUtils.java | 64 +- .../com/gh/gamecenter/ImageViewerActivity.kt | 69 +- .../viewholder/ExcellentCommentsHolder.java | 22 + .../viewholder/UserCommentTitleHolder.java | 18 + .../adapter/viewholder/ViewHolder.kt | 9 +- .../entity/FollowersOrFansEntity.kt | 1 + .../gh/gamecenter/entity/PersonalEntity.kt | 14 +- .../gamecenter/personal/PersonalFragment.java | 48 +- .../personalhome/FollowersOrFansAdapter.kt | 30 +- .../personalhome/FollowersOrFansFragment.kt | 4 + .../personalhome/UserHomeActivity.kt | 17 +- .../personalhome/UserHomeFragment.kt | 244 +++++--- .../personalhome/UserHomeViewModel.kt | 15 + .../ExcellentCommentsActivity.kt | 26 + .../ExcellentCommentsAdapter.kt | 124 ++++ .../ExcellentCommentsFragment.kt | 32 + .../ExcellentCommentsViewModel.kt | 38 ++ .../HorizontalExcellentCommentsAdapter.kt | 66 ++ .../home/UserCommentHistoryAdapter.kt | 237 +++++++ .../home/UserCommentHistoryFragment.kt | 85 +++ .../home/UserCommentHistoryItemData.kt | 7 + .../home/UserCommentHistoryViewModel.kt | 150 +++++ .../personalhome/rating/MyRating.kt | 4 + .../retrofit/service/ApiService.java | 14 +- .../res/drawable-xxhdpi/ic_badge_default.png | Bin 0 -> 3534 bytes app/src/main/res/drawable-xxhdpi/share_qq.png | Bin 0 -> 3783 bytes .../res/drawable-xxhdpi/share_qq_zone.png | Bin 0 -> 4430 bytes .../drawable-xxhdpi/share_wechat_moments.png | Bin 0 -> 5158 bytes .../main/res/drawable-xxhdpi/share_weibo.png | Bin 0 -> 5036 bytes .../res/drawable-xxxhdpi/ic_badge_default.png | Bin 0 -> 5310 bytes .../main/res/drawable-xxxhdpi/share_qq.png | Bin 0 -> 5350 bytes .../res/drawable-xxxhdpi/share_qq_zone.png | Bin 0 -> 6199 bytes .../drawable-xxxhdpi/share_wechat_moments.png | Bin 0 -> 7141 bytes .../main/res/drawable-xxxhdpi/share_weibo.png | Bin 0 -> 7115 bytes app/src/main/res/drawable/bg_amway_tag.xml | 6 + app/src/main/res/drawable/bg_comment_tag.xml | 6 + .../res/drawable/bg_follower_or_fans_btn.xml | 6 + app/src/main/res/drawable/bg_recent_visit.xml | 11 + app/src/main/res/drawable/bg_save_pic.xml | 8 + .../res/drawable/bg_user_home_normal_btn.xml | 6 + .../main/res/layout/activity_viewimage.xml | 15 +- .../res/layout/followers_or_fans_item.xml | 162 +++-- app/src/main/res/layout/fragment_home.xml | 64 +- app/src/main/res/layout/fragment_home_new.xml | 590 ++++++++++++++++++ app/src/main/res/layout/fragment_personal.xml | 74 ++- .../layout/fragment_user_comment_history.xml | 30 + .../res/layout/item_excellent_comments.xml | 46 ++ .../res/layout/item_user_comment_history.xml | 184 ++++++ .../res/layout/item_user_comment_title.xml | 18 + .../main/res/layout/popup_share_dialog.xml | 173 +++++ .../main/res/layout/user_home_amway_item.xml | 217 +++++++ app/src/main/res/values/colors.xml | 4 + app/src/main/res/values/strings.xml | 18 + 54 files changed, 2735 insertions(+), 245 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/adapter/viewholder/ExcellentCommentsHolder.java create mode 100644 app/src/main/java/com/gh/gamecenter/adapter/viewholder/UserCommentTitleHolder.java create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsActivity.kt create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsViewModel.kt create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/home/HorizontalExcellentCommentsAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryItemData.kt create mode 100644 app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryViewModel.kt create mode 100644 app/src/main/res/drawable-xxhdpi/ic_badge_default.png create mode 100644 app/src/main/res/drawable-xxhdpi/share_qq.png create mode 100644 app/src/main/res/drawable-xxhdpi/share_qq_zone.png create mode 100644 app/src/main/res/drawable-xxhdpi/share_wechat_moments.png create mode 100644 app/src/main/res/drawable-xxhdpi/share_weibo.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_badge_default.png create mode 100644 app/src/main/res/drawable-xxxhdpi/share_qq.png create mode 100644 app/src/main/res/drawable-xxxhdpi/share_qq_zone.png create mode 100644 app/src/main/res/drawable-xxxhdpi/share_wechat_moments.png create mode 100644 app/src/main/res/drawable-xxxhdpi/share_weibo.png create mode 100644 app/src/main/res/drawable/bg_amway_tag.xml create mode 100644 app/src/main/res/drawable/bg_comment_tag.xml create mode 100644 app/src/main/res/drawable/bg_follower_or_fans_btn.xml create mode 100644 app/src/main/res/drawable/bg_recent_visit.xml create mode 100644 app/src/main/res/drawable/bg_save_pic.xml create mode 100644 app/src/main/res/drawable/bg_user_home_normal_btn.xml create mode 100644 app/src/main/res/layout/fragment_home_new.xml create mode 100644 app/src/main/res/layout/fragment_user_comment_history.xml create mode 100644 app/src/main/res/layout/item_excellent_comments.xml create mode 100644 app/src/main/res/layout/item_user_comment_history.xml create mode 100644 app/src/main/res/layout/item_user_comment_title.xml create mode 100644 app/src/main/res/layout/popup_share_dialog.xml create mode 100644 app/src/main/res/layout/user_home_amway_item.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c63abfff70..ee2dc85167 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -579,6 +579,10 @@ android:screenOrientation="portrait" android:theme="@style/TransparentStatusBarAndNavigationBar"/> + + (activity); + this.shareIcon = icon; + this.shareUrl = url; + this.mSummary = shareSummary; + this.mTitle = shareTitle; + this.mShareEntrance = shareEntrance; + ShareUtils.shareEntrance = mShareEntrance; + ShareUtils.resourceId = id; + ShareUtils.shareEntity = new ShareEntity(shareUrl, mTitle, mSummary); + LogUtils.uploadShareEnter(mShareEntrance.getName(), shareUrl, mTitle, mSummary, id); + + View contentView = View.inflate(mActivity.get(), R.layout.popup_share_dialog, null); + contentView.setFocusable(true); + contentView.setFocusableInTouchMode(true); + + View wechatType = contentView.findViewById(R.id.item_wechat); + View wechatMomentsType = contentView.findViewById(R.id.item_wechat_moments); + View qqType = contentView.findViewById(R.id.item_qq); + View qqZoneType = contentView.findViewById(R.id.item_qq_zone); + View weiboType = contentView.findViewById(R.id.item_weibo); + + wechatType.setOnClickListener((v) -> wechatShare()); + wechatMomentsType.setOnClickListener((v) -> wechatMomentsShare()); + qqType.setOnClickListener((v) -> qqShare()); + qqZoneType.setOnClickListener((v) -> qZoneShare()); + weiboType.setOnClickListener((v) -> sinaWeiboShare()); + + popupWindow = new WeakReference<>(new SharePopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT + , LinearLayout.LayoutParams.MATCH_PARENT, true)); +// popupWindow.get().setAnimationStyle(R.style.popwindow_exit_only_anim_style); + //解决PopupWindow无法覆盖状态栏 + popupWindow.get().setClippingEnabled(false); + + int bottomLocation = -DisplayUtils.retrieveNavigationHeight(activity); + if (!DisplayUtils.isNavigationBarShow(activity)) { + bottomLocation = 0; + } + try { + popupWindow.get().showAtLocation(view, Gravity.NO_GRAVITY, 0, bottomLocation); + } catch (Exception e) { + e.printStackTrace(); + } + + contentView.setOnClickListener(v -> safelyDismiss()); + + contentView.setOnKeyListener((v, keyCode, event) -> { + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getRepeatCount() == 0 + && popupWindow.get() != null + && popupWindow.get().isShowing()) { + if (callBack != null) { + callBack.onCancel(); + } + safelyDismiss(); + } + return false; + }); + } + public void showShareWindowsCallback(Activity activity, View view, String url, String icon, String shareTitle, String shareSummary, ShareEntrance shareEntrance, String id, ShareCallBack callBack) { if (activity.isFinishing()) return; this.mActivity = new WeakReference<>(activity); diff --git a/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt b/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt index 05efd5ada1..e05c9c0f8d 100644 --- a/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt @@ -75,6 +75,9 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { @BindView(R.id.background_view) lateinit var mBackgroundView: View + @BindView(R.id.btn_save_pic) + lateinit var mSavePicBtn: View + private var adapter: ViewImageAdapter? = null private var mImagePipeline: ImagePipeline? = null private var mShowBase64Image = false @@ -82,9 +85,11 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { private var mViewedSet: HashSet? = null // 让调用者知道该图片是否被看过了 private var mImageInfoMap: MutableMap? = null private var mBigImageView: BigImageView? = null + private var mFinalUrl = "" private var mInitialPosition = 0 private var mUseEnterAndExitAnimation = false + private var mShowSaveBtn = false private var mLimitWidth = 0 private var mOriginLeft = 0 @@ -121,8 +126,10 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { mUrlList = it.getStringArrayList(KEY_URL_LIST) mInitialPosition = it.getInt(KEY_CURRENT, 0) } + mShowSaveBtn = it.getBoolean(KEY_SHOW_SAVE) mUseEnterAndExitAnimation = it.getBoolean(KEY_USE_ENTER_AND_EXIT_ANIMATION) } + mSavePicBtn.visibleIf(mShowSaveBtn) mIndicatorMask.goneIf(mUrlList?.size == 1) mIndicatorTv.text = String.format("%d/%d", mInitialPosition + 1, mUrlList!!.size) @@ -169,6 +176,15 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { } } + mSavePicBtn.setOnClickListener { + checkStoragePermissionBeforeAction { + mBigImageView?.currentImageFile?.run { + adapter?.saveImageToFile(this, mFinalUrl) + } + } + + } + initEnterAnimation() DisplayUtils.transparentStatusAndNavigation(this) } @@ -187,6 +203,44 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { mViewPager.onDestroy() // 注销EventBus } + private fun saveImageToFile(src: File, curUrl: String?) { + var `in`: InputStream? = null + var out: OutputStream? = null + try { + val fileName: String = if (mShowBase64Image) { + MD5Utils.getUrlMD5(curUrl!!.substring(0, 50)) + ".png" + } else { + curUrl!!.substring(curUrl.lastIndexOf("/")) + } + val savePath = Environment.getExternalStorageDirectory().absolutePath + "/Pictures/ghzhushou/" + val file = File(savePath) + if (!file.exists()) { + file.mkdirs() + } + val dst = File(savePath, fileName) + if (dst.exists()) { + dst.delete() + } + `in` = FileInputStream(src) + out = FileOutputStream(dst) + val buf = ByteArray(1024) + var len: Int + while (`in`.read(buf).also { len = it } > 0) { + out.write(buf, 0, len) + } + Utils.toast(this@ImageViewerActivity, "图片已保存到/Pictures/ghzhushou/") + MessageShareUtils.refreshImage(this@ImageViewerActivity, dst) + } catch (e: Exception) { + Utils.log("图片保存失败:$e") + } finally { + try { + out?.close() + `in`?.close() + } catch (ignore: Exception) { + } + } + } + @SuppressLint("SetTextI18n") override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { @@ -463,6 +517,8 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { decoratedUrl = getTransformLimitUrl(originalUrl, mLimitWidth, applicationContext) } val finalUrl = decoratedUrl + mFinalUrl = finalUrl ?: "" + imageView.setImageLoaderCallback(object : SimpleImageLoader() { override fun onSuccess(image: File) { if (finalUrl != mUrlList!![position]) { @@ -529,7 +585,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { return view } - private fun saveImageToFile(src: File, curUrl: String?) { + fun saveImageToFile(src: File, curUrl: String?) { var `in`: InputStream? = null var out: OutputStream? = null try { @@ -587,6 +643,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { private const val KEY_BASE64 = "base64" private const val KEY_URL_LIST = "urls" private const val KEY_CURRENT = "current" + private const val KEY_SHOW_SAVE = "showSave" private const val KEY_USE_ENTER_AND_EXIT_ANIMATION = "use_enter_and_exit_animation" private const val KEY_LEFT = "left" @@ -605,17 +662,23 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { @JvmStatic fun getIntent(context: Context, list: ArrayList, position: Int = 0, entrance: String?): Intent { - return getIntent(context, list, position, null, entrance) + return getIntent(context, list, position, null, entrance, false) + } + + @JvmStatic + fun getIntent(context: Context, list: ArrayList, position: Int = 0, originalView: View? = null, entrance: String?): Intent { + return getIntent(context, list, position, originalView, entrance, false) } /** * 传入 view 代表使用渐入渐出动画 */ @JvmStatic - fun getIntent(context: Context, list: ArrayList, position: Int = 0, originalView: View? = null, entrance: String?): Intent { + fun getIntent(context: Context, list: ArrayList, position: Int = 0, originalView: View? = null, entrance: String?, isShowSaveBtn: Boolean): Intent { val intent = Intent(context, ImageViewerActivity::class.java) intent.putExtra(KEY_URL_LIST, list) intent.putExtra(KEY_CURRENT, position) + intent.putExtra(KEY_SHOW_SAVE, isShowSaveBtn) intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance) val location = IntArray(2) diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/ExcellentCommentsHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/ExcellentCommentsHolder.java new file mode 100644 index 0000000000..1fffa1906a --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/ExcellentCommentsHolder.java @@ -0,0 +1,22 @@ +package com.gh.gamecenter.adapter.viewholder; + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import com.gh.base.BaseRecyclerViewHolder; +import com.gh.gamecenter.R; + +import butterknife.BindView; + +public class ExcellentCommentsHolder extends BaseRecyclerViewHolder { + + @BindView(R.id.excellentCommentMore) + public View excellentCommentMore; + @BindView(R.id.excellentCommentList) + public RecyclerView excellentCommentList; + + public ExcellentCommentsHolder(View itemView) { + super(itemView); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/UserCommentTitleHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/UserCommentTitleHolder.java new file mode 100644 index 0000000000..ae25257a0d --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/UserCommentTitleHolder.java @@ -0,0 +1,18 @@ +package com.gh.gamecenter.adapter.viewholder; + +import android.view.View; +import android.widget.TextView; +import com.gh.base.BaseRecyclerViewHolder; +import com.gh.gamecenter.R; + +import butterknife.BindView; + +public class UserCommentTitleHolder extends BaseRecyclerViewHolder { + + @BindView(R.id.title) + public TextView title; + + public UserCommentTitleHolder(View itemView) { + super(itemView); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/ViewHolder.kt b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/ViewHolder.kt index 6e14708476..6d43361622 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/ViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/ViewHolder.kt @@ -1,12 +1,11 @@ package com.gh.gamecenter.adapter.viewholder import com.gh.base.BaseRecyclerViewHolder -import com.gh.gamecenter.databinding.GameColumnCollectionItemBinding -import com.gh.gamecenter.databinding.PersonalHomeRatingBinding -import com.gh.gamecenter.databinding.PrivacyItemBinding -import com.gh.gamecenter.databinding.SearchGameFooterBinding +import com.gh.gamecenter.databinding.* class SearchGameFooterViewHolder(val binding: SearchGameFooterBinding) : BaseRecyclerViewHolder(binding.root) class PersonalHomeRatingViewHolder(val binding: PersonalHomeRatingBinding) : BaseRecyclerViewHolder(binding.root) class GameColumnCollectionItemViewHolder(val binding: GameColumnCollectionItemBinding) : BaseRecyclerViewHolder(binding.root) -class PrivacyPolicyItemViewHolder(val binding: PrivacyItemBinding) : BaseRecyclerViewHolder(binding.root) \ No newline at end of file +class PrivacyPolicyItemViewHolder(val binding: PrivacyItemBinding) : BaseRecyclerViewHolder(binding.root) +class UserCommentHistoryItemViewHolder(val binding: ItemUserCommentHistoryBinding) : BaseRecyclerViewHolder(binding.root) +class UserHomeAmwayItemViewHolder(val binding: UserHomeAmwayItemBinding) : BaseRecyclerViewHolder(binding.root) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/FollowersOrFansEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/FollowersOrFansEntity.kt index 562a7f3a6f..ef606f9302 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/FollowersOrFansEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/FollowersOrFansEntity.kt @@ -7,6 +7,7 @@ data class FollowersOrFansEntity( val id: String = "", val icon: String = "", val name: String = "", + var introduce: String? = "", val count: Count = Count(), val me: MeEntity = MeEntity(), val auth: Auth = Auth(), diff --git a/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt index b1f0aa4c77..fac1daafbb 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt @@ -19,7 +19,9 @@ data class PersonalEntity( var border: String = "", @SerializedName("icon_border") var iconBorder: AvatarBorderEntity? = null, - var backgroundImageEntity: BackgroundImageEntity? = null + var background: BackgroundImageEntity? = null, + @SerializedName("last_visitor") + val lastVisitor: LastVisitor? = null ) : Parcelable { @Parcelize @@ -34,12 +36,20 @@ data class PersonalEntity( val communityArticle: Int = 0, @SerializedName("game_comment") val gameComment: Int = 0, - val video: Int = 0) : Parcelable { + val video: Int = 0, + @SerializedName("today_visit") + val todayVisit: Int? = 0) : Parcelable { fun getQaCount() = answer + question + communityArticle } } +@Parcelize +data class LastVisitor( + var id: String = "", + var name: String = "", + var icon: String = "") : Parcelable + @Parcelize data class Badge( var name: String = "", diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java index f43c9085ca..4e6d32c5d5 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java @@ -12,6 +12,14 @@ import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.fragment.BaseLazyFragment; import com.gh.common.databind.BindingAdapters; @@ -83,13 +91,6 @@ import java.util.ArrayList; import java.util.Locale; import java.util.concurrent.TimeUnit; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; -import androidx.lifecycle.ViewModelProviders; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; @@ -118,6 +119,8 @@ public class PersonalFragment extends BaseLazyFragment { TextView mLoginMessageHint; @BindView(R.id.personal_user_icon) AvatarBorderView mUserIcon; + @BindView(R.id.personal_user_default_icon) + ImageView mUserDefaultIcon; @BindView(R.id.personal_user_small_icon) SimpleDraweeView mUserIconSmall; // @BindView(R.id.personal_user_badge) @@ -142,6 +145,8 @@ public class PersonalFragment extends BaseLazyFragment { RecyclerView mFuncRecyclerView; @BindView(R.id.personal_new_fans_tips) View personalNewFansTips; + @BindView(R.id.personal_background) + SimpleDraweeView mPersonalBackground; public final static String LOGIN_TAG = "login_tag"; //登入标识 public final static String LOGOUT_TAG = "logout_tag"; // 登出标识 @@ -316,15 +321,16 @@ public class PersonalFragment extends BaseLazyFragment { mPersonalBadgeTv.setText("领取徽章"); } else { mPersonalBadgeTv.setText(String.format(Locale.CHINA, "%d枚徽章", badgeEntities.size())); - } - for (BadgeEntity badgeEntity : badgeEntities) { - if (badgeEntity.getWear()) { - ImageUtils.display(mPersonalBadgeIcon, badgeEntity.getIcon()); - mPersonalBadgeIcon.setOnClickListener(v -> DialogUtils.showViewBadgeDialog(requireContext(), new Badge(badgeEntity.getName(), badgeEntity.getIcon(), badgeEntity.getActions()), - () -> DirectUtils.directToBadgeWall(requireContext(), mUserInfoEntity.getUserId(), mUserInfoEntity.getName(), mUserInfoEntity.getIcon()))); + for (BadgeEntity badgeEntity : badgeEntities) { + if (badgeEntity.getWear()){ + ImageUtils.display(mPersonalBadgeIcon, badgeEntity.getIcon()); - break; + mPersonalBadgeIcon.setOnClickListener(v -> DialogUtils.showViewBadgeDialog(requireContext(), new Badge(badgeEntity.getName(), badgeEntity.getIcon(), badgeEntity.getActions()), + () -> DirectUtils.directToBadgeWall(requireContext(), mUserInfoEntity.getUserId(), mUserInfoEntity.getName(), mUserInfoEntity.getIcon()))); + + break; + } } } }); @@ -693,6 +699,11 @@ public class PersonalFragment extends BaseLazyFragment { private void changeLoginState(boolean isLogin) { if (isLogin) { + // 设置背景 + if (mUserInfoEntity.getBackground() != null) { + ImageUtils.display(mPersonalBackground, mUserInfoEntity.getBackground().getUrl()); + } + SignEntity signEntity = mDatabase.signDao().getSignEntityById(UserManager.getInstance().getUserId()); if (signEntity != null && !isCanSign(signEntity.getLastTime())) { mPersonalSign.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.personal_sign_icon_yellow)); @@ -700,6 +711,8 @@ public class PersonalFragment extends BaseLazyFragment { mPersonalSign.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.personal_sign_icon_white)); } if (mUserInfoEntity != null) { + mUserDefaultIcon.setVisibility(View.GONE); + mUserIcon.setVisibility(View.VISIBLE); mUserIcon.display(mUserInfoEntity.getIconBorder() == null ? "" : mUserInfoEntity.getIconBorder().getUrl(), mUserInfoEntity.getIcon(), mUserInfoEntity.getAuth() == null ? "" : mUserInfoEntity.getAuth().getIcon()); ImageUtils.displayIcon(mUserIconSmall, mUserInfoEntity.getIcon()); @@ -709,6 +722,10 @@ public class PersonalFragment extends BaseLazyFragment { mPersonalLogin.setVisibility(View.GONE); mPersonalUserName.setText(mUserInfoEntity.getName()); mPersonalUserNameSmall.setText(mUserInfoEntity.getName()); +// if (mUserInfoEntity.getAuth() != null) { +// mUserBadge.setVisibility(View.VISIBLE); +// ImageUtils.display(mUserBadge, mUserInfoEntity.getAuth().getIcon()); +// } } mUserHomeViewModel.setUserId(UserManager.getInstance().getUserId()); mUserHomeViewModel.getBadgeList(); @@ -716,9 +733,12 @@ public class PersonalFragment extends BaseLazyFragment { MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(true); } else { mUserIcon.display("", "", ""); + mUserDefaultIcon.setVisibility(View.VISIBLE); + mUserIcon.setVisibility(View.GONE); mUserIconSmall.setImageURI(""); mPersonalBadgeTv.setText("领取徽章"); mPersonalUserNameSmall.setText("立即登录"); +// mUserBadge.setVisibility(View.GONE); mPersonalUserName.setVisibility(View.GONE); mPersonalHome.setVisibility(View.GONE); mPersonalBadge.setVisibility(View.GONE); diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt index 713d2024c0..b85074785e 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt @@ -45,29 +45,33 @@ class FollowersOrFansAdapter(context: Context, val mViewModel: FollowersOrFansVi } override fun getItemCount(): Int { - return if (mEntityList == null || mEntityList.isEmpty()) 0 else mEntityList.size + ListAdapter.FOOTER_ITEM_COUNT + return if (mEntityList == null || mEntityList.isEmpty()) 0 else mEntityList.size + FOOTER_ITEM_COUNT } override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) { if (holder is FollowersOrFansViewHolder) { val entity = mEntityList[position] holder.binding.entity = entity + + holder.binding.divider.visibility = if (position == 0) View.GONE else View.VISIBLE holder.binding.userIcon.display(entity.border, entity.icon, entity.auth.icon) holder.binding.followerBtn.run { - if (entity.id == UserManager.getInstance().userId) { - setText(R.string.myself) - setTextColor(ContextCompat.getColor(mContext, R.color.text_999999)) - setBackgroundResource(R.drawable.questions_detail_tag_bg) - } else if (entity?.me?.isFollower!!) { - setText(R.string.concerned) - setTextColor(ContextCompat.getColor(mContext, R.color.text_999999)) - setBackgroundResource(R.drawable.questions_detail_tag_bg) - } else { - setText(R.string.concern) - setTextColor(R.color.theme_font.toColor()) - setBackgroundResource(R.drawable.questions_detail_tag_bg) + when { + entity.id == UserManager.getInstance().userId -> { + setText(R.string.myself) + setTextColor(ContextCompat.getColor(mContext, R.color.text_999999)) + } + entity?.me?.isFollower!! -> { + setText(R.string.concerned) + setTextColor(ContextCompat.getColor(mContext, R.color.text_999999)) + } + else -> { + setText(R.string.concern) + setTextColor(R.color.theme_font.toColor()) + } } } + holder.binding.followerBtn.setOnClickListener { mContext.ifLogin("个人主页-粉丝-[关注]") { if (entity.id != UserManager.getInstance().userId) { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt index 51b3475b01..80ff28d426 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansFragment.kt @@ -6,6 +6,8 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.gh.common.util.EntranceUtils import com.gh.common.util.MtaHelper +import com.gh.common.util.dip2px +import com.gh.common.view.SpacingItemDecoration import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.entity.FollowersOrFansEntity import com.gh.gamecenter.manager.UserManager @@ -36,6 +38,8 @@ class FollowersOrFansFragment : ListFragment + if (badge.wear) { + ImageUtils.display(mHomeBinding?.userBadgeIcon, badge.icon) + mHomeBinding?.userBadgeIcon?.setOnClickListener { + DialogUtils.showViewBadgeDialog(requireContext(), Badge(badge.name, badge.icon, badge.actions)) { + directToBadgeWall(requireContext(), mPersonalEntity.id, mPersonalEntity.name, mPersonalEntity.icon) + } + } + return@outside + } + } + } updateUserBadge(it) } else { mHomeBinding?.userBadge?.visibility = View.GONE + mHomeBinding?.userBadgeTv?.text = "领取徽章" } } } @@ -126,12 +160,14 @@ class UserHomeFragment : NormalFragment() { reuse_no_connection.setOnClickListener { mUserHomeViewModel.getUserInfo() mUserHomeViewModel.getUserPlayedGame() + mUserHomeViewModel.getUserPlayedGameCount() } toast("网络异常") } mUserHomeViewModel.playedGames.observe(this, Observer { if (!it.isNullOrEmpty()) { + mPlayGameCount = it.size showPlayedGames(it) } val installedList = PackagesManager.filterSameApk(PackagesManager.filterDownloadBlackPackage(PackagesManager.getInstalledList())) @@ -145,10 +181,16 @@ class UserHomeFragment : NormalFragment() { mDialog.show() mDialog.onConfirmClickListener = { mUserHomeViewModel.getUserPlayedGame() + mUserHomeViewModel.getUserPlayedGameCount() } } }) + // 记录玩过的游戏总数 + mUserHomeViewModel.playGamesCount.observe(this, Observer { + mPlayGameCount = it + }) + mMessageUnreadViewModel.liveData.observeNonNull(this) { updateUnreadInfo(it) } @@ -156,12 +198,13 @@ class UserHomeFragment : NormalFragment() { mUserViewModel.editObsUserinfo.observeNonNull(this) { it.data?.let { updatedUserInfo -> if (mUserHomeViewModel.userId == UserManager.getInstance().userId) { - val personalData = mUserHomeViewModel.userInfo.value - if (personalData != null) { - personalData.icon = updatedUserInfo.icon!! - personalData.name = updatedUserInfo.name!! - personalData.introduce = updatedUserInfo.introduce!! - updateUserInfo(personalData) + mUserHomeViewModel.userInfo.value?.run { + icon = updatedUserInfo.icon!! + name = updatedUserInfo.name!! + introduce = updatedUserInfo.introduce!! + iconBorder = updatedUserInfo.iconBorder!! + background = updatedUserInfo.background!! + updateUserInfo(this) } } } @@ -171,18 +214,22 @@ class UserHomeFragment : NormalFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setNavigationTitle("个人主页") + mHomeBinding?.run { + val statusBarHeight = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) 0 else DisplayUtils.getStatusBarHeight(resources) + val params: ViewGroup.LayoutParams = toolbar.layoutParams + params.height = DisplayUtils.dip2px(50f) + statusBarHeight + toolbar.layoutParams = params - appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, offset -> - val absVerticalOffset = abs(offset) - val total = appBarLayout.totalScrollRange - - if (absVerticalOffset > total / 5) { - setNavigationTitle(mUserHomeViewModel.userInfo.value?.name ?: "个人主页") - } else { - setNavigationTitle("个人主页") - } - }) + appbar.addOnOffsetChangedListener(OnOffsetChangedListener { _: AppBarLayout?, verticalOffset: Int -> + val absOffset = abs(verticalOffset) + val invisibleOffset = DisplayUtils.dip2px(240f - statusBarHeight) + if (absOffset <= invisibleOffset) { + toolbar.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.transparent)) + } else { + toolbar.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.theme)) + } + }) + } } private fun updateTab(personalData: PersonalEntity) { @@ -195,21 +242,35 @@ class UserHomeFragment : NormalFragment() { when { count.gameComment > 0 -> 0 count.getQaCount() > 0 -> 1 - count.video > 0 -> 2 + count.video > 0 -> { + if (count.getQaCount() == 0) 1 else 2 + } else -> 0 } } val tag = "android:switcher:${mHomeBinding?.viewpager?.id}:" - val commentFragment = childFragmentManager.findFragmentByTag("${tag}0") - ?: UserHistoryFragment.getInstance(mUserHomeViewModel.userId, UserHistoryViewModel.SCENE.COMMENT, count) - val qaFragment = childFragmentManager.findFragmentByTag("${tag}1") - ?: UserHistoryFragment.getInstance(mUserHomeViewModel.userId, UserHistoryViewModel.SCENE.QUESTION_ANSWER, count) - val videoFragment = childFragmentManager.findFragmentByTag("${tag}2") - ?: UserVideoHistoryFragment.getInstance(mUserHomeViewModel.userId, count) + val fragmentList = ArrayList() + val titleList = ArrayList() - val fragmentList = listOf(commentFragment, qaFragment, videoFragment) - val titleList = listOf("游戏评论", "论坛", "视频") + val commentFragment = childFragmentManager.findFragmentByTag("${tag}0") + ?: UserCommentHistoryFragment.getInstance(mUserHomeViewModel.userId) + fragmentList.add(commentFragment) + titleList.add("游戏评论 ${count.gameComment}") + + if (count.getQaCount() > 0) { + val qaFragment = childFragmentManager.findFragmentByTag("${tag}1") + ?: UserHistoryFragment.getInstance(mUserHomeViewModel.userId, UserHistoryViewModel.SCENE.QUESTION_ANSWER, count) + fragmentList.add(qaFragment) + titleList.add("问答 ${count.getQaCount()}") + } + + if (count.video > 0) { + val videoFragment = childFragmentManager.findFragmentByTag("${tag}2") + ?: UserVideoHistoryFragment.getInstance(mUserHomeViewModel.userId, count) + fragmentList.add(videoFragment) + titleList.add("视频 ${count.video}") + } viewpager.offscreenPageLimit = fragmentList.size viewpager.adapter = FragmentAdapter(childFragmentManager, fragmentList, titleList) @@ -260,43 +321,58 @@ class UserHomeFragment : NormalFragment() { private fun updateUserInfo(personalData: PersonalEntity) { mHomeBinding?.run { + mPersonalEntity = personalData entity = personalData +// personalData.auth?.let { +// userAuthCommand.text = it.text +// userAuthCommand.setTextColor(Color.parseColor("#" + it.color)) +// it.articleId?.let { +// userAuthCommand.setOnClickListener { +// startActivity(NewsDetailActivity.getIntentById(requireContext(), personalData.auth.articleId, "$mEntrance+(个人主页)")) +// } +// } +// } + + // 设置有边框挂件的头像 userIcon.display(personalData.iconBorder?.url, personalData.icon, personalData.auth?.icon) - personalData.auth?.let { - userAuthCommand.text = it.text - userAuthCommand.setTextColor(Color.parseColor("#" + it.color)) - it.articleId?.let { - userAuthCommand.setOnClickListener { - startActivity(NewsDetailActivity.getIntentById(requireContext(), personalData.auth.articleId, "$mEntrance+(个人主页)")) - } - } - } if (mUserHomeViewModel.userId != UserManager.getInstance().userId) { userFansCountHint.visibility = View.GONE - userConcernOrEdit.run { - typeface = Typeface.defaultFromStyle(Typeface.BOLD) - if (personalData.me.isFollower) { - setText(R.string.concerned) - setTextColor(R.color.text_999999.toColor()) - setBackgroundResource(R.drawable.questions_detail_tag_bg) - } else { - setText(R.string.concern) - setTextColor(R.color.theme_font.toColor()) - setBackgroundResource(R.drawable.questions_detail_tag_bg) - } + userConcernBtn.run { + visibility = View.VISIBLE + setText(if (personalData.me.isFollower) R.string.concerned else R.string.concern) } } else { - userConcernOrEdit.text = "编辑" + userEditBtn.visibility = View.VISIBLE + userChangeBgBtn.visibility = View.VISIBLE + recentVisitContainer.visibility = View.VISIBLE + recentVisitIcon.setOnClickListener { + DirectUtils.directToHomeActivity(requireContext(), personalData.lastVisitor?.id, "个人主页-最近来访") + } + + // 跳转更换背景页 + userChangeBgBtn.setOnClickListener { + startActivity(PersonalityBackgroundActivity.getIntent(requireContext())) + } } - userConcernOrEdit.visibility = View.VISIBLE userBadgeTitle.text = if (mUserHomeViewModel.userId == UserManager.getInstance().userId) "我的徽章" else "TA的徽章" - userIcon.setOnClickListener { - MtaHelper.onEvent("个人主页详情", "个人主页详情", "头像") - startActivity(ImageViewerActivity.getIntent(requireContext(), arrayListOf(personalData.icon), 0, userIcon, "$mEntrance+($mPath)")) + personalData.background?.url?.let { + userBackground.setOnClickListener { + startActivity(ImageViewerActivity.getIntent(requireContext(), arrayListOf(personalData.background!!.url), 0, userIcon, "$mEntrance+($mPath)", true)) + } } + + userIcon.setOnClickListener { + if (mUserHomeViewModel.userId == UserManager.getInstance().userId) { + MtaHelper.onEvent("个人主页详情", "个人主页详情", "头像") + startActivity(AvatarBorderActivity.getIntent(requireContext())) + } else { + startActivity(ImageViewerActivity.getIntent(requireContext(), arrayListOf(personalData.icon), 0, userIcon, "$mEntrance+($mPath)", true)) + } + } + userFollowerContainer.setOnClickListener { MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注数") startActivity(FollowersActivity.getIntent(requireContext(), mUserHomeViewModel.userId, mEntrance, mPath)) @@ -309,21 +385,20 @@ class UserHomeFragment : NormalFragment() { MtaHelper.onEvent("个人主页详情", "个人主页详情", "赞同数") Utils.toast(requireContext(), "共获得 " + NumberUtils.transSimpleCount(entity?.count?.vote!!) + " 赞同") } - userConcernOrEdit.setOnClickListener { + userEditBtn.setOnClickListener { + MtaHelper.onEvent("个人主页详情", "个人主页详情", "编辑按钮") + requireContext().startActivity(UserInfoActivity.getIntent(requireContext())) + } + userConcernBtn.setOnClickListener { ifLogin("个人主页-关注-[关注]") { - if (mUserHomeViewModel.userId == UserManager.getInstance().userId) { - MtaHelper.onEvent("个人主页详情", "个人主页详情", "编辑按钮") - requireContext().startActivity(UserInfoActivity.getIntent(requireContext())) + MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注按钮") + if (personalData.me.isFollower) { + DialogUtils.showAlertDialog(requireContext(), "取消关注", "确定要取消关注 ${personalData.name} 吗?", + "确定取消", "暂不取消", DialogUtils.ConfirmListener { + mUserHomeViewModel.unFollow() + }, null) } else { - MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注按钮") - if (personalData.me.isFollower) { - DialogUtils.showAlertDialog(requireContext(), "取消关注", "确定要取消关注 ${personalData.name} 吗?", - "确定取消", "暂不取消", DialogUtils.ConfirmListener { - mUserHomeViewModel.unFollow() - }, null) - } else { - mUserHomeViewModel.follow() - } + mUserHomeViewModel.follow() } } } @@ -352,4 +427,19 @@ class UserHomeFragment : NormalFragment() { } } + @OnClick(R.id.iv_back, R.id.iv_share) + fun onViewClicked(v: View) { + when(v.id) { + R.id.iv_back -> requireActivity().finish() + + R.id.iv_share -> ShareUtils.getInstance(requireContext()).showShareUserHomeWindows(requireActivity(), + mHomeBinding?.root, + "https://www.baidu.com", + mPersonalEntity.icon, + "【推荐】来自光环助手的${mPersonalEntity.name}" , + "好燃~ 玩过 $mPlayGameCount 款游戏\n给力~ 已领取 $mBadgeCount 枚徽章\n${mPersonalEntity.introduce}\n要好玩,上光环", + ShareUtils.ShareEntrance.userHome, + mPersonalEntity.id, null) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt index 041fadec11..6a25f8bdd4 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt @@ -28,6 +28,7 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV var badges = MutableLiveData>() var availableBadge = MutableLiveData() var availableBadgeCount = MutableLiveData() + var playGamesCount = MutableLiveData() fun getUserInfo() { RetrofitManager.getInstance(getApplication()) @@ -77,6 +78,20 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV }) } + @SuppressLint("CheckResult") + fun getUserPlayedGameCount() { + RetrofitManager.getInstance(getApplication()) + .api.getPlayedGamesCount(userId, Utils.getTime(getApplication())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: retrofit2.Response) { + var countContent = data.headers().get("Total") + playGamesCount.postValue(countContent?.toInt() ?: 0) + } + }) + } + private fun followingCommand(isFollow: Boolean) { val observable = if (isFollow) { RetrofitManager.getInstance(getApplication()).api.postFollowing(userId) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsActivity.kt b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsActivity.kt new file mode 100644 index 0000000000..98d0e7ed8e --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsActivity.kt @@ -0,0 +1,26 @@ +package com.gh.gamecenter.personalhome.excellentcomments + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.gh.base.BaseActivity +import com.gh.common.util.EntranceUtils +import com.gh.gamecenter.NormalActivity + +class ExcellentCommentsActivity : NormalActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setNavigationTitle("优秀评论") + } + + companion object { + fun getIntent(context: Context, userId: String, entrance: String, path: String): Intent { + val bundle = Bundle() + bundle.putString(EntranceUtils.KEY_USER_ID, userId) + bundle.putString(EntranceUtils.KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path)) + return getTargetIntent(context, ExcellentCommentsActivity::class.java, ExcellentCommentsFragment::class.java, bundle) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsAdapter.kt new file mode 100644 index 0000000000..630ace0abb --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsAdapter.kt @@ -0,0 +1,124 @@ +package com.gh.gamecenter.personalhome.excellentcomments + +import android.content.Context +import android.util.SparseBooleanArray +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.constant.ItemViewType +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder +import com.gh.gamecenter.adapter.viewholder.UserCommentHistoryItemViewHolder +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.ItemUserCommentHistoryBinding +import com.gh.gamecenter.gamedetail.rating.RatingReplyActivity +import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity +import com.gh.gamecenter.personalhome.rating.MyRating +import kotlinx.android.synthetic.main.item_my_game_rating.view.* +import java.util.regex.Pattern + +class ExcellentCommentsAdapter(context: Context, val mListViewModel: ExcellentCommentsViewModel, val mEntrance: String) : + ListAdapter(context) { + + private var mExpandSparseBooleanArray = SparseBooleanArray() + + override fun getItemViewType(position: Int): Int { + return if (position == itemCount - 1) ItemViewType.ITEM_FOOTER else ItemViewType.ITEM_BODY + } + + override fun getItemCount(): Int { + return if (mEntityList.isNullOrEmpty()) 0 else mEntityList.size + FOOTER_ITEM_COUNT + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder { + val view: View + return when (viewType) { + ItemViewType.ITEM_FOOTER -> { + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) + FooterViewHolder(view) + } + else -> { + view = mLayoutInflater.inflate(R.layout.item_user_comment_history, parent, false) + UserCommentHistoryItemViewHolder(ItemUserCommentHistoryBinding.bind(view)) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is UserCommentHistoryItemViewHolder -> { + var isChildLongClick = false + val rating = mEntityList[position] + holder.binding.entity = rating + + holder.binding.divider.visibility = if (position == 0) View.GONE else View.VISIBLE + + val maxDesLines = if (mExpandSparseBooleanArray.get(holder.adapterPosition)) Int.MAX_VALUE else 3 + holder.binding.tvComment.setExpandMaxLines(maxDesLines) + holder.binding.tvComment.setIsExpanded(Int.MAX_VALUE == maxDesLines) + + holder.binding.gameIcon.displayGameIcon(rating.game.getRawIconIfExisted(), rating.game.iconSubscript) + + val m = Pattern.compile(RatingEditActivity.LABEL_REGEX).matcher(rating.content) + if (m.find()) { + val contents = TextHelper.getCommentLabelSpannableStringBuilder(rating.content, R.color.theme_font) + holder.binding.tvComment.setTextWithHighlightedTextWrappedInsideWrapper(text = contents, copyClickedText = true) + } else { + holder.binding.tvComment.setTextWithHighlightedTextWrappedInsideWrapper(text = rating.content, copyClickedText = true) + } + holder.itemView.tv_comment.setExpandCallback { + mExpandSparseBooleanArray.put(holder.adapterPosition, true) + } + +// holder.binding.vote.setOnClickListener { +// mContext.ifLogin(mEntrance) { +// if (!holder.binding.vote.isChecked) { +// mListViewModel.voteComment(rating.game.id, rating.id, callback = { +// val count = rating.vote + 1 +// holder.binding.vote.text = count.toString() +// holder.binding.vote.isChecked = true +// rating.vote = count +// rating.me.isVoted = true +// }) +// } else { +// mListViewModel.unVoteComment(rating.game.id, rating.id, callback = { +// val count = rating.vote - 1 +// holder.binding.vote.text = if (count == 0) "" else count.toString() +// holder.binding.vote.isChecked = false +// rating.vote = count +// rating.me.isVoted = false +// }) +// } +// } +// } + + holder.binding.apply { + gameInfo.setOnClickListener { + MtaHelper.onEvent("我的光环_新", "我的游戏评论", "游戏详情") + DirectUtils.directToGameDetail(mContext, rating.game.id, "我的游戏评论") + } + commentInfo.setOnClickListener { + if (isChildLongClick) { + isChildLongClick = false + return@setOnClickListener + } + MtaHelper.onEvent("我的光环_新", "我的游戏评论", "评论详情") + val intent = RatingReplyActivity.getIntent(mContext, rating.game.id, rating.id, false, "我的游戏评论", "") + + SyncDataBetweenPageHelper.startActivityForResult(mContext, intent, 100, position) + } + tvComment.setOnLongClickListener(View.OnLongClickListener { + isChildLongClick = true + rating.content.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "").copyTextAndToast() + return@OnLongClickListener true + }) + } + } + is FooterViewHolder -> { + holder.initItemPadding() + holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsFragment.kt new file mode 100644 index 0000000000..01510652d4 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsFragment.kt @@ -0,0 +1,32 @@ +package com.gh.gamecenter.personalhome.excellentcomments + +import com.gh.common.util.EntranceUtils +import com.gh.common.util.dip2px +import com.gh.common.util.viewModelProvider +import com.gh.common.view.SpacingItemDecoration +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.baselist.ListFragment +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.personalhome.rating.MyRating +import com.halo.assistant.HaloApp + +open class ExcellentCommentsFragment : ListFragment() { + + protected var mAdapter: ExcellentCommentsAdapter? = null + protected lateinit var mViewModel: ExcellentCommentsViewModel + + + override fun provideListViewModel(): ExcellentCommentsViewModel { + val userId = arguments?.getString(EntranceUtils.KEY_USER_ID) ?: UserManager.getInstance().userId + mViewModel = viewModelProvider(ExcellentCommentsViewModel.Factory(HaloApp.getInstance().application, userId)) + return mViewModel + } + + override fun provideListAdapter(): ListAdapter { + return mAdapter + ?: ExcellentCommentsAdapter(requireContext(), mViewModel, mEntrance).apply { mAdapter = this } + } + + override fun getItemDecoration() = SpacingItemDecoration(onlyDecorateTheFirstItem = true, top = 8F.dip2px()) + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsViewModel.kt new file mode 100644 index 0000000000..c82da062fd --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/excellentcomments/ExcellentCommentsViewModel.kt @@ -0,0 +1,38 @@ +package com.gh.gamecenter.personalhome.excellentcomments + +import android.app.Application +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.personalhome.rating.MyRating +import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.Observable +import io.reactivex.Single + +class ExcellentCommentsViewModel(application: Application, var userId: String) + : ListViewModel(application) { + + init { + setOverLimitSize(1) + } + + override fun provideDataObservable(page: Int): Observable>? { + return null + } + + override fun provideDataSingle(page: Int): Single> { + return RetrofitManager.getInstance(getApplication()).api.getMyRating(userId, page, "view:jingxuan") + } + + override fun mergeResultLiveData() { + mResultLiveData.addSource(mListLiveData) { mResultLiveData.postValue(it) } + } + + class Factory(private val mApplication: Application, + private val mUserId: String) : ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return ExcellentCommentsViewModel(mApplication, mUserId) as T + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/HorizontalExcellentCommentsAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/HorizontalExcellentCommentsAdapter.kt new file mode 100644 index 0000000000..d914f146ce --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/HorizontalExcellentCommentsAdapter.kt @@ -0,0 +1,66 @@ +package com.gh.gamecenter.personalhome.home + +import android.content.Context +import android.view.ViewGroup +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.UserHomeAmwayItemViewHolder +import com.gh.gamecenter.databinding.UserHomeAmwayItemBinding +import com.gh.gamecenter.gamedetail.rating.RatingReplyActivity +import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity +import com.gh.gamecenter.personalhome.rating.MyRating +import com.lightgame.adapter.BaseRecyclerAdapter +import java.util.regex.Pattern + +class HorizontalExcellentCommentsAdapter(context: Context, + var dataList: List) : BaseRecyclerAdapter(context) { + + var mMaxWidth = context.resources.displayMetrics.widthPixels + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserHomeAmwayItemViewHolder { + val view = mLayoutInflater.inflate(R.layout.user_home_amway_item, parent, false) + return UserHomeAmwayItemViewHolder(UserHomeAmwayItemBinding.bind(view)) + } + + override fun onBindViewHolder(holder: UserHomeAmwayItemViewHolder, position: Int) { + holder.binding.run { + data = dataList[position] + var rating = dataList[position] + + val padLeft = if (position == 0) { + 16F.dip2px() + } else 12F.dip2px() + holder.itemView.setPadding(padLeft, 0, 0, 12F.dip2px()) + +// all.visibility = if (position == itemCount - 1) { +// View.VISIBLE +// } else View.GONE + + holder.itemView.layoutParams?.width = if (position == itemCount - 1) { + mMaxWidth - 4F.dip2px() + } else mMaxWidth - 60F.dip2px() + + gameIcon.displayGameIcon(rating.game.getRawIconIfExisted(), rating.game.iconSubscript) + + val m = Pattern.compile(RatingEditActivity.LABEL_REGEX).matcher(rating.content) + if (m.find()) { + val contents = TextHelper.getCommentLabelSpannableStringBuilder(rating.content, R.color.theme_font) + content.text = contents + } else { + content.text = rating.content + } + + commentBackground.setOnClickListener { + DirectUtils.directToGameDetail(mContext, rating.game.id, "个人主页-优秀评论") + } + + ratingBlock.setOnClickListener { + val intent = RatingReplyActivity.getIntent(mContext, rating.game.id, rating.id, false, "个人主页-优秀评论", "") + + SyncDataBetweenPageHelper.startActivityForResult(mContext, intent, 100, position) + } + } + } + + override fun getItemCount() = dataList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryAdapter.kt new file mode 100644 index 0000000000..00b79cbb19 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryAdapter.kt @@ -0,0 +1,237 @@ +package com.gh.gamecenter.personalhome.home + +import android.content.Context +import android.graphics.Color +import android.util.Log +import android.util.SparseBooleanArray +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.constant.ItemViewType +import com.gh.common.util.* +import com.gh.common.view.BugFixedPopupWindow +import com.gh.common.view.FixLinearLayoutManager +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.ExcellentCommentsHolder +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder +import com.gh.gamecenter.adapter.viewholder.UserCommentHistoryItemViewHolder +import com.gh.gamecenter.adapter.viewholder.UserCommentTitleHolder +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.ItemUserCommentHistoryBinding +import com.gh.gamecenter.gamedetail.rating.RatingReplyActivity +import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity +import com.gh.gamecenter.personalhome.excellentcomments.ExcellentCommentsActivity +import kotlinx.android.synthetic.main.item_my_game_rating.view.* +import java.util.regex.Pattern + +class UserCommentHistoryAdapter(context: Context, + val mEntrance: String, + val mListViewModel: UserCommentHistoryViewModel) : ListAdapter(context) { + + private var mExpandSparseBooleanArray = SparseBooleanArray() + private var mHasExcellent = false + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val view: View + return when (viewType) { + ItemViewType.ITEM_FOOTER -> { + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) + FooterViewHolder(view) + } + + TYPE_EXCELLENT -> { + mHasExcellent = true + view = mLayoutInflater.inflate(R.layout.item_excellent_comments, parent, false) + ExcellentCommentsHolder(view) + } + + TYPE_TITLE -> { + view = mLayoutInflater.inflate(R.layout.item_user_comment_title, parent, false) + UserCommentTitleHolder(view) + } + + TYPE_NORMAL -> { + view = mLayoutInflater.inflate(R.layout.item_user_comment_history, parent, false) + UserCommentHistoryItemViewHolder(ItemUserCommentHistoryBinding.bind(view)) + } + + else -> throw NullPointerException() + } + } + + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is ExcellentCommentsHolder -> { + val list = mEntityList[position].excellentComments!! + holder.run { + excellentCommentMore.run { + visibility = if (list.size > 10) View.VISIBLE else View.VISIBLE + setOnClickListener { + mContext.startActivity(ExcellentCommentsActivity.getIntent(mContext, mListViewModel.userId, mEntrance, "优秀评论-查看更多")) + } + } + + excellentCommentList.run { + layoutManager = FixLinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + if (list.size > 10) + adapter = HorizontalExcellentCommentsAdapter(mContext, if (list.size > 10) list.subList(0, 10) else list) + onFlingListener = null +// LeftPagerSnapHelper(4F.dip2px()).attachToRecyclerView(this) + } + } + } + + is UserCommentTitleHolder -> { + holder.run { + title.setOnClickListener { showFilterWindow(title) } + } + } + + is UserCommentHistoryItemViewHolder -> { + var isChildLongClick = false + val rating = mEntityList[position].normalComment!! + holder.binding.entity = rating + + holder.binding.divider.visibility = if ((mHasExcellent && position == 2) || (!mHasExcellent && position == 1)) View.GONE else View.VISIBLE + + val maxDesLines = if (mExpandSparseBooleanArray.get(holder.adapterPosition)) Int.MAX_VALUE else 3 + holder.binding.tvComment.setExpandMaxLines(maxDesLines) + holder.binding.tvComment.setIsExpanded(Int.MAX_VALUE == maxDesLines) + + holder.binding.gameIcon.displayGameIcon(rating.game.getRawIconIfExisted(), rating.game.iconSubscript) + + val m = Pattern.compile(RatingEditActivity.LABEL_REGEX).matcher(rating.content) + if (m.find()) { + val contents = TextHelper.getCommentLabelSpannableStringBuilder(rating.content, R.color.theme_font) + holder.binding.tvComment.setTextWithHighlightedTextWrappedInsideWrapper(text = contents, copyClickedText = true) + } else { + holder.binding.tvComment.setTextWithHighlightedTextWrappedInsideWrapper(text = rating.content, copyClickedText = true) + } + holder.itemView.tv_comment.setExpandCallback { + mExpandSparseBooleanArray.put(holder.adapterPosition, true) + } + + holder.binding.vote.setOnClickListener { + mContext.ifLogin(mEntrance) { + if (!holder.binding.vote.isChecked) { + mListViewModel.voteComment(rating.game.id, rating.id, callback = { + val count = rating.vote + 1 + holder.binding.vote.text = count.toString() + holder.binding.vote.isChecked = true + rating.vote = count + rating.me.isVoted = true + }) + } else { + mListViewModel.unVoteComment(rating.game.id, rating.id, callback = { + val count = rating.vote - 1 + holder.binding.vote.text = if (count == 0) "" else count.toString() + holder.binding.vote.isChecked = false + rating.vote = count + rating.me.isVoted = false + }) + } + } + } + + holder.binding.apply { + gameInfo.setOnClickListener { + MtaHelper.onEvent("我的光环_新", "我的游戏评论", "游戏详情") + DirectUtils.directToGameDetail(mContext, rating.game.id, "我的游戏评论") + } + commentInfo.setOnClickListener { + if (isChildLongClick) { + isChildLongClick = false + return@setOnClickListener + } + MtaHelper.onEvent("我的光环_新", "我的游戏评论", "评论详情") + val intent = RatingReplyActivity.getIntent(mContext, rating.game.id, rating.id, false, "我的游戏评论", "") + + SyncDataBetweenPageHelper.startActivityForResult(mContext, intent, 100, position) + } + tvComment.setOnLongClickListener(View.OnLongClickListener { + isChildLongClick = true + rating.content.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "").copyTextAndToast() + return@OnLongClickListener true + }) + } + } + is FooterViewHolder -> { + holder.initItemPadding() + holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint) + } + } + } + + private fun showFilterWindow(view: TextView) { + val contentList = listOf("全部评论", "精彩评论", "安利墙") + + val inflater = LayoutInflater.from(mContext) + val layout = inflater.inflate(R.layout.layout_user_history_filter, null) + val popupWindow = BugFixedPopupWindow( + layout, + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + + val container = layout.findViewById(R.id.container) + for (text in contentList) { + val item = inflater.inflate(R.layout.item_user_history_filter, container, false) + + container.addView(item) + + val hintTv = item.findViewById(R.id.hint_text) + hintTv.text = text + +// if (mViewModel.type.getDisplayText() == text) { +// hintTv.setTextColor(Color.parseColor("#1383EB")) +// } + + item.setOnClickListener { + view.text = text + mListViewModel.changeType(UserCommentHistoryViewModel.TYPE.typeFromDisplayText(text)) + popupWindow.dismiss() + } + } + + popupWindow.setOnDismissListener { +// filterArrow.rotation = 0f + } + + popupWindow.isTouchable = true + popupWindow.isFocusable = true + +// filterArrow.rotation = 180f + popupWindow.showAutoOrientation(view, DisplayUtils.dip2px(16f)) + } + + override fun getItemViewType(position: Int): Int { + return if (position == itemCount - 1) { + ItemViewType.ITEM_FOOTER + } else { + val item = mEntityList[position] + when { + item.excellentComments != null -> TYPE_EXCELLENT + + item.title != null -> TYPE_TITLE + + else -> TYPE_NORMAL + } + } + } + + override fun getItemCount(): Int { + return if (mEntityList.isNullOrEmpty()) 0 else mEntityList.size + FOOTER_ITEM_COUNT + } + + companion object { + private const val TYPE_EXCELLENT = 900 + + private const val TYPE_TITLE = 901 + + private const val TYPE_NORMAL = 902 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryFragment.kt new file mode 100644 index 0000000000..a520bf51df --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryFragment.kt @@ -0,0 +1,85 @@ +package com.gh.gamecenter.personalhome.home + +import android.os.Bundle +import android.view.View +import androidx.core.content.ContextCompat +import androidx.core.os.bundleOf +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.baselist.ListFragment +import com.gh.gamecenter.baselist.LoadStatus +import com.halo.assistant.HaloApp + +class UserCommentHistoryFragment : ListFragment() { + + private var mUserId: String = "" + + private var mAdapter: UserCommentHistoryAdapter? = null + private lateinit var mViewModel: UserCommentHistoryViewModel + + override fun getLayoutId(): Int { + return R.layout.fragment_user_comment_history + } + + override fun onCreate(savedInstanceState: Bundle?) { + arguments?.apply { + mUserId = getString(USER_ID, "") + } + super.onCreate(savedInstanceState) + + } + + override fun getItemDecoration() = null + + override fun provideListViewModel(): UserCommentHistoryViewModel { + mViewModel = viewModelProvider(UserCommentHistoryViewModel.Factory(HaloApp.getInstance().application, mUserId)) + + return mViewModel + } + + override fun provideListAdapter(): ListAdapter<*> { + if (mAdapter == null) { + mAdapter = UserCommentHistoryAdapter(requireContext(), mEntrance, mListViewModel) + } + return mAdapter!! + } + + override fun onLoadEmpty() { + + // RecyclerView 被隐藏的话会导致不能 AppBar 不能滑动 + mListRv.visibility = View.VISIBLE + + when (mViewModel.type) { + UserCommentHistoryViewModel.TYPE.ALL -> { + super.onLoadEmpty() + } + else -> { +// updateFilterHintText() + mAdapter?.loadChange(LoadStatus.INIT_OVER) + } + } +// mReuseNoData?.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.background)) + } + + override fun onLoadError() { + super.onLoadError() + + mListRv.visibility = View.VISIBLE + mReuseNoConn?.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.background)) + } + + companion object { + + const val USER_ID = "user_id" + + fun getInstance(userId: String): UserCommentHistoryFragment { + return UserCommentHistoryFragment().apply { + with(bundleOf( + UserHistoryFragment.USER_ID to userId + )) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryItemData.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryItemData.kt new file mode 100644 index 0000000000..298308a6d9 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryItemData.kt @@ -0,0 +1,7 @@ +package com.gh.gamecenter.personalhome.home + +import com.gh.gamecenter.personalhome.rating.MyRating + +data class UserCommentHistoryItemData(var excellentComments: List? = null, + var title: String? = null, + var normalComment: MyRating? = null) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryViewModel.kt new file mode 100644 index 0000000000..ba9b70d731 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserCommentHistoryViewModel.kt @@ -0,0 +1,150 @@ +package com.gh.gamecenter.personalhome.home + +import android.app.Application +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.gh.common.util.ErrorHelper +import com.gh.common.util.UrlFilterUtils +import com.gh.common.util.toObject +import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.baselist.LoadType +import com.gh.gamecenter.entity.ErrorEntity +import com.gh.gamecenter.personalhome.rating.MyRating +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.Response +import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.Observable +import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers +import okhttp3.ResponseBody +import retrofit2.HttpException + +class UserCommentHistoryViewModel(application: Application, var userId: String) + : ListViewModel(application) { + + private val mApi = RetrofitManager.getInstance(getApplication()).api + + var type: TYPE = TYPE.ALL + + init { + setOverLimitSize(1) + } + + override fun provideDataObservable(page: Int): Observable>? { + return null + } + + override fun provideDataSingle(page: Int): Single> { + return mApi.getMyRating(userId, page, getFilter()) + } + + override fun mergeResultLiveData() { + mResultLiveData.addSource(mListLiveData) { list -> + if (type == TYPE.ALL && list.isEmpty()) return@addSource + + val itemDataList = arrayListOf() + + mApi.getExcellentComments(userId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + if (data.isNotEmpty()) itemDataList.add(UserCommentHistoryItemData(excellentComments = data)) + + itemDataList.add(UserCommentHistoryItemData(title = "")) + + list.forEach { + itemDataList.add(UserCommentHistoryItemData(normalComment = it)) + } + + mResultLiveData.postValue(itemDataList) + } + }) + } + } + + + fun voteComment(gameId: String, commentId: String, callback: () -> Unit) { + mApi.voteGameComment(gameId, commentId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + callback.invoke() + } + + override fun onFailure(e: HttpException?) { + val string = e?.response()?.errorBody()?.string() + val errorEntity = string?.toObject() + if (errorEntity?.code == 403008) { + onResponse(null) + return + } + ErrorHelper.handleError(getApplication(), string) + } + }) + } + + fun unVoteComment(gameId: String, commentId: String, callback: () -> Unit) { + mApi.unvoteGameComment(gameId, commentId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + callback.invoke() + } + + override fun onFailure(e: HttpException?) { + val string = e?.response()?.errorBody()?.string() + ErrorHelper.handleError(getApplication(), string) + } + }) + } + + + fun changeType(type: TYPE) { + if (this.type != type) { + this.type = type + load(LoadType.REFRESH) + } + } + + private fun getFilter(): String { + return UrlFilterUtils.getFilterQuery( + "view", "halo", + "type", type.value) + + } + + enum class TYPE(val value: String) { + ALL("all"), + JINGXUAN("jingxuan"), + ANLIWALL("anliwall"); + + fun getDisplayText() = when (this) { + ALL -> "全部评论" + JINGXUAN -> "精彩评论" + ANLIWALL -> "安利墙" + } + + companion object { + fun typeFromDisplayText(text: String): TYPE { + return values().find { it.getDisplayText() == text } ?: ALL + } + + val TYPE_LIST = arrayListOf().apply { + TYPE.values().iterator().forEach { add(it.getDisplayText()) } + } + } + } + + class Factory(private val mApplication: Application, + private val mUserId: String) : ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return UserCommentHistoryViewModel(mApplication, mUserId) as T + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/rating/MyRating.kt b/app/src/main/java/com/gh/gamecenter/personalhome/rating/MyRating.kt index 1a4a4d5845..ce2e182be6 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/rating/MyRating.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/rating/MyRating.kt @@ -19,6 +19,10 @@ data class MyRating(@SerializedName("_id") var me: MeEntity = MeEntity(), val active: Boolean = true, var audit: Boolean = false, + @SerializedName("is_jingxuan") + val excellent: Boolean = false, + @SerializedName("anliwall") + val amway: Boolean = false, val game: PersonalHistoryEntity.Game = PersonalHistoryEntity.Game()) { fun transformHistoryEntity(): PersonalHistoryEntity { diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index de8cf0a296..92674258e1 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -1885,11 +1885,17 @@ public interface ApiService { Single> getAllTheGameReservations(@Path("user_id") String userId, @Query("timestamp") long timestamp); /** - * 个人主页-我的评分 + * 获取某用户的游戏评分列表(userId为本人则为个人主页-我的评分) */ @GET("users/{user_id}/games/comments") Single> getMyRating(@Path("user_id") String userId, @Query("page") int page, @Query("filter") String filter); + /** + * 我的光环-用户的优秀评论列表 + */ + @GET("users/{user_id}/games/comments?page=1&filter=view:jingxuan") + Single> getExcellentComments(@Path("user_id") String userId); + /** * 游戏评分-修改 */ @@ -2188,6 +2194,12 @@ public interface ApiService { @DELETE("users/{user_id}/played_games/{game_id}") Single deletePlayedGame(@Path("user_id") String userId, @Path("game_id") String gameId); + /** + * 获取玩过的游戏总数 + */ + @GET("users/{user_id}/played_games") + Single> getPlayedGamesCount(@Path("user_id") String userId, @Query("timestamp") long timestamp); + /** * 获取用户成功安装应用记录(用于玩过的游戏) */ diff --git a/app/src/main/res/drawable-xxhdpi/ic_badge_default.png b/app/src/main/res/drawable-xxhdpi/ic_badge_default.png new file mode 100644 index 0000000000000000000000000000000000000000..2c96a872ab8c5709d2f08316c0439902e01c0933 GIT binary patch literal 3534 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 IM6N<$f~)w>t^fc4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/share_qq.png b/app/src/main/res/drawable-xxhdpi/share_qq.png new file mode 100644 index 0000000000000000000000000000000000000000..d063a5561d7352b5ab1efde83581eb34c5ee3ff7 GIT binary patch literal 3783 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/share_weibo.png b/app/src/main/res/drawable-xxhdpi/share_weibo.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec0d233a6c094780f4e3406b6a4eeed65ab6bf3 GIT binary patch literal 5036 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 Id05o{01%1u@c;k- literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/share_qq.png b/app/src/main/res/drawable-xxxhdpi/share_qq.png new file mode 100644 index 0000000000000000000000000000000000000000..427b52eb9ccacc615a3ea6f941bd92eb8ca88392 GIT binary patch literal 5350 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 LL!m~_GW34{6fII{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/share_weibo.png b/app/src/main/res/drawable-xxxhdpi/share_weibo.png new file mode 100644 index 0000000000000000000000000000000000000000..63ab8d76daa004b430ef1eaf1878792ae5799819 GIT binary patch literal 7115 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 + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_comment_tag.xml b/app/src/main/res/drawable/bg_comment_tag.xml new file mode 100644 index 0000000000..171eb7c2c1 --- /dev/null +++ b/app/src/main/res/drawable/bg_comment_tag.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_follower_or_fans_btn.xml b/app/src/main/res/drawable/bg_follower_or_fans_btn.xml new file mode 100644 index 0000000000..abea68584e --- /dev/null +++ b/app/src/main/res/drawable/bg_follower_or_fans_btn.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_recent_visit.xml b/app/src/main/res/drawable/bg_recent_visit.xml new file mode 100644 index 0000000000..f132223805 --- /dev/null +++ b/app/src/main/res/drawable/bg_recent_visit.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_save_pic.xml b/app/src/main/res/drawable/bg_save_pic.xml new file mode 100644 index 0000000000..fd954fa75f --- /dev/null +++ b/app/src/main/res/drawable/bg_save_pic.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_user_home_normal_btn.xml b/app/src/main/res/drawable/bg_user_home_normal_btn.xml new file mode 100644 index 0000000000..7761ac0419 --- /dev/null +++ b/app/src/main/res/drawable/bg_user_home_normal_btn.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_viewimage.xml b/app/src/main/res/layout/activity_viewimage.xml index f052299d6b..7f9eb1a2c8 100644 --- a/app/src/main/res/layout/activity_viewimage.xml +++ b/app/src/main/res/layout/activity_viewimage.xml @@ -56,6 +56,19 @@ android:visibility="gone" tools:text="查看原图(1.8M)" tools:visibility="visible" /> - + + \ No newline at end of file diff --git a/app/src/main/res/layout/followers_or_fans_item.xml b/app/src/main/res/layout/followers_or_fans_item.xml index 1fd9c534c3..1493133006 100644 --- a/app/src/main/res/layout/followers_or_fans_item.xml +++ b/app/src/main/res/layout/followers_or_fans_item.xml @@ -1,25 +1,25 @@ - + - + + + + + name = "entity" + type = "com.gh.gamecenter.entity.FollowersOrFansEntity" /> + - - - - + + + + android:maxWidth="220dp" + android:layout_marginTop="5dp" + android:layout_marginLeft="8dp" + android:includeFontPadding="false" + android:textColor="@color/text_999999" + android:textSize="11sp" + android:text='@{TextUtils.isEmpty(entity.introduce)?"这是一个很神秘的崽~":entity.introduce}' + tools:text="这是一个很神秘的崽~这是一个很神秘的崽~这是一个很神秘的崽~这是一个很神秘的崽~" + app:layout_constraintTop_toBottomOf="@+id/user_name" + app:layout_constraintLeft_toRightOf="@+id/user_icon" + app:layout_constraintBottom_toBottomOf="@+id/user_icon" /> + visibleGone="@{entity.count.answer > 0 && entity.count.vote > 0}" + android:id = "@+id/count_rl" + android:layout_width = "wrap_content" + android:layout_height = "wrap_content" + android:layout_marginLeft = "8dp" + android:layout_marginTop = "12dp" + app:layout_constraintLeft_toRightOf = "@id/user_icon" + app:layout_constraintTop_toBottomOf = "@id/user_introduce" + app:layout_constraintBottom_toBottomOf = "parent"> + visibleGone="@{entity.count.answer > 0}" + android:id = "@+id/answer_count" + android:layout_width = "wrap_content" + android:layout_height = "wrap_content" + android:layout_marginRight = "11dp" + tools:text="1回答" + android:text = "@{NumberUtils.transSimpleCount(entity.count.answer) + `回答`}" + android:textColor = "@color/text_666666" + android:textSize = "11sp" /> - + visibleGone="@{entity.count.vote > 0}" + android:id = "@+id/vote_count" + android:layout_width = "wrap_content" + android:layout_height = "wrap_content" + android:layout_toRightOf = "@id/answer_count" + tools:text = "1赞同" + android:text = "@{NumberUtils.transSimpleCount(entity.count.vote) + `赞同`}" + android:textColor = "@color/text_666666" + android:textSize = "11sp" /> + + app:layout_constraintTop_toTopOf = "parent" + app:layout_constraintBottom_toBottomOf = "parent" + app:layout_constraintRight_toRightOf = "parent" + tools:text = "关注" /> - - + + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index bfb3700f37..eba718061a 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -46,28 +46,35 @@ + android:background="@color/lite_blue"> - - - + app:layout_constraintTop_toTopOf="parent"> + + + + + + @@ -115,13 +124,14 @@ visibleGone="@{TextUtils.isEmpty(entity.introduce)?false:true}" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="11dp" android:lineSpacingMultiplier="1.2" android:paddingLeft="20dp" android:paddingRight="20dp" android:text="@{entity.introduce}" android:textColor="@color/title" android:textSize="15sp" - app:layout_constraintTop_toBottomOf="@id/user_icon" /> + app:layout_constraintTop_toBottomOf="@id/user_icon_container" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_personal.xml b/app/src/main/res/layout/fragment_personal.xml index 61f3cfb0ed..600c52fe81 100644 --- a/app/src/main/res/layout/fragment_personal.xml +++ b/app/src/main/res/layout/fragment_personal.xml @@ -3,21 +3,21 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/list_refresh" + android:fitsSystemWindows="true" android:layout_width="match_parent" - android:layout_height="match_parent" - android:fitsSystemWindows="true"> - + android:layout_height="match_parent"> @@ -32,41 +32,53 @@ + android:layout_height="184dp"> + + + android:layout_width="70dp" + android:layout_height="70dp" + android:gravity="center" + app:avatar_width="70dp" /> - + android:layout_alignParentBottom="true" /> @@ -74,25 +86,26 @@ android:id="@+id/personal_login" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginLeft="12dp" android:text="立即登录" android:textColor="@color/white" android:textSize="18sp" android:textStyle="bold" - android:layout_marginLeft="90dp" app:layout_constraintBottom_toBottomOf="@+id/personal_user_icon_container" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintStart_toEndOf="@+id/personal_user_icon_container" app:layout_constraintTop_toTopOf="@+id/personal_user_icon_container" /> @@ -118,12 +130,12 @@ android:id="@+id/personal_badge_tv" android:layout_width="58dp" android:layout_height="14dp" - android:layout_centerVertical="true" android:layout_marginLeft="4dp" - android:background="@drawable/bg_personal_badge" - android:gravity="center_vertical|right" - android:includeFontPadding="false" android:paddingRight="8dp" + android:layout_centerVertical="true" + android:gravity="center_vertical|right" + android:background="@drawable/bg_personal_badge" + android:includeFontPadding="false" android:text="领取徽章" android:textColor="@color/white" android:textSize="9sp" /> @@ -132,7 +144,7 @@ android:id="@+id/personal_badge_icon" android:layout_width="16dp" android:layout_height="16dp" - app:placeholderImage="@drawable/ic_personal_badge" /> + app:placeholderImage="@drawable/ic_badge_default" /> + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_excellent_comments.xml b/app/src/main/res/layout/item_excellent_comments.xml new file mode 100644 index 0000000000..e6f2260c5a --- /dev/null +++ b/app/src/main/res/layout/item_excellent_comments.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_user_comment_history.xml b/app/src/main/res/layout/item_user_comment_history.xml new file mode 100644 index 0000000000..098bd11910 --- /dev/null +++ b/app/src/main/res/layout/item_user_comment_history.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_user_comment_title.xml b/app/src/main/res/layout/item_user_comment_title.xml new file mode 100644 index 0000000000..4c05c2a14b --- /dev/null +++ b/app/src/main/res/layout/item_user_comment_title.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/popup_share_dialog.xml b/app/src/main/res/layout/popup_share_dialog.xml new file mode 100644 index 0000000000..1cd9bc6bb3 --- /dev/null +++ b/app/src/main/res/layout/popup_share_dialog.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/user_home_amway_item.xml b/app/src/main/res/layout/user_home_amway_item.xml new file mode 100644 index 0000000000..6455e4411e --- /dev/null +++ b/app/src/main/res/layout/user_home_amway_item.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index da7a295767..a5db181a41 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -85,6 +85,7 @@ #66000000 #80000000 + #33FFFFFF #99FFFFFF #80FFFFFF #E6FFFFFF @@ -111,6 +112,7 @@ #e5e5e5 #ECF6FF #EDEDED + #F2F2F2 #80000000 #404040 #ededed @@ -198,5 +200,7 @@ #28282E #3796FF #213964 + #06CEA8 + #FFA142 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 99352fd78e..ac543ef691 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -726,6 +726,24 @@ 领取徽章 申请领取 + 最近来访 + 今日来访 + 关注 + 粉丝 + 赞同 + 编辑 + 更换背景 + 安利墙 + 精彩评论 + 分享到 + 微信好友 + 朋友圈 + QQ好友 + QQ空间 + 微博 + 优秀评论 + 查看更多 +