package com.gh.common.databind; import static com.gh.gamecenter.entity.SubjectEntity.SUBJECT_TAG_SELLING_POINT; import static com.gh.gamecenter.entity.SubjectEntity.SUBJECT_TAG_TEST; import static com.gh.gamecenter.entity.SubjectEntity.SUBJECT_TAG_TYPE; import static com.gh.gamecenter.entity.SubjectEntity.SUBJECT_TAG_UPDATE; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.view.View; import android.view.ViewParent; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; import com.gh.common.chain.BrowserInstallHandler; import com.gh.common.chain.CheckDownloadHandler; import com.gh.common.chain.CheckStoragePermissionHandler; import com.gh.common.chain.DownloadChainBuilder; import com.gh.common.chain.DownloadChainHandler; import com.gh.common.chain.DownloadDialogHelperHandler; import com.gh.common.chain.GamePermissionHandler; import com.gh.common.chain.LandPageAddressHandler; import com.gh.common.chain.OverseaDownloadHandler; import com.gh.common.chain.PackageCheckHandler; import com.gh.common.chain.UnsupportedFeatureHandler; import com.gh.common.chain.ValidateVSpaceHandler; import com.gh.common.chain.VersionNumberHandler; import com.gh.common.filter.RegionSetting; import com.gh.common.filter.RegionSettingHelper; import com.gh.common.history.HistoryHelper; import com.gh.common.repository.ReservationRepository; import com.gh.common.simulator.SimulatorDownloadManager; import com.gh.common.simulator.SimulatorGameManager; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.DialogUtils; import com.gh.common.util.GameUtils; import com.gh.common.util.GameViewUtils; import com.gh.common.util.LogUtils; import com.gh.common.util.PackageInstaller; import com.gh.common.util.PackageLauncher; import com.gh.common.util.PackageUtils; import com.gh.common.util.ReservationHelper; import com.gh.download.DownloadManager; import com.gh.download.dialog.DownloadDialog; import com.gh.download.server.BrowserInstallHelper; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.WebActivity; import com.gh.gamecenter.common.databinding.LayoutGameItemSellingPointBinding; import com.gh.gamecenter.common.entity.LinkEntity; import com.gh.gamecenter.common.utils.DarkModeUtils; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.FileUtils; import com.gh.gamecenter.common.utils.NewFlatLogUtils; import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.core.utils.MtaHelper; import com.gh.gamecenter.core.utils.TimeUtils; import com.gh.gamecenter.core.utils.ToastUtils; import com.gh.gamecenter.feature.entity.ApkEntity; import com.gh.gamecenter.feature.entity.GameEntity; import com.gh.gamecenter.feature.entity.PluginLocation; import com.gh.gamecenter.feature.entity.TagStyleEntity; import com.gh.gamecenter.feature.entity.TestEntity; import com.gh.gamecenter.feature.exposure.ExposureEvent; import com.gh.gamecenter.feature.utils.PlatformUtils; import com.gh.gamecenter.feature.view.DownloadButton; import com.gh.gamecenter.feature.view.GameIconView; import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment; import com.gh.gamecenter.manager.PackagesManager; import com.gh.vspace.VHelper; import com.lightgame.download.DownloadEntity; import com.lightgame.utils.Utils; import java.io.File; import java.util.ArrayList; import java.util.List; import kotlin.collections.CollectionsKt; /** * Created by khy on 12/02/18. */ public class BindingAdapters { public static void setMessageUnread(TextView view, int unreadCount) { if (unreadCount < 100) { view.setText(String.valueOf(unreadCount)); } else { view.setText("99+"); } } public static void setGame(View view, GameEntity gameEntity) { if (gameEntity != null && view instanceof GameIconView) { ((GameIconView) view).displayGameIcon(gameEntity); } } public static void setDownloadButton(DownloadButton progressBar, GameEntity gameEntity, ExposureEvent traceEvent, @Nullable View.OnClickListener clickCallBack, @Nullable String entrance, @Nullable String location) { setDownloadButton(progressBar, gameEntity, traceEvent, clickCallBack, entrance, location, "其他"); } // 大图下的进度条 public static void setDownloadButton(DownloadButton progressBar, GameEntity gameEntity, ExposureEvent traceEvent, @Nullable View.OnClickListener clickCallBack, @Nullable String entrance, @Nullable String location, String sourceEntrance) { // 恢复DialogFragment restoreDialogFragment(progressBar); // 判断是否显示按钮 if (gameEntity != null && !"光环助手".equals(gameEntity.getName())) { progressBar.setVisibility(View.VISIBLE); } else { progressBar.setVisibility(View.GONE); return; } // 点击事件 progressBar.setOnClickListener(v -> { if (clickCallBack != null) clickCallBack.onClick(v); switch (progressBar.getButtonStyle()) { case DOWNLOADING_PLUGIN: case DOWNLOADING_NORMAL: Intent intent = DownloadManagerActivity.getDownloadMangerIntent(v.getContext(), gameEntity.getApk().isEmpty() ? "" : gameEntity.getApk().get(0).getUrl(), entrance); v.getContext().startActivity(intent); break; case NONE: Utils.toast(v.getContext(), "该游戏已关闭下载"); break; case NORMAL: case PLUGIN: final RegionSetting.GameH5Download gameH5Download = RegionSettingHelper.getGameH5DownloadByGameId(gameEntity.getId()); if (gameH5Download != null) { DialogUtils.showGameH5DownloadDialog(v.getContext(), gameEntity, gameH5Download); } else { if (gameEntity.getApk().size() == 1) { ApkEntity apk = gameEntity.getApk().get(0); DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(apk.getUrl()); if (gameEntity.getSimulator() != null) { boolean isInstalled = PackageUtils.isInstalledFromAllPackage(v.getContext(), gameEntity.getSimulator().getApk().getPackageName()); if (downloadEntity != null && SimulatorGameManager.isSimulatorGame(gameEntity) && !isInstalled) { SimulatorDownloadManager.getInstance().showDownloadDialog(v.getContext(), gameEntity.getSimulator(), SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.getId(), gameEntity.getName(), gameEntity.getCategoryChinese(), null); return; } } DownloadChainBuilder builder = new DownloadChainBuilder(); builder.addHandler(new UnsupportedFeatureHandler()); builder.addHandler(new GamePermissionHandler()); builder.addHandler(new CheckStoragePermissionHandler()); builder.addHandler(new ValidateVSpaceHandler()); builder.addHandler(new BrowserInstallHandler()); builder.addHandler(new PackageCheckHandler()); builder.addHandler(new DownloadDialogHelperHandler()); builder.addHandler(new VersionNumberHandler()); builder.addHandler(new LandPageAddressHandler()); builder.addHandler(new OverseaDownloadHandler()); builder.addHandler(new CheckDownloadHandler()); builder.setProcessEndCallback(gameEntity.getId(), (asVGame, isSubscribe) -> { download(v.getContext(), progressBar, gameEntity, traceEvent, asVGame, (boolean) isSubscribe, entrance, location); return null; }); final DownloadChainHandler chainHandler = builder.buildHandlerChain(); if (chainHandler != null) { chainHandler.handleRequest( v.getContext(), gameEntity, GameUtils.shouldPerformAsVGame(gameEntity) ); } } else { DownloadChainBuilder builder = new DownloadChainBuilder(); builder.addHandler(new UnsupportedFeatureHandler()); builder.addHandler(new GamePermissionHandler()); builder.addHandler(new VersionNumberHandler()); builder.setProcessEndCallback(gameEntity.getId(), (asVGame, isSubscribe) -> { DownloadDialog.showDownloadDialog( v.getContext(), gameEntity, traceEvent, entrance, location + ":" + gameEntity.getName(), null); return null; }); final DownloadChainHandler chainHandler = builder.buildHandlerChain(); if (chainHandler != null) { chainHandler.handleRequest( v.getContext(), gameEntity, GameUtils.shouldPerformAsVGame(gameEntity) ); } } } break; case LAUNCH_OR_OPEN: if (gameEntity.getApk().size() == 1) { //启动模拟器游戏 if (SimulatorGameManager.isSimulatorGame(gameEntity)) { DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(gameEntity.getApk().isEmpty() ? "" : gameEntity.getApk().get(0).getUrl()); if (downloadEntity != null) { File file = new File(downloadEntity.getPath()); if (!file.exists()) { download(v.getContext(), progressBar, gameEntity, traceEvent, false, false, entrance, location); return; } SimulatorGameManager.launchSimulatorGame(downloadEntity, gameEntity); } return; } PackageLauncher.launch(v.getContext(), gameEntity, null); } else { DownloadDialog.showDownloadDialog( v.getContext(), gameEntity, traceEvent, entrance, location + ":" + gameEntity.getName(), null); } break; case INSTALL_PLUGIN: case INSTALL_NORMAL: if (gameEntity.getApk().size() == 1) { NewFlatLogUtils.INSTANCE.logGameInstall( gameEntity.getId(), gameEntity.getName() != null ? gameEntity.getName() : "", "主动安装" ); SensorsBridge.trackInstallGameClick( gameEntity.getId(), gameEntity.getName() != null ? gameEntity.getName() : "", "主动安装", gameEntity.isDspGame(), gameEntity.getDspAdId() ); DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity); if (downloadEntity != null) { if (ExtensionsKt.isLocalDownloadInDualDownloadMode(downloadEntity)) { PackageInstaller.install(v.getContext(), downloadEntity); } else { VHelper.installOrLaunch(v.getContext(), gameEntity, null); } } } break; case RESERVABLE: GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> { CheckLoginUtils.checkLogin(progressBar.getContext(), "", () -> { ReservationHelper.reserve(v.getContext(), gameEntity, sourceEntrance, () -> { LogUtils.logReservation(gameEntity, traceEvent); updateReservation(progressBar, gameEntity); }); }); }); break; case RESERVED: ReservationHelper.showCancelReservationDialog(progressBar.getContext(), gameEntity, () -> { ReservationHelper.cancelReservation(gameEntity, () -> { updateReservation(progressBar, gameEntity); }); }); break; case H5_GAME: LinkEntity linkEntity = gameEntity.getH5Link(); boolean isPlay = "play".equals(linkEntity.getType()); // 是否为开始玩 MtaHelper.onEvent("H5页面", "入口", "列表页_" + gameEntity.getName()); if (isPlay) { HistoryHelper.insertGameEntity(gameEntity); } GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> { Intent i = new Intent(WebActivity.getIntentForWebGame(progressBar.getContext(), linkEntity.getLink(), gameEntity.getName(), isPlay, linkEntity.getCloseButton())); progressBar.getContext().startActivity(i); }); break; case UPDATING: Utils.toast(progressBar.getContext(), "正在加急更新版本,敬请后续留意"); break; } }); // 显示预约 if (gameEntity.isReservable()) { if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) { progressBar.setText("预约"); progressBar.setButtonStyle(DownloadButton.ButtonStyle.RESERVABLE); } else { progressBar.setText("已预约"); progressBar.setButtonStyle(DownloadButton.ButtonStyle.RESERVED); } return; } // 显示下载按钮状态 if (gameEntity.getApk().isEmpty() || gameEntity.getDownloadOffStatus() != null) { LinkEntity h5LinkEntity = gameEntity.getH5Link(); String offStatus = gameEntity.getDownloadOffStatus(); if (h5LinkEntity != null) { if ("play".equals(h5LinkEntity.getType())) { progressBar.setText("开始玩"); } else { progressBar.setText("查看"); } progressBar.setButtonStyle(DownloadButton.ButtonStyle.H5_GAME); } else { if (("dialog".equals(offStatus) || "third_party".equals(offStatus))) { progressBar.setText("查看"); progressBar.setButtonStyle(DownloadButton.ButtonStyle.NONE_WITH_HINT); } else if ("updating".equals(offStatus)) { progressBar.setText("更新中"); progressBar.setButtonStyle(DownloadButton.ButtonStyle.UPDATING); } else { progressBar.setText("暂无"); progressBar.setButtonStyle(DownloadButton.ButtonStyle.NONE); } } } else { String status = GameUtils.getDownloadBtnText(progressBar.getContext(), gameEntity, true, false, PluginLocation.only_game); switch (status) { case "插件化": progressBar.setButtonStyle(DownloadButton.ButtonStyle.PLUGIN); break; case "打开": case "启动": progressBar.setButtonStyle(DownloadButton.ButtonStyle.LAUNCH_OR_OPEN); break; default: progressBar.setButtonStyle(DownloadButton.ButtonStyle.NORMAL); break; } progressBar.setText(status); } // 显示下载过程状态 if (gameEntity.getApk().size() == 1) { DownloadEntity downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshot(gameEntity); if (downloadEntity != null) { progressBar.setProgress((int) (downloadEntity.getPercent() * 10)); switch (downloadEntity.getStatus()) { case downloading: case pause: case timeout: case neterror: case diskisfull: case diskioerror: case waiting: progressBar.setText(com.gh.gamecenter.feature.R.string.downloading); if (downloadEntity.isPluggable() && PackagesManager.isInstalled(downloadEntity.getPackageName())) { progressBar.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_PLUGIN); } else { progressBar.setButtonStyle(DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); } break; case done: progressBar.setText(com.gh.gamecenter.feature.R.string.install); if (downloadEntity.isPluggable() && PackagesManager.isInstalled(downloadEntity.getPackageName())) { progressBar.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_PLUGIN); } else { progressBar.setButtonStyle(DownloadButton.ButtonStyle.INSTALL_NORMAL); } break; case cancel: case hijack: case notfound: case uncertificated: case unqualified: case unavailable: case banned: break; default: break; } } } } /** * 当页面完全重建时,若存在重建的DialogFragment,则需要手动恢复该DialogFragment之前配置的回调(因为DialogFragment重建时只会从arguments中获取之前的配置内容, * 而arguments无法传递回调),或者dismiss该DialogFragment */ private static void restoreDialogFragment(DownloadButton progressBar) { GamePermissionDialogFragment gamePermissionDialogFragment = ((GamePermissionDialogFragment) ((AppCompatActivity) progressBar.getContext()).getSupportFragmentManager().findFragmentByTag(GamePermissionDialogFragment.class.getName())); if (gamePermissionDialogFragment != null) { gamePermissionDialogFragment.dismissAllowingStateLoss(); } } private static void updateReservation(DownloadButton progressBar, GameEntity gameEntity) { // 显示预约 if (gameEntity.isReservable()) { if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.getId())) { progressBar.setText("预约"); progressBar.setButtonStyle(DownloadButton.ButtonStyle.RESERVABLE); } else { progressBar.setText("已预约"); progressBar.setButtonStyle(DownloadButton.ButtonStyle.RESERVED); } } } // 开始下载 private static void download(Context context, DownloadButton progressBar, GameEntity gameEntity, ExposureEvent traceEvent, boolean asVGame, boolean isSubscribe, String entrance, String location) { if (BrowserInstallHelper.shouldAutoSwitchAssistantInstall(gameEntity)) { ToastUtils.toast(context.getString(R.string.unsupported_browser_install_hint)); } String buttonText = progressBar.getText(); ApkEntity apkEntity = CollectionsKt.firstOrNull(gameEntity.getApk()); String msg = FileUtils.isCanDownload(progressBar.getContext(), apkEntity == null ? "" : apkEntity.getSize()); if (apkEntity != null && TextUtils.isEmpty(msg)) { DownloadManager.createDownload(progressBar.getContext(), apkEntity, gameEntity, asVGame, gameEntity.isDualBtnModeEnabled(), entrance, location + gameEntity.getName(), isSubscribe, traceEvent); progressBar.setProgress(0); progressBar.setButtonStyle(buttonText.contains("插件化") ? DownloadButton.ButtonStyle.DOWNLOADING_PLUGIN : DownloadButton.ButtonStyle.DOWNLOADING_NORMAL); } else { Utils.toast(progressBar.getContext(), msg); } } /** * 包含测试开服标签 * * @param layout * @param gameEntity * @param subjectTag 默认为 “”,只有游戏专题可以配置subjectTag */ public static void setGameTags(LinearLayout layout, GameEntity gameEntity, String subjectTag) { try { if (layout.getVisibility() == View.GONE) return; ArrayList tagStyle = new ArrayList<>(); TestEntity test = gameEntity.getTest(); if (test != null && subjectTag.equals(SUBJECT_TAG_TEST)) { // 显示开测表标签 TagStyleEntity typeTag = new TagStyleEntity(); boolean isDarkModeOn = DarkModeUtils.INSTANCE.isDarkModeOn(layout.getContext()); typeTag.setName(test.getType() != null ? test.getType() : ""); typeTag.setBackground("1AFFA142"); typeTag.setColor(isDarkModeOn ? "EB9238" : "FFA142"); tagStyle.add(typeTag); TagStyleEntity timeTag = new TagStyleEntity(); if (test.getStartPending()) { timeTag.setName(test.getStartText()); } else { timeTag.setName(GameViewUtils.getGameTestDate(test.getStart())); } timeTag.setBackground("1A06CEA8"); timeTag.setColor(isDarkModeOn ? "07A385" : "06CEA8"); tagStyle.add(timeTag); } else { tagStyle = gameEntity.getTagStyle(); } GameViewUtils.setLabelList(layout.getContext(), layout, tagStyle); } catch (Exception e) { e.printStackTrace(); } } public static void setGameTagsWithSellingPoint(LinearLayout layout, LayoutGameItemSellingPointBinding binding, GameEntity gameEntity, String subjectTag) { if (subjectTag.equals(SUBJECT_TAG_SELLING_POINT)) { layout.setVisibility(View.GONE); binding.getRoot().setVisibility(View.VISIBLE); GameEntity.SellingPoints sellingPoints = gameEntity.getSellingPoints(); if (sellingPoints != null) { binding.tvSellingPoints.setVisibility(View.VISIBLE); binding.tvSellingPoints.setText(sellingPoints.getText()); } else { binding.tvSellingPoints.setVisibility(View.GONE); } ArrayList tagStyle = gameEntity.getTagStyle(); StringBuilder tagText = new StringBuilder(); for (int i = 0; i < tagStyle.size(); i++) { if (i < 3) { tagText.append(i == 0 ? "" : "·").append(tagStyle.get(i).getName()); } } binding.gtcvTags.setText(tagText); } else { layout.setVisibility(View.VISIBLE); binding.getRoot().setVisibility(View.GONE); switch (subjectTag) { case SUBJECT_TAG_UPDATE: List updateTags = new ArrayList<>(); TagStyleEntity updateTag = new TagStyleEntity( "local_generated", TimeUtils.getFormatTime(gameEntity.getUpdateTime(), "MM-dd") + " 更新", "", "1383EB", "E8F3FF", "1383EB", false ); updateTags.add(updateTag); GameViewUtils.setLabelList(layout.getContext(), layout, updateTags); break; case SUBJECT_TAG_TYPE: GameViewUtils.setLabelList(layout.getContext(), layout, gameEntity.getTagStyle()); break; default: setGameTags(layout, gameEntity, subjectTag); break; } } ViewParent parent = binding.getRoot().getParent(); if (parent instanceof ConstraintLayout) { ConstraintLayout constraintLayout = (ConstraintLayout) parent; ConstraintSet constraintSet = new ConstraintSet(); constraintSet.clone(constraintLayout); constraintSet.clear(R.id.gameDesSpace, ConstraintSet.BOTTOM); if (subjectTag.equals(SUBJECT_TAG_SELLING_POINT)) { constraintSet.connect(R.id.gameDesSpace, ConstraintSet.BOTTOM, R.id.layout_selling_points, ConstraintSet.TOP); } else { constraintSet.connect(R.id.gameDesSpace, ConstraintSet.BOTTOM, R.id.label_list, ConstraintSet.TOP); } constraintSet.applyTo(constraintLayout); } } public static void setVideoDetailGameTags(LinearLayout layout, GameEntity gameEntity) { try { ArrayList tagStyle = new ArrayList<>(); TestEntity test = gameEntity.getTest(); if (test != null // 这个判断用于开测表列表 && !"type_tag".equals(test.getGameTag())) { TagStyleEntity typeTag = new TagStyleEntity(); typeTag.setName(test.getType() != null ? test.getType() : ""); typeTag.setBackground("FFF3E0"); typeTag.setColor("FA8500"); tagStyle.add(typeTag); TagStyleEntity timeTag = new TagStyleEntity(); timeTag.setName(GameViewUtils.getGameTestDate(test.getStart())); timeTag.setBackground("E0FFF9"); timeTag.setColor("00A887"); tagStyle.add(timeTag); } else { tagStyle = gameEntity.getTagStyle(); } GameViewUtils.setLabelList(layout.getContext(), layout, tagStyle, 4); } catch (Exception e) { e.printStackTrace(); } } public static void setGameName(TextView view, GameEntity game, boolean isShowPlatform) { String gameName; if (isShowPlatform && game.getApk().size() > 0) { gameName = String.format("%s - %s", game.getName(), PlatformUtils.getInstance(view.getContext()).getPlatformName( game.getApk().get(0).getPlatform())); if (!gameName.equals((String) view.getTag(com.gh.gamecenter.common.R.string.tag_game_name_id))) { view.setText(gameName); view.setTag(com.gh.gamecenter.common.R.string.tag_game_name_id, gameName); } } else { gameName = game.getName(); if (gameName != null && !gameName.equals((String) view.getTag(com.gh.gamecenter.common.R.string.tag_game_name_id))) { view.setText(gameName); view.setTag(com.gh.gamecenter.common.R.string.tag_game_name_id, gameName); } } } public static void setGameTags(TextView view, List tags, int maxTags) { if (tags == null) { view.setText(""); return; } int showCount = tags.size() > maxTags ? maxTags : tags.size(); // 最多显示3个 StringBuilder content = new StringBuilder(); for (int i = 0; i < showCount; i++) { TagStyleEntity tag = tags.get(i); content.append(tag.getName()); if (i != showCount - 1) content.append("/"); } Spannable span = new SpannableString(content); int index = 0; for (int i = 0; i < showCount; i++) { TagStyleEntity tag = tags.get(i); int start = index; int end = start + tag.getName().length() + ((i != showCount - 1) ? 1 : 0); index = end; span.setSpan(new ForegroundColorSpan(ExtensionsKt.hexStringToIntColor("#" + tag.getColor(), Color.WHITE)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } view.setText(span); } }