From 0db817189863288897645ff65f703c0e6e159436 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Tue, 9 Oct 2018 16:29:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=B8=BA=E4=B8=93=E9=A2=98=E5=A4=A7?= =?UTF-8?q?=E5=9B=BE=E6=B7=BB=E5=8A=A0=E6=9B=9D=E5=85=89=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=EF=BC=8C=E5=90=8C=E6=97=B6=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=B8=BA=20null=20=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/common/exposure/ExposureListener.kt | 3 +- .../com/gh/common/exposure/ExposureManager.kt | 2 - .../java/com/gh/common/util/Extensions.kt | 25 ++++ .../gh/gamecenter/game/GameFragmentAdapter.kt | 124 ++++++++---------- .../gh/gamecenter/subject/SubjectAdapter.java | 2 +- .../subject/refactor/SubjectActivity.kt | 2 +- .../subject/refactor/SubjectAdapter.kt | 11 +- .../refactor/tile/SubjectTileFragment.kt | 4 +- 8 files changed, 92 insertions(+), 81 deletions(-) diff --git a/app/src/main/java/com/gh/common/exposure/ExposureListener.kt b/app/src/main/java/com/gh/common/exposure/ExposureListener.kt index 2078c7aaea..7aa2d06cee 100644 --- a/app/src/main/java/com/gh/common/exposure/ExposureListener.kt +++ b/app/src/main/java/com/gh/common/exposure/ExposureListener.kt @@ -48,8 +48,7 @@ class ExposureListener(var fragment: Fragment, var exposable: IExposable) : Recy } /** - * Check disappearMap items together with according data in displayMap, - * log any items displayed long enough to be called a EXPOSURE + * Just commit the exposureEvent that is stored in listItem. */ private fun commitExposure(visibleState: ExposureThrottleBus.VisibleState) { diff --git a/app/src/main/java/com/gh/common/exposure/ExposureManager.kt b/app/src/main/java/com/gh/common/exposure/ExposureManager.kt index a878e4fb33..985c613266 100644 --- a/app/src/main/java/com/gh/common/exposure/ExposureManager.kt +++ b/app/src/main/java/com/gh/common/exposure/ExposureManager.kt @@ -18,8 +18,6 @@ import kotlin.concurrent.fixedRateTimer */ object ExposureManager { - private var TAG: String = ExposureManager::class.java.simpleName - private const val ENDPOINT = "cn-qingdao.log.aliyuncs.com" private const val PROJECT = "ghzs" private const val STORE_SIZE = 100 diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index f9b1a239fd..6dddc3c2ec 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -5,6 +5,7 @@ import android.arch.lifecycle.ViewModelProvider import android.arch.lifecycle.ViewModelProviders import android.support.v4.app.Fragment import android.support.v4.app.FragmentActivity +import android.support.v4.view.ViewPager /** * 创建以 activity 为观察者上下文的 viewModel @@ -21,3 +22,27 @@ inline fun Fragment.viewModelProvider( provider: ViewModelProvider.Factory ) = ViewModelProviders.of(this, provider).get(VM::class.java) + +/** + * + * ViewPager Extensions + * + */ +fun ViewPager.doOnPageSelected(action: (position: Int) -> Unit) = addOnPageChangeListener(onSelected = action) + +fun ViewPager.addOnPageChangeListener(onSelected: ((position: Int) -> Unit)? = null) { + val listener = object : ViewPager.OnPageChangeListener { + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + // Do nothing. + } + + override fun onPageSelected(position: Int) { + onSelected?.invoke(position) + } + + override fun onPageScrollStateChanged(state: Int) { + // Do nothing. + } + } + addOnPageChangeListener(listener) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt index 72f83fe95e..ce09043ca9 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt @@ -2,7 +2,6 @@ package com.gh.gamecenter.game import android.content.Context import android.graphics.drawable.Animatable -import android.support.v4.view.ViewPager import android.support.v7.widget.DefaultItemAnimator import android.support.v7.widget.GridLayoutManager import android.support.v7.widget.LinearLayoutManager @@ -44,8 +43,6 @@ import kotlin.collections.ArrayList class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: String) : BaseRecyclerAdapter(context), IExposable { - data class GameAndPosition(val entity: GameEntity?, val position: Int) - private val mPluginPosition = 1 private val mViewModel: GameViewModel = model @@ -220,21 +217,17 @@ class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: DataUtils.onMtaEvent(mContext, "推荐入口", if (TextUtils.isEmpty(blockName)) "首页" else blockName, (data + 1).toString()) if (data < subjectDigestList?.size!!) { val entity = subjectDigestList[data] - - if (entity.type == "block") { - mContext.startActivity(BlockActivity.getIntent(mContext, entity)) - } else if (entity.type == "category") { - mContext.startActivity(CategoryDirectoryActivity.getIntent(mContext, entity.link!!, entity.text!!)) - } else if (entity.type == "column") { - SubjectActivity.startSubjectActivity(mContext, entity.link, entity.text, entity.order - , StringUtils.buildString("(游戏-专题:", entity.name, "[1-", (data + 1).toString(), "]", ")")) - DataCollectionUtils.uploadPosition(mContext, "游戏", (data + 1).toString(), entity.name) - } else if (entity.type == "game") { - GameDetailActivity.startGameDetailActivity(mContext, entity.link, "(推荐入口)") - } else if (entity.type == EntranceUtils.HOST_COMMUNITY) { - DirectUtils.directToCommunity(mContext, CommunityEntity(entity.link!!, entity.text!!)) - } else { - DialogUtils.showLowVersionDialog(mContext) + when { + entity.type == "block" -> mContext.startActivity(BlockActivity.getIntent(mContext, entity)) + entity.type == "category" -> mContext.startActivity(CategoryDirectoryActivity.getIntent(mContext, entity.link!!, entity.text!!)) + entity.type == "column" -> { + SubjectActivity.startSubjectActivity(mContext, entity.link, entity.text, entity.order + , StringUtils.buildString("(游戏-专题:", entity.name, "[1-", (data + 1).toString(), "]", ")")) + DataCollectionUtils.uploadPosition(mContext, "游戏", (data + 1).toString(), entity.name) + } + entity.type == "game" -> GameDetailActivity.startGameDetailActivity(mContext, entity.link, "(推荐入口)") + entity.type == EntranceUtils.HOST_COMMUNITY -> DirectUtils.directToCommunity(mContext, CommunityEntity(entity.link!!, entity.text!!)) + else -> DialogUtils.showLowVersionDialog(mContext) } } } else if (v.id == R.id.home_subject_failure) { @@ -254,25 +247,22 @@ class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: binding.entranceName5.text = "开服表" } - binding.entranceContainer5.setOnClickListener(View.OnClickListener { + binding.entranceContainer5.setOnClickListener { DataUtils.onMtaEvent(mContext, "推荐入口", if (TextUtils.isEmpty(blockName)) "首页" else blockName, "5") if (mViewModel.blockData != null) { if (subjectDigestList != null && subjectDigestList.size >= 5) { val entity = subjectDigestList[4] - if (entity.type == "block") { - mContext.startActivity(BlockActivity.getIntent(mContext, entity)) - } else if (entity.type == "category") { - mContext.startActivity(CategoryDirectoryActivity.getIntent(mContext, entity.link!!, entity.text!!)) - } else if (entity.type == "column") { - SubjectActivity.startSubjectActivity(mContext, entity.link, entity.text, entity.order - , StringUtils.buildString("(游戏-专题:", entity.name, "[1-", (5).toString(), "]", ")")) - DataCollectionUtils.uploadPosition(mContext, "游戏", (5).toString(), entity.name) - } else if (entity.type == "game") { - GameDetailActivity.startGameDetailActivity(mContext, entity.link, "(推荐入口)") - } else if (entity.type == EntranceUtils.HOST_COMMUNITY) { - DirectUtils.directToCommunity(mContext, CommunityEntity(entity.link!!, entity.text!!)) - } else { - DialogUtils.showLowVersionDialog(mContext) + when { + entity.type == "block" -> mContext.startActivity(BlockActivity.getIntent(mContext, entity)) + entity.type == "category" -> mContext.startActivity(CategoryDirectoryActivity.getIntent(mContext, entity.link!!, entity.text!!)) + entity.type == "column" -> { + SubjectActivity.startSubjectActivity(mContext, entity.link, entity.text, entity.order + , StringUtils.buildString("(游戏-专题:", entity.name, "[1-", (5).toString(), "]", ")")) + DataCollectionUtils.uploadPosition(mContext, "游戏", (5).toString(), entity.name) + } + entity.type == "game" -> GameDetailActivity.startGameDetailActivity(mContext, entity.link, "(推荐入口)") + entity.type == EntranceUtils.HOST_COMMUNITY -> DirectUtils.directToCommunity(mContext, CommunityEntity(entity.link!!, entity.text!!)) + else -> DialogUtils.showLowVersionDialog(mContext) } } } else { @@ -280,58 +270,48 @@ class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: mContext.startActivity(intent) DataCollectionUtils.uploadPosition(mContext, "游戏", "4", "开服表") } - }) + } val slideList = mItemDataList[position].slideList val pagerAdapter = binding.viewPager.adapter if (slideList != null && slideList.isNotEmpty() && pagerAdapter == null) { binding.viewpagerLlHint.removeAllViews() val margin = DisplayUtils.dip2px(mContext, 6f) - run { - var i = 0 - val size = slideList.size - while (i < size) { - val imageView = ImageView(mContext) - val lparams = LinearLayout.LayoutParams(margin, margin) - if (i == 0) { - imageView.setImageResource(R.drawable.oval_hint_up) - } else { - imageView.setImageResource(R.drawable.oval_hint_dn) - } - if (i != 0) { - lparams.leftMargin = margin - } - imageView.layoutParams = lparams - binding.viewpagerLlHint.addView(imageView) - i++ + var i = 0 + val size = slideList.size + while (i < size) { + val imageView = ImageView(mContext) + val lparams = LinearLayout.LayoutParams(margin, margin) + if (i == 0) { + imageView.setImageResource(R.drawable.oval_hint_up) + } else { + imageView.setImageResource(R.drawable.oval_hint_dn) } + if (i != 0) { + lparams.leftMargin = margin + } + imageView.layoutParams = lparams + binding.viewpagerLlHint.addView(imageView) + i++ } binding.viewPager.adapter = ImagePagerAdapter(mContext, slideList, true, if (TextUtils.isEmpty(blockName)) "首页" else blockName) binding.viewPager.interval = 3000 binding.viewPager.startAutoScroll() - binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { - } - - override fun onPageSelected(position: Int) { - var i = 0 - val size = binding.viewpagerLlHint.childCount - while (i < size) { - if (i == position % size) { - (binding.viewpagerLlHint.getChildAt(i) as ImageView) - .setImageResource(R.drawable.oval_hint_up) - } else { - (binding.viewpagerLlHint.getChildAt(i) as ImageView) - .setImageResource(R.drawable.oval_hint_dn) - } - i++ + binding.viewPager.doOnPageSelected { + var j = 0 + val childCount = binding.viewpagerLlHint.childCount + while (j < childCount) { + if (j == it % childCount) { + (binding.viewpagerLlHint.getChildAt(j) as ImageView) + .setImageResource(R.drawable.oval_hint_up) + } else { + (binding.viewpagerLlHint.getChildAt(j) as ImageView) + .setImageResource(R.drawable.oval_hint_dn) } + j++ } - - override fun onPageScrollStateChanged(state: Int) { - } - }) + } } else if (slideList != null && pagerAdapter != null) { (pagerAdapter as ImagePagerAdapter).checkResetData(slideList) } @@ -510,4 +490,6 @@ class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: override fun getEventListByPosition(pos: Int): List? { return mItemDataList[pos].exposureEventList } + + data class GameAndPosition(val entity: GameEntity?, val position: Int) } diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.java b/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.java index c6a155b751..90c57ed830 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.java @@ -243,7 +243,7 @@ class SubjectAdapter extends BaseRecyclerAdapter implements IExposab switch (gameEntity.getType()) { case "game": - GameDetailActivity.startGameDetailActivity(mContext, gameEntity.getLink(), mEntrance + "(" + mName + ":大图)"); + GameDetailActivity.startGameDetailActivity(mContext, gameEntity.getLink(), mEntrance + "(" + mName + ":大图)", mExposureEventSparseArray.get(position)); break; case "news": // 统计阅读量 diff --git a/app/src/main/java/com/gh/gamecenter/subject/refactor/SubjectActivity.kt b/app/src/main/java/com/gh/gamecenter/subject/refactor/SubjectActivity.kt index a521f09cc8..a3e1e55ea7 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/refactor/SubjectActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/refactor/SubjectActivity.kt @@ -64,7 +64,7 @@ class SubjectActivity : BaseActivity() { } else { SubjectTabFragment() } - val bundle = Bundle() + val bundle = intent.extras bundle.putParcelable(EntranceUtils.KEY_SUBJECT_DATA, mViewModel?.subjectData) fragment.arguments = bundle transaction.replace(R.id.subject_content, fragment) diff --git a/app/src/main/java/com/gh/gamecenter/subject/refactor/SubjectAdapter.kt b/app/src/main/java/com/gh/gamecenter/subject/refactor/SubjectAdapter.kt index 7b7a9a6244..67b29e40e6 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/refactor/SubjectAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/refactor/SubjectAdapter.kt @@ -131,6 +131,15 @@ class SubjectAdapter(context: Context, val gameEntity = mEntityList[position] ImageUtils.display(holder.image, gameEntity.image, widthPixels) + // 大图是游戏的时候添加曝光事件 + if ("game" == gameEntity.type) { + val exposureSources = ArrayList() + exposureSources.add(ExposureSource("专题", subjectData.subjectName.toString())) + exposureSources.add(ExposureSource("专题详情", "大图")) + val event = ExposureEvent.createEvent(gameEntity, exposureSources, null, ExposureType.EXPOSURE) + mExposureEventSparseArray.put(position, event) + } + if (!TextUtils.isEmpty(gameEntity.des)) { holder.gameDes.visibility = View.VISIBLE holder.gameDes.text = gameEntity.des @@ -139,7 +148,7 @@ class SubjectAdapter(context: Context, DataCollectionUtils.uploadClick(mContext, "头图", subjectData.subjectName) when (gameEntity.type) { "game" -> GameDetailActivity.startGameDetailActivity(mContext, gameEntity.link, - mEntrance + "(" + subjectData.subjectName + ":大图)") + mEntrance + "(" + subjectData.subjectName + ":大图)", mExposureEventSparseArray[position]) "news" -> { // 统计阅读量 NewsUtils.statNewsViews(mContext, gameEntity.link) diff --git a/app/src/main/java/com/gh/gamecenter/subject/refactor/tile/SubjectTileFragment.kt b/app/src/main/java/com/gh/gamecenter/subject/refactor/tile/SubjectTileFragment.kt index e64221c42e..b8dbaa0e71 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/refactor/tile/SubjectTileFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/refactor/tile/SubjectTileFragment.kt @@ -38,7 +38,6 @@ class SubjectTileFragment : BaseFragment() { private var mIsTouchScreen: Boolean = false - override fun getLayoutId(): Int { return R.layout.fragment_subject_tiled } @@ -134,7 +133,7 @@ class SubjectTileFragment : BaseFragment() { transaction.show(fragmentByTag) } else { fragmentByTag = SubjectListFragment() - val bundle = Bundle() + val bundle = arguments ?: Bundle() bundle.putParcelable(EntranceUtils.KEY_SUBJECT_DATA, mSubjectData) fragmentByTag.arguments = bundle transaction.add(R.id.subject_content_rl, fragmentByTag, fmTag) @@ -145,5 +144,4 @@ class SubjectTileFragment : BaseFragment() { } - } \ No newline at end of file From b5d8e1cd2e870fcd0fe673a00556cb21a5a13df9 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Tue, 9 Oct 2018 17:37:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8"=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E7=AE=A1=E7=90=86-=E6=B8=B8=E6=88=8F=E6=9B=B4?= =?UTF-8?q?=E6=96=B0"=E9=A1=B5=E9=9D=A2=E6=9B=B4=E6=96=B0=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E6=B2=A1=E6=9C=89=E8=AE=B0=E5=BD=95=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=9B=9D=E5=85=89=E4=BA=8B=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/databind/BindingAdapters.java | 1 + .../download/GameUpdateFragmentAdapter.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 3f12d64fbf..e88a92dcaa 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -409,6 +409,7 @@ public class BindingAdapters { PackageUtils.launchSetup(v.getContext(), downloadEntity.getPath()); } } + break; } }); } diff --git a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java index 75c64ad04a..a8c5df33e7 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java @@ -14,10 +14,12 @@ import android.view.ViewGroup; import android.widget.LinearLayout; import com.gh.common.AppExecutor; +import com.gh.common.exposure.ExposureEvent; import com.gh.common.exposure.ExposureUtils; import com.gh.common.util.DataCollectionUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DialogUtils; +import com.gh.common.util.GsonUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.MD5Utils; import com.gh.common.util.NetworkUtils; @@ -520,7 +522,6 @@ class GameUpdateFragmentAdapter extends BaseRecyclerAdapter { kv.put("版本", updateEntity.getPlatform()); kv.put("状态", "下载开始"); DataUtils.onEvent(mContext, "游戏更新", updateEntity.getName(), kv); - ExposureUtils.logADownloadExposureEvent(new GameEntity(updateEntity.getId(), updateEntity.getName()), updateEntity.getPlatform(), null, ExposureUtils.DownloadType.UPDATE); DownloadEntity downloadEntity = new DownloadEntity(); downloadEntity.setUrl(updateEntity.getUrl()); @@ -532,6 +533,15 @@ class GameUpdateFragmentAdapter extends BaseRecyclerAdapter { downloadEntity.setIcon(updateEntity.getIcon()); downloadEntity.setPlatform(updateEntity.getPlatform()); downloadEntity.setPackageName(updateEntity.getPackageName()); + + ExposureEvent event = ExposureUtils.logADownloadExposureEvent( + new GameEntity(updateEntity.getId(), updateEntity.getName()), + updateEntity.getPlatform(), + null, + ExposureUtils.DownloadType.UPDATE); + + downloadEntity.setExposureTrace(GsonUtils.Companion.getInstance().toJson(event)); + String platform = PlatformUtils.getInstance(mContext) .getPlatformName(updateEntity.getPlatform()); if (platform != null || !"官方版".equals(platform)) {