diff --git a/app/src/main/java/com/gh/common/TimeElapsedHelper.kt b/app/src/main/java/com/gh/common/TimeElapsedHelper.kt new file mode 100644 index 0000000000..8ee83b5a92 --- /dev/null +++ b/app/src/main/java/com/gh/common/TimeElapsedHelper.kt @@ -0,0 +1,61 @@ +package com.gh.common + +import android.support.v4.app.Fragment +import android.support.v4.app.FragmentManager +import java.util.concurrent.Executors + +/** + * 统计用户在当前 Fragment 的停留时间,在 onViewDestroy 或 onDestroy 里获取 elapsedTime 即可,单位为秒 + */ +class TimeElapsedHelper(var fragment: Fragment) { + + private var isWorking = false + + var elapsedTime: Int = 0 + + init { + fragment.fragmentManager?.registerFragmentLifecycleCallbacks( + object : FragmentManager.FragmentLifecycleCallbacks() { + override fun onFragmentResumed(fm: FragmentManager?, f: Fragment?) { + if (f === fragment) { + resumeCounting() + } + } + + override fun onFragmentPaused(fm: FragmentManager?, f: Fragment?) { + if (f === fragment) { + pauseCounting() + } + } + + override fun onFragmentViewDestroyed(fm: FragmentManager?, f: Fragment?) { + if (f === fragment) { + fragment.fragmentManager?.unregisterFragmentLifecycleCallbacks(this) + } + } + }, false) + } + + private fun resumeCounting() { + isWorking = true + TimeElapsedThreadHolder.threadService.execute { + while (isWorking) { + try { + elapsedTime++ + Thread.sleep(1000) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + } + + private fun pauseCounting() { + isWorking = false + } + +} + +object TimeElapsedThreadHolder { + val threadService = Executors.newSingleThreadExecutor() +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/DataUtils.java b/app/src/main/java/com/gh/common/util/DataUtils.java index f84a9dda07..eba8fa2403 100644 --- a/app/src/main/java/com/gh/common/util/DataUtils.java +++ b/app/src/main/java/com/gh/common/util/DataUtils.java @@ -163,6 +163,24 @@ public class DataUtils { StatService.trackCustomKVEvent(var0, var1, prop); } + public static void trackTimeEvent(Context context, String eventId, int costTime, String... kv) { + + Properties prop = new Properties(); + for (int i = 0; i < kv.length; i++) { + if (i % 2 != 0 || i != 0) { + String key = kv[i - 1]; + String value = kv[i]; + if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { + prop.setProperty(key, value); + } + } + } + + if (prop.size() == 0) return; + + StatService.trackCustomKVTimeIntervalEvent(context, costTime, eventId, prop); + } + // 游戏下载 public static void onGameDownloadEvent(Context context, String gameName, String platform, String entrance, String status) { Map kv = new HashMap<>(); diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index 17d4dff76f..8441dd3240 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -23,7 +23,7 @@ import com.lightgame.utils.Utils object DirectUtils { @JvmStatic - fun directToSpecificPage(context: Context, type: String, link: String, text: String? = "", entrance: String? = null) { + fun directToSpecificPage(context: Context, type: String, link: String, text: String? = "", entrance: String? = null, path: String? = null) { when (type) { EntranceUtils.HOST_ARTICLE -> directToArticle(context, id = link, entrance = entrance) @@ -33,9 +33,9 @@ object DirectUtils { EntranceUtils.HOST_COLUMN -> directToSubject(context, id = link, subjectName = text, entrance = entrance) - EntranceUtils.HOST_QUESTION -> directToQuestionDetail(context, id = link, entrance = entrance) + EntranceUtils.HOST_QUESTION -> directToQuestionDetail(context, id = link, entrance = entrance, path = path) - EntranceUtils.HOST_ANSWER -> directToAnswerDetail(context, id = link, entrance = entrance) + EntranceUtils.HOST_ANSWER -> directToAnswerDetail(context, id = link, entrance = entrance, path = path) EntranceUtils.HOST_WEB -> directToWebView(context, url = link, entrance = entrance) @@ -134,19 +134,21 @@ object DirectUtils { } @JvmStatic - fun directToAnswerDetail(context: Context, id: String, entrance: String? = null) { + fun directToAnswerDetail(context: Context, id: String, entrance: String? = null, path: String? = null) { val bundle = Bundle() bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER) bundle.putString(KEY_TO, AnswerDetailActivity::class.java.name) + bundle.putString(KEY_PATH, path) bundle.putString(KEY_ANSWER_ID, id) EntranceUtils.jumpActivity(context, bundle) } @JvmStatic - fun directToQuestionDetail(context: Context, id: String, entrance: String? = null) { + fun directToQuestionDetail(context: Context, id: String, entrance: String? = null, path: String? = null) { val bundle = Bundle() bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER) bundle.putString(KEY_TO, QuestionsDetailActivity::class.java.name) + bundle.putString(KEY_PATH, path) bundle.putString(KEY_QUESTIONS_ID, id) EntranceUtils.jumpActivity(context, bundle) } diff --git a/app/src/main/java/com/gh/common/util/StringUtils.java b/app/src/main/java/com/gh/common/util/StringUtils.java index 3fad12c719..d4ed2cd30f 100644 --- a/app/src/main/java/com/gh/common/util/StringUtils.java +++ b/app/src/main/java/com/gh/common/util/StringUtils.java @@ -1,5 +1,7 @@ package com.gh.common.util; +import android.text.TextUtils; + /** * Created by khy on 2017/5/2. */ @@ -21,4 +23,21 @@ public class StringUtils { return result.toString(); } + + /** + * 将两个字符串拼接起来,以 "displayName(description)" 的形式返回 + * + * @param displayName 若传入的 displayName 长度大于 30 截取 30 并补充 "..." + * @param description 不需额外处理的入参 + * @return "display(description)" + */ + public static String combineTwoString(String displayName, String description) { + if (TextUtils.isEmpty(displayName) || TextUtils.isEmpty(description)) return ""; + + if (displayName.length() > 30) { + displayName = displayName.substring(0, 30) + "..."; + } + + return displayName + "(" + description + ")"; + } } diff --git a/app/src/main/java/com/gh/common/view/WelcomeDialog.kt b/app/src/main/java/com/gh/common/view/WelcomeDialog.kt index d7a4a2877d..5a99dbb51a 100644 --- a/app/src/main/java/com/gh/common/view/WelcomeDialog.kt +++ b/app/src/main/java/com/gh/common/view/WelcomeDialog.kt @@ -41,10 +41,10 @@ class WelcomeDialog : BaseDialogFragment() { DirectUtils.directToSubject(context!!, mWelcomeEntity?.link!!, null, EntranceUtils.ENTRANCE_WELCOME) } EntranceUtils.HOST_QUESTION -> { - DirectUtils.directToQuestionDetail(context!!, mWelcomeEntity?.link!!, EntranceUtils.ENTRANCE_WELCOME) + DirectUtils.directToQuestionDetail(context!!, mWelcomeEntity?.link!!, EntranceUtils.ENTRANCE_WELCOME, "首页弹窗") } EntranceUtils.HOST_ANSWER -> { - DirectUtils.directToAnswerDetail(context!!, mWelcomeEntity?.link!!, EntranceUtils.ENTRANCE_WELCOME) + DirectUtils.directToAnswerDetail(context!!, mWelcomeEntity?.link!!, EntranceUtils.ENTRANCE_WELCOME, "首页弹窗") } EntranceUtils.HOST_WEB -> { DirectUtils.directToWebView(context!!, mWelcomeEntity?.link!!, EntranceUtils.ENTRANCE_WELCOME) diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index c67e6a2e66..f64f35ca07 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -1005,7 +1005,12 @@ public class MainActivity extends BaseActivity { UserManager.getInstance().setCommunityData(new CommunityEntity(info.getLink(), info.getText())); runOnUiThread(() -> mMainWrapperFragment.setCurrentItem(MainWrapperFragment.INDEX_ASK)); } else { - DirectUtils.directToSpecificPage(this, info.getType(), info.getLink(), info.getText(), EntranceUtils.KEY_PLUGIN); + DirectUtils.directToSpecificPage(this, + info.getType(), + info.getLink(), + info.getText(), + EntranceUtils.KEY_PLUGIN, + "特定包启动跳转"); } } } diff --git a/app/src/main/java/com/gh/gamecenter/SkipActivity.java b/app/src/main/java/com/gh/gamecenter/SkipActivity.java index cbdfe9e3c7..63e3697331 100644 --- a/app/src/main/java/com/gh/gamecenter/SkipActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SkipActivity.java @@ -76,10 +76,10 @@ public class SkipActivity extends BaseActivity { DirectUtils.directToDownloadManager(this, ENTRANCE_BROWSER); break; case HOST_ANSWER: - DirectUtils.directToAnswerDetail(this, id, ENTRANCE_BROWSER); + DirectUtils.directToAnswerDetail(this, id, ENTRANCE_BROWSER, "浏览器"); break; case HOST_QUESTION: - DirectUtils.directToQuestionDetail(this, id, ENTRANCE_BROWSER); + DirectUtils.directToQuestionDetail(this, id, ENTRANCE_BROWSER,"浏览器"); break; case HOST_COMMUNITY: DirectUtils.directToCommunity(this, id, name, ENTRANCE_BROWSER); diff --git a/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java b/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java index d2005a9d92..6f8320a6e9 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java +++ b/app/src/main/java/com/gh/gamecenter/collection/AnswerFragment.java @@ -53,7 +53,7 @@ public class AnswerFragment extends ListFragment case "invited": if (view.getId() == R.id.message_original || view.getId() == R.id.message_item) { MessageEntity.Question question = entity.getQuestion(); - context.startActivity(QuestionsDetailActivity.getIntent(context, question.getId(), tracers)); + context.startActivity(QuestionsDetailActivity.getIntent(context, question.getId(), tracers, "消息中心")); Questions questions = new Questions(); questions.setId(question.getId()); @@ -213,24 +213,24 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder case "follow_question": if (view.getId() == R.id.message_original) { MessageEntity.Question question = entity.getQuestion(); - context.startActivity(QuestionsDetailActivity.getIntent(context, question.getId(), tracers)); + context.startActivity(QuestionsDetailActivity.getIntent(context, question.getId(), tracers, "消息中心")); Questions questions = new Questions(); questions.setId(question.getId()); questions.setTitle(question.getTitle()); LogUtils.uploadQuestions(context, tracers, questions); } else if (view.getId() == R.id.message_item) { - context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers)); + context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers, "消息中心")); } break; case "answer_vote": if (view.getId() == R.id.message_original || view.getId() == R.id.message_item) { - context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers)); + context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers, "消息中心")); } break; case "reply_answer_comment": if (view.getId() == R.id.message_original) { - context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers)); + context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers, "消息中心")); } else if (view.getId() == R.id.message_item) { Intent intent = CommentDetailActivity.getAnswerCommentIntent(context, entity.getDialogue().getFrom().getId(), entity.getAnswer().getId()); context.startActivity(intent); @@ -239,10 +239,10 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder case "answer_comment_vote": case "answer_comment": if (view.getId() == R.id.message_original) { - context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers)); + context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers, "消息中心")); } else if (view.getId() == R.id.message_item) { // 打开评论管理 - context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers, true)); + context.startActivity(AnswerDetailActivity.getIntent(context, entity.getAnswer().getId(), tracers, "消息中心",true)); } break; } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/PersonalHomeAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/PersonalHomeAdapter.kt index 73661dfd98..bc77b954ac 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/PersonalHomeAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/PersonalHomeAdapter.kt @@ -113,11 +113,11 @@ class PersonalHomeAdapter(context: Context, userVoteContainer.setOnClickListener { Utils.toast(mContext, "共获得" + entity?.count?.answerVote + "赞同") } - userConcernOrEdit.setOnClickListener({ + userConcernOrEdit.setOnClickListener { if (mListViewModel.userId == UserManager.getInstance().userId) { mContext.startActivity(UserInfoActivity.getIntent(mContext)) } else { - mListViewModel.followingCommand(!personalData?.me?.isFollower!!, { + mListViewModel.followingCommand(!personalData?.me?.isFollower!!) { if (it) { // 关注成功 userConcernOrEdit.setText(R.string.cancel_concern) userConcernOrEdit.setBackgroundResource(R.drawable.button_normal_border) @@ -127,9 +127,9 @@ class PersonalHomeAdapter(context: Context, userConcernOrEdit.setBackgroundResource(R.drawable.button_normal_style) userConcernOrEdit.setTextColor(Color.WHITE) } - }) + } } - }) + } } } is PersonalItemViewHolder -> { @@ -142,12 +142,12 @@ class PersonalHomeAdapter(context: Context, questionTitle.setOnClickListener { val id = if (historyEntity.type.contains("question")) historyEntity.id else historyEntity?.question?.id - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, id, "个人主页")) + mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, id, "个人主页", "个人主页-动态")) } } holder.itemView.setOnClickListener { if (!historyEntity.type.contains("question")) { - mContext.startActivity(AnswerDetailActivity.getIntent(mContext, historyEntity.id, "个人主页")) + mContext.startActivity(AnswerDetailActivity.getIntent(mContext, historyEntity.id, "个人主页", "个人主页-动态")) } } } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/answer/PersonalAnswerAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/answer/PersonalAnswerAdapter.kt index 1a9ba4b668..6627916232 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/answer/PersonalAnswerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/answer/PersonalAnswerAdapter.kt @@ -40,15 +40,15 @@ class PersonalAnswerAdapter(context: Context) : ListAdapter(contex val tracers = "(我的主页)+(我的回答)" val entity = mEntityList[position] holder.initMyAnswerViewHolder(entity) - holder.itemView.setOnClickListener({ - mContext.startActivity(AnswerDetailActivity.getIntent(mContext, entity.id, tracers)) + holder.itemView.setOnClickListener { + mContext.startActivity(AnswerDetailActivity.getIntent(mContext, entity.id, tracers, "个人主页-Ta的回答")) LogUtils.uploadAnswers(mContext, tracers, entity.questions, entity.id) - }) - holder.mQuestionTitle.setOnClickListener({ + } + holder.mQuestionTitle.setOnClickListener { val questions = entity.questions - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, tracers)) + mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, tracers, "个人主页-Ta的回答")) LogUtils.uploadQuestions(mContext, tracers, questions) - }) + } } is FooterViewHolder -> { holder.initItemPadding() diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/question/PersonalQuestionAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/question/PersonalQuestionAdapter.kt index 9beaa9abb1..30457347a4 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/question/PersonalQuestionAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/question/PersonalQuestionAdapter.kt @@ -38,11 +38,11 @@ class PersonalQuestionAdapter(context: Context) : ListAdapter(context is AskQuestionsNewViewHolder -> { val questions = mEntityList[position] holder.initMyQuestionsViewHolder(questions) - holder.itemView.setOnClickListener({ + holder.itemView.setOnClickListener { val tracers = "(个人主页)+(Ta的问题)" - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, tracers)) + mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, tracers, "个人主页-Ta的提问")) LogUtils.uploadQuestions(mContext, tracers, questions) - }) + } } is FooterViewHolder -> { holder.initItemPadding() diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailActivity.java b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailActivity.java index c4737eba2b..fba3b68284 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailActivity.java @@ -16,16 +16,17 @@ public class AnswerDetailActivity extends NormalActivity { public static final String TAG = "AnswerDetailActivity"; @NonNull - public static Intent getIntent(Context context, String answerId, String entrance) { - return getIntent(context, answerId, entrance, false); + public static Intent getIntent(Context context, String answerId, String entrance, String path) { + return getIntent(context, answerId, entrance, path,false); } @NonNull - public static Intent getIntent(Context context, String answerId, String entrance, boolean isOpenCommentManager) { + public static Intent getIntent(Context context, String answerId, String entrance, String path, boolean isOpenCommentManager) { Bundle bundle = new Bundle(); bundle.putString(EntranceUtils.KEY_ANSWER_ID, answerId); bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance); bundle.putBoolean(EntranceUtils.KEY_SHOW_ANSWER_COMMENT, isOpenCommentManager); + bundle.putString(EntranceUtils.KEY_PATH, path); return getTargetIntent(context, AnswerDetailActivity.class, AnswerDetailFragment.class, bundle); } diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.java b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.java index a0c2ce8e04..db2b3688e7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.java @@ -27,6 +27,7 @@ import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.fragment.BaseDialogWrapperFragment; +import com.gh.common.TimeElapsedHelper; import com.gh.common.util.AskUtils; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.CollectionUtils; @@ -36,6 +37,7 @@ import com.gh.common.util.EntranceUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.NewsUtils; import com.gh.common.util.ShareUtils; +import com.gh.common.util.StringUtils; import com.gh.common.view.RichEditor; import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.PersonalHomeActivity; @@ -46,6 +48,7 @@ import com.gh.gamecenter.databinding.FragmentAnswerDetailBinding; import com.gh.gamecenter.entity.MeEntity; import com.gh.gamecenter.entity.UserEntity; import com.gh.gamecenter.eventbus.EBReuse; +import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.normal.NormalFragment; import com.gh.gamecenter.qa.answer.detail.comment.AnswerCommentFragment; import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity; @@ -148,6 +151,9 @@ public class AnswerDetailFragment extends NormalFragment { private String mCacheCommentDraft; + private String mPath; + private TimeElapsedHelper mElapsedHelper; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -160,10 +166,12 @@ public class AnswerDetailFragment extends NormalFragment { Bundle arguments = getArguments(); mAnswerId = arguments.getString(EntranceUtils.KEY_ANSWER_ID); mIsShowCommentManager = arguments.getBoolean(EntranceUtils.KEY_SHOW_ANSWER_COMMENT, false); + mPath = arguments.getString(EntranceUtils.KEY_PATH); mViewModel.getAnswerDetail(mAnswerId, mEntrance); } mRichEditor.setInputEnabled(false); + mElapsedHelper = new TimeElapsedHelper(this); } @Override @@ -224,6 +232,30 @@ public class AnswerDetailFragment extends NormalFragment { } } + @Override + public void onDestroyView() { + super.onDestroyView(); + if (mDetailEntity != null) { + DataUtils.trackTimeEvent(getContext(), + "答案阅读量_按社区", + mElapsedHelper.getElapsedTime(), + UserManager.getInstance().getCommunity().getName(), + StringUtils.combineTwoString(mDetailEntity.getContent(), mAnswerId)); + + DataUtils.trackTimeEvent(getContext(), + "答案阅读量_按位置", + mElapsedHelper.getElapsedTime(), + mPath, + StringUtils.combineTwoString(mDetailEntity.getContent(), mAnswerId)); + + DataUtils.trackTimeEvent(getContext(), + "答案阅读量_社区加位置", + mElapsedHelper.getElapsedTime(), + UserManager.getInstance().getCommunity().getName(), + mPath); + } + } + private void initObserver() { mViewModel.getAnswerLiveData().observe(this, apiResponse -> { if (apiResponse == null) return; @@ -423,13 +455,18 @@ public class AnswerDetailFragment extends NormalFragment { case R.id.answer_detail_title_answer_count_container: case R.id.answer_detail_title: if (mDetailEntity != null) { - startActivity(QuestionsDetailActivity.getIntent(getContext(), mDetailEntity.getQuestion().getId(), mEntrance)); + startActivity(QuestionsDetailActivity.getIntent(getContext(), mDetailEntity.getQuestion().getId(), mEntrance, "回答详情")); } break; case R.id.answer_detail_like_container: CheckLoginUtils.checkLogin(getContext(), () -> { if (mDetailEntity != null && !mDetailEntity.getMe().isAnswerVoted()) { mViewModel.postVote(mAnswerId); + + DataUtils.onMtaEvent(getContext(), + "答案点赞量_社区加位置", + UserManager.getInstance().getCommunity().getName(), + mPath); } else { toast(R.string.ask_vote_hint); } @@ -457,7 +494,7 @@ public class AnswerDetailFragment extends NormalFragment { toast("当前已是你的回答"); break; case ANSWERED_NOT_MY_ANSWER: - startActivityForResult(AnswerDetailActivity.getIntent(getContext(), mDetailEntity.getMe().getMyAnswerId(), mEntrance), ANSWER_PATCH_REQUEST); + startActivityForResult(AnswerDetailActivity.getIntent(getContext(), mDetailEntity.getMe().getMyAnswerId(), mEntrance, "答案详情"), ANSWER_PATCH_REQUEST); break; case NOT_ANSWERED_YET: CheckLoginUtils.checkLogin(getContext(), () -> { diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditFragment.java b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditFragment.java index 0b8d5b4cdf..f6e45291aa 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditFragment.java @@ -336,7 +336,7 @@ public class AnswerEditFragment extends NormalFragment { getActivity().setResult(Activity.RESULT_OK, data); if (mOpenAnswerInNewPage) { - Intent intent = AnswerDetailActivity.getIntent(getContext(), answerId, "(新建回答)"); + Intent intent = AnswerDetailActivity.getIntent(getContext(), answerId, "(新建回答)", "编辑答案"); getActivity().startActivity(intent); } getActivity().finish(); diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/fold/AnswerFoldFragment.java b/app/src/main/java/com/gh/gamecenter/qa/answer/fold/AnswerFoldFragment.java index 190357538e..ce27296f5e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/fold/AnswerFoldFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/fold/AnswerFoldFragment.java @@ -93,7 +93,7 @@ public class AnswerFoldFragment extends ListFragment(context) { val answerEntity = mEntityList[position] holder.initQuestionsHotViewHolder(mContext, answerEntity) holder.itemView.setOnClickListener { - mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerEntity.id, "问答专题详情")) + mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerEntity.id, "问答专题详情", "问答-专栏详情-热门")) } holder.mAskTitle.setOnClickListener { val questions = answerEntity.questions - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "问答专题详情")) + mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "问答专题详情", "问答-专栏详情-热门")) LogUtils.uploadQuestions(mContext, "", questions) } answerEntity.user.auth?.let { ImageUtils.display(holder.badgeIcon, it.icon) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/column/detail/recommends/RecommendsAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/column/detail/recommends/RecommendsAdapter.kt index 22e82044f9..1ad7183aea 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/column/detail/recommends/RecommendsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/column/detail/recommends/RecommendsAdapter.kt @@ -40,11 +40,11 @@ class RecommendsAdapter(context: Context) : ListAdapter(context) { val answerEntity = mEntityList[position] holder.initQuestionsHotViewHolder(mContext, answerEntity) holder.itemView.setOnClickListener { - mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerEntity.id, "问答专题详情")) + mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerEntity.id, "问答专题详情", "问答-专栏详情-精华")) } holder.mAskTitle.setOnClickListener { val questions = answerEntity.questions - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "问答专题详情")) + mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "问答专题详情", "问答-专栏详情-精华")) LogUtils.uploadQuestions(mContext, "", questions) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/column/detail/unanswered/UnansweredAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/column/detail/unanswered/UnansweredAdapter.kt index 401ee2bcb3..ba35319114 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/column/detail/unanswered/UnansweredAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/column/detail/unanswered/UnansweredAdapter.kt @@ -39,7 +39,7 @@ class UnansweredAdapter(context: Context) : ListAdapter(context) { holder.initAskQuestionsNewViewHolder(questions) holder.itemView.setOnClickListener { - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "问答专题详情")) + mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "问答专题详情", "问答-专栏详情-待回答")) } LogUtils.uploadQuestions(mContext, "", questions) } else if (holder is FooterViewHolder) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/myqa/ConcernQuestionsFragment.java b/app/src/main/java/com/gh/gamecenter/qa/myqa/ConcernQuestionsFragment.java index a693a36549..2e3f111f86 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/myqa/ConcernQuestionsFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/myqa/ConcernQuestionsFragment.java @@ -51,7 +51,6 @@ public class ConcernQuestionsFragment extends ListFragment> provideDataObservable(int page) { return RetrofitManager.getInstance(getContext()).getApi().getConcernQuestions(UserManager.getInstance().getUserId(), page); @@ -68,7 +67,7 @@ public class ConcernQuestionsFragment extends ListFragment { if (mQuestionsDetailEntity != null && !TextUtils.isEmpty(mQuestionsDetailEntity.getMe().getMyAnswerId())) { Intent intent = AnswerDetailActivity.getIntent(getContext(), mQuestionsDetailEntity.getMe().getMyAnswerId(), - mEntrance + "+(问题详情)"); + mEntrance + "+(问题详情)", "问题详情"); startActivityForResult(intent, QUESTIONS_DETAIL_ANSWER_REQUEST); } else { startActivityForResult(AnswerEditActivity.getIntent(getContext(), mQuestionsId diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt index 61023059dc..33ec74ac55 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt @@ -37,8 +37,7 @@ class TagsSelectFragment : BaseFragment() { companion object { fun getInstance(): TagsSelectFragment { - val fragment = TagsSelectFragment() - return fragment + return TagsSelectFragment() } } @@ -89,7 +88,7 @@ class TagsSelectFragment : BaseFragment() { activity?.setResult(Activity.RESULT_OK, data) } else { val data = JSONObject(it.data?.string()) - startActivity(QuestionsDetailActivity.getIntent(context, data.getString("_id"), "(回答编辑)")) + startActivity(QuestionsDetailActivity.getIntent(context, data.getString("_id"), "(回答编辑)", "问题编辑")) } activity?.finish() } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/tip/QuestionTitleTipAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/tip/QuestionTitleTipAdapter.kt index d88dae6359..0f3c6a12f2 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/tip/QuestionTitleTipAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/tip/QuestionTitleTipAdapter.kt @@ -46,10 +46,10 @@ class QuestionTitleTipAdapter(private val context: Context, title: AutoCompleteT val entity = questionList[pos] binding.entity = entity binding.questionsEditIndexTitle.text = Html.fromHtml(replayKeyword(entity.title)) - view.setOnClickListener({ + view.setOnClickListener { val tracers = "(问题编辑)+(标题自动搜索)" - context.startActivity(QuestionsDetailActivity.getIntent(context, entity.id, tracers)) - }) + context.startActivity(QuestionsDetailActivity.getIntent(context, entity.id, tracers, "问题编辑")) + } return view } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteFragment.java b/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteFragment.java index 00c1932556..c01831a6ab 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteFragment.java @@ -159,7 +159,11 @@ public class QuestionsInviteFragment extends ListFragment startActivity(AnswerDetailActivity.getIntent(getContext(), answerId, "邀请达人")), null); + DialogUtils.showAlertDialog(getContext(), + "已经回答", + "Ta已经回答了这个问题,赶紧前往查看吧", + "立即查看", + "关闭", + () -> startActivity(AnswerDetailActivity.getIntent(getContext(), answerId, "邀请达人", "达人邀请")), null); } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsFragment.java b/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsFragment.java index a035841c3c..2a0207a0a6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsFragment.java @@ -203,12 +203,12 @@ public class AskQuestionsRecommendsFragment extends ListFragment { - DataUtils.onMtaEvent(mContext, "问答专题", UserManager.getInstance().getCommunity().getName(), entity.getTitle()); if ("answer_list".equals(entity.getType())) { mContext.startActivity(CommunitySubjectActivity.getIntent(mContext, entity)); } else { - mContext.startActivity(AnswerDetailActivity.getIntent(mContext, entity.getId(), "(问答专题)")); + mContext.startActivity(AnswerDetailActivity.getIntent(mContext, entity.getId(), "(问答专题)", "问答专题")); } - }); return binding.getRoot(); } diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/base/BaseAskSearchAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/search/base/BaseAskSearchAdapter.kt index c388cc4b76..940e2a228d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/base/BaseAskSearchAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/base/BaseAskSearchAdapter.kt @@ -62,14 +62,14 @@ abstract class BaseAskSearchAdapter(context: Context) : ListAdapter(contex this.mSearchKey = searchKey } - protected fun skipAnswerDetail(answerId: String) { - mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerId, "(搜索结果)")) + protected fun skipAnswerDetail(answerId: String, path: String) { + mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerId, "(搜索结果)", path)) postSearchLog() } - protected fun skipQuestionDetail(questions: Questions) { + protected fun skipQuestionDetail(questions: Questions, path: String) { val tracers = "(搜索结果)" - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, tracers)) + mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, tracers, path)) LogUtils.uploadQuestions(mContext, tracers, questions) postSearchLog() } diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/hottest/HottestAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/search/hottest/HottestAdapter.kt index 3a0a54b3a0..340532bf82 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/hottest/HottestAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/hottest/HottestAdapter.kt @@ -44,8 +44,8 @@ class HottestAdapter(context: Context) : BaseAskSearchAdapter(c askHolder.mVoteCount.text = mContext.getString(R.string.ask_vote_count, searchEntity.vote.toString()) askHolder.mTitle.text = Html.fromHtml(replayKeyword(questions.title)) askHolder.mContent.text = Html.fromHtml(replayKeyword(searchEntity.brief)) - askHolder.mTitle.setOnClickListener { skipQuestionDetail(questions) } - askHolder.itemView.setOnClickListener({ skipAnswerDetail(searchEntity.id) }) + askHolder.mTitle.setOnClickListener { skipQuestionDetail(questions, "搜索结果-最热答案") } + askHolder.itemView.setOnClickListener { skipAnswerDetail(searchEntity.id, "搜索结果-最热答案") } } ItemViewType.ITEM_FOOTER -> { val footerViewHolder = holder as FooterViewHolder diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/newest/NewestAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/search/newest/NewestAdapter.kt index c3ea69e773..ece0bb64b1 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/newest/NewestAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/newest/NewestAdapter.kt @@ -44,8 +44,8 @@ class NewestAdapter(context: Context) : BaseAskSearchAdapter(co askHolder.mVoteCount.text = mContext.getString(R.string.ask_vote_count, searchEntity.vote.toString()) askHolder.mTitle.text = Html.fromHtml(replayKeyword(questions.title)) askHolder.mContent.text = Html.fromHtml(replayKeyword(searchEntity.brief)) - askHolder.mTitle.setOnClickListener { skipQuestionDetail(questions) } - askHolder.itemView.setOnClickListener({ skipAnswerDetail(searchEntity.id) }) + askHolder.mTitle.setOnClickListener { skipQuestionDetail(questions, "搜索结果-最新答案") } + askHolder.itemView.setOnClickListener { skipAnswerDetail(searchEntity.id, "搜索结果-最新答案") } } ItemViewType.ITEM_FOOTER -> { val footerViewHolder = holder as FooterViewHolder diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/question/QuestionAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/search/question/QuestionAdapter.kt index 82394ad83c..7e0dc44178 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/question/QuestionAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/question/QuestionAdapter.kt @@ -38,12 +38,12 @@ class QuestionAdapter(context: Context) : BaseAskSearchAdapter( viewHolder.binding.questionsEditIndexTitle.text = Html.fromHtml(replayKeyword(entity.questions.title)) viewHolder.binding.questionsEditIndexAnswerCount.text = (entity.questions.answerCount.toString() + " 回答") viewHolder.binding.questionsEditIndexLine.visibility = View.INVISIBLE - viewHolder.itemView.setOnClickListener({ + viewHolder.itemView.setOnClickListener { val questions = Questions() questions.id = entity.questions.id questions.title = entity.questions.title - skipQuestionDetail(questions) - }) + skipQuestionDetail(questions, "搜索结果-只看问题") + } } ItemViewType.ITEM_FOOTER -> { val footerViewHolder = holder as FooterViewHolder diff --git a/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectFragment.java b/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectFragment.java index 86950cb2f8..ef895b5c62 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectFragment.java @@ -7,18 +7,21 @@ import android.support.v7.widget.RecyclerView; import android.view.View; import com.gh.common.util.LogUtils; +import com.gh.common.TimeElapsedHelper; +import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.view.VerticalItemDecoration; -import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity; -import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity; import com.gh.gamecenter.R; -import com.gh.gamecenter.qa.entity.AnswerEntity; -import com.gh.gamecenter.qa.entity.AskSubjectEntity; -import com.gh.gamecenter.qa.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; +import com.gh.gamecenter.manager.UserManager; +import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity; +import com.gh.gamecenter.qa.entity.AnswerEntity; +import com.gh.gamecenter.qa.entity.AskSubjectEntity; +import com.gh.gamecenter.qa.entity.Questions; +import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity; /** * Created by khy on 1/04/18. @@ -32,6 +35,8 @@ public class AskSubjectFragment extends ListFragment mAdapter.setSubjectEntity(subjectEntity)); } + @Override + public void onDestroyView() { + DataUtils.trackTimeEvent(getContext(), "问答专题", mElapsedHelper.getElapsedTime(), UserManager.getInstance().getCommunity().getName(), entity.getTitle()); + super.onDestroyView(); + } + @Override protected ListAdapter provideListAdapter() { return mAdapter == null ? mAdapter = new AskSubjectAdapter(getContext(), this) : mAdapter; @@ -121,12 +134,12 @@ public class AskSubjectFragment extends ListFragment { - DirectUtils.directToQuestionDetail(context, link.target!!, EntranceUtils.ENTRANCE_UMENG) + DirectUtils.directToQuestionDetail(context, link.target!!, EntranceUtils.ENTRANCE_UMENG, "推送通知") } EntranceUtils.HOST_ANSWER -> { - DirectUtils.directToAnswerDetail(context, link.target!!, EntranceUtils.ENTRANCE_UMENG) + DirectUtils.directToAnswerDetail(context, link.target!!, EntranceUtils.ENTRANCE_UMENG, "推送通知") } EntranceUtils.HOST_WEB -> { DirectUtils.directToWebView(context, link.target!!, EntranceUtils.ENTRANCE_UMENG) diff --git a/build.gradle b/build.gradle index caff3c3279..18e9228d40 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,6 @@ apply from: 'dependencies.gradle' buildscript { ext.kotlin_version = '1.2.60' - ext.kotlin_version = '1.2.50' repositories { google() jcenter()