Feature issues1130

This commit is contained in:
zhangyujiu
2021-01-26 16:17:29 +08:00
parent 22801846e4
commit 2aadb78301
8 changed files with 363 additions and 14 deletions

View File

@ -18,6 +18,7 @@ object ErrorHelper {
* [showHighPriorityHint] 用来标识有同样错误码可以触发两种处理时,为 true 时选择重要的
* [customizedHandler] 返回 true 为已处理该错误码false 则交由 [handleError] 处理
*/
@JvmStatic
fun handleErrorWithCustomizedHandler(context: Context,
errorString: String?,
showHighPriorityHint: Boolean = false,

View File

@ -767,4 +767,27 @@ public class LogUtils {
}
LoghubUtils.log(object, "event", false);
}
public static void uploadPackageSkip(String action, String gameId, String gameName) {
JSONObject object = new JSONObject();
JSONObject payloadObject = new JSONObject();
try {
object.put("event", "external_jump");
object.put("action", action);
if (!TextUtils.isEmpty(gameId)&&!TextUtils.isEmpty(gameName)) {
payloadObject.put("game_id", gameId);
payloadObject.put("game_name", gameName);
object.put("payload", payloadObject);
}
object.put("meta", getMetaObject());
} catch (JSONException e) {
e.printStackTrace();
}
if (BuildConfig.DEBUG) {
Utils.log("LogUtils->" + object.toString());
}
LoghubUtils.log(object, "event", false);
}
}

View File

@ -20,6 +20,7 @@ import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProviders;
import com.gh.base.AppUncaughtHandler;
@ -43,6 +44,7 @@ import com.gh.common.util.DialogUtils;
import com.gh.common.util.DirectUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.ErrorHelper;
import com.gh.common.util.ExtensionsKt;
import com.gh.common.util.GsonUtils;
import com.gh.common.util.HomePluggableHelper;
@ -56,6 +58,7 @@ import com.gh.common.util.PlatformUtils;
import com.gh.common.util.SPUtils;
import com.gh.common.util.ShareUtils;
import com.gh.common.util.ToastUtils;
import com.gh.common.util.UrlFilterUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.download.DownloadFragment;
import com.gh.gamecenter.entity.CommunityEntity;
@ -67,20 +70,18 @@ import com.gh.gamecenter.eventbus.EBNetworkState;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.eventbus.EBSkip;
import com.gh.gamecenter.fragment.MainWrapperFragment;
import com.gh.gamecenter.gamedetail.GameDetailFragment;
import com.gh.gamecenter.home.skip.PackageSkipActivity;
import com.gh.gamecenter.manager.DataCollectionManager;
import com.gh.gamecenter.manager.UpdateManager;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.normal.NormalFragment;
import com.gh.gamecenter.packagehelper.PackageViewModel;
import com.gh.gamecenter.qa.CommunityFragment;
import com.gh.gamecenter.retrofit.BiResponse;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.gh.gamecenter.suggest.SuggestSelectFragment;
import com.gh.gamecenter.suggest.SuggestType;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.halo.assistant.HaloApp;
import com.lightgame.download.DownloadEntity;
@ -92,7 +93,6 @@ import com.lightgame.utils.Utils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
import java.io.BufferedReader;
@ -101,6 +101,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.zip.ZipEntry;
@ -108,9 +109,11 @@ import java.util.zip.ZipFile;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import kotlin.jvm.functions.Function1;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.HttpException;
import static com.gh.common.util.EntranceUtils.ENTRANCE_BROWSER;
import static com.gh.common.util.EntranceUtils.HOST_LAUNCH_SIMULATOR_GAME;
@ -122,7 +125,7 @@ import static com.gh.common.util.EntranceUtils.KEY_MARKET_DETAILS;
import static com.gh.common.util.EntranceUtils.KEY_NEXT_TO;
import static com.gh.common.util.EntranceUtils.KEY_TO;
import static com.gh.common.util.EntranceUtils.KEY_TYPE;
import static com.gh.common.util.ExtensionsKt.singleToMain;
import static com.gh.common.util.ExtensionsKt.observableToMain;
import static com.gh.gamecenter.fragment.MainWrapperFragment.INDEX_PERSONAL;
import static com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG;
import static com.gh.gamecenter.personal.PersonalFragment.LOGOUT_TAG;
@ -453,20 +456,43 @@ public class MainActivity extends BaseActivity {
*
* @param packageName
*/
@SuppressLint("CheckResult")
private void redirectGameDetail(String packageName) {
RetrofitManager.getInstance(this).getApi().redirectGameDetail(packageName)
.compose(singleToMain())
.subscribe(new BiResponse<JsonObject>() {
String filterQuery = UrlFilterUtils.getFilterQuery("package", packageName, "type", "package_redirect");
RetrofitManager.getInstance(this).getApi().loadGameDataByPackageName(filterQuery)
.compose(observableToMain())
.subscribe(new Response<List<GameEntity>>() {
@Override
public void onSuccess(JsonObject data) {
String gameId = data.get("game_id").getAsString();
DirectUtils.directToGameDetail(MainActivity.this, gameId, GameDetailFragment.INDEX_DESC, "应用跳转");
public void onResponse(@Nullable List<GameEntity> response) {
super.onResponse(response);
if (response == null || response.isEmpty()) return;
if (response.size() > 1) {
startActivity(PackageSkipActivity.getIntent(MainActivity.this, response));
LogUtils.uploadPackageSkip("show_enter", "", "");
} else {
GameDetailActivity.startGameDetailActivity(MainActivity.this, response.get(0), "应用跳转");
LogUtils.uploadPackageSkip("game_detail_enter", response.get(0).getId(), response.get(0).getName());
}
}
@Override
public void onFailure(@NotNull Exception exception) {
super.onFailure(exception);
public void onFailure(@Nullable HttpException e) {
super.onFailure(e);
try {
ErrorHelper.handleErrorWithCustomizedHandler(MainActivity.this, e.response().errorBody().string(), false, new Function1<Integer, Boolean>() {
@Override
public Boolean invoke(Integer code) {
if (code == 404001) {
toast("抱歉,暂未找到相关内容");
LogUtils.uploadPackageSkip("game_library_enter", "", "");
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_GAME));
return true;
}
return false;
}
});
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}

View File

@ -0,0 +1,32 @@
package com.gh.gamecenter.home.skip
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.gh.base.BaseActivity
import com.gh.common.util.DisplayUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.GameEntity
class PackageSkipActivity : BaseActivity() {
override fun getLayoutId(): Int = R.layout.activity_amway
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val containerFragment = supportFragmentManager.findFragmentByTag(PackageSkipFragment::class.java.simpleName)
?: PackageSkipFragment().with(intent.extras)
// 若 placeholder 外层为 RelativeLayout 的话,会出现莫名的偏移
supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, PackageSkipFragment::class.java.simpleName).commitAllowingStateLoss()
DisplayUtils.setStatusBarColor(this, R.color.transparent, true)
}
companion object {
@JvmStatic
fun getIntent(context: Context, games: List<GameEntity>): Intent {
val intent = Intent(context, PackageSkipActivity::class.java)
intent.putParcelableArrayListExtra(GameEntity::class.java.name, ArrayList(games))
return intent
}
}
}

View File

@ -0,0 +1,53 @@
package com.gh.gamecenter.home.skip
import android.content.Context
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.util.DownloadItemUtils
import com.gh.common.util.EmptyCallback
import com.gh.common.util.LogUtils
import com.gh.common.util.StringUtils
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
import com.gh.gamecenter.databinding.GameItemBinding
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.game.GameItemViewHolder
import com.lightgame.adapter.BaseRecyclerAdapter
class PackageSkipAdapter(val context: Context, val games: ArrayList<GameEntity>, private val itemClickCallback: () -> Unit) : BaseRecyclerAdapter<RecyclerView.ViewHolder>(context) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return GameItemViewHolder(GameItemBinding.bind(mLayoutInflater.inflate(R.layout.game_item, parent, false)))
}
override fun getItemCount(): Int = games.size
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is GameItemViewHolder) {
val gameEntity = games[position]
holder.binding.game = gameEntity
holder.initServerType(gameEntity)
val subjectData = gameEntity.subjectData
holder.binding.isShowSuffix = subjectData?.isShowSuffix
holder.binding.briefStyle = subjectData?.briefStyle
holder.binding.executePendingBindings()
DownloadItemUtils.setOnClickListener(mContext, holder.binding.downloadBtn, gameEntity, position,
this,
StringUtils.buildString("应用跳转:", subjectData?.name, "-列表[", (position + 1).toString(), "])"),
StringUtils.buildString("应用跳转-", subjectData?.name, ":", gameEntity.name), null,
object : EmptyCallback {
override fun onCallback() {
LogUtils.uploadPackageSkip("show_download", gameEntity.id, gameEntity.name)
}
})
DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), !gameEntity.isPluggable, subjectData?.briefStyle)
holder.itemView.setOnClickListener {
LogUtils.uploadPackageSkip("show_click", gameEntity.id, gameEntity.name)
GameDetailActivity.startGameDetailActivity(context, gameEntity, "应用跳转")
itemClickCallback.invoke()
}
}
}
}

View File

@ -0,0 +1,118 @@
package com.gh.gamecenter.home.skip
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager
import com.gh.base.fragment.BaseFragment
import com.gh.common.util.LogUtils
import com.gh.download.DownloadManager
import com.gh.gamecenter.databinding.FragmentPackageSkipBinding
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.eventbus.EBPackage
import com.lightgame.download.DataWatcher
import com.lightgame.download.DownloadEntity
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
class PackageSkipFragment : BaseFragment<Any>() {
private lateinit var mBinding: FragmentPackageSkipBinding
private lateinit var mAdapter: PackageSkipAdapter
private var games: ArrayList<GameEntity> = arrayListOf()
private var positionAndPackageMap = HashMap<String, Int>()
override fun getLayoutId(): Int = 0
private val dataWatcher = object : DataWatcher() {
override fun onDataChanged(downloadEntity: DownloadEntity) {
for (key in positionAndPackageMap.keys) {
if (key.contains(downloadEntity.packageName) && key.contains(downloadEntity.gameId)) {
val position = positionAndPackageMap[key]
if (position != null && position < games.size) {
games[position].getEntryMap()[downloadEntity.platform] = downloadEntity
mAdapter.notifyItemChanged(position)
}
}
}
}
}
override fun getInflatedLayout(): View {
mBinding = FragmentPackageSkipBinding.inflate(LayoutInflater.from(requireContext()), null, false)
return mBinding.root
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
games = arguments?.getParcelableArrayList<GameEntity>(GameEntity::class.java.name)
?: arrayListOf()
positionAndPackageMap.clear()
games.forEachIndexed { index, gameEntity ->
addGamePositionAndPackage(gameEntity, index)
}
mBinding.normalToolbar.setNavigationOnClickListener {
LogUtils.uploadPackageSkip("home_enter", "", "")
requireActivity().finish()
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mBinding.listRv.apply {
(itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
layoutManager = LinearLayoutManager(requireContext())
mAdapter = PackageSkipAdapter(requireContext(), games) {
requireActivity().finish()
}
adapter = mAdapter
}
}
private fun addGamePositionAndPackage(game: GameEntity, position: Int) {
var packages = ""
for (apkEntity in game.getApk()) {
packages += apkEntity.packageName
}
packages += game.simulator?.apk?.packageName
positionAndPackageMap[packages + position + game.id] = position
game.gameLocation = GameEntity.GameLocation.INDEX
game.setEntryMap(DownloadManager.getInstance(requireContext()).getEntryMap(game.name))
}
override fun onResume() {
super.onResume()
DownloadManager.getInstance(requireContext()).addObserver(dataWatcher)
}
override fun onPause() {
super.onPause()
DownloadManager.getInstance(requireContext()).removeObserver(dataWatcher)
}
//安装、卸载事件
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEventMainThread(busFour: EBPackage) {
if ("安装" == busFour.type || "卸载" == busFour.type) {
mAdapter.notifyDataSetChanged()
}
}
// 下载被删除事件
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEventMainThread(status: EBDownloadStatus) {
if ("delete" == status.status) {
for (key in positionAndPackageMap.keys) {
if (key.contains(status.packageName) && key.contains(status.gameId)) {
val position = positionAndPackageMap[key]
if (position != null && position < games.size) {
games[position].getEntryMap().remove(status.platform)
mAdapter.notifyItemChanged(position)
}
}
}
}
}
}