Compare commits

..

53 Commits

Author SHA1 Message Date
3e512634c6 tinkerBase:3.6.2 2019-03-04 09:51:55 +08:00
7045354808 修复推送系统通道内容乱码问题 2019-02-28 23:25:22 +08:00
dbcc97a250 修复版本说明弹窗圆角 2019-02-28 19:28:20 +08:00
050081b7b1 修复版本说明弹窗大小 修改求版本文案 2019-02-28 18:04:57 +08:00
993d1e7635 UI调整 2019-02-28 10:07:48 +08:00
a86a3c1f71 修复了游戏详情下载按钮文字过多导致超出可是范围的问题 2019-02-27 17:54:41 +08:00
b0a192ad9a 修复了未登录时游戏动态的热门推荐区域不显示的问题 2019-02-27 17:31:51 +08:00
ea7b478c6b Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2019-02-27 16:23:01 +08:00
b673383f59 修复文章详情引用评论隐藏后没有显示"该内容已被隐藏"问题 2019-02-27 16:22:27 +08:00
06ae366b74 修复隐藏入口后一键修复无法即时更新页面问题 2019-02-27 16:20:57 +08:00
6b9cf7094e 修复关注页面刷新不及时的问题 2019-02-27 15:45:38 +08:00
5ae22bd2bc 修复了用户没有登录也能看到消息中心推送的问题 2019-02-27 10:40:46 +08:00
e951551531 修复了答案详情点击更多会闪退的问题 2019-02-27 10:39:50 +08:00
272e5fb6cc 调整专栏阅读日志的默认值 2019-02-26 14:49:42 +08:00
7dc17d09c1 记录专栏的阅读位置信息 2019-02-26 14:29:39 +08:00
cfacbe739d 修复一些空指针异常 2019-02-26 10:10:29 +08:00
0a72226ba5 下载平台面板增加翻页提示 2019-02-25 10:56:25 +08:00
5f22a14643 整理部分代码 2019-02-24 15:14:42 +08:00
5562e38c2f Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2019-02-24 11:16:58 +08:00
f9027f7a61 消息中心样式修改 2019-02-24 11:16:46 +08:00
6d0e437ad4 完成 MTA 统计需求 https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/456 2019-02-23 11:40:19 +08:00
3abc53d3b3 完成首页游戏替换功能 https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/447 2019-02-23 10:33:55 +08:00
d0e4c2c3ab 补充注释 2019-02-22 15:39:09 +08:00
5be50c1638 修复数据统计缺失社区ID的问题 2019-02-22 15:38:31 +08:00
7c525aec79 推送功能优化 https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/451 2019-02-22 15:35:11 +08:00
63d5edf892 光环前端需求汇总(2019年2月第4周)(2.3.6.7)https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/452 2019-02-22 15:32:34 +08:00
c9f2cf178a 去掉推送通知的本地过滤 2019-02-22 10:14:37 +08:00
fc98de3bc0 更换广点通接入帐号 https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/454 2019-02-22 09:59:36 +08:00
dd8360f5e8 游戏下载面板增加公告(补充) 2019-02-21 11:13:06 +08:00
bc9b815b47 DownloadDialog 去除单例 2019-02-20 14:41:15 +08:00
2a93995221 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2019-02-20 10:32:15 +08:00
0e93f6521c 版本升为3.6.2 2019-02-20 10:32:09 +08:00
b3a6d0ce94 修复横排专题的曝光出现内容错乱的问题 2019-02-19 18:11:38 +08:00
de60d05190 插件游戏求版本功能完善 https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/450#note_17274 2019-02-19 15:42:22 +08:00
2a2ce9a490 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2019-02-19 11:32:42 +08:00
639644e3c3 游戏下载面板增加公告功能 https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/449#note_17186 2019-02-19 11:30:52 +08:00
2378e6e94e 基本完成首页游戏替换功能(本地测试通过,暂未与后台调试) https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/447 2019-02-18 15:33:12 +08:00
87d9feae70 修改 Gson 的对象化实现,避免类型擦除 2019-02-18 15:27:49 +08:00
4a93d129bb 游戏下载面板增加公告 2019-02-16 15:46:15 +08:00
39e5e2e9f9 渠道包功能开关控制规则优化(未测试) https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/448 2019-02-15 16:07:30 +08:00
8a5f777c65 社区和文章评论被删除的默认文案颜色修改 2019-02-14 10:48:53 +08:00
22c693e042 Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2019-02-13 18:25:13 +08:00
36d04f5841 意见反馈修改 光环前端需求汇总(2019年2月第3周)(8.9.10.11) https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/445#note_17027 2019-02-13 18:25:05 +08:00
409123337d 统一游戏动态和我的关注页面的游戏推荐样式 2019-02-13 17:32:06 +08:00
b180a210cb Merge branch 'dev' of gitlab.ghzhushou.com:halo/assistant-android into dev 2019-02-13 15:38:40 +08:00
32dfdc4d08 更改草稿刷新逻辑 光环前端需求汇总(2019年2月第3周)(3) 2019-02-13 15:38:35 +08:00
4d46888995 修复更新非活跃状态的页面造成的闪退问题 2019-02-13 14:27:31 +08:00
69db836231 修复问题详情和答案详情页面会丢失部分阅读时长统计的问题 2019-02-12 17:46:54 +08:00
f82b9ad308 修复进入有视频的游戏详情时会造成手机被静音的问题 2019-02-12 15:14:46 +08:00
3ac91b1216 修复重复初始化七陌客服SDK造成后台产生空的聊天条目的问题 2019-02-11 15:36:05 +08:00
8d4b3e0851 修复更新非活跃状态的页面造成的闪退问题 2019-02-11 10:39:11 +08:00
67d8f46217 反馈图标大小自适应 2019-01-30 17:18:57 +08:00
f357136936 update CHANGELOG
3.6.1 Tinker Base
2019-01-30 15:48:00 +08:00
130 changed files with 2322 additions and 1454 deletions

View File

@ -30,4 +30,9 @@
- 删除TINKER_VERISON_NAME
- tinker打包方式变更(以小版本作为Base包,防止与数据后台小版本更新发生冲突)
* 社区增加版主功能(版主可以对存在的相关内容进行修改/隐藏操作,内容包括问题/回答/回答评论)
* 社区互动引导优化(问答推荐增加`推荐关注`,回答详情增加一些交互动效)
* 社区互动引导优化(问答推荐增加`推荐关注`,回答详情增加一些交互动效)
### Ver 3.6.1
* 可以后台控制关闭资讯功能
* 版块、分类、专题详情、游戏详情、礼包详情增加预览骨架
* 下载按钮状态可以通过接口屏蔽相应的包

View File

@ -75,7 +75,7 @@ public class AppUncaughtHandler implements UncaughtExceptionHandler {
// 保存log到本地
public static void saveLocalLog(Context context, Throwable ex) {
String errorMsg = Log.getStackTraceString(ex);
Config.setExceptionMsg(context, errorMsg);
Config.setExceptionMsg(errorMsg);
// 保存到本地
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault());

View File

@ -101,6 +101,12 @@ public abstract class BaseToolBarActivity extends BaseAppCompatActivity implemen
return mToolbar.getMenu().findItem(res);
}
public void clearMenu() {
if (mToolbar != null) {
mToolbar.getMenu().clear();
}
}
public Menu getMenu() {
return mToolbar.getMenu();
}

View File

@ -15,9 +15,8 @@ import android.view.View
import com.gh.common.notifier.Notifier
import com.gh.common.util.DataUtils
import com.gh.common.util.EntranceUtils
import com.gh.common.util.PackageUtils
import com.gh.common.util.StringUtils
import com.gh.gamecenter.BuildConfig
import com.gh.common.util.toObject
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.PushEntity
import com.gh.gamecenter.entity.PushMessageEntity
@ -32,7 +31,6 @@ import com.gh.gamecenter.receiver.UmengMessageReceiver.Companion.TYPE_REMOVE
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import com.google.gson.Gson
import com.halo.assistant.HaloApp
import com.umeng.message.UmengMessageService
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
@ -48,22 +46,16 @@ class GHUmengNotificationService : UmengMessageService() {
companion object {
const val ACTION_UMENG = "com.gh.gamecenter.UMENG"
const val MESSAGE_FROM_SYSTEM = "message_from_system"
const val HALO_MESSAGE_DIALOG = "HALO_MESSAGE_DIALOG"
const val HALO_MESSAGE_CENTER = "HALO_MESSAGE_CENTER"
const val ANSWER = "answer"
const val FOLLOW_QUESTION = "follow_question"
const val NOTIFICATION_ID = 2015
const val DISPLAY_TYPE_NOTIFICATION = "notification"
const val DISPLAY_TYPE_CUSTOM = "custom"
const val MESSAGE_ID = "message_id"
const val PUSH_ID = "push_id"
}
val notificationTags = arrayOf("GH_UMENG_TAG_1", "GH_UMENG_TAG_2", "GH_UMENG_TAG_3")
@ -74,7 +66,7 @@ class GHUmengNotificationService : UmengMessageService() {
val isMessageFromSystem = intent.getBooleanExtra(MESSAGE_FROM_SYSTEM, false)
try {
val pushData = gson.fromJson(message, PushEntity::class.java)
val pushData = message.toObject<PushEntity>()
pushData?.let { handlePushData(context, it, message, isMessageFromSystem) }
} catch (e: Exception) {
e.printStackTrace()
@ -87,10 +79,10 @@ class GHUmengNotificationService : UmengMessageService() {
if (pushData.displayType == DISPLAY_TYPE_NOTIFICATION) {
// 其它类型的透传信息
// 显示到通知栏
val msg = gson.fromJson(message, PushNotificationEntity::class.java)
val msg = message.toObject<PushNotificationEntity>()
val data = msg?.extra?.data
// 系统推送,直接处理跳转
// 系统推送(非自定义信息),直接处理跳转
if (isMessageFromSystem) {
val intent = Intent()
intent.setClass(context, UmengMessageReceiver::class.java)
@ -101,43 +93,49 @@ class GHUmengNotificationService : UmengMessageService() {
return
}
// 判断是否过滤该消息
if (validatePush(data?.condition)) {
val clickIntent = Intent()
val removeIntent = Intent()
clickIntent.setClass(context, UmengMessageReceiver::class.java)
clickIntent.putExtra(EntranceUtils.KEY_DATA, data?.link)
clickIntent.putExtra(EntranceUtils.KEY_MESSAGE, message)
clickIntent.putExtra(EntranceUtils.KEY_TYPE, TYPE_CLICK)
removeIntent.setClass(context, UmengMessageReceiver::class.java)
removeIntent.putExtra(EntranceUtils.KEY_TYPE, TYPE_REMOVE)
removeIntent.putExtra(EntranceUtils.KEY_MESSAGE, message)
val clickPendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt(),
clickIntent, PendingIntent.FLAG_UPDATE_CURRENT)
val deletePendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt() + 1,
removeIntent, PendingIntent.FLAG_UPDATE_CURRENT)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel("Halo_Push", "Halo_Push", NotificationManager.IMPORTANCE_DEFAULT)
notificationManager.createNotificationChannel(channel)
}
val notification = NotificationCompat.Builder(context, "Halo_Push")
.setSmallIcon(R.drawable.ic_notification)
.setTicker(pushData.body?.ticker)
.setContentTitle(pushData.body?.title)
.setContentText(pushData.body?.text)
.setContentIntent(clickPendingIntent)
.setDeleteIntent(deletePendingIntent)
.build()
notification.flags = notification.flags or Notification.FLAG_AUTO_CANCEL
notificationManager.notify(getNotificationTag(context), NOTIFICATION_ID, notification)
// 用户未登录的情况下不生成消息中心通知,避免用户掉登录了还收到跳转至消息中心的通知
if (data != null
&& data.link?.target == "system"
&& !UserManager.getInstance().isLoggedIn) {
return
}
val clickIntent = Intent()
val removeIntent = Intent()
clickIntent.setClass(context, UmengMessageReceiver::class.java)
clickIntent.putExtra(EntranceUtils.KEY_DATA, data?.link)
clickIntent.putExtra(EntranceUtils.KEY_MESSAGE, message)
clickIntent.putExtra(MESSAGE_ID, msg?.msgId)
clickIntent.putExtra(PUSH_ID, data?.pushId)
clickIntent.putExtra(EntranceUtils.KEY_TYPE, TYPE_CLICK)
removeIntent.setClass(context, UmengMessageReceiver::class.java)
removeIntent.putExtra(EntranceUtils.KEY_TYPE, TYPE_REMOVE)
removeIntent.putExtra(EntranceUtils.KEY_MESSAGE, message)
val clickPendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt(),
clickIntent, PendingIntent.FLAG_UPDATE_CURRENT)
val deletePendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt() + 1,
removeIntent, PendingIntent.FLAG_UPDATE_CURRENT)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel("Halo_Push", "Halo_Push", NotificationManager.IMPORTANCE_DEFAULT)
notificationManager.createNotificationChannel(channel)
}
val notification = NotificationCompat.Builder(context, "Halo_Push")
.setSmallIcon(R.drawable.ic_notification)
.setTicker(pushData.body?.ticker)
.setContentTitle(pushData.body?.title)
.setContentText(pushData.body?.text)
.setContentIntent(clickPendingIntent)
.setDeleteIntent(deletePendingIntent)
.build()
notification.flags = notification.flags or Notification.FLAG_AUTO_CANCEL
notificationManager.notify(getNotificationTag(context), NOTIFICATION_ID, notification)
} else {
if (HALO_MESSAGE_DIALOG == pushData.body?.custom) {
// 回答了问题或者关注了问题的消息
@ -201,37 +199,6 @@ class GHUmengNotificationService : UmengMessageService() {
}
}
private fun validatePush(condition: PushNotificationEntity.Data.Condition?): Boolean {
if (condition == null) return true
// 校验渠道是否匹配
condition.ghzs?.channel?.let {
if (it.isNotEmpty() && it != HaloApp.getInstance().channel) {
return false
}
}
// 校验光环版本版本是否匹配
condition.ghzs?.version?.let {
if (it.isNotEmpty() && !BuildConfig.VERSION_NAME.contains(it)) {
return false
}
}
// 校验已安装的应用里是否存在条件的包名
if (condition.packageName.isNotEmpty()) {
val installedPackageList = PackageUtils.getAllPackageName(HaloApp.getInstance().application)
for (packageName in installedPackageList) {
if (condition.packageName == packageName) {
return true
}
}
return false
}
return true
}
/**
* 规则:最多三条消息,以旧换新
*

View File

@ -1,5 +1,6 @@
package com.gh.common
import android.annotation.SuppressLint
import android.preference.PreferenceManager
import com.gh.base.GHUmengNotificationService
import com.gh.common.constant.Config
@ -77,6 +78,7 @@ object PushManager {
})
}
@SuppressLint("CheckResult")
@JvmStatic
fun getAndSetAlias() {
if (deviceToken.isNullOrEmpty()) {

View File

@ -13,6 +13,8 @@ import java.util.concurrent.Executors
*/
class TimeElapsedHelper(val fragment: Fragment?, val activity: Activity?) {
constructor() : this(null, null)
constructor(fragment: Fragment) : this(fragment, null)
constructor(activity: Activity) : this(null, activity)
@ -79,7 +81,7 @@ class TimeElapsedHelper(val fragment: Fragment?, val activity: Activity?) {
}, false)
}
private fun resumeCounting() {
fun resumeCounting() {
isWorking = true
TimeElapsedThreadHolder.threadService.execute {
while (isWorking) {
@ -100,7 +102,7 @@ class TimeElapsedHelper(val fragment: Fragment?, val activity: Activity?) {
}
}
private fun pauseCounting() {
fun pauseCounting() {
isWorking = false
}

View File

@ -1,6 +1,5 @@
package com.gh.common.constant;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
@ -8,6 +7,7 @@ import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.gh.common.util.GsonUtils;
import com.gh.common.util.PackageHelper;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.entity.NewsEntity;
import com.gh.gamecenter.entity.SettingsEntity;
@ -51,9 +51,14 @@ public class Config {
private static SettingsEntity mSettingsEntity;
public static final String FIX_DOWNLOAD_KEY = "isFixDownload";
public static final String FIX_PLUGIN_KEY = "isFixPlugin";
public static final String FIX_ARTICLE_KEY = "isFixArticle";
public static final String FIX_COMMUNITY_KEY = "isFixCommunity";
public static boolean isShow() {
if (PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication())
.getBoolean("isFixDownload", false)) return true;
if (getPreferences().getBoolean(FIX_DOWNLOAD_KEY, false)) return true;
if (!isExistDownloadFilter()) return false;
@ -64,23 +69,20 @@ public class Config {
}
}
}
return false;
}
public static String getExceptionMsg(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getString("errMsg", null);
public static String getExceptionMsg() {
return getPreferences().getString("errMsg", null);
}
public static void setExceptionMsg(Context context, String errMsg) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putString("errMsg", errMsg).apply();
public static void setExceptionMsg(String errMsg) {
getPreferences().edit().putString("errMsg", errMsg).apply();
}
public static boolean isShowDownload(String gameId) {
if (PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication())
.getBoolean("isFixDownload", false)) return true;
if (getPreferences().getBoolean(FIX_DOWNLOAD_KEY, false)) return true;
if (TextUtils.isEmpty(gameId) || !isExistDownloadFilter())
return false;
@ -114,8 +116,15 @@ public class Config {
} else {
return false;
}
} else if ("all".equals(entity.getGame())) {
}
SharedPreferences preferences = getPreferences();
boolean isFixPlugin = preferences.getBoolean(FIX_PLUGIN_KEY, false);
if (isFixPlugin) return true;
if ("all".equals(entity.getGame())) {
if (entity.getPluginfy() && filterTime(entity.getTime())) {
preferences.edit().putBoolean(FIX_PLUGIN_KEY, true).apply();
return true;
}
}
@ -152,20 +161,20 @@ public class Config {
}
public static void setSettings(SettingsEntity settingsEntity) {
SharedPreferences.Editor edit = PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication()).edit();
edit.putString(SETTINGS_KEY, GsonUtils.getInstance().toJson(settingsEntity)).apply();
getPreferences().edit().putString(SETTINGS_KEY, GsonUtils.toJson(settingsEntity)).apply();
mSettingsEntity = settingsEntity;
// 加载完设置后刷新下
PackageHelper.initList();
}
@Nullable
public static SettingsEntity getSettings() {
if (mSettingsEntity == null) {
try {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication());
String json = sp.getString(SETTINGS_KEY, null);
String json = getPreferences().getString(SETTINGS_KEY, null);
if (!TextUtils.isEmpty(json)) {
mSettingsEntity = GsonUtils.getInstance().fromJsonBean(json, SettingsEntity.class);
mSettingsEntity = GsonUtils.fromJson(json, SettingsEntity.class);
}
} catch (Exception e) {
e.printStackTrace();
@ -195,4 +204,27 @@ public class Config {
}
}
public static SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication());
}
public static boolean isExistHideFunction() {
SharedPreferences preferences = getPreferences();
if (!preferences.getBoolean(FIX_DOWNLOAD_KEY, false)) return true;
if (!preferences.getBoolean(FIX_PLUGIN_KEY, false)) return true;
if (!preferences.getBoolean(FIX_COMMUNITY_KEY, false)) return true;
if (!preferences.getBoolean(FIX_ARTICLE_KEY, false)) return true;
return false;
}
public static void fixHideFunction() {
SharedPreferences preferences = PreferenceManager.
getDefaultSharedPreferences(HaloApp.getInstance().getApplication());
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(Config.FIX_DOWNLOAD_KEY, true);
editor.putBoolean(Config.FIX_ARTICLE_KEY, true);
editor.putBoolean(Config.FIX_COMMUNITY_KEY, true);
editor.putBoolean(Config.FIX_PLUGIN_KEY, true);
editor.apply();
}
}

View File

@ -11,27 +11,27 @@ class ExposureConverters {
@TypeConverter
fun convertPayload2String(any: ExposureEntity): String {
return GsonUtils.getInstance().mGson.toJson(any)
return GsonUtils.toJson(any)
}
@TypeConverter
fun convertString2Payload(string: String): ExposureEntity {
return GsonUtils.getInstance().mGson.fromJson(string, ExposureEntity::class.java)
return GsonUtils.fromJson(string, ExposureEntity::class.java)
}
@TypeConverter
fun convertSource2String(sourceList: List<ExposureSource>): String {
return GsonUtils.getInstance().mGson.toJson(sourceList)
return GsonUtils.toJson(sourceList)
}
@TypeConverter
fun convertString2Source(sourceList: String): List<ExposureSource> {
return ArrayList(Arrays.asList(GsonUtils.getInstance().mGson.fromJson(sourceList, Array<ExposureSource>::class.java))) as List<ExposureSource>
return ArrayList(Arrays.asList(GsonUtils.fromJson(sourceList, Array<ExposureSource>::class.java))) as List<ExposureSource>
}
@TypeConverter
fun convertETrace2String(sourceList: List<ExposureEvent>?): String {
return GsonUtils.getInstance().mGson.toJson(sourceList)
return GsonUtils.toJson(sourceList)
}
@TypeConverter
@ -51,12 +51,12 @@ class ExposureConverters {
@TypeConverter
fun convertMeta2String(any: Meta): String {
return GsonUtils.getInstance().mGson.toJson(any)
return GsonUtils.toJson(any)
}
@TypeConverter
fun convertString2Meta(string: String): Meta {
return GsonUtils.getInstance().mGson.fromJson(string, Meta::class.java)
return GsonUtils.fromJson(string, Meta::class.java)
}
}

View File

@ -15,7 +15,7 @@ import java.util.*
@Parcelize
@Entity(tableName = "exposureEvent")
data class ExposureEvent(
val payload: ExposureEntity,
var payload: ExposureEntity,
val source: List<ExposureSource>,
var eTrace: List<ExposureEvent>? = arrayListOf(),
val event: ExposureType,
@ -26,7 +26,7 @@ data class ExposureEvent(
companion object {
fun createEvent(gameEntity: GameEntity?, source: List<ExposureSource>, eTrace: List<ExposureEvent>?, event: ExposureType): ExposureEvent {
return ExposureEvent(
ExposureEntity(gameId = gameEntity?.id,
payload = ExposureEntity(gameId = gameEntity?.id,
gameName = gameEntity?.name,
sequence = gameEntity?.sequence,
platform = gameEntity?.platform,

View File

@ -1,6 +1,6 @@
package com.gh.common.exposure
import com.gh.common.util.fromObject
import com.gh.common.util.toObject
import com.gh.gamecenter.entity.GameEntity
import java.util.*
@ -30,7 +30,7 @@ object ExposureUtils {
val gameEntity = entity.clone()
gameEntity.platform = platform
gameEntity.downloadCompleteType = downloadType.toString()
val traceEvent = trace?.fromObject<ExposureEvent>()
val traceEvent = trace?.toObject<ExposureEvent>()
val exposureEvent = ExposureEvent.createEvent(gameEntity = gameEntity,
source = traceEvent?.source ?: ArrayList(),
eTrace = ExposureTraceUtils.appendTrace(traceEvent),

View File

@ -5,6 +5,7 @@ import android.app.NotificationManager
import android.content.Context
import com.gh.base.CurrentActivityHolder
import com.gh.common.util.SPUtils
import com.gh.gamecenter.BuildConfig
import com.gh.gamecenter.MainActivity
import com.gh.gamecenter.MessageActivity
import com.gh.gamecenter.SuggestSelectActivity
@ -27,10 +28,15 @@ object ImManager {
var shouldShowFloatingWindow = false
var shouldShowFloatingWindowDot = false
// 记录当前用户 ID 避免重复初始化
var currentUserId = ""
@JvmStatic
fun attachIm() {
try {
if (UserManager.getInstance().userInfoEntity != null) {
if (UserManager.getInstance().userInfoEntity != null &&
currentUserId != UserManager.getInstance().userId) {
currentUserId = UserManager.getInstance().userId
MoorUtils.init(HaloApp.getInstance().application)
Utils.init(HaloApp.getInstance().application)
IMChatManager.getInstance().init(
@ -71,7 +77,8 @@ object ImManager {
chatHelper.initSdkChat(
ImReceiver.UNIQUE_BROADCAST_ACTION,
IM_KEY,
UserManager.getInstance().userInfoEntity.name + "(" + UserManager.getInstance().userId + ")",
UserManager.getInstance().userInfoEntity.name + "(" + UserManager.getInstance().userId + ")"
+ "[" + BuildConfig.VERSION_NAME + "]",
UserManager.getInstance().userId)
} catch (e: Exception) {
e.printStackTrace()

View File

@ -28,6 +28,8 @@ object RemenkapaiRepository {
* 选择随机数量的热门卡牌
*/
private fun pickRandomSizeEntity(size: Int): List<GameEntity> {
if (size > remenkapaiList.size) return remenkapaiList
val randomGameList = arrayListOf<GameEntity>()
val randomArray = RandomUtils.getRandomArray(size, remenkapaiList.size)
for (i in randomArray) {

View File

@ -111,6 +111,7 @@ public class EntranceUtils {
public static final String KEY_RATING_STAR_COUNT = "ratingStarCount";
public static final String KEY_QUESTION_MODERATOR_PATCH = "questionModeratorPatch";
public static final String KEY_SKIP_GAME_COMMENT = "skipGameComment";
public static final String KEY_OPEN_PLATFORM_WINDOW = "openPlatformWindow";
public static void jumpActivity(Context context, Bundle bundle) {

View File

@ -29,7 +29,7 @@ object ErrorHelper {
* [important] 用来标识有同样错误码可以触发两种处理时,为 true 时选择重要的
*/
fun handleError(context: Context, errorString: String?, important: Boolean = false) {
val errorEntity = errorString?.fromObject<ErrorEntity>()
val errorEntity = errorString?.toObject<ErrorEntity>()
if (errorEntity == null) {
Utils.toast(context, R.string.post_failure_hint)

View File

@ -6,6 +6,7 @@ import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
import android.support.v4.view.ViewPager
import android.view.View
import com.google.gson.reflect.TypeToken
/**
* 创建以 activity 为观察者上下文的 viewModel
@ -73,9 +74,9 @@ fun Context.ifLogin(entrance: String, action: (() -> Unit)? = null) {
/**
* Gson related extensions.
*/
inline fun <reified T : Any> String.fromObject(): T? {
inline fun <reified T : Any> String.toObject(): T? {
return try {
GsonUtils.getInstance().mGson.fromJson(this, T::class.java)
GsonUtils.gson.fromJson(this, object : TypeToken<T>() {}.type)
} catch (e: Exception) {
e.printStackTrace()
null
@ -83,7 +84,7 @@ inline fun <reified T : Any> String.fromObject(): T? {
}
inline fun <reified T : Any> T.toJson(): String {
return GsonUtils.getInstance().mGson.toJson(this)
return GsonUtils.toJson(this)
}
/**

View File

@ -0,0 +1,113 @@
package com.gh.common.util
import android.content.Context
import android.text.TextUtils
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.entity.SubjectEntity
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import io.reactivex.schedulers.Schedulers
/**
* 首页补充游戏库辅助类
*/
object GameRepositoryHelper {
private const val KEY_GAME_REPOSITORY = "game_repository"
// TODO 会有多线程操作问题(在此列表获取补充游戏数据时进行下拉刷新修改此列表)
var gameCollectionList: List<SubjectEntity> = arrayListOf()
init {
loadSavedRepository()
}
/**
* 获取游戏补充库
*/
@JvmStatic
fun getGameRepository(context: Context) {
// Test only
// RetrofitManager.getInstance(context)
// .api
// .remenkapai
// .subscribeOn(Schedulers.io())
// .subscribe(object : Response<List<GameEntity>>() {
// override fun onResponse(response: List<GameEntity>?) {
// val subjectEntityList = arrayListOf<SubjectEntity>()
// val subjectEntity = SubjectEntity(id = "5ac46cca2924bc2870438d28")
// subjectEntity.data = ArrayList(response)
// subjectEntityList.add(subjectEntity)
// updateGameRepository(subjectEntityList)
// }
// })
RetrofitManager.getInstance(context)
.api
.reserveColumns
.subscribeOn(Schedulers.io())
.subscribe(object : Response<List<SubjectEntity>>() {
override fun onResponse(response: List<SubjectEntity>?) {
super.onResponse(response)
updateGameRepository(response)
}
})
}
/**
* 刷新内存中的游戏库(即从 SP 中再读一次)
*/
@JvmStatic
fun refreshGameRepository() = loadSavedRepository()
private fun loadSavedRepository() {
gameCollectionList = SPUtils.getString(KEY_GAME_REPOSITORY).toObject() ?: arrayListOf()
}
fun updateGameRepository(subjects: List<SubjectEntity>?) {
if (subjects == null) return
SPUtils.setString(KEY_GAME_REPOSITORY, subjects.toJson())
gameCollectionList = subjects
}
/**
* 从补充游戏库相应的专题中取出一个与其它游戏都不相同的游戏,为空时即为游戏用完或不存在该相应专题
* @param collectionId 补充游戏库相应专题 ID
* @param gameIdList 该专题里已经包含的游戏 ID 列表
*/
fun getOneUniqueGame(collectionId: String?, gameIdList: List<String>): GameEntity? {
collectionId?.let {
val collection = gameCollectionList.find { it.id == collectionId }
// Test only
// val collection = gameCollectionList.find { it.id == "5ac46cca2924bc2870438d28" }
collection?.let {
val game = collection.data?.find { game -> findUniqueGame(game, gameIdList) }
game?.let {
collection.data?.remove(game)
return game
}
}
}
return null
}
private fun findUniqueGame(game: GameEntity, gameIdList: List<String>): Boolean {
for (apk in game.getApk()) {
// 检查本地是否已安装该游戏,已过滤那部分框架服务的包名
if (PackageHelper.validLocalPackageNameSet.contains(apk.packageName)) {
return false
}
}
return !gameIdList.contains(game.id) && !TextUtils.isEmpty(game.id)
}
}

View File

@ -21,7 +21,7 @@ object GdtHelper {
const val PLATFORM = "PLATFORM"
fun init(application: Application) {
GDTAction.init(application, "1107958753", "dff25cc0dcb4a3b9f881a5fd7eec7e8a")
GDTAction.init(application, "1108222478", "0b2bb2b971c8221be45a8454f05a0b1f")
}
fun logAction(type: String) {

View File

@ -56,7 +56,7 @@ public class GetLoginDataUtils {
+ "follow_app_official_microblog," + "invitation_write"; // weiboCode
private GetLoginDataUtils(Context context) {
mContext = context.getApplicationContext();
mContext = context;
mTencent = Tencent.createInstance(Config.TENCENT_APPID, mContext); //初始化QQ分享
mIWXAPI = WXAPIFactory.createWXAPI(mContext, Config.WECHAT_APPID, true); //初始化微信分享
@ -68,7 +68,7 @@ public class GetLoginDataUtils {
public static GetLoginDataUtils getInstance(Context context) {
if (instance == null) {
instance = new GetLoginDataUtils(context);
instance = new GetLoginDataUtils(context.getApplicationContext());
}
return instance;
}
@ -172,7 +172,7 @@ public class GetLoginDataUtils {
}
}
public void WCLofinCallBack(JSONObject content) {
public void WCLoginCallBack(JSONObject content) {
if (mLoginListener != null) {
mLoginListener.OnLoginData(content, LoginTag.wechat);
}

View File

@ -1,36 +1,27 @@
package com.gh.common.util
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
/**
* Created by khy on 11/10/17.
*/
class GsonUtils private constructor() {
val mGson: Gson = Gson()
object GsonUtils {
val gson: Gson = Gson()
companion object {
@JvmStatic
fun getInstance(): GsonUtils {
return Inner.anotherSingle
}
private object Inner {
val anotherSingle = GsonUtils()
}
@JvmStatic
fun <T> fromJson(json: String, t: Class<T>): T {
return gson.fromJson(json, t)
}
fun <T> fromJsonBean(json: String, t: Class<T>): T {
return mGson.fromJson(json, t)
}
// @JvmStatic
// fun <T> fromJsonList(json: String): List<T> {
// val type = object : TypeToken<List<T>>() {}.type
// return gson.fromJson(json, type)
// }
fun <T> fromJsonList(json: String, t: Class<T>): T {
val type = object : TypeToken<List<T>>() {}.type
return mGson.fromJson(json, type)
}
fun toJson(any: Any): String {
return mGson.toJson(any)
@JvmStatic
fun toJson(any: Any?): String {
return gson.toJson(any)
}
}

View File

@ -8,6 +8,7 @@ import android.text.TextUtils;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.entity.CommunityEntity;
import com.gh.gamecenter.entity.SpecialColumn;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.qa.entity.Questions;
import com.gh.loghub.LogHubUtils;
@ -23,8 +24,12 @@ import org.json.JSONObject;
*/
public class LogUtils {
public static void uploadCommunityArticle(String tracers, String articleId, String articleTitle,
int readTime, CommunityEntity community) {
public static void uploadCommunityArticle(String tracers,
String articleId,
String articleTitle,
int readTime,
CommunityEntity community,
SpecialColumn specialColumn) {
JSONObject object = new JSONObject();
try {
object.put("subject", "community_article");
@ -34,6 +39,17 @@ public class LogUtils {
object.put("article_name", articleTitle);
object.put("tracers", tracers);
object.put("read", readTime);
JSONObject columnObject = new JSONObject();
if (specialColumn != null) {
columnObject.put("type", specialColumn.getType());
columnObject.put("name", specialColumn.getName());
columnObject.put("tab", specialColumn.getTab());
} else {
columnObject.put("type", "");
columnObject.put("name", "");
columnObject.put("tab", "");
}
object.put("special_column", columnObject);
} catch (JSONException e) {
e.printStackTrace();
}
@ -56,17 +72,34 @@ public class LogUtils {
upload(object);
}
public static void uploadAnswerReadTime(String tracers, int readTime, String answerId, Questions questions) {
public static void uploadAnswerReadTime(String tracers,
int readTime,
String answerId,
Questions questions,
String communityId,
String CommunityName,
SpecialColumn specialColumn) {
JSONObject object = new JSONObject();
try {
object.put("subject", "answer");
object.put("community_id", UserManager.getInstance().getCommunity().getId());
object.put("community_name", UserManager.getInstance().getCommunity().getName());
object.put("community_id", communityId);
object.put("community_name", CommunityName);
object.put("question_id", questions.getId());
object.put("question_name", questions.getTitle());
object.put("tracers", tracers);
object.put("answer_id", answerId);
object.put("read", readTime);
JSONObject columnObject = new JSONObject();
if (specialColumn != null) {
columnObject.put("type", specialColumn.getType());
columnObject.put("name", specialColumn.getName());
columnObject.put("tab", specialColumn.getTab());
} else {
columnObject.put("type", "");
columnObject.put("name", "");
columnObject.put("tab", "");
}
object.put("special_column", columnObject);
} catch (JSONException e) {
e.printStackTrace();
}
@ -74,16 +107,32 @@ public class LogUtils {
upload(object);
}
public static void uploadQuestionReadTime(String tracers, int readTime, Questions questions) {
public static void uploadQuestionReadTime(String tracers,
int readTime,
Questions questions,
String communityId,
String communityName,
SpecialColumn specialColumn) {
JSONObject object = new JSONObject();
try {
object.put("subject", "question");
object.put("community_id", UserManager.getInstance().getCommunity().getId());
object.put("community_name", UserManager.getInstance().getCommunity().getName());
object.put("community_id", communityId);
object.put("community_name", communityName);
object.put("question_id", questions.getId());
object.put("question_name", questions.getTitle());
object.put("tracers", tracers);
object.put("read", readTime);
JSONObject columnObject = new JSONObject();
if (specialColumn != null) {
columnObject.put("type", specialColumn.getType());
columnObject.put("name", specialColumn.getName());
columnObject.put("tab", specialColumn.getTab());
} else {
columnObject.put("type", "");
columnObject.put("name", "");
columnObject.put("tab", "");
}
object.put("special_column", columnObject);
} catch (JSONException e) {
e.printStackTrace();
}

View File

@ -3,13 +3,24 @@ package com.gh.common.util
import android.content.Context
import android.content.pm.ApplicationInfo
import com.gh.common.constant.Config
import com.gh.gamecenter.entity.SettingsEntity
import com.halo.assistant.HaloApp
object PackageHelper {
// 黑名单包名,用于区分像 Xposed Installer 那些工具的包名
var excludePackageNameList = arrayListOf<String>()
// 评论黑名单包名列表,避免用户安装了 Xposed Installer 这样的工具,也能在包含该安装包的游戏详情页评论
var commentPackageNameBlackList = arrayListOf<String>()
// 关闭下载的包列表
var downloadPackageNameBlackList = arrayListOf<String>()
// 本地已安装的包去掉关闭下载的包后的列表
var validLocalPackageNameSet = hashSetOf<String>()
// 游戏包名匹配列表
var relatedPackageList = arrayListOf<SettingsEntity.GameWithPackages>()
// 本地已安装包的列表
var localPackageNameSet = hashSetOf<String>()
get() {
return if (field.isEmpty()) {
@ -23,13 +34,27 @@ object PackageHelper {
@JvmStatic
fun refreshLocalPackageList() {
localPackageNameSet = getAllPackageName(HaloApp.getInstance().application)
updateValidPackageNameList()
}
@JvmStatic
fun initExcludePackageName() {
fun initList() {
Config.getSettings()?.gameCommentBlackList?.let {
excludePackageNameList = ArrayList(it)
commentPackageNameBlackList = ArrayList(it)
}
Config.getSettings()?.gameDownloadBlackList?.let {
downloadPackageNameBlackList = ArrayList(it)
}
Config.getSettings()?.gamePackageMatch?.let {
relatedPackageList = ArrayList(it)
}
Config.getSettings()?.gameDownloadBlackList
updateValidPackageNameList()
}
private fun updateValidPackageNameList() {
validLocalPackageNameSet = localPackageNameSet.filterNot { p -> downloadPackageNameBlackList.contains(p) }.toHashSet()
}
/*

View File

@ -236,7 +236,10 @@ public class PlatformUtils {
if (TextUtils.isEmpty(platformName)) {
getPlatform();
}
return platformName;
if (!TextUtils.isEmpty(platformName)) {
return platformName;
}
return platform;
}
public void getPlatform() {

View File

@ -1,84 +0,0 @@
package com.gh.common.util;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
/**
* 用于解决因为沉浸式状态栏(自定义)时键盘不遮挡输入框
*/
public class SoftInputHidWidgetUtils {
private View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
private int contentHeight;
private boolean isfirst = true;
private int statusBarHeight;
public static void assistActivity(Activity activity) {
if (Build.VERSION.SDK_INT >= 19) {
new SoftInputHidWidgetUtils(activity);
}
}
private SoftInputHidWidgetUtils(Activity activity) {
statusBarHeight = getStatusBarHeight(activity);
FrameLayout content = (FrameLayout)activity.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);
//界面出现变动都会调用这个监听事件
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
if (isfirst) {
contentHeight = mChildOfContent.getHeight();//兼容华为等机型
isfirst = false;
}
possiblyResizeChildOfContent();
}
});
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
}
//重新调整跟布局的高度
private void possiblyResizeChildOfContent() {
int usableHeightNow = computeUsableHeight();
//当前可见高度和上一次可见高度不一致 布局变动
if (usableHeightNow != usableHeightPrevious) {
int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
int heightDifference = usableHeightSansKeyboard - usableHeightNow;
if (heightDifference > (usableHeightSansKeyboard / 4)) {
// keyboard probably just became visible
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight;
} else {
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
}
} else {
frameLayoutParams.height = contentHeight;
}
mChildOfContent.requestLayout();
usableHeightPrevious = usableHeightNow;
}
}
/**
* 获取改变之后界面的可用高度(可以为开发者显示内容的高度)
* @return
*/
private int computeUsableHeight() {
Rect r = new Rect();
mChildOfContent.getWindowVisibleDisplayFrame(r);//获取到的rect就是界面除去标题栏、除去软键盘挡住部分所剩下的域
return (r.bottom - r.top);
}
public static int getStatusBarHeight(Activity activity) {
//获取状态栏的高度
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
return activity.getResources().getDimensionPixelSize(resourceId);
}
}

View File

@ -55,6 +55,11 @@ object SPUtils {
return sp.getBoolean(key, false)
}
@JvmStatic
fun getBoolean(key: String, defaultValue: Boolean): Boolean {
return sp.getBoolean(key, defaultValue)
}
@JvmStatic
fun setString(sp: SharedPreferences, key: String, value: String? = null) {
try {

View File

@ -1,32 +1,44 @@
package com.gh.common.view;
import android.app.Dialog;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.gh.common.constant.Config;
import com.gh.common.exposure.ExposureEvent;
import com.gh.common.util.ClickUtils;
import com.gh.common.util.DirectUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.PlatformUtils;
import com.gh.common.util.SPUtils;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.OnCollectionCallBackListener;
import com.gh.gamecenter.adapter.PlatformPagerAdapter;
import com.gh.gamecenter.databinding.ImprintContentItemBinding;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.ApkLink;
import com.gh.gamecenter.entity.GameCollectionEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.LinkEntity;
import com.gh.gamecenter.entity.SettingsEntity;
import com.gh.gamecenter.eventbus.EBDownloadStatus;
import com.gh.gamecenter.eventbus.EBPackage;
import com.gh.gamecenter.eventbus.EBReuse;
@ -55,21 +67,35 @@ import java.util.concurrent.ConcurrentHashMap;
* @des 弹出游戏版本下载按钮,点击并添加到下载任务中
*/
public class DownloadDialog implements OnCollectionCallBackListener {
private static DownloadDialog instance;
private Context mContext;
private boolean isShow;
private PopupWindow popupWindow;
private List<ApkEntity> gameApk;
private GameEntity gameEntity;
private ViewPager viewPager;
private PlatformPagerAdapter adapter;
private ViewPager collectionViewPager;
private LinearLayout dialog_ll_collection_hint;
private LinearLayout dialog_ll_hint;
private LinearLayout dialog_ll_collection;
private ViewPager collectionViewPager;
private View mDialogMorePlatformHint;
private List<ApkEntity> gameApk;
private GameEntity gameEntity;
private PlatformPagerAdapter adapter;
private PlatformPagerAdapter collectionAdapter;
private ExposureEvent traceEvent;
private static final String DOWNLOAD_PLATFORM_HINT = "download_platform_hint";
private String entrance;
private String location;
private String mAutoDownloadPlatform;
private final int row = 3;
private final int column = 3;
private boolean isLoadPlatform;
private DataWatcher dataWatcher = new DataWatcher() {
@Override
public void onDataChanged(DownloadEntity downloadEntity) {
@ -84,25 +110,13 @@ public class DownloadDialog implements OnCollectionCallBackListener {
}
}
};
private LinearLayout dialog_ll_collection_hint;
private String entrance;
private String location;
private ExposureEvent traceEvent;
private String mAutoDownloadPlatform;
private final int row = 3;
private final int column = 3;
private boolean isLoadPlatform;
private DownloadDialog() {
isShow = false;
private DownloadDialog(Context context) {
mContext = context;
}
public static DownloadDialog getInstance(Context context) {
if (instance == null) {
instance = new DownloadDialog();
}
instance.mContext = context; // 每次创建context重新赋值, Dialog持有context问题
return instance;
return new DownloadDialog(context);
}
// 自动下载并翻到相应页面
@ -118,13 +132,9 @@ public class DownloadDialog implements OnCollectionCallBackListener {
public void showPopupWindow(View view, GameEntity gameEntity, String entrance, String location,
@Nullable ExposureEvent traceEvent) {
if (isShow && (popupWindow == null || !popupWindow.isShowing())) {
isShow = false;
}
if (isShow) {
if (ClickUtils.isFastDoubleClick()) {
return;
}
isShow = true;
this.gameEntity = gameEntity;
this.entrance = entrance;
@ -153,6 +163,31 @@ public class DownloadDialog implements OnCollectionCallBackListener {
dialog_ll_collection = contentView.findViewById(R.id.dialog_ll_collection);
dialog_ll_collection_hint = contentView.findViewById(R.id.dialog_ll_collection_hint);
collectionViewPager = contentView.findViewById(R.id.dialog_collection_viewPager);
mDialogMorePlatformHint = contentView.findViewById(R.id.dialog_more_platform_hit);
TextView dialogAd = contentView.findViewById(R.id.dialog_ad);
TextView dialogAdMirror = contentView.findViewById(R.id.dialog_ad_mirror);
mDialogMorePlatformHint.setOnClickListener(v -> {
mDialogMorePlatformHint.setVisibility(View.GONE);
SPUtils.setBoolean(DOWNLOAD_PLATFORM_HINT, false);
});
LinkEntity downloadAd = gameEntity.getDownloadAd();
if (downloadAd != null) {
dialogAd.setVisibility(View.VISIBLE);
dialogAd.setText(downloadAd.getTitle());
dialogAdMirror.setVisibility(View.INVISIBLE);
dialogAdMirror.setText(downloadAd.getTitle());
dialogAd.setOnClickListener(v -> {
if ("imprint".equals(downloadAd.getType())) {
showImprintDialog(downloadAd.getTitle());
} else {
DirectUtils.directToLinkPage(
mContext,
downloadAd,
entrance, "下载多平台弹窗");
}
});
}
isLoadPlatform = false;
@ -175,7 +210,6 @@ public class DownloadDialog implements OnCollectionCallBackListener {
});
popupWindow.setOnDismissListener(() -> {
isShow = false;
EventBus.getDefault().unregister(DownloadDialog.this);
DownloadManager.getInstance(mContext).removeObserver(dataWatcher);
});
@ -196,6 +230,51 @@ public class DownloadDialog implements OnCollectionCallBackListener {
DownloadManager.getInstance(mContext).addObserver(dataWatcher);
}
private void showImprintDialog(String titleName) {
Dialog dialog = new Dialog(mContext, R.style.full_dialog);
View inflate = LayoutInflater.from(mContext).inflate(R.layout.imprint_dialog, null);
dialog.setContentView(inflate);
dialog.show();
Window window = dialog.getWindow();
WindowManager.LayoutParams params;
if (window != null) {
params = window.getAttributes();
params.width = (int) (mContext.getResources().getDisplayMetrics().widthPixels * 0.9);
window.setAttributes(params);
window.setBackgroundDrawableResource(R.drawable.full_dialog_background);
}
inflate.findViewById(R.id.imprint_close).setOnClickListener(v -> dialog.dismiss());
LinearLayout content = inflate.findViewById(R.id.imprint_content);
((TextView) inflate.findViewById(R.id.imprint_title)).setText(titleName);
View head = LayoutInflater.from(mContext).inflate(R.layout.imprint_content_item, null);
content.addView(head, LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(30));
LimitHeightLinearLayout imprintContainer = inflate.findViewById(R.id.imprint_container);
imprintContainer.setLimitHeight((int) (mContext.getResources().getDisplayMetrics().heightPixels * 0.8));
ArrayList<ApkEntity> list = gameEntity.getApk();
SettingsEntity settings = Config.getSettings();
for (int i = 0; i < list.size(); i++) {
ApkEntity apk = gameEntity.getApk().get(i);
if (settings != null && settings.getGameDownloadBlackList().contains(apk.getPackageName())) {
continue;
}
View item = LayoutInflater.from(mContext).inflate(R.layout.imprint_content_item, null);
ImprintContentItemBinding bind = DataBindingUtil.bind(item);
bind.setApk(apk);
bind.setPlatformName(PlatformUtils.getInstance(mContext).getPlatformName(apk.getPlatform()));
content.addView(item, LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(40));
}
// close line
View view = new View(mContext);
view.setBackgroundColor(mContext.getResources().getColor(R.color.text_5d5d5d));
view.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(1)));
content.addView(view);
}
private void sortApk() {
for (ApkEntity apkEntity : gameApk) {
GameCollectionEntity apkCollection = apkEntity.getApkCollection();
@ -376,6 +455,13 @@ public class DownloadDialog implements OnCollectionCallBackListener {
int size = (int) Math.ceil(apkList.size() / (double) (row * column));
addHintPoint(dialog_ll_hint, size);
if (size >= 2) {
boolean isShowPlatformHint = SPUtils.getBoolean(DOWNLOAD_PLATFORM_HINT, true);
if (isShowPlatformHint) {
mDialogMorePlatformHint.setVisibility(View.VISIBLE);
}
}
int count = apkList.size();
int vpHeight;
if (count <= 3) {

View File

@ -8,9 +8,11 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.StringRes;
import android.support.v4.content.ContextCompat;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.ProgressBar;
@ -37,6 +39,8 @@ public class DownloadProgressBar extends ProgressBar {
private PorterDuffXfermode mDuffXFerMode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
// 仅用于测量文字是否超出范围,不用于画文字
private TextPaint mFakeTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
private DownloadType mDownloadType;
@ -46,6 +50,8 @@ public class DownloadProgressBar extends ProgressBar {
private int mDefaultColor;
private int mTextSize;
private Rect mTextBound = new Rect();
public DownloadProgressBar(Context context) {
super(context);
}
@ -79,6 +85,9 @@ public class DownloadProgressBar extends ProgressBar {
mPaint.setColor(mDefaultColor == 0 ? ContextCompat.getColor(getContext(), R.color.theme) : mDefaultColor); // 初始化颜色
mPaint.setTextSize(mTextSize);
mFakeTextPaint.setTextSize(mTextSize);
mFakeTextPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mFakeTextPaint.setTextAlign(Paint.Align.CENTER);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setXfermode(null);
create();
@ -87,7 +96,11 @@ public class DownloadProgressBar extends ProgressBar {
int baseline = (getHeight() - fontMetrics.bottom - fontMetrics.top) / 2;
mPaint.setTextAlign(Paint.Align.CENTER);
srcCanvas.drawText(mText, getWidth() / 2, baseline, mPaint);
canvas.getClipBounds(mTextBound); //The dimensions of your canvas
int width = mTextBound.width() - 20; //10 to keep some space on the right for the "..."
String txt = TextUtils.ellipsize(mText, mFakeTextPaint, width, TextUtils.TruncateAt.END).toString();
srcCanvas.drawText(txt, getWidth() / 2, baseline, mPaint);
mPaint.setXfermode(mDuffXFerMode);
if (getProgress() != 0 && getProgress() != MAX_LENGTH) {
mPaint.setColor(DOWNLOAD_IMAGE_STYLE == mDownloadStyle ? Color.BLACK : Color.WHITE); // 反向颜色

View File

@ -0,0 +1,59 @@
package com.gh.common.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import com.gh.common.util.DisplayUtils;
import com.gh.gamecenter.R;
/**
* Created by khy on 2/04/18.
*/
public class LimitHeightLinearLayout extends LinearLayout {
private int mLimitHeight;
public LimitHeightLinearLayout(Context context) {
super(context);
}
public LimitHeightLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
if (attrs != null) {
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.LimitHeightScrollView);
mLimitHeight = ta.getDimensionPixelSize(R.styleable.LimitHeightScrollView_maxHeight, DisplayUtils.dip2px(getContext(), 240));
ta.recycle();
} else {
mLimitHeight = DisplayUtils.dip2px(getContext(), 240);
}
}
public LimitHeightLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (heightMode == MeasureSpec.EXACTLY
|| heightMode == MeasureSpec.AT_MOST
|| heightMode == MeasureSpec.UNSPECIFIED) {
heightSize = heightSize <= mLimitHeight ? heightSize
: mLimitHeight;
}
int maxHeightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize,
heightMode);
super.onMeasure(widthMeasureSpec, maxHeightMeasureSpec);
}
public void setLimitHeight(int limitHeight) {
mLimitHeight = limitHeight;
requestLayout();
}
}

View File

@ -1,62 +0,0 @@
//package com.gh.common.view;
//
//import android.content.Context;
//import android.support.v7.widget.LinearLayoutManager;
//import android.support.v7.widget.RecyclerView;
//import android.view.View;
//import android.view.ViewGroup;
//
///**
// * Created by khy on 2017/3/30.
// */
//public class MeasureLinearLayoutManager extends LinearLayoutManager {
// int height;
// private int[] mMeasuredDimension = new int[1];
//
// public MeasureLinearLayoutManager(Context context) {
// super(context);
// }
//
// @Override
// public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
// int widthSpec, int heightSpec) {
// super.onMeasure(recycler, state, widthSpec, heightSpec);
// height = 0;
//
// try {
// for (int i = 0; i < getItemCount(); i++) {
// measureScrapChild(recycler, i,
// View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
// View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
// mMeasuredDimension);
// height = height + mMeasuredDimension[0];
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// }
//
// private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
// int heightSpec, int[] measuredDimension) throws Exception {
// View view = recycler.getViewForPosition(position);
// if (view.getVisibility() == View.GONE) {
// measuredDimension[0] = 0;
// return;
// }
// super.measureChildWithMargins(view, 0, 0);
// RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
// int childHeightSpec = ViewGroup.getChildMeasureSpec(
// heightSpec,
// getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
// p.height);
//
// view.measure(0, childHeightSpec);
// measuredDimension[0] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
// recycler.recycleView(view);
// }
//
// public int getRvHeight() {
// return height;
// }
//}

View File

@ -3,18 +3,13 @@ package com.gh.common.view
import android.content.Context
import android.content.pm.ActivityInfo
import android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
import android.media.AudioManager
import android.os.Build
import android.os.Handler
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.util.AttributeSet
import android.view.View
import android.widget.ImageView
import cn.jzvd.JZDataSource
import cn.jzvd.JZUtils
import cn.jzvd.Jzvd
import cn.jzvd.JzvdStd
import cn.jzvd.*
import com.gh.common.observer.MuteCallback
import com.gh.common.observer.VolumeObserver
import com.gh.common.util.DialogUtils
@ -101,6 +96,10 @@ class PlayerView @JvmOverloads constructor(context: Context, attrs: AttributeSet
private fun toggleMute() {
HaloApp.getInstance().isMute = !HaloApp.getInstance().isMute
updateMuteStatus()
}
private fun updateMuteStatus() {
if (HaloApp.getInstance().isMute) {
mute()
} else {
@ -124,24 +123,20 @@ class PlayerView @JvmOverloads constructor(context: Context, attrs: AttributeSet
private fun mute() {
muteIv.setImageResource(R.drawable.ic_volume_off)
// 安卓 6.0 以上 toggle 静音接口,以下将声音置为 0% 或 60%
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, 0)
} else {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0)
try {
JZMediaManager.instance()?.jzMediaInterface?.setVolume(0f, 0f)
} catch (e: Exception) {
e.printStackTrace()
}
MtaHelper.onEvent("游戏详情_新", "视频_点击静音", gameName)
}
private fun unmute() {
muteIv.setImageResource(R.drawable.ic_volume_on)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE, 0)
} else {
mAudioManager.setStreamVolume(
AudioManager.STREAM_MUSIC,
60 * mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
0)
try {
JZMediaManager.instance()?.jzMediaInterface?.setVolume(1.0f, 1.0f)
} catch (e: Exception) {
e.printStackTrace()
}
MtaHelper.onEvent("游戏详情_新", "视频_解除静音", gameName)
}
@ -154,6 +149,11 @@ class PlayerView @JvmOverloads constructor(context: Context, attrs: AttributeSet
}
}
override fun onStatePrepared() {
super.onStatePrepared()
updateMuteStatus()
}
override fun onClickUiToggle() {
// 仅在全屏状态下才会 toggle 播放信息
if (currentScreen == Jzvd.SCREEN_WINDOW_FULLSCREEN) {
@ -204,11 +204,7 @@ class PlayerView @JvmOverloads constructor(context: Context, attrs: AttributeSet
rotateIv.visibility = View.GONE
// 将右下角的按钮变成静音与否
if (HaloApp.getInstance().isMute) {
mute()
} else {
unmute()
}
updateMuteStatus()
} else {
progressBar.visibility = View.VISIBLE
totalTimeTextView.visibility = View.VISIBLE

View File

@ -53,6 +53,18 @@ public class GameDetailActivity extends NormalActivity {
public static void startGameDetailActivity(Context context, GameEntity gameEntity, String entrance, ExposureEvent traceEvent) {
DataUtils.onMtaEvent(context, "详情页面", "游戏详情", gameEntity != null ? gameEntity.getName() : "");
if (gameEntity != null
&& traceEvent != null
&& gameEntity.getId() != null
&& !gameEntity.getId().equals(traceEvent.getPayload().getGameId())) {
// 当游戏 ID 跟曝光 traceEvent 的游戏ID 不一样的时候更新 traceEvent 的游戏ID
ExposureEvent forNewPayload = ExposureEvent.Companion.createEvent(gameEntity,
traceEvent.getSource(),
ExposureTraceUtils.INSTANCE.appendTrace(traceEvent),
ExposureType.EXPOSURE);
traceEvent.setPayload(forNewPayload.getPayload());
}
ExposureEvent clickEvent = ExposureEvent.Companion.createEvent(gameEntity, traceEvent.getSource(), ExposureTraceUtils.INSTANCE.appendTrace(traceEvent), ExposureType.CLICK);
ExposureManager.INSTANCE.log(clickEvent);
Bundle bundle = new Bundle();
@ -67,6 +79,16 @@ public class GameDetailActivity extends NormalActivity {
*/
public static void startGameDetailActivity(Context context, String gameId, String entrance, ExposureEvent traceEvent) {
if (traceEvent != null
&& !gameId.equals(traceEvent.getPayload().getGameId())) {
// 当游戏 ID 跟曝光 traceEvent 的游戏ID 不一样的时候更新 traceEvent 的游戏ID
ExposureEvent forNewPayload = ExposureEvent.Companion.createEvent(new GameEntity(gameId),
traceEvent.getSource(),
ExposureTraceUtils.INSTANCE.appendTrace(traceEvent),
ExposureType.EXPOSURE);
traceEvent.setPayload(forNewPayload.getPayload());
}
ExposureEvent clickEvent = ExposureEvent.Companion.createEvent(new GameEntity(gameId), traceEvent.getSource(), ExposureTraceUtils.INSTANCE.appendTrace(traceEvent), ExposureType.CLICK);
ExposureManager.INSTANCE.log(clickEvent);
@ -88,6 +110,17 @@ public class GameDetailActivity extends NormalActivity {
context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle));
}
/**
* 如果存在多个游戏平台则打开
*/
public static void startGameDetailActivityByVote(Context context, String gameId, String entrance) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_GAMEID, gameId);
bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance);
bundle.putBoolean(EntranceUtils.KEY_OPEN_PLATFORM_WINDOW, true);
context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle));
}
@Override
public void onBackPressed() {
if (Jzvd.backPress()) {

View File

@ -279,9 +279,9 @@ public class MainActivity extends BaseActivity {
mPackageViewModel = ViewModelProviders.of(this, new PackageViewModel.Factory()).get(PackageViewModel.class);
final String message = Config.getExceptionMsg(this);
final String message = Config.getExceptionMsg();
if (!TextUtils.isEmpty(message)) {
Config.setExceptionMsg(this, null);
Config.setExceptionMsg(null);
AppUncaughtHandler.reportException(this, new Throwable(message));
DialogUtils.showWarningDialog(this, "发生闪退", "光环助手刚刚发生了闪退,马上反馈以帮助我们更好地修复问题?(只需简单描述你刚才的操作)"
, "暂不", "马上反馈",
@ -550,11 +550,11 @@ public class MainActivity extends BaseActivity {
// 意见反馈
SharedPreferences.Editor edit = mSp.edit();
edit.putString(SuggestionActivity.SUGGESTION_HINT_TYPE,
GsonUtils.Companion.getInstance().toJson(response.getSuggestion()));
GsonUtils.toJson(response.getSuggestion()));
edit.apply();
if (!mSp.getBoolean("isFixDownload", false) && Config.isShow()) {
mSp.edit().putBoolean("isFixDownload", true).apply();
if (!mSp.getBoolean(Config.FIX_DOWNLOAD_KEY, false) && Config.isShow()) {
mSp.edit().putBoolean(Config.FIX_DOWNLOAD_KEY, true).apply();
}
EventBus.getDefault().post(new EBReuse("Refresh"));

View File

@ -72,7 +72,7 @@ public class SkipActivity extends BaseActivity {
case HOST_SUGGESTION:
String platform = uri.getQueryParameter(KEY_PLATFORM);
String platformName = PlatformUtils.getInstance(this).getPlatformName(platform);
String content = String.format("%s-%s-V%s",
String content = String.format("%s-%s-V%s",
uri.getQueryParameter(KEY_GAME_NAME),
TextUtils.isEmpty(platformName) ? platform : platformName,
uri.getQueryParameter(KEY_VERSION));

View File

@ -25,6 +25,7 @@ import com.gh.common.exposure.meta.MetaUtil;
import com.gh.common.util.DeviceTokenUtils;
import com.gh.common.util.DeviceUtils;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.GameRepositoryHelper;
import com.gh.common.util.GdtHelper;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.PlatformUtils;
@ -210,6 +211,8 @@ public class SplashScreenActivity extends BaseActivity {
if (hasFocus && isFirst) {
isFirst = false;
GameRepositoryHelper.getGameRepository(this);
HaloApp.getInstance().getMainExecutor().execute(() -> {
// 第一次启动把package.txt文件内容加载进数据库
FilterManager filterManager = new FilterManager(getApplicationContext());

View File

@ -128,6 +128,12 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
TextView mEmailName;
@BindView(R.id.tv_ad)
TextView mAdTv;
@BindView(R.id.suggest_platform_container)
View mPlatformContainer;
@BindView(R.id.suggest_platform_et)
TextView mPlatformEt;
@BindView(R.id.suggest_platform_title)
TextView mPlatformTitle;
public static final int MEDIA_STORE_REQUEST = 1;
public static final String SUGGESTION_HINT_TYPE = "SUGGESTION_HINT_TYPE";
@ -146,6 +152,7 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
private String mGameInfo;
private String mHideHint;
private String mSuggestContent;
private String mSuggestHintType;
private boolean mAgreePostPic;
@ -226,7 +233,7 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
mSuggestType = SuggestType.normal;
}
mSuggestContent = extras.getString(EntranceUtils.KEY_CONTENT);
String suggestHintType = extras.getString(EntranceUtils.KEY_SUGGEST_HINT_TYPE);
mSuggestHintType = extras.getString(EntranceUtils.KEY_SUGGEST_HINT_TYPE);
mHideHint = extras.getString(EntranceUtils.KEY_HIDE_SUGGEST_HINT, "");
mFunctionTypeName = getResources().getStringArray(R.array.suggest_function_type);
@ -258,19 +265,26 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
mSuggestPicRv.setAdapter(mAdapter);
if (!TextUtils.isEmpty(mSuggestContent)) {
mSuggestContentEt.setText(mSuggestContent);
if (mSuggestType == SuggestType.gameQuestion && "game".equals(mSuggestHintType)) {
mSuggestContentEt.setText("问题反馈:");
mSuggestSelectGame.setVisibility(View.GONE);
mSuggestGameName.setVisibility(View.VISIBLE);
mSuggestGameName.setText(mSuggestContent);
} else {
mSuggestContentEt.setText(mSuggestContent);
}
mSuggestContentEt.setSelection(mSuggestContentEt.getText().length());
}
initSuggest(mSuggestType);
String suggestionType = sp.getString(SUGGESTION_HINT_TYPE, null);
if (!TextUtils.isEmpty(suggestHintType) && !TextUtils.isEmpty(suggestionType)) {
if (!TextUtils.isEmpty(mSuggestHintType) && !TextUtils.isEmpty(suggestionType)) {
Gson gson = new Gson();
SuggestionTypeEntity typeEntity = gson.fromJson(suggestionType, SuggestionTypeEntity.class);
if (typeEntity != null) {
switch (suggestHintType) {
case "plugin":
switch (mSuggestHintType) {
case EntranceUtils.KEY_PLUGIN:
List<String> plugin = typeEntity.getPlugin();
if (plugin != null && plugin.size() > 0) {
showHintDialog(plugin);
@ -335,9 +349,18 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
mSuggestTypeContainer.setVisibility(View.GONE);
mSuggestGameLl.setVisibility(View.GONE);
} else if (type == SuggestType.gameQuestion) {
mSuggestContentEt.setHint("请写上游戏名字,以及具体遇到的问题... \n ↓↓你还可以上传截图");
mSuggestTypeContainer.setVisibility(View.GONE);
mSuggestGameLl.setVisibility(View.GONE);
if (!EntranceUtils.KEY_PLUGIN.equals(mSuggestHintType)) {
mSuggestContentEt.setHint("请描述具体遇到的问题... \n ↓↓你还可以上传截图");
mSuggestGameLl.setVisibility(View.VISIBLE);
mPlatformContainer.setVisibility(View.VISIBLE);
mGameNameTitle.setText(Html.fromHtml(getString(R.string.suggestion_game_name)));
mPlatformTitle.setText(Html.fromHtml(getString(R.string.suggestion_platform_name)));
} else {
mSuggestContentEt.setHint("请写上游戏名字,以及具体遇到的问题... \n ↓↓你还可以上传截图");
mSuggestGameLl.setVisibility(View.GONE);
mPlatformContainer.setVisibility(View.GONE);
}
} else if (type == SuggestType.gameCollect) {
mSuggestGameLl.setVisibility(View.VISIBLE);
mGameNameTitle.setText(Html.fromHtml(getString(R.string.suggestion_game_name)));
@ -456,6 +479,12 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
}
}
if (mPlatformContainer.getVisibility() == View.VISIBLE &&
TextUtils.isEmpty(mPlatformEt.getText().toString())) {
toast("请填写版本");
return;
}
String entrance = "我的光环-反馈-[提交]";
if (!TextUtils.isEmpty(mSuggestContent)) {
switch (mSuggestContent) {
@ -470,25 +499,14 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
break;
}
}
CheckLoginUtils.checkLogin(this, entrance, () -> {
if (TextUtils.isEmpty(email)) {
if (mSuggestType == SuggestType.functionSuggest || mSuggestType == SuggestType.gameCollect) {
toast("请填写联系方式");
} else {
showConfirmDialog(email);
}
} else {
postDialog = WaitingDialogFragment.newInstance(getString(R.string.dialog_feedback_doing));
postDialog.show(getSupportFragmentManager(), null);
List<String> fileList = mAdapter.getFileList();
if (fileList != null && fileList.size() > 0) {
postPic(email);
} else {
initPostData(email, null);
}
}
});
// 闪退反馈不需要反馈(由闪退提示框跳转)
if (mSuggestType == SuggestType.crash && !mHideHint.isEmpty()) {
postSuggestion(email);
} else {
CheckLoginUtils.checkLogin(this, entrance, () -> {
postSuggestion(email);
});
}
break;
case R.id.suggest_game_container:
showSelectDialog();
@ -528,6 +546,26 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
}
}
private void postSuggestion(String email) {
if (TextUtils.isEmpty(email)) {
if (mSuggestType == SuggestType.functionSuggest || mSuggestType == SuggestType.gameCollect) {
toast("请填写联系方式");
} else {
showConfirmDialog(email);
}
} else {
postDialog = WaitingDialogFragment.newInstance(getString(R.string.dialog_feedback_doing));
postDialog.show(getSupportFragmentManager(), null);
List<String> fileList = mAdapter.getFileList();
if (fileList != null && fileList.size() > 0) {
postPic(email);
} else {
initPostData(email, null);
}
}
}
// 弹出确认对话框
private void showConfirmDialog(final String email) {
@ -598,8 +636,9 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
params.put("suggestion_type", mSuggestType.getType());
String message;
String content = mSuggestContentEt.getText().toString().trim();
if (mSuggestType == SuggestType.gameCollect) {
message = mGameInfo + "" + mSuggestContentEt.getText().toString().trim();
message = mGameInfo + "" + content;
} else if (mSuggestType == SuggestType.functionSuggest) {
String typeName;
if (mFunctionType == 3) {
@ -607,9 +646,15 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
} else {
typeName = mFunctionTypeName[mFunctionType];
}
message = mGameInfo + "" + typeName + "" + mSuggestContentEt.getText().toString().trim();
message = mGameInfo + "" + typeName + "" + content;
} else if (mSuggestType == SuggestType.gameQuestion) {
if (EntranceUtils.KEY_PLUGIN.equals(mSuggestHintType)) {
message = "【插件问题】" + content;
} else {
message = mSuggestGameName.getText() + "-" + mPlatformEt.getText() + "" + content;
}
} else {
message = mSuggestContentEt.getText().toString().trim();
message = content;
if (mSuggestType == SuggestType.crash) {
params.put("log", readFromFile());
}
@ -632,9 +677,11 @@ public class SuggestionActivity extends BaseActivity implements OnRequestCallBac
sendSuggestion(body);
// 创建一条信息至七陌客服
String feedbackType = "意见反馈-" + mSuggestType.getType();
ImManager.sendFeedbackMessage(feedbackType + ": " + message);
if (CheckLoginUtils.isLogin()) {
// 创建一条信息至七陌客服
String feedbackType = "意见反馈-" + mSuggestType.getType();
ImManager.sendFeedbackMessage(feedbackType + ": " + message);
}
}
private void sendSuggestion(final RequestBody body) {

View File

@ -17,7 +17,7 @@ public class UserInfoEditActivity extends NormalActivity {
@NonNull
public static Intent getIntent(Context context, String editType) {
Bundle args = new Bundle();
args.putString(UserViewModel.KEY_EDITTYPE, editType);
args.putString(UserViewModel.KEY_EDIT_TYPE, editType);
return getTargetIntent(context, UserInfoEditActivity.class, UserInfoEditFragment.class, args);
}

View File

@ -338,7 +338,10 @@ public class ViewImageActivity extends BaseActivity implements OnPageChangeListe
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(container1);
dialog.show();
if (!isFinishing()) {
dialog.show();
}
reportTv.setOnClickListener(v -> {
findImageBM();

View File

@ -161,8 +161,10 @@ public class CommentDetailAdapter extends BaseRecyclerAdapter<ViewHolder> {
String content;
if (parent.getActive()) {
content = parent.getComment();
holder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_5d5d5d));
} else {
content = mContext.getString(R.string.comment_hide_hint);
holder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_d5d5d5));
}
holder.quoteContentTv.setText(content);
} else {

View File

@ -368,8 +368,10 @@ public class MessageDetailAdapter extends BaseRecyclerAdapter<ViewHolder> {
String content;
if (parent.getActive()) {
content = parent.getComment();
holder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_5d5d5d));
} else {
content = mContext.getString(R.string.comment_hide_hint);
holder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_d5d5d5));
}
holder.quoteContentTv.setText(content);
} else {

View File

@ -11,11 +11,16 @@ import android.view.View;
import android.view.ViewGroup;
import com.gh.base.OnRequestCallBackListener;
import com.gh.common.util.DialogUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.GameDetailActivity;
import com.gh.gamecenter.NewsDetailActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
import com.gh.gamecenter.adapter.viewholder.VoteViewHolder;
import com.gh.gamecenter.baselist.ListAdapter;
import com.gh.gamecenter.entity.LinkEntity;
import com.gh.gamecenter.entity.MeEntity;
import com.gh.gamecenter.entity.VersionVoteEntity;
@ -62,19 +67,32 @@ public class VoteAdapter extends ListAdapter<VersionVoteEntity> {
if (holder instanceof VoteViewHolder) {
final VoteViewHolder viewHolder = (VoteViewHolder) holder;
VersionVoteEntity versionVoteEntity = mEntityList.get(position);
MeEntity userData = versionVoteEntity.getMe();
if (userData != null && userData.isVersionRequested()) {
viewHolder.voteBtn.setBackgroundResource(R.drawable.border_suggest_bg);
viewHolder.voteBtn.setTextColor(ContextCompat.getColor(mContext, R.color.content));
viewHolder.voteBtn.setText(R.string.voted);
viewHolder.voteBtn.setEnabled(false);
if (versionVoteEntity.getOpen()) {
MeEntity userData = versionVoteEntity.getMe();
if (userData != null && userData.isVersionRequested()) {
viewHolder.voteBtn.setBackgroundResource(R.drawable.border_suggest_bg);
viewHolder.voteBtn.setTextColor(ContextCompat.getColor(mContext, R.color.content));
viewHolder.voteBtn.setText(R.string.voted);
viewHolder.voteBtn.setEnabled(false);
} else {
viewHolder.voteBtn.setBackgroundResource(R.drawable.button_normal_style);
viewHolder.voteBtn.setTextColor(Color.WHITE);
viewHolder.voteBtn.setText(R.string.vote);
viewHolder.voteBtn.setEnabled(true);
}
} else {
LinkEntity link = versionVoteEntity.getLink();
if (EntranceUtils.HOST_GAME.equals(link.getType())) {
viewHolder.voteBtn.setText(R.string.download);
} else {
viewHolder.voteBtn.setText(R.string.libao_check);
}
viewHolder.voteBtn.setBackgroundResource(R.drawable.button_normal_style);
viewHolder.voteBtn.setTextColor(Color.WHITE);
viewHolder.voteBtn.setText(R.string.vote);
viewHolder.voteBtn.setEnabled(true);
}
View progressbar = viewHolder.progressbar;
ViewGroup.LayoutParams layoutParams = progressbar.getLayoutParams();
if (position > 0) {
@ -99,7 +117,25 @@ public class VoteAdapter extends ListAdapter<VersionVoteEntity> {
viewHolder.count.setText(mContext.getString(R.string.vote_count, versionVoteEntity.getNum()));
progressbar.setLayoutParams(layoutParams);
viewHolder.voteBtn.setOnClickListener(v -> mCallBackListener.loadDone(versionVoteEntity.getId()));
viewHolder.voteBtn.setOnClickListener(v -> {
if (versionVoteEntity.getOpen()) {
mCallBackListener.loadDone(versionVoteEntity.getId());
} else {
LinkEntity link = versionVoteEntity.getLink();
String entrance = "(游戏求版本)";
switch (link.getType() == null ? "" : link.getType()) {
case EntranceUtils.HOST_GAME:
GameDetailActivity.startGameDetailActivityByVote(mContext, link.getLink(), entrance);
break;
case EntranceUtils.HOST_ARTICLE:
mContext.startActivity(NewsDetailActivity.getIntentById(mContext, link.getLink(), entrance));
break;
default:
DialogUtils.showLowVersionDialog(mContext);
break;
}
}
});
} else if (holder instanceof FooterViewHolder) {
initFooterViewHolder((FooterViewHolder) holder);
}

View File

@ -25,9 +25,10 @@ public class AskSearchHistoryDao {
}
}
public void add(String item) {
public void add(String key, String communityId) {
try {
dao.createOrUpdate(new AskSearchHistoryInfo(item));
List<String> all = getAll(communityId);
if (!all.contains(key)) dao.createOrUpdate(new AskSearchHistoryInfo(key, communityId));
} catch (SQLException e) {
e.printStackTrace();
@ -57,14 +58,17 @@ public class AskSearchHistoryDao {
return;
}
public List<String> getAll() {
public List<String> getAll(String communityId) {
List<String> history = new ArrayList<String>();
try {
List<AskSearchHistoryInfo> his = dao.queryBuilder().orderBy("time", false).query();
List<AskSearchHistoryInfo> his = dao.queryBuilder().
orderBy("time", false).
where().eq("communityId", communityId).
query();
Iterator<AskSearchHistoryInfo> hisIterator = his.iterator();
while (hisIterator.hasNext()) {
history.add(hisIterator.next().getItem());
history.add(hisIterator.next().getKey());
}
} catch (SQLException e) {

View File

@ -21,7 +21,7 @@ import java.sql.SQLException;
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "gh_assist.db";
private static final int DATABASE_VERSION = 12;
private static final int DATABASE_VERSION = 13;
private static DatabaseHelper instance;
private ArrayMap<String, Dao> daos = new ArrayMap<>();

View File

@ -16,27 +16,46 @@ public class AskSearchHistoryInfo implements Serializable {
*/
private static final long serialVersionUID = 1L;
@DatabaseField(id = true, columnName = "item")
private String item;
@DatabaseField(id = true, columnName = "id")
private String id;
@DatabaseField(useGetSet = true, columnName = "time")
@DatabaseField(columnName = "key")
private String key;
@DatabaseField(columnName = "time")
private String time;
@DatabaseField(columnName = "communityId")
private String communityId;
public AskSearchHistoryInfo() {
}
public AskSearchHistoryInfo(String item) {
this.item = item;
public AskSearchHistoryInfo(String key, String communityId) {
this.key = key;
this.communityId = communityId;
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
Locale.getDefault());
this.time = format.format(date);
this.id = String.valueOf(date.getTime());
}
public AskSearchHistoryInfo(String item, String time) {
this.item = item;
this.time = time;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getTime() {
@ -47,13 +66,20 @@ public class AskSearchHistoryInfo implements Serializable {
this.time = time;
}
public String getItem() {
return item;
public String getCommunityId() {
return communityId;
}
public void setCommunityId(String communityId) {
this.communityId = communityId;
}
@Override
public String toString() {
return "SearchHistoryEntity [item=" + item + ", time=" + time + "]";
return "AskSearchHistoryInfo{" +
"key='" + key + '\'' +
", time='" + time + '\'' +
", communityId='" + communityId + '\'' +
'}';
}
}

View File

@ -165,11 +165,15 @@ class DiscoverFragment : BaseFragment<Any>() {
}
private fun checkArticleStatus() {
val showArticleEntrance = Config.getSettings()?.showArticleEntrance
if (showArticleEntrance == "off") {
val showArticleEntrance = Config.getSettings()?.showArticleEntrance()
if (showArticleEntrance == false) {
mDiscoverGameTrends.visibility = View.GONE
mDiscoverInfo.visibility = View.GONE
mDiscoverLibaoLine.visibility = View.GONE
} else {
mDiscoverGameTrends.visibility = View.VISIBLE
mDiscoverInfo.visibility = View.VISIBLE
mDiscoverLibaoLine.visibility = View.VISIBLE
}
}

View File

@ -149,11 +149,12 @@ class DownloadFragment : BaseFragment_TabLayout() {
if (view != null) {
view!!.postDelayed({
mViewPager.currentItem = skip.currentItem
if (skip.currentItem == DownloadManagerActivity.INDEX_DOWNLOAD) {
if (isAdded && skip.currentItem == DownloadManagerActivity.INDEX_DOWNLOAD) {
val fragments = childFragmentManager.fragments
if (fragments != null) {
for (fragment in fragments) {
if (fragment is GameDownloadFragment) {
if (fragment.isAdded
&& fragment is GameDownloadFragment) {
fragment.onResume() // auto refresh list
}
}

View File

@ -132,7 +132,7 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi
}
}
adapter.getUrlMap().put(PackageUtils.getPackageNameByPath(getActivity(),
adapter.getUrlMap().put(PackageUtils.getPackageNameByPath(HaloApp.getInstance().getApplication(),
downloadEntity.getPath()), downloadEntity.getUrl());
} else if (DownloadStatus.cancel.equals(downloadEntity.getStatus())) { // 有可能由于网络劫持造成的
adapter.initMap();

View File

@ -475,7 +475,7 @@ class GameUpdateFragmentAdapter extends BaseRecyclerAdapter<ViewHolder> {
null,
ExposureUtils.DownloadType.UPDATE);
downloadEntity.setExposureTrace(GsonUtils.Companion.getInstance().toJson(event));
downloadEntity.setExposureTrace(GsonUtils.toJson(event));
String platform = PlatformUtils.getInstance(mContext)
.getPlatformName(updateEntity.getPlatform());

View File

@ -21,7 +21,8 @@ data class ApkEntity(@SerializedName("package")
var isActive: Boolean = true,
var force: Boolean = false,
var apkLink: ApkLink? = null,
var plugin: String? = ""/*控制是否显示插件化 默认open取值有open/only_index/only_game/close*/) : Parcelable {
var plugin: String? = "",/*控制是否显示插件化 默认open取值有open/only_index/only_game/close*/
var time: Long? = null) : Parcelable {
fun getPlatform(): String? {
if (TextUtils.isEmpty(platform)) {
return "官方版"

View File

@ -69,7 +69,9 @@ data class GameEntity(
// 用于开服表标记是否为置顶项目
@SerializedName("is_fixed_top")
var fixedTop: Boolean? = false,
var fixedTopHint: Boolean? = false) : Parcelable {
var fixedTopHint: Boolean? = false,
@SerializedName("download_notice")
val downloadAd: LinkEntity? = null) : Parcelable {
@IgnoredOnParcel
private var entryMap: ArrayMap<String, DownloadEntity>? = ArrayMap()

View File

@ -30,8 +30,11 @@ data class PushNotificationEntity(
data class Extra(var data: Data? = null)
data class Data(var condition: Condition? = null,
var link: Link? = null) {
data class Data(
@SerializedName("push_id")
var pushId: String? = "",
var condition: Condition? = null,
var link: Link? = null) {
@Parcelize
data class Link(var type: String? = "", var target: String? = "") : Parcelable

View File

@ -1,6 +1,9 @@
package com.gh.gamecenter.entity
import android.preference.PreferenceManager
import com.gh.common.constant.Config
import com.google.gson.annotations.SerializedName
import com.halo.assistant.HaloApp
data class SettingsEntity(
var download: List<Download>? = listOf(),
@ -10,15 +13,54 @@ data class SettingsEntity(
var image: Image? = null,
var support: Support? = null,
@SerializedName("community_entrance")
var communityEntrance: String? = "",
private var communityEntrance: String? = "",
@SerializedName("game_comment_blacklist")
var gameCommentBlackList: List<String>? = listOf(),
@SerializedName("game_download_blacklist")
var gameDownloadBlackList: List<String> = listOf(),
@SerializedName("game_package_match")
var gamePackageMatch: List<GameWithPackages>? = listOf(),
@SerializedName("ad")
var adList: List<AD>? = listOf(),
@SerializedName("article_entrance")
var showArticleEntrance: String = "on") {
private var articleEntrance: String = "") {
fun setCommunityEntrance(communityEntrance: String) {
this.communityEntrance = communityEntrance
}
fun showCommunityEntrance(): Boolean {
val preferences =
PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().application)
val isFixCommunity =
preferences.getBoolean(Config.FIX_COMMUNITY_KEY, false)
if (isFixCommunity) return true
if ("on" == communityEntrance) {
preferences.edit().putBoolean(Config.FIX_COMMUNITY_KEY, true).apply()
return true
}
return false
}
fun setArticleEntrance(articleEntrance: String) {
this.articleEntrance = articleEntrance
}
fun showArticleEntrance(): Boolean {
val preferences =
PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().application)
val isFixArticle =
preferences.getBoolean(Config.FIX_ARTICLE_KEY, false)
if (isFixArticle) return true
if ("on" == articleEntrance) {
preferences.edit().putBoolean(Config.FIX_ARTICLE_KEY, true).apply()
return true
}
return false
}
data class Support(
@SerializedName("qq-group")
@ -80,4 +122,10 @@ data class SettingsEntity(
}
}
data class GameWithPackages(
@SerializedName("game_id")
var gameId: String? = "",
var packages: List<String>? = listOf()
)
}

View File

@ -0,0 +1,11 @@
package com.gh.gamecenter.entity
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class SpecialColumn(
var type: String? = "",
var name: String? = "",
var tab: String? = ""
) : Parcelable

View File

@ -19,4 +19,6 @@ data class SubjectEntity(@SerializedName("_id")
var sort: Int = 0,
var data: MutableList<GameEntity>? = null,
var type: String? = null,
var des: String? = null) : Parcelable
var des: String? = null,
@SerializedName("relation_column_id")
var relatedColumnId: String ?= null) : Parcelable

View File

@ -19,4 +19,8 @@ class VersionVoteEntity {
var me: MeEntity? = null
var reply: String? = null
var open : Boolean = true
var link: LinkEntity = LinkEntity()
}

View File

@ -203,7 +203,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable {
}
} else if ("Refresh".equals(reuse.getType())) {
SettingsEntity settings = Config.getSettings();
if (settings != null && "off".equals(settings.getCommunityEntrance())) {
if (settings != null && !settings.showCommunityEntrance()) {
mTabCommunity.setVisibility(View.GONE);
} else {
mTabCommunity.setVisibility(View.VISIBLE);

View File

@ -21,6 +21,7 @@ import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.DataUtils;
import com.gh.common.util.DisplayUtils;
import com.gh.common.util.EntranceUtils;
import com.gh.common.util.MtaHelper;
import com.gh.download.DownloadManager;
import com.gh.gamecenter.ConcernActivity;
import com.gh.gamecenter.DownloadManagerActivity;
@ -30,8 +31,8 @@ import com.gh.gamecenter.entity.GameUpdateEntity;
import com.gh.gamecenter.entity.PluginLocation;
import com.gh.gamecenter.eventbus.EBDownloadStatus;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.packagehelper.PackageViewModel;
import com.gh.gamecenter.manager.PackagesManager;
import com.gh.gamecenter.packagehelper.PackageViewModel;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@ -220,13 +221,13 @@ public class SearchToolbarFragment extends BaseFragment implements View.OnClickL
switch (id) {
case R.id.actionbar_rl_download:
DataUtils.onEvent(getActivity(), "主页", "下载图标");
MtaHelper.onEvent("首页_点击", "顶栏", "下载管理");
DataCollectionUtils.uploadClick(getActivity(), "下载图标", "主页");
startActivity(DownloadManagerActivity.getDownloadMangerIntent(getContext(), null, "(工具栏)"));
break;
case R.id.actionbar_iv_search:
DataUtils.onEvent(getActivity(), "主页", "搜索图标");
MtaHelper.onEvent("首页_点击", "顶栏", "搜索");
DataCollectionUtils.uploadClick(getActivity(), "搜索图标", "主页");
intent = SearchActivity.getIntent(getContext(), true, mSearchHintTv.getHint().toString(), "(工具栏)");
@ -235,6 +236,7 @@ public class SearchToolbarFragment extends BaseFragment implements View.OnClickL
case R.id.actionbar_search_input:
case R.id.actionbar_search_rl:
DataUtils.onEvent(getActivity(), "主页", "搜索框");
MtaHelper.onEvent("首页_点击", "顶栏", "搜索");
DataCollectionUtils.uploadClick(getActivity(), "搜索框", "主页");
intent = SearchActivity.getIntent(getContext(), false, mSearchHintTv.getHint().toString(), "(工具栏)");
@ -242,6 +244,7 @@ public class SearchToolbarFragment extends BaseFragment implements View.OnClickL
break;
case R.id.actionbar_notification:
DataUtils.onEvent(getActivity(), "主页", "关注图标");
MtaHelper.onEvent("首页_点击", "顶栏", "我的关注");
DataCollectionUtils.uploadClick(getActivity(), "关注图标", "主页");
intent = ConcernActivity.getIntent(getContext(), "(工具栏)");

View File

@ -155,7 +155,6 @@ class GameFragment : NormalFragment() {
mSkeleton = Skeleton.bind(mBinding?.gameSkeletonContainer).shimmer(false).load(R.layout.fragment_game_skeleton).show()
}
override fun onPause() {
super.onPause()
DownloadManager.getInstance(context).removeObserver(dataWatcher)

View File

@ -42,7 +42,8 @@ import com.lightgame.download.DownloadEntity
import java.util.*
import kotlin.collections.ArrayList
class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: String) : BaseRecyclerAdapter<RecyclerView.ViewHolder>(context), IExposable {
class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: String)
: BaseRecyclerAdapter<RecyclerView.ViewHolder>(context), IExposable {
private val mPluginPosition = 1
@ -121,312 +122,336 @@ class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName:
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is GameHeadViewHolder -> bindHeadView(holder, position)
is GamePluginViewHolder -> bindPluginView(holder, position)
is GameItemViewHolder -> bindGameItemView(holder, position)
is GameViewPagerViewHolder -> bindGameViewPagerView(holder, position)
is FooterViewHolder -> bindFooterView(holder)
is GameImageViewHolder -> bindGameImageView(holder, position)
is GameHorizontalListViewHolder -> bindGameHorizontalListView(holder, position)
}
}
if (holder is GameHeadViewHolder) {
val column = mItemDataList[position].columnHead
holder.binding.subject = column
holder.binding.headPb.visibility = View.GONE
val text = if ("change" == column?.home) "换一批" else "全部"
holder.binding.headMore.text = text
private fun bindGameHorizontalListView(holder: GameHorizontalListViewHolder, position: Int) {
val subjectEntity = mItemDataList[position].horizontalColumn
val exposureEventList = arrayListOf<ExposureEvent>()
if (text == "全部" && column != null && column.data != null && column.data!!.size >= column.more!!) {
holder.binding.headMore.visibility = View.GONE
} else {
holder.binding.headMore.visibility = View.VISIBLE
}
holder.binding.headMore.setOnClickListener {
if ("all" == column?.home) {
DataUtils.onMtaEvent(mContext, "游戏专题", "全部", column.name)
SubjectActivity.startSubjectActivity(mContext, column.id, column.name, column.isOrder, "(游戏-专题:" + column.name + "-全部)")
} else {
DataUtils.onMtaEvent(mContext, "游戏专题", "换一批", column?.name)
holder.binding.headPb.visibility = View.VISIBLE
mViewModel.changeSubjectGame(column?.id!!)
}
}
} else if (holder is GamePluginViewHolder) {
val pluginList = mItemDataList[position].pluginList
var adapter = holder.mPluginRv.adapter
if (adapter == null) {
adapter = GamePluginAdapter(mContext, pluginList)
adapter.openList(mIsOpenPluginList)
(holder.mPluginRv.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
holder.mPluginRv.layoutManager = LinearLayoutManager(mContext)
holder.mPluginRv.adapter = adapter
} else {
(adapter as GamePluginAdapter).openList(mIsOpenPluginList)
adapter.checkResetData(pluginList)
}
holder.mHeadTitle.text = String.format(Locale.getDefault(), "你有%d个游戏可以升级插件版", pluginList?.size)
holder.mPluginHead.setOnClickListener {
if (mIsOpenPluginList) {
mIsOpenPluginList = false
holder.mHeadOpen.setImageResource(R.drawable.gamedetail_open_icon)
} else {
mIsOpenPluginList = true
holder.mHeadOpen.setImageResource(R.drawable.gamedetail_colse_icon)
}
notifyItemChanged(holder.adapterPosition)
}
} else if (holder is GameItemViewHolder) {
val itemData = mItemDataList[position]
val gameEntity = itemData.game
val subjectData = gameEntity?.subjectData
if (mItemDataList[position - 1].game == null) {
holder.itemView.setPadding(DisplayUtils.dip2px(8F), DisplayUtils.dip2px(10.5F),
DisplayUtils.dip2px(20F), DisplayUtils.dip2px(6F))
} else {
holder.itemView.setPadding(DisplayUtils.dip2px(8F), DisplayUtils.dip2px(6F),
DisplayUtils.dip2px(20F), DisplayUtils.dip2px(6F))
}
holder.binding.game = gameEntity
holder.binding.subjectTag = subjectData?.tag
holder.initServerType(gameEntity!!)
holder.binding.executePendingBindings()
if (subjectData?.isOrder!!) {
holder.binding.gameOrder.visibility = View.VISIBLE
holder.binding.gameOrder.text = (subjectData.position).toString()
} else {
holder.binding.gameOrder.visibility = View.GONE
}
val binding = holder.binding
var subjectAdapter = binding.horizontalRv.adapter
if (subjectAdapter == null) {
subjectAdapter = GameHorizontalAdapter(mContext, subjectEntity!!)
(binding.horizontalRv.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
binding.horizontalRv.layoutManager = GridLayoutManager(mContext, 4)
binding.horizontalRv.adapter = subjectAdapter
} else {
(subjectAdapter as GameHorizontalAdapter).checkResetData(subjectEntity!!)
subjectAdapter.notifyItemRangeChanged(0, subjectAdapter.itemCount)
}
subjectEntity.data?.let {
val keyName = if (TextUtils.isEmpty(blockName)) "首页" else "板块"
val keyValue = if (TextUtils.isEmpty(blockName)) "" else blockName
itemData.exposureEvent = ExposureEvent.createEvent(gameEntity = gameEntity,
source = listOf(ExposureSource(keyName, keyValue), ExposureSource("专题", subjectData.name!!)),
eTrace = null,
event = ExposureType.EXPOSURE)
DownloadItemUtils.setOnClickListener(mContext, holder.binding.downloadBtn, gameEntity, position,
this@GameFragmentAdapter,
StringUtils.buildString("(游戏-专题:", subjectData.name, "-列表[", (position + 1).toString(), "])"),
StringUtils.buildString("游戏-专题-", subjectData.name, ":", gameEntity.name), itemData.exposureEvent)
DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), !gameEntity.isPluggable)
holder.itemView.setOnClickListener {
DataCollectionUtils.uploadClick(mContext, subjectData.name + "-列表", "游戏-专题", gameEntity.name)
val positionOffset = subjectAdapter.getIndex()
if (gameEntity.isPluggable) {
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id,
StringUtils.buildString("(游戏-专题:插件化-列表[", (subjectData.position).toString(), "])"), itemData.exposureEvent)
} else {
GameDetailActivity.startGameDetailActivity(mContext, gameEntity,
StringUtils.buildString("(游戏-专题:", subjectData.name, "-列表[", (subjectData.position).toString(), "])"), itemData.exposureEvent)
}
for (i in positionOffset until subjectAdapter.itemCount + positionOffset) {
it[i].sequence = i
val event = ExposureEvent.createEvent(gameEntity = it[i],
source = listOf(ExposureSource(keyName, keyValue), ExposureSource("专题", subjectEntity.name!!)),
eTrace = null,
event = ExposureType.EXPOSURE)
exposureEventList.add(event)
}
} else if (holder is GameViewPagerViewHolder) {
val subjectDigestList = mItemDataList[position].subjectRecommend
val binding = holder.binding
mItemDataList[position].exposureEventList = exposureEventList
subjectAdapter.exposureEventList = exposureEventList
}
}
binding.list = subjectDigestList
binding.clickListener = OnViewClickListener { v, data ->
if (data is Int) {
DataUtils.onMtaEvent(mContext, "推荐入口", if (TextUtils.isEmpty(blockName)) "首页" else blockName, (data + 1).toString())
if (data < subjectDigestList?.size!!) {
val entity = subjectDigestList[data]
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)
}
private fun bindGameImageView(holder: GameImageViewHolder, position: Int) {
val entity = mItemDataList[position].image
val keyName = if (TextUtils.isEmpty(blockName)) "首页" else "板块"
val keyValue = if (TextUtils.isEmpty(blockName)) "" else blockName
entity?.let {
if (it.type == "game") {
mItemDataList[position].exposureEvent = ExposureEvent.createEvent(gameEntity = entity,
source = listOf(ExposureSource(keyName, keyValue), ExposureSource("专题", entity.subjectData?.name + "-大图")),
eTrace = null,
event = ExposureType.EXPOSURE)
}
}
holder.binding.game = entity
holder.binding.traceEvent = mItemDataList[position].exposureEvent
val name = entity?.subjectData?.name
val link = entity?.link
val width = mContext.resources.displayMetrics.widthPixels - DisplayUtils.dip2px(mContext, 16F)
ImageUtils.display(holder.binding.gameImageIcon, entity?.image, width, object : BaseControllerListener<ImageInfo>() {
override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) {
if (imageInfo == null) return
val imageParams = holder.binding.gameImageIcon.layoutParams
val scale = imageInfo.height.toFloat() / imageInfo.width.toFloat()
imageParams?.height = (width * scale).toInt()
holder.binding.gameImageIcon.layoutParams = imageParams
holder.binding.gameContainer.layoutParams.height = (width * scale).toInt()
}
})
holder.binding.gameImageIcon.setOnClickListener {
DataCollectionUtils.uploadClick(mContext, "$name-大图", "游戏-专题")
DataUtils.onMtaEvent(mContext, "游戏专题", "大图", name + ":" + entity?.name)
val linkEntity = LinkEntity()
linkEntity.link = link
linkEntity.type = entity?.type
linkEntity.text = name
DirectUtils.directToLinkPage(mContext, linkEntity, "(游戏-专题:$name-大图)", "首页游戏")
}
}
private fun bindFooterView(holder: FooterViewHolder) {
holder.initFooterViewHolder(mLoadStatus == LoadStatus.LIST_LOADING
, mLoadStatus == LoadStatus.LIST_FAILED
, mLoadStatus == LoadStatus.LIST_OVER) {
if (mLoadStatus == LoadStatus.LIST_OVER) {
MtaHelper.onEvent("首页_点击", "底部", "点击回到顶部")
mViewModel.commandScrollTop.postValue(null)
} else {
mViewModel.getSubjectList(false)
notifyItemChanged(itemCount - 1)
}
} else if (v.id == R.id.home_subject_failure) {
mViewModel.getSubjectDigest(false)
} else if (v.id == R.id.viewpager_tv_failure) {
mViewModel.getSlideData(false)
}
}
}
private fun bindGameViewPagerView(holder: GameViewPagerViewHolder, position: Int) {
val subjectDigestList = mItemDataList[position].subjectRecommend
val binding = holder.binding
binding.list = subjectDigestList
binding.clickListener = OnViewClickListener { v, data ->
if (data is Int) {
DataUtils.onMtaEvent(mContext, "推荐入口", if (TextUtils.isEmpty(blockName)) "首页" else blockName, (data + 1).toString())
if (data < subjectDigestList?.size!!) {
val entity = subjectDigestList[data]
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) {
mViewModel.getSubjectDigest(false)
} else if (v.id == R.id.viewpager_tv_failure) {
mViewModel.getSlideData(false)
}
}
if (mViewModel.blockData != null) {
if (subjectDigestList != null && subjectDigestList.size >= 5) {
ImageUtils.display(binding.entranceIcon5, subjectDigestList[4].icon)
binding.entranceName5.text = if (Config.isShowPlugin()) subjectDigestList[4].name else subjectDigestList[4].nameNormal
}
} else {
ImageUtils.display(binding.entranceIcon5, R.drawable.home_entrance_kaifu)
binding.entranceName5.text = "开服表"
}
binding.entranceContainer5.setOnClickListener {
DataUtils.onMtaEvent(mContext, "推荐入口", if (TextUtils.isEmpty(blockName)) "首页" else blockName, "5")
if (mViewModel.blockData != null) {
if (subjectDigestList != null && subjectDigestList.size >= 5) {
ImageUtils.display(binding.entranceIcon5, subjectDigestList[4].icon)
binding.entranceName5.text = if (Config.isShowPlugin()) subjectDigestList[4].name else subjectDigestList[4].nameNormal
val entity = subjectDigestList[4]
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 {
ImageUtils.display(binding.entranceIcon5, R.drawable.home_entrance_kaifu)
binding.entranceName5.text = "开服表"
val intent = KaiFuActivity.getIntent(mContext, "(游戏-专题:开服表[1-4])")
mContext.startActivity(intent)
DataCollectionUtils.uploadPosition(mContext, "游戏", "4", "开服表")
}
}
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]
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)
}
}
val slideList = mItemDataList[position].slideList
val pagerAdapter = binding.viewPager.adapter
if (slideList != null && slideList.isNotEmpty() &&
(pagerAdapter == null ||
pagerAdapter is ImagePagerAdapter &&
pagerAdapter.dataSize == slideList.size)) {
binding.viewpagerLlHint.removeAllViews()
val margin = DisplayUtils.dip2px(mContext, 6f)
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 {
val intent = KaiFuActivity.getIntent(mContext, "(游戏-专题:开服表[1-4])")
mContext.startActivity(intent)
DataCollectionUtils.uploadPosition(mContext, "游戏", "4", "开服表")
imageView.setImageResource(R.drawable.oval_hint_dn)
}
if (i != 0) {
lparams.leftMargin = margin
}
imageView.layoutParams = lparams
binding.viewpagerLlHint.addView(imageView)
i++
}
val slideList = mItemDataList[position].slideList
val pagerAdapter = binding.viewPager.adapter
if (slideList != null && slideList.isNotEmpty() &&
(pagerAdapter == null ||
pagerAdapter is ImagePagerAdapter &&
pagerAdapter.dataSize == slideList.size)) {
binding.viewpagerLlHint.removeAllViews()
val margin = DisplayUtils.dip2px(mContext, 6f)
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)
binding.viewPager.adapter = ImagePagerAdapter(mContext, slideList, true, if (TextUtils.isEmpty(blockName)) "首页" else blockName)
binding.viewPager.interval = 3000
binding.viewPager.startAutoScroll()
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 {
imageView.setImageResource(R.drawable.oval_hint_dn)
(binding.viewpagerLlHint.getChildAt(j) as ImageView)
.setImageResource(R.drawable.oval_hint_dn)
}
if (i != 0) {
lparams.leftMargin = margin
}
imageView.layoutParams = lparams
binding.viewpagerLlHint.addView(imageView)
i++
j++
}
binding.viewPager.adapter = ImagePagerAdapter(mContext, slideList, true, if (TextUtils.isEmpty(blockName)) "首页" else blockName)
binding.viewPager.interval = 3000
binding.viewPager.startAutoScroll()
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++
}
}
} else if (slideList != null && slideList.isNotEmpty() && pagerAdapter != null) {
(pagerAdapter as ImagePagerAdapter).checkResetData(slideList)
} else if (slideList == null || slideList.isEmpty()) {
binding.viewPager.adapter = null
}
} else if (slideList != null && slideList.isNotEmpty() && pagerAdapter != null) {
(pagerAdapter as ImagePagerAdapter).checkResetData(slideList)
} else if (slideList == null || slideList.isEmpty()) {
binding.viewPager.adapter = null
}
if (mViewModel.blockData != null) {
binding.viewpagerContainer.visibility = if (slideList!!.isEmpty()) View.GONE else View.VISIBLE
binding.entranceContainer.visibility = if (subjectDigestList!!.isEmpty()) View.GONE else View.VISIBLE
}
if (mViewModel.blockData != null) {
binding.viewpagerContainer.visibility = if (slideList!!.isEmpty()) View.GONE else View.VISIBLE
binding.entranceContainer.visibility = if (subjectDigestList!!.isEmpty()) View.GONE else View.VISIBLE
}
if (isAutoScroll) {
binding.viewPager.startAutoScroll()
if (isAutoScroll) {
binding.viewPager.startAutoScroll()
} else {
binding.viewPager.stopAutoScroll()
}
}
private fun bindGameItemView(holder: GameItemViewHolder, position: Int) {
val itemData = mItemDataList[position]
val gameEntity = itemData.game
val subjectData = gameEntity?.subjectData
if (mItemDataList[position - 1].game == null) {
holder.itemView.setPadding(DisplayUtils.dip2px(8F), DisplayUtils.dip2px(10.5F),
DisplayUtils.dip2px(20F), DisplayUtils.dip2px(6F))
} else {
holder.itemView.setPadding(DisplayUtils.dip2px(8F), DisplayUtils.dip2px(6F),
DisplayUtils.dip2px(20F), DisplayUtils.dip2px(6F))
}
holder.binding.game = gameEntity
holder.binding.subjectTag = subjectData?.tag
holder.initServerType(gameEntity!!)
holder.binding.executePendingBindings()
if (subjectData?.isOrder!!) {
holder.binding.gameOrder.visibility = View.VISIBLE
holder.binding.gameOrder.text = (subjectData.position).toString()
} else {
holder.binding.gameOrder.visibility = View.GONE
}
val keyName = if (TextUtils.isEmpty(blockName)) "首页" else "板块"
val keyValue = if (TextUtils.isEmpty(blockName)) "" else blockName
itemData.exposureEvent = ExposureEvent.createEvent(gameEntity = gameEntity,
source = listOf(ExposureSource(keyName, keyValue), ExposureSource("专题", subjectData.name!!)),
eTrace = null,
event = ExposureType.EXPOSURE)
DownloadItemUtils.setOnClickListener(mContext, holder.binding.downloadBtn, gameEntity, position,
this@GameFragmentAdapter,
StringUtils.buildString("(游戏-专题:", subjectData.name, "-列表[", (position + 1).toString(), "])"),
StringUtils.buildString("游戏-专题-", subjectData.name, ":", gameEntity.name), itemData.exposureEvent)
DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), !gameEntity.isPluggable)
holder.itemView.setOnClickListener {
DataCollectionUtils.uploadClick(mContext, subjectData.name + "-列表", "游戏-专题", gameEntity.name)
if (gameEntity.isPluggable) {
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id,
StringUtils.buildString("(游戏-专题:插件化-列表[", (subjectData.position).toString(), "])"), itemData.exposureEvent)
} else {
binding.viewPager.stopAutoScroll()
GameDetailActivity.startGameDetailActivity(mContext, gameEntity,
StringUtils.buildString("(游戏-专题:", subjectData.name, "-列表[", (subjectData.position).toString(), "])"), itemData.exposureEvent)
}
}
}
} else if (holder is FooterViewHolder) {
holder.initFooterViewHolder(mLoadStatus == LoadStatus.LIST_LOADING
, mLoadStatus == LoadStatus.LIST_FAILED
, mLoadStatus == LoadStatus.LIST_OVER, View.OnClickListener {
if (mLoadStatus == LoadStatus.LIST_OVER) {
mViewModel.commandScrollTop.postValue(null)
} else {
mViewModel.getSubjectList(false)
notifyItemChanged(itemCount - 1)
}
})
} else if (holder is GameImageViewHolder) {
val entity = mItemDataList[position].image
private fun bindHeadView(holder: GameHeadViewHolder, position: Int) {
val column = mItemDataList[position].columnHead
holder.binding.subject = column
holder.binding.headPb.visibility = View.GONE
val text = if ("change" == column?.home) "换一批" else "全部"
holder.binding.headMore.text = text
val keyName = if (TextUtils.isEmpty(blockName)) "首页" else "板块"
val keyValue = if (TextUtils.isEmpty(blockName)) "" else blockName
if (text == "全部" && column != null && column.data != null && column.data!!.size >= column.more!!) {
holder.binding.headMore.visibility = View.GONE
} else {
holder.binding.headMore.visibility = View.VISIBLE
}
entity?.let {
if (it.type == "game") {
mItemDataList[position].exposureEvent = ExposureEvent.createEvent(gameEntity = entity,
source = listOf(ExposureSource(keyName, keyValue), ExposureSource("专题", entity.subjectData?.name + "-大图")),
eTrace = null,
event = ExposureType.EXPOSURE)
}
}
holder.binding.game = entity
holder.binding.traceEvent = mItemDataList[position].exposureEvent
val name = entity?.subjectData?.name
val link = entity?.link
val width = mContext.resources.displayMetrics.widthPixels - DisplayUtils.dip2px(mContext, 16F)
ImageUtils.display(holder.binding.gameImageIcon, entity?.image, width, object : BaseControllerListener<ImageInfo>() {
override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) {
if (imageInfo == null) return
val imageParams = holder.binding.gameImageIcon.layoutParams
val scale = imageInfo.height.toFloat() / imageInfo.width.toFloat()
imageParams?.height = (width * scale).toInt()
holder.binding.gameImageIcon.layoutParams = imageParams
holder.binding.gameContainer.layoutParams.height = (width * scale).toInt()
}
})
holder.binding.gameImageIcon.setOnClickListener {
DataCollectionUtils.uploadClick(mContext, "$name-大图", "游戏-专题")
DataUtils.onMtaEvent(mContext, "游戏专题", "大图", name + ":" + entity?.name)
val linkEntity = LinkEntity()
linkEntity.link = link
linkEntity.type = entity?.type
linkEntity.text = name
DirectUtils.directToLinkPage(mContext, linkEntity, "(游戏-专题:$name-大图)", "首页游戏")
}
} else if (holder is GameHorizontalListViewHolder) {
val subjectEntity = mItemDataList[position].horizontalColumn
val exposureEventList = arrayListOf<ExposureEvent>()
val binding = holder.binding
var subjectAdapter = binding.horizontalRv.adapter
if (subjectAdapter == null) {
subjectAdapter = GameHorizontalAdapter(mContext, subjectEntity!!)
(binding.horizontalRv.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
binding.horizontalRv.layoutManager = GridLayoutManager(mContext, 4)
binding.horizontalRv.adapter = subjectAdapter
holder.binding.headMore.setOnClickListener {
if ("all" == column?.home) {
DataUtils.onMtaEvent(mContext, "游戏专题", "全部", column.name)
SubjectActivity.startSubjectActivity(mContext, column.id, column.name, column.isOrder, "(游戏-专题:" + column.name + "-全部)")
} else {
(subjectAdapter as GameHorizontalAdapter).checkResetData(subjectEntity!!)
subjectAdapter.notifyItemRangeChanged(0, subjectAdapter.itemCount)
DataUtils.onMtaEvent(mContext, "游戏专题", "换一批", column?.name)
holder.binding.headPb.visibility = View.VISIBLE
mViewModel.changeSubjectGame(column?.id!!)
}
}
}
subjectEntity.data?.let {
val keyName = if (TextUtils.isEmpty(blockName)) "首页" else "板块"
val keyValue = if (TextUtils.isEmpty(blockName)) "" else blockName
private fun bindPluginView(holder: GamePluginViewHolder, position: Int) {
val pluginList = mItemDataList[position].pluginList
var adapter = holder.mPluginRv.adapter
val positionOffset = subjectAdapter.getIndex()
if (adapter == null) {
adapter = GamePluginAdapter(mContext, pluginList)
adapter.openList(mIsOpenPluginList)
(holder.mPluginRv.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false
holder.mPluginRv.layoutManager = LinearLayoutManager(mContext)
holder.mPluginRv.adapter = adapter
} else {
(adapter as GamePluginAdapter).openList(mIsOpenPluginList)
adapter.checkResetData(pluginList)
}
for (i in positionOffset until subjectAdapter.itemCount + positionOffset) {
it[i].sequence = i
val event = ExposureEvent.createEvent(gameEntity = it[i],
source = listOf(ExposureSource(keyName, keyValue), ExposureSource("专题", subjectEntity.name!!)),
eTrace = null,
event = ExposureType.EXPOSURE)
exposureEventList.add(event)
}
mItemDataList[position].exposureEventList = exposureEventList
subjectAdapter.exposureEventList = exposureEventList
holder.mHeadTitle.text = String.format(Locale.getDefault(), "你有%d个游戏可以升级插件版", pluginList?.size)
holder.mPluginHead.setOnClickListener {
if (mIsOpenPluginList) {
mIsOpenPluginList = false
holder.mHeadOpen.setImageResource(R.drawable.gamedetail_open_icon)
MtaHelper.onEvent("首页_点击", "插件化区域", "收起")
} else {
mIsOpenPluginList = true
holder.mHeadOpen.setImageResource(R.drawable.gamedetail_colse_icon)
MtaHelper.onEvent("首页_点击", "插件化区域", "展开")
}
notifyItemChanged(holder.adapterPosition)
}
}

View File

@ -1,14 +1,14 @@
package com.gh.gamecenter.game
import android.annotation.SuppressLint
import android.app.Application
import android.arch.lifecycle.*
import android.preference.PreferenceManager
import android.support.v4.util.ArrayMap
import android.text.TextUtils
import com.gh.common.TimeElapsedHelper
import com.gh.common.constant.Constants
import com.gh.common.util.ApkActiveUtils
import com.gh.common.util.GameUtils
import com.gh.common.util.RandomUtils
import com.gh.common.util.*
import com.gh.download.DownloadManager
import com.gh.gamecenter.baselist.LoadStatus
import com.gh.gamecenter.entity.*
@ -27,52 +27,59 @@ import java.util.HashMap
import kotlin.collections.ArrayList
import kotlin.collections.set
class GameViewModel(application: Application, var blockData: SubjectRecommendEntity?)
: AndroidViewModel(application) {
class GameViewModel(application: Application, blockData: SubjectRecommendEntity?) : AndroidViewModel(application) {
private var mSlideList = ArrayList<LinkEntity>() // 轮播图
private var mPluginList: List<GameEntity>? = null // 插件化
private var mSubjectList: MutableList<SubjectEntity> = ArrayList() // 专题
private var mSubjectDigestList = ArrayList<SubjectRecommendEntity>() // 专题入口
private var mSmartSubject: SubjectEntity? = null // 插件化
var mApi = RetrofitManager.getInstance(getApplication()).api
private val mItemDataListCache: MutableList<GameItemData> = ArrayList()
private val mSubjectChangedMap: ArrayMap<String, List<GameEntity>> = ArrayMap() // 存储换一换的数据
var blockData = blockData
private var mSubjectPage = 1 // 专题分页
private var mIsLoading = false
var slideList = ArrayList<LinkEntity>() // 轮播图
var pluginList: List<GameEntity>? = null // 插件化
var subjectList: MutableList<SubjectEntity> = ArrayList() // 专题
var subjectDigestList = ArrayList<SubjectRecommendEntity>() // 专题入口
var smartSubject: SubjectEntity? = null // 插件化
private var mApi = RetrofitManager.getInstance(getApplication()).api
private var mElapsedHelper: TimeElapsedHelper? = null
private var mShouldLogReplacingGame = true
var itemDataList: MediatorLiveData<List<GameItemData>> = MediatorLiveData()
val loadStatus = MutableLiveData<LoadStatus>()
val openingDialog = MutableLiveData<WelcomeDialogEntity>()
val mSubjectChangedMap: ArrayMap<String, List<GameEntity>> = ArrayMap() //存储换一换的数据
var positionAndPackageMap = HashMap<String, Int>() // key: packageName + position, value: position
private val itemDataListCache: MutableList<GameItemData> = ArrayList()
val commandScrollTop = MutableLiveData<Any>()
private var mSubjectPage = 1 // 专分页
private var mIsLoading = false
var positionAndPackageMap = HashMap<String, Int>() // key: packageName + position, value: position
init {
if (blockData == null) {
itemDataList.addSource(PackageRepository.gameUpdateLiveData) {
initPlugin(it)
// 第一次加载开始计时,供加载成功查看加载用时
mElapsedHelper = TimeElapsedHelper()
mElapsedHelper?.resumeCounting()
}
}
initData()
}
fun initData() {
slideList.clear()
subjectList.clear()
subjectDigestList.clear()
itemDataListCache.clear()
mSlideList.clear()
mSubjectList.clear()
mSubjectDigestList.clear()
mItemDataListCache.clear()
loadStatus.postValue(LoadStatus.INIT_LOADING)
getSlideData(true)
getSmartColumn()
// 触发列表刷新行为时亦刷新内存中的备用游戏库列表
GameRepositoryHelper.refreshGameRepository()
}
private fun initPlugin(updateList: List<GameUpdateEntity>?) {
@ -87,14 +94,14 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
for (game in list) {
game.setEntryMap(DownloadManager.getInstance(getApplication()).getEntryMap(game.name))
}
pluginList = list
mPluginList = list
transformationItemData()
}
/**
* 获取启动弹窗
*/
@SuppressLint("CheckResult")
fun requestOpeningData() {
val lastId = PreferenceManager.getDefaultSharedPreferences(getApplication()).getString(Constants.SP_LAST_OPENING_ID, "")
val lastTime = PreferenceManager.getDefaultSharedPreferences(getApplication()).getLong(Constants.SP_LAST_OPENING_TIME, 0)
@ -122,7 +129,7 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<List<LinkEntity>>() {
override fun onResponse(response: List<LinkEntity>?) {
if (response != null) slideList.addAll(response)
if (response != null) mSlideList.addAll(response)
if (initData) getSubjectDigest(initData)
}
@ -138,12 +145,18 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
if (initData) getSubjectList(initData)
return
}
val observable = if (blockData == null) mApi.subjectDigest else mApi.getBlockRecommends(blockData?.link)
val observable = if (blockData == null) {
mApi.subjectDigest
} else {
mApi.getBlockRecommends(blockData?.link)
}
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<List<SubjectRecommendEntity>>() {
override fun onResponse(response: List<SubjectRecommendEntity>?) {
if (response != null) subjectDigestList.addAll(response)
if (response != null) mSubjectDigestList.addAll(response)
transformationItemData()
if (initData) {
getSubjectList(initData)
@ -169,7 +182,13 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
} else {
loadStatus.postValue(LoadStatus.LIST_LOADING)
}
val observable = if (blockData == null) mApi.getColumn(mSubjectPage) else mApi.getBlockColumns(blockData?.link, mSubjectPage)
val observable = if (blockData == null) {
mApi.getColumn(mSubjectPage)
} else {
mApi.getBlockColumns(blockData?.link, mSubjectPage)
}
observable.subscribeOn(Schedulers.io())
.map {
for (subjectEntity in it) {
@ -188,7 +207,7 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
if (response != null) {
when {
initData -> {
subjectList = response as MutableList<SubjectEntity>
mSubjectList = response as MutableList<SubjectEntity>
loadStatus.postValue(LoadStatus.INIT_LOADED)
transformationItemData()
}
@ -196,7 +215,7 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
loadStatus.postValue(LoadStatus.LIST_OVER)
}
else -> {
subjectList.addAll(response)
mSubjectList.addAll(response)
loadStatus.postValue(LoadStatus.LIST_LOADED)
transformationItemData()
}
@ -204,19 +223,39 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
}
mSubjectPage++
mIsLoading = false
logSuccess()
}
override fun onFailure(e: HttpException?) {
if (initData && slideList.isEmpty() && subjectDigestList.isEmpty()) {
if (initData && mSlideList.isEmpty() && mSubjectDigestList.isEmpty()) {
loadStatus.postValue(LoadStatus.INIT_FAILED)
} else {
loadStatus.postValue(LoadStatus.LIST_FAILED)
}
mIsLoading = false
logFailure()
}
})
}
private fun logFailure() {
mElapsedHelper?.let {
it.pauseCounting()
mElapsedHelper = null
MtaHelper.onEvent("首页_加载", "启动光环", "加载失败")
}
}
private fun logSuccess() {
mElapsedHelper?.let {
it.pauseCounting()
MtaHelper.onEventWithTime("首页_加载", it.elapsedTime, "启动光环", "加载成功")
mElapsedHelper = null
}
}
private fun getSmartColumn() {
if (blockData != null) return
mApi.smartColumn
@ -224,11 +263,7 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<SubjectEntity>() {
override fun onResponse(response: SubjectEntity?) {
smartSubject = response
}
override fun onFailure(e: HttpException?) {
mSmartSubject = response
}
})
}
@ -269,7 +304,7 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
private fun initRandomGame(subjectId: String, sourceList: List<GameEntity>?) {
var rawList: MutableList<GameEntity>? = null
for (entity in subjectList) {
for (entity in mSubjectList) {
if (entity.id == subjectId) rawList = entity.data
}
if (rawList == null) return
@ -302,46 +337,50 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
}
private fun transformationItemData() {
itemDataListCache.clear()
mItemDataListCache.clear()
positionAndPackageMap.clear()
// 插入智能推荐专题
if (smartSubject != null && subjectList.size > smartSubject!!.sort) {
subjectList.add(smartSubject!!.sort, smartSubject!!)
smartSubject = null // 防止重复插入
if (mSmartSubject != null && mSubjectList.size > mSmartSubject!!.sort) {
mSubjectList.add(mSmartSubject!!.sort, mSmartSubject!!)
mSmartSubject = null // 防止重复插入
}
// 轮播图+专题入口
if (blockData == null || blockData?.display?.recommend!! || blockData?.display?.slide!!) {
val itemDataTop = GameItemData()
itemDataTop.slideList = slideList
itemDataTop.subjectRecommend = subjectDigestList
itemDataListCache.add(itemDataTop)
itemDataTop.slideList = mSlideList
itemDataTop.subjectRecommend = mSubjectDigestList
mItemDataListCache.add(itemDataTop)
}
// 插件化
if (pluginList != null && pluginList!!.isNotEmpty()) {
if (mPluginList != null && mPluginList!!.isNotEmpty()) {
val itemDataPlugin = GameItemData()
itemDataPlugin.pluginList = pluginList
itemDataListCache.add(itemDataPlugin)
itemDataPlugin.pluginList = mPluginList
mItemDataListCache.add(itemDataPlugin)
for (entity in pluginList!!) {
for (entity in mPluginList!!) {
addGamePositionAndPackage(entity)
}
}
// 专题 "type": "image/game_vertical/game_horizontal"
for (subjectEntity in subjectList) {
for (subjectEntity in mSubjectList) {
val data = subjectEntity.data
if (data == null || data.isEmpty()) continue
subjectEntity.relatedColumnId?.let {
replaceInstalledApp(data, it)
}
if (!data[0].image.isNullOrEmpty()) {
val itemDataImage = GameItemData()
val gameEntity = data[0]
if (gameEntity.id.isNullOrEmpty()) gameEntity.id = gameEntity.link
itemDataImage.image = gameEntity
itemDataImage.image?.subjectData = GameSubjectData(name = subjectEntity.name, isOrder = false)
itemDataListCache.add(itemDataImage)
mItemDataListCache.add(itemDataImage)
if (gameEntity.type == "game") addGamePositionAndPackage(gameEntity)
if (subjectEntity.type == "image") continue
@ -349,12 +388,12 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
val itemDataHead = GameItemData()
itemDataHead.columnHead = subjectEntity
itemDataListCache.add(itemDataHead)
mItemDataListCache.add(itemDataHead)
if (subjectEntity.type == "game_horizontal") {
val itemDataSubject = GameItemData()
itemDataSubject.horizontalColumn = subjectEntity
itemDataListCache.add(itemDataSubject)
mItemDataListCache.add(itemDataSubject)
for (game in subjectEntity.data!!) {
addGamePositionAndPackage(game)
}
@ -370,12 +409,69 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
val itemDataGame = GameItemData()
game.sequence = i
itemDataGame.game = game
itemDataListCache.add(itemDataGame)
mItemDataListCache.add(itemDataGame)
addGamePositionAndPackage(game)
}
}
itemDataList.postValue(itemDataListCache)
itemDataList.postValue(mItemDataListCache)
}
private fun replaceInstalledApp(gameList: MutableList<GameEntity>, relatedCollectionId: String) {
val gameIdList = arrayListOf<String>() // 专题包含的游戏 ID 列表
val positionOfTheGameToReplaceList = arrayListOf<Int>()
// 标记需要替换的已安装游戏
for ((index, game) in gameList.withIndex()) {
gameIdList.add(game.id ?: "")
// 是大图形式的游戏时不标记替换
if ((index == 0 && !gameList[0].image.isNullOrEmpty())) {
continue
}
var isThisPositionAdded = false
// 检查是否已安装该游戏里同包名的 APK
for (apk in game.getApk()) {
if (PackageHelper.validLocalPackageNameSet.contains(apk.packageName)) {
// 将该位置的游戏标记为需要替换
positionOfTheGameToReplaceList.add(index)
isThisPositionAdded = true
break
}
}
// 若此游戏所包含的 apk 没有已安装,那么再检查是否已安装有预设相关包名
if (!isThisPositionAdded) {
var relatedPackageList = arrayListOf<String>()
for (entity in PackageHelper.relatedPackageList) {
if (entity.gameId == game.id) {
relatedPackageList = ArrayList(entity.packages)
break
}
}
for (packageName in relatedPackageList) {
if (PackageHelper.validLocalPackageNameSet.contains(packageName)) {
positionOfTheGameToReplaceList.add(index)
break
}
}
}
}
if (positionOfTheGameToReplaceList.isNotEmpty()) {
if (blockData == null && mShouldLogReplacingGame) {
mShouldLogReplacingGame = false
MtaHelper.onEvent("首页_加载", "启动光环", "替换游戏")
}
for (position in positionOfTheGameToReplaceList) {
val replacingGame = GameRepositoryHelper.getOneUniqueGame(relatedCollectionId, gameIdList)
replacingGame?.let {
gameList[position] = replacingGame
}
}
}
}
private fun addGamePositionAndPackage(game: GameEntity) {
@ -383,15 +479,12 @@ class GameViewModel(application: Application, blockData: SubjectRecommendEntity?
for (apkEntity in game.getApk()) {
packages += apkEntity.packageName
}
positionAndPackageMap[packages + (itemDataListCache.size - 1)] = itemDataListCache.size - 1
positionAndPackageMap[packages + (mItemDataListCache.size - 1)] = mItemDataListCache.size - 1
game.gameLocation = GameEntity.GameLocation.INDEX
game.setEntryMap(DownloadManager.getInstance(getApplication()).getEntryMap(game.name))
}
class Factory(val mApplication: Application, val blockData: SubjectRecommendEntity?) : ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return GameViewModel(mApplication, blockData) as T

View File

@ -43,7 +43,6 @@ class GameHorizontalAdapter(context: Context, subject: SubjectEntity) : BaseRecy
holder.itemView?.setOnClickListener {
GameDetailActivity.startGameDetailActivity(mContext, gameEntity,
StringUtils.buildString("(游戏-专题:", mSubjectEntity.name, "-列表[", (position + 1).toString(), "])"), exposureEventList!![position])
}
}

View File

@ -74,7 +74,7 @@ import retrofit2.HttpException;
/**
* Created by CsHeng on 19/12/2017.
* \游戏详情适配器
* 游戏详情适配器
*/
public class GameDetailFragment extends NormalFragment {
@ -152,6 +152,7 @@ public class GameDetailFragment extends NormalFragment {
private boolean mSwitchToFirstTabInStartup;
private boolean mSkipGameComment;
private boolean mIsPageChanged;
private boolean mIsOpenPlatformWindow;
private int mCurVpPosition;
private int mMaxWidth;
@ -213,6 +214,7 @@ public class GameDetailFragment extends NormalFragment {
mAutoDownload = args.getBoolean(EntranceUtils.KEY_AUTO_DOWNLOAD);
mTraceEvent = args.getParcelable(EntranceUtils.KEY_TRACE_EVENT);
mSkipGameComment = args.getBoolean(EntranceUtils.KEY_SKIP_GAME_COMMENT);
mIsOpenPlatformWindow = args.getBoolean(EntranceUtils.KEY_OPEN_PLATFORM_WINDOW);
mSkeleton = Skeleton.bind(mListSkeleton).shimmer(false).load(R.layout.fragment_gamedetail_skeleton).show();
@ -344,7 +346,7 @@ public class GameDetailFragment extends NormalFragment {
}
}
if (mAutoDownload) {
if (mAutoDownload || (mIsOpenPlatformWindow && mGameEntity.getApk().size() > 1)) {
viewHolder.mDownloadPb.performClick();
mAutoDownload = false;
}

View File

@ -134,7 +134,7 @@ class FuLiAdapter(context: Context,
holder.hint.setText(R.string.game_suggestion_hint)
holder.initItemPadding()
holder.itemView.setOnClickListener {
SuggestionActivity.startSuggestionActivity(mContext, SuggestType.gameQuestion, "game", mFuLiViewModel?.game?.name + ",问题反馈:")
SuggestionActivity.startSuggestionActivity(mContext, SuggestType.gameQuestion, "game", mFuLiViewModel?.game?.name)
DataUtils.onMtaEvent(mContext, "游戏详情_新", "此游戏有问题_点击反馈", mFuLiViewModel?.game?.name)
}
}

View File

@ -176,13 +176,13 @@ class FuLiViewModel(application: Application,
val itemList = ArrayList<FuLiItemData>()
var isExistServer = false
var index = 0
val showArticleEntrance = Config.getSettings()?.showArticleEntrance
if (showArticleEntrance == "on" && gameDetail.notice != null && gameDetail.notice!!.isNotEmpty()) {
val showArticleEntrance = Config.getSettings()?.showArticleEntrance()
if (showArticleEntrance == true && gameDetail.notice != null && gameDetail.notice!!.isNotEmpty()) {
val fuLiData = FuLiItemData()
fuLiData.notice = gameDetail.notice
itemList.add(fuLiData)
}
if (showArticleEntrance == "on" && mArticleList != null) {
if (showArticleEntrance == true && mArticleList != null) {
val fuLiData = FuLiItemData()
fuLiData.article = mArticleList
itemList.add(fuLiData)

View File

@ -52,7 +52,7 @@ class RatingViewModel(application: Application, val game: GameEntity) : ListView
val packageName = apk.packageName
if (!TextUtils.isEmpty(packageName)
// 过滤黑名单包名
&& !PackageHelper.excludePackageNameList.contains(packageName)) {
&& !PackageHelper.commentPackageNameBlackList.contains(packageName)) {
packageNameList.add(packageName!!)
}
}

View File

@ -4,29 +4,25 @@ import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.util.ArrayMap;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gc.materialdesign.views.ProgressBarCircularIndeterminate;
import com.gh.common.AppExecutor;
import com.gh.common.repository.RemenkapaiRepository;
import com.gh.base.BaseActivity;
import com.gh.base.OnRequestCallBackListener;
import com.gh.common.util.ApkActiveUtils;
import com.gh.common.util.CheckLoginUtils;
import com.gh.common.util.ConcernUtils;
import com.gh.common.util.DataCollectionUtils;
import com.gh.common.util.ImageUtils;
import com.gh.common.util.StringUtils;
import com.gh.common.view.Concern_LinearLayout;
import com.gh.common.view.VerticalItemDecoration;
import com.gh.gamecenter.ConcernActivity;
import com.gh.gamecenter.LibaoDetailActivity;
@ -38,7 +34,6 @@ import com.gh.gamecenter.ShareCardPicActivity;
import com.gh.gamecenter.WebActivity;
import com.gh.gamecenter.entity.ConcernEntity;
import com.gh.gamecenter.entity.GameEntity;
import com.gh.gamecenter.entity.GameInstall;
import com.gh.gamecenter.entity.LibaoEntity;
import com.gh.gamecenter.entity.LibaoStatusEntity;
import com.gh.gamecenter.entity.MeEntity;
@ -46,27 +41,22 @@ import com.gh.gamecenter.entity.UserDataLibaoEntity;
import com.gh.gamecenter.eventbus.EBConcernChanged;
import com.gh.gamecenter.eventbus.EBNetworkState;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.manager.PackagesManager;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.normal.NormalFragment;
import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.halo.assistant.fragment.myconcern.MyConcernRecommendAdapter;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONArray;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import butterknife.BindView;
import butterknife.OnClick;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import retrofit2.HttpException;
import static com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG;
@ -86,23 +76,20 @@ public class ConcernFragment extends NormalFragment implements SwipeRefreshLayou
LinearLayout noConnectionLayout;
@BindView(R.id.news1_ll_empty)
LinearLayout emptyLayout;
@BindView(R.id.news1_tv_concern)
TextView concern;
@BindView(R.id.news1_ll_concern)
LinearLayout concernLayout;
@BindView(R.id.news1_ll_concern_list)
ViewGroup concernListLayout;
@BindView(R.id.news1_empty_tv)
TextView mEmptyTv;
@BindView(R.id.concern_rv_recommend)
RecyclerView mRecommendRv;
@BindView(R.id.concern_rl_title)
RelativeLayout mConcernTitleRl;
public final static int NEWS_MESSAGE_LIBAO_REQUEST = 3; // 刷新礼包状态
public final static int NEWS_MESSAGE_ARTICLE_REQUEST = 4; // 刷新文章评论数
private ConcernAdapter mAdapter;
private MyConcernRecommendAdapter mConcernRecommendAdapter;
private LinearLayoutManager layoutManager;
private List<GameEntity> recommendGameList; // 推荐关注的游戏
private List<GameEntity> installGameList; // 安装的游戏
private Map<Integer, Boolean> concernMap; // 记录选择关注
Runnable mRunnable = new Runnable() {
@Override
@ -121,15 +108,11 @@ public class ConcernFragment extends NormalFragment implements SwipeRefreshLayou
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setNavigationTitle(R.string.discover_game_trends);
initMenu(R.menu.menu_concern);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recommendGameList = new ArrayList<>();
installGameList = new ArrayList<>();
concernMap = new ArrayMap<>();
refreshLayout.setColorSchemeResources(R.color.theme);
refreshLayout.setOnRefreshListener(this);
@ -169,11 +152,16 @@ public class ConcernFragment extends NormalFragment implements SwipeRefreshLayou
@Override
public void loadDone() { // 数据加载成功回调
refreshLayout.setEnabled(true);
refreshLayout.setRefreshing(false);
emptyLayout.setVisibility(View.GONE);
concernLayout.setVisibility(View.GONE);
mRecommendRv.setVisibility(View.GONE);
mConcernTitleRl.setVisibility(View.GONE);
loadingLayout.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
((BaseActivity) requireActivity()).clearMenu();
initMenu(R.menu.menu_concern);
}
@Override
@ -192,7 +180,7 @@ public class ConcernFragment extends NormalFragment implements SwipeRefreshLayou
emptyLayout.setVisibility(View.VISIBLE);
refreshLayout.setEnabled(false);
initInstallGame();
showRecommendGames();
if (TextUtils.isEmpty(UserManager.getInstance().getToken())) {
mEmptyTv.setText(getString(R.string.login_hint));
@ -201,202 +189,67 @@ public class ConcernFragment extends NormalFragment implements SwipeRefreshLayou
mEmptyTv.setText(getString(R.string.ask_none));
mEmptyTv.setTextColor(getResources().getColor(R.color.c7c7c7));
}
((BaseActivity) requireActivity()).clearMenu();
}
// 推荐关注改为手机安装的游戏+光环助手
private void initInstallGame() {
recommendGameList.clear();//清除上一次记录
installGameList.clear();
concernMap.clear();
concern.setEnabled(true);//防止上一次关注按钮不可以,导致重新刷新后也不可用
AppExecutor.getIoExecutor().execute(() -> {
List<GameInstall> installedList = PackagesManager.filterSameApk(PackagesManager.getInstalledList());
// 对已安装的游戏排序
Collections.sort(installedList, (lhs, rhs) -> Long.compare(lhs.getInstallTime(), rhs.getInstallTime()));
List<Observable<GameEntity>> sequences = new ArrayList<>();
List<GameEntity> gameList = new ArrayList<>();
for (int i = 0, size = installedList.size() + 1; i < size; i++) {
if (i == size - 1) {
if (getContext() != null) {
sequences.add(RetrofitManager.getInstance(getContext()).getApi().getGameDigest(getContext().getString(R.string.ghzs_id)));// 光环助手ID
}
} else {
sequences.add(RetrofitManager.getInstance(getContext()).getApi().getGameDigest(installedList.get(i).getId()));
}
}
Observable.mergeDelayError(sequences)
.map(ApkActiveUtils.filterMapper)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<GameEntity>() {
@Override
public void onFailure(@Nullable HttpException e) {
initRecommendConcern(installedList, gameList);
}
@Override
public void onComplete() {
initRecommendConcern(installedList, gameList);
}
@Override
public void onResponse(@Nullable GameEntity response) {
if (getString(R.string.ghzs_id).equals(response.getId())) {
recommendGameList.add(response);
} else {
ApkActiveUtils.filterHideApk(response);
gameList.add(response);
}
}
});
});
}
private void initRecommendConcern(List<GameInstall> list, List<GameEntity> gameList) {
for (GameInstall info : list) {
for (int i = 0; i < gameList.size(); i++) {
if (info.getId().equals(gameList.get(i).getId())) {
installGameList.add(gameList.get(i));
break;
}
}
}
RemenkapaiRepository
.getRemenkapai(4)
.map(list1 -> {
// 根据热门卡牌顺序进行排序
for (int i = 0; i < installGameList.size(); i++) {
if (recommendGameList.size() >= 4) {
break;
}
for (int j = 0; j < list1.size(); j++) {
if (list1.get(j).getId().equals(installGameList.get(i).getId())) {
recommendGameList.add(installGameList.get(i));
installGameList.remove(i);
i--;
break;
}
}
}
// 推荐关注列表不足4个时剩下的从已安装列表选取
if (recommendGameList.size() < 4) {
for (GameEntity installEntity : installGameList) {
boolean notExistInRecommendList = true;
if (recommendGameList.size() < 4) {
for (int i = 0; i < recommendGameList.size(); i++) {
GameEntity recEntity = recommendGameList.get(i);
if (recEntity.getId().equals(installEntity.getId())) {
notExistInRecommendList = false;
break;
}
}
if (notExistInRecommendList) recommendGameList.add(installEntity);
if (recommendGameList.size() == 4) break;
}
}
}
// 推荐关注列表不足4个时, 在热门卡牌补
if (recommendGameList.size() < 4) {
for (GameEntity hotEntity : list1) {
boolean notExistInRecommendList = true;
for (int i = 0; i < recommendGameList.size(); i++) {
GameEntity recEntity = recommendGameList.get(i);
if (recEntity.getId().equals(hotEntity.getId())) {
notExistInRecommendList = false;
break;
}
}
if (notExistInRecommendList) recommendGameList.add(hotEntity);
if (recommendGameList.size() == 4) break;
}
}
return "";
})
private void showRecommendGames() {
// 先请求用户已关注的游戏数据
RetrofitManager.getInstance(requireContext()).getApi()
.getConcern(UserManager.getInstance().getUserId())
.map(ApkActiveUtils.filterMapperList)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<String>() {
.subscribe(new Response<List<GameEntity>>() {
@Override
public void onResponse(String response) {
initRecommendConcernView();
public void onResponse(List<GameEntity> response) {
initRecommendAdapter(response);
}
@Override
public void onError(Throwable e) {
initRecommendAdapter(new ArrayList<>());
}
});
}
private void initRecommendConcernView() {
if (recommendGameList.isEmpty()) {
return;
}
concernLayout.setVisibility(View.VISIBLE);
concernListLayout.removeAllViews();
private void initRecommendAdapter(List<GameEntity> response) {
mConcernRecommendAdapter = new MyConcernRecommendAdapter(getContext(),
new OnRequestCallBackListener() {
@Override
public void loadDone() {
mConcernTitleRl.setVisibility(View.VISIBLE);
mRecommendRv.setVisibility(View.VISIBLE);
SimpleDraweeView icon;
TextView name;
ImageView concern;
int size = mConcernRecommendAdapter.getItemCount();
mRecommendRv.setAdapter(mConcernRecommendAdapter);
mRecommendRv.setLayoutManager(new GridLayoutManager(getContext(), size > 4 ? 4 : size));
mConcernRecommendAdapter.notifyDataSetChanged();
}
GameEntity gameEntity;
for (int i = 0, size = recommendGameList.size(); i < size; i++) {
concernMap.put(i, true);
@Override
public void loadDone(Object obj) {
mConcernTitleRl.setVisibility(View.VISIBLE);
mRecommendRv.setVisibility(View.VISIBLE);
gameEntity = recommendGameList.get(i);
int size = mConcernRecommendAdapter.getItemCount();
mRecommendRv.setAdapter(mConcernRecommendAdapter);
mRecommendRv.setLayoutManager(new GridLayoutManager(getContext(), size > 4 ? 4 : size));
mConcernRecommendAdapter.notifyDataSetChanged();
}
View view = View.inflate(getActivity(), R.layout.concern_item, null);
@Override
public void loadError() {
icon = view.findViewById(R.id.concern_item_icon);
name = view.findViewById(R.id.concern_item_name);
concern = view.findViewById(R.id.concern_item_concern_iv);
view.findViewById(R.id.concern_item_concern).setVisibility(View.GONE);
}
concern.setVisibility(View.VISIBLE);
ImageUtils.display(icon, gameEntity.getIcon());
name.setText(gameEntity.getName());
concern.setImageResource(R.drawable.concern_select_true);
final int finalI = i;
concern.setOnClickListener(v -> {
if (concernMap.get(finalI)) {
((ImageView) v).setImageResource(R.drawable.concern_select_false);
concernMap.put(finalI, false);
} else {
((ImageView) v).setImageResource(R.drawable.concern_select_true);
concernMap.put(finalI, true);
}
// 判断关注按钮是否可用
isConcernAvailable();
});
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
0, ViewGroup.LayoutParams.MATCH_PARENT);
params.weight = 1;
concernListLayout.addView(view, params);
}
concernListLayout.setVisibility(View.VISIBLE);
}
// 判断关注按钮是否可用
private void isConcernAvailable() {
// ???
boolean isEnabled = false;
for (int key : concernMap.keySet()) {
if (concernMap.get(key)) {
isEnabled = true;
break;
}
}
concern.setEnabled(isEnabled);
if (isEnabled) {
concern.setTextColor(ContextCompat.getColor(getContext(), R.color.theme));
} else {
concern.setTextColor(ContextCompat.getColor(getContext(), R.color.btn_pause));
}
@Override
public void loadEmpty() {
onRefresh();
}
},
response,
mEntrance);
}
@Override
@ -438,27 +291,7 @@ public class ConcernFragment extends NormalFragment implements SwipeRefreshLayou
mAdapter.notifyItemChanged(mAdapter.getSkipPosition());
mAdapter.setSkipPosition(-1);
break;
}
}
@OnClick(R.id.news1_tv_concern)
public void concern() { // 关注 推荐关注的游戏
CheckLoginUtils.checkLogin(getContext(), "游戏动态-推荐关注-[关注]", () -> {
ArrayList<GameEntity> list = new ArrayList<>();
for (int key : concernMap.keySet()) {
if (concernMap.get(key)) {
list.add(recommendGameList.get(key));
}
}
// 同步关注
JSONArray data = new JSONArray();
for (GameEntity gameEntity : list) {
data.put(gameEntity.getId());
}
ConcernUtils.INSTANCE.updateConcernData(getContext(), data);
});
}
// 连接上网络事件
@ -477,34 +310,46 @@ public class ConcernFragment extends NormalFragment implements SwipeRefreshLayou
@OnClick(R.id.reuse_no_connection)
public void reconnection() { // 重新连接
refresh();
}
private void refresh() {
refreshLayout.setRefreshing(true);
recyclerView.setVisibility(View.VISIBLE);
loadingLayout.setVisibility(View.VISIBLE);
noConnectionLayout.setVisibility(View.GONE);
postDelayedRunnable(mRunnable, 1000);
postRunnable(mRunnable);
}
// // Fragment界面切换事件
// @Subscribe(threadMode = ThreadMode.MAIN)
// public void onEventMainThread(EBUISwitch swith) {
// if (InfoToolWrapperFragment.EB_NEWSFRAGMENT_TAG.equals(swith.getFrom())) {
// if (swith.getPosition() == 1) {
// if (loadingLayout.getVisibility() == View.VISIBLE) {
// mAdapter.addList(0);
// }
// }
// }
// }
@OnClick(R.id.concern_rl_title)
public void onClick(View v) {
switch (v.getId()) {
case R.id.concern_rl_title:
if (mRecommendRv.getVisibility() == View.VISIBLE) {
((Concern_LinearLayout) mCachedView).hideRecyclerView();
} else {
((Concern_LinearLayout) mCachedView).showRecyclerView();
}
break;
}
}
// 关注事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBConcernChanged changed) {
emptyLayout.setVisibility(View.GONE);
refreshLayout.setEnabled(true);
refreshLayout.setRefreshing(true);
recyclerView.setVisibility(View.VISIBLE);
loadingLayout.setVisibility(View.VISIBLE);
postRunnable(mRunnable);
if (!isResumed()) {
refresh();
} else {
if (mAdapter.getItemCount() == 0) {
mEmptyTv.setText("点击刷新");
mEmptyTv.setTextColor(getResources().getColor(R.color.theme));
mEmptyTv.setOnClickListener(v -> {
refresh();
mEmptyTv.setOnClickListener(null);
});
}
}
mConcernRecommendAdapter.concernGame(changed.getGameId());
}
// 登录事件

View File

@ -114,7 +114,7 @@ class AddKaiFuViewModel(application: Application) : AndroidViewModel(application
}
}
val listJson = GsonUtils.getInstance().toJson(calendarList)
val listJson = GsonUtils.toJson(calendarList)
for (i in 1 until calendarList.size) {
val entity = calendarList[i]
if (entity.getTime() != 0L && !entity.getNote().isNullOrEmpty()) {
@ -158,7 +158,7 @@ class AddKaiFuViewModel(application: Application) : AndroidViewModel(application
private fun postData(postList: ArrayList<KaiFuCalendarEntity>) {
val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.getInstance().toJson(postList))
val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.toJson(postList))
RetrofitManager.getInstance(getApplication()).api.addKaifu(body, mGameId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

View File

@ -119,7 +119,7 @@ public class DataCollectionManager {
// 检查列表数目是否满足条件
if (isUpload) {
List<DataCollectionInfo> list = dao.getAll();
if (list.size() >= 20) {
if (list != null && list.size() >= 20) {
try {
upload(list, false);
} catch (JSONException e) {

View File

@ -6,9 +6,13 @@ import com.gh.gamecenter.entity.GameUpdateEntity
object PackagesManager {
// 存在网络延迟
private val updateAndPluginList = ArrayList<GameUpdateEntity>()
private val installedList = ArrayList<GameInstall>()
// 实时更新(对应安装/卸载广播)
private val installedPkgList = ArrayList<String>()
/**
* 获取更新列表数量
*
@ -16,6 +20,11 @@ object PackagesManager {
*/
val updateListSize: Int get() = updateAndPluginList.size
fun initInstallPkgList(list: ArrayList<String>) {
installedPkgList.clear()
installedPkgList.addAll(list)
}
/**
* 初始化更新列表
*
@ -90,8 +99,8 @@ object PackagesManager {
if (TextUtils.isEmpty(packageName)) {
return false
}
for (gameInstall in installedList) {
if (gameInstall.packageName == packageName) {
for (pkg in installedPkgList) {
if (pkg == packageName) {
return true
}
}

View File

@ -114,7 +114,7 @@ public class UserManager {
public void setCommunityData(CommunityEntity community) {
if (community != null) {
SPUtils.setString(mSp, COMMUNITY_KEY, GsonUtils.Companion.getInstance().toJson(community));
SPUtils.setString(mSp, COMMUNITY_KEY, GsonUtils.toJson(community));
this.mCommunityData = community;
}
}
@ -123,7 +123,7 @@ public class UserManager {
if (mCommunityData == null || TextUtils.isEmpty(mCommunityData.getId())) {
String communityJson = mSp.getString(COMMUNITY_KEY, null);
mCommunityData = TextUtils.isEmpty(communityJson) ? new CommunityEntity()
: GsonUtils.Companion.getInstance().fromJsonBean(communityJson, CommunityEntity.class);
: GsonUtils.fromJson(communityJson, CommunityEntity.class);
}
return mCommunityData == null ? new CommunityEntity() : mCommunityData;
}
@ -289,12 +289,12 @@ public class UserManager {
tokenEntity.setId(loginTokenEntity.getId());
}
setLoginTokenEntity(tokenEntity);
SPUtils.setString(mSp, Constants.USER_TOKEN_KEY, GsonUtils.Companion.getInstance().toJson(tokenEntity));
SPUtils.setString(mSp, Constants.USER_TOKEN_KEY, GsonUtils.toJson(tokenEntity));
}
private void saveUserInfo(final UserInfoEntity userInfo) {
setUserInfoEntity(userInfo);
SPUtils.setString(mSp, Constants.USER_INFO_KEY, GsonUtils.Companion.getInstance().toJson(userInfo));
SPUtils.setString(mSp, Constants.USER_INFO_KEY, GsonUtils.toJson(userInfo));
}
public interface refreshCallBack {

View File

@ -122,7 +122,7 @@ public class KeFuFragmentAdapter extends ListAdapter<MessageKeFuEntity> {
!"7moor".equals(link.getType())) continue;
TextView textView = new TextView(mContext);
textView.setTextColor(mContext.getResources().getColor(R.color.theme));
textView.setTextSize(14F);
textView.setTextSize(12F);
textView.setText(link.getDocument());
textView.setOnClickListener(v -> {
if (!keFuEntity.isRead()) {

View File

@ -426,7 +426,7 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder<MessageEntity>
case "community_article_comment":
community = new CommunityEntity(entity.getArticle().getCommunityId(), "");
if (view.getId() == R.id.message_original) {
context.startActivity(ArticleDetailActivity.getIntent(context, community, entity.getArticle().getId(), entrance, path));
context.startActivity(ArticleDetailActivity.getIntent(context, community, entity.getArticle().getId(), entrance, path, null));
} else if (view.getId() == R.id.message_item) { // 打开评论管理
context.startActivity(ArticleDetailActivity.getOpenCommentIntent(context, community, entity.getArticle().getId(), entrance, path));
}
@ -434,13 +434,13 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder<MessageEntity>
case "community_article_vote":
if (view.getId() == R.id.message_original || view.getId() == R.id.message_item) {
community = new CommunityEntity(entity.getArticle().getCommunityId(), "");
context.startActivity(ArticleDetailActivity.getIntent(context, community, entity.getArticle().getId(), entrance, path));
context.startActivity(ArticleDetailActivity.getIntent(context, community, entity.getArticle().getId(), entrance, path, null));
}
break;
case "reply_community_article_comment":
if (view.getId() == R.id.message_original) {
community = new CommunityEntity(entity.getArticle().getCommunityId(), "");
context.startActivity(ArticleDetailActivity.getIntent(context, community, entity.getArticle().getId(), entrance, path));
context.startActivity(ArticleDetailActivity.getIntent(context, community, entity.getArticle().getId(), entrance, path, null));
} else if (view.getId() == R.id.message_item) {
linkEntity = new LinkEntity();
linkEntity.setType("community_article");

View File

@ -53,6 +53,7 @@ import com.gh.gamecenter.adapter.viewholder.GameDetailNewsViewHolder;
import com.gh.gamecenter.adapter.viewholder.NewsDetailCommentListViewHolder;
import com.gh.gamecenter.adapter.viewholder.NewsDetailGameViewHolder;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.ArticleCommentParent;
import com.gh.gamecenter.entity.ColorEntity;
import com.gh.gamecenter.entity.CommentEntity;
import com.gh.gamecenter.entity.CommentnumEntity;
@ -525,10 +526,19 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter<ViewHolder> {
holder.list.addView(contentView);
viewHolder.commentContentTv.setText(commentEntity.getContent());
if (commentEntity.getParent() != null && !TextUtils.isEmpty(commentEntity.getParent().getUser().getName())) {
ArticleCommentParent parent = commentEntity.getParent();
if (parent != null && !TextUtils.isEmpty(parent.getUser().getName())) {
viewHolder.quoteContainer.setVisibility(View.VISIBLE);
viewHolder.quoteAuthorTv.setText(String.format("@%s", commentEntity.getParent().getUser().getName()));
viewHolder.quoteContentTv.setText(commentEntity.getParent().getComment());
viewHolder.quoteAuthorTv.setText(String.format("@%s", parent.getUser().getName()));
String content;
if (parent.getActive()) {
content = parent.getComment();
viewHolder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_5d5d5d));
} else {
content = mContext.getString(R.string.comment_hide_hint);
viewHolder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_d5d5d5));
}
viewHolder.quoteContentTv.setText(content);
} else {
viewHolder.quoteContainer.setVisibility(View.GONE);
}

View File

@ -40,6 +40,8 @@ object PackageRepository {
private val mApi = RetrofitManager.getInstance(mApplication).api
private val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mApplication)
private val mInstalledPkgList = ArrayList<String>()
val gameUpdateLiveData = MutableLiveData<List<GameUpdateEntity>>()
val gameInstalledLiveData = MutableLiveData<List<GameInstall>>()
@ -57,6 +59,7 @@ object PackageRepository {
fun initData() {
if (gameInstalled.isNotEmpty()) gameInstalled.clear()
if (gameUpdate.isNotEmpty()) gameUpdate.clear()
if (mInstalledPkgList.isNotEmpty()) mInstalledPkgList.clear()
val list = PackageUtils.getAllPackageName(mApplication)
@ -64,6 +67,9 @@ object PackageRepository {
filterPackers(list)
mInstalledPkgList.addAll(list)
notifyInstallPkgData()
loadInstalledGameDigestAndNotifyData(list)
loadGhzsUpdate()
}
@ -226,6 +232,9 @@ object PackageRepository {
* @param pkgName 已安装的游戏包名
*/
fun installedGame(pkgName: String) {
mInstalledPkgList.add(pkgName)
notifyInstallPkgData()
val list = ArrayList<String>()
list.add(pkgName)
loadInstalledGameDigestAndNotifyData(list)
@ -236,6 +245,9 @@ object PackageRepository {
* @param pkgName 已安装的游戏包名
*/
fun uninstalledGame(pkgName: String) {
mInstalledPkgList.remove(pkgName)
notifyInstallPkgData()
// 删除更新列表
var j = 0
while (j < gameUpdate.size) {
@ -270,4 +282,8 @@ object PackageRepository {
PackagesManager.initGameUpdate(gameUpdate)
gameUpdateLiveData.postValue(gameUpdate)
}
private fun notifyInstallPkgData() {
PackagesManager.initInstallPkgList(mInstalledPkgList)
}
}

View File

@ -268,7 +268,7 @@ public class PersonalFragment extends BaseFragment implements Observer<ApiRespon
sign();
} else {
DataUtils.onEvent(getActivity(), "我的光环", "微信登录");
GetLoginDataUtils.getInstance(getActivity()).WCLogin(this);
GetLoginDataUtils.getInstance(getContext()).WCLogin(this);
}
});
}
@ -303,7 +303,7 @@ public class PersonalFragment extends BaseFragment implements Observer<ApiRespon
startActivity(CollectionActivity.getCollectionActivity(getContext(), "(我的光环)"));
} else {
DataUtils.onEvent(getActivity(), "我的光环", "QQ登录");
GetLoginDataUtils.getInstance(getActivity()).QQLogin(this, getActivity());
GetLoginDataUtils.getInstance(getContext()).QQLogin(this, getActivity());
}
break;
case R.id.personal_login_weibo:
@ -312,7 +312,7 @@ public class PersonalFragment extends BaseFragment implements Observer<ApiRespon
startActivityForResult(MessageActivity.getIntent(getContext(), "(我的光环)+(消息中心)"), REQUEST_MESSAGE);
} else {
DataUtils.onEvent(getActivity(), "我的光环", "微博登录");
GetLoginDataUtils.getInstance(getActivity()).WeiBoLogin(this, getActivity());
GetLoginDataUtils.getInstance(getContext()).WeiBoLogin(this, getActivity());
}
break;
case R.id.personal_user_icon:

View File

@ -7,6 +7,7 @@ import android.support.annotation.NonNull;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.NormalActivity;
import com.gh.gamecenter.entity.SpecialColumn;
/**
* Created by khy on 10/04/18.
@ -17,16 +18,27 @@ public class AnswerDetailActivity extends NormalActivity {
@NonNull
public static Intent getIntent(Context context, String answerId, String entrance, String path) {
return getIntent(context, answerId, entrance, path, false);
return getIntent(context, answerId, entrance, path, false, null);
}
@NonNull
public static Intent getIntent(Context context, String answerId, String entrance, String path, boolean isOpenCommentManager) {
return getIntent(context, answerId, entrance, path, isOpenCommentManager, null);
}
@NonNull
public static Intent getIntent(Context context, String answerId, String entrance, String path, SpecialColumn specialColumn) {
return getIntent(context, answerId, entrance, path, false, specialColumn);
}
@NonNull
public static Intent getIntent(Context context, String answerId, String entrance, String path, boolean isOpenCommentManager, SpecialColumn specialColumn) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_ANSWER_ID, answerId);
bundle.putString(EntranceUtils.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path));
bundle.putBoolean(EntranceUtils.KEY_SHOW_ANSWER_COMMENT, isOpenCommentManager);
bundle.putString(EntranceUtils.KEY_PATH, path);
bundle.putParcelable(EntranceUtils.KEY_DATA, specialColumn);
return getTargetIntent(context, AnswerDetailActivity.class, AnswerDetailFragment.class, bundle);
}

View File

@ -61,6 +61,7 @@ import com.gh.gamecenter.SuggestionActivity;
import com.gh.gamecenter.ViewImageActivity;
import com.gh.gamecenter.databinding.FragmentAnswerDetailBinding;
import com.gh.gamecenter.entity.MeEntity;
import com.gh.gamecenter.entity.SpecialColumn;
import com.gh.gamecenter.entity.UserEntity;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.manager.UserManager;
@ -172,6 +173,8 @@ public class AnswerDetailFragment extends NormalFragment {
private AnswerDetailViewModel mViewModel;
private FragmentAnswerDetailBinding mBinding;
private SpecialColumn mSpecialColumn = null;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -183,9 +186,13 @@ public class AnswerDetailFragment extends NormalFragment {
if (getArguments() != null) {
Bundle arguments = getArguments();
mAnswerId = arguments.getString(EntranceUtils.KEY_ANSWER_ID);
if (mAnswerId == null) mAnswerId = "";
mIsShowCommentManager = arguments.getBoolean(EntranceUtils.KEY_SHOW_ANSWER_COMMENT, false);
mIsRecommendsAnswer = arguments.getBoolean(EntranceUtils.KEY_RECOMMENDS_CONTENTS, false);
mPath = arguments.getString(EntranceUtils.KEY_PATH);
mSpecialColumn = arguments.getParcelable(EntranceUtils.KEY_DATA);
mViewModel.getAnswerDetail(mAnswerId, mEntrance);
}
@ -232,7 +239,7 @@ public class AnswerDetailFragment extends NormalFragment {
MtaHelper.onEventWithTime(
"答案阅读量_按社区",
mElapsedHelper.getElapsedTime(),
UserManager.getInstance().getCommunity().getName(),
mDetailEntity.getCommunity().getName(),
StringUtils.combineTwoString(mDetailEntity.getContent(), mAnswerId));
MtaHelper.onEventWithTime(
@ -244,10 +251,16 @@ public class AnswerDetailFragment extends NormalFragment {
MtaHelper.onEventWithTime(
"答案阅读量_社区加位置",
mElapsedHelper.getElapsedTime(),
UserManager.getInstance().getCommunity().getName(),
mDetailEntity.getCommunity().getName(),
mPath);
LogUtils.uploadAnswerReadTime(mEntrance, mElapsedHelper.getElapsedTime(), mAnswerId, mDetailEntity.getQuestion());
LogUtils.uploadAnswerReadTime(mEntrance,
mElapsedHelper.getElapsedTime(),
mAnswerId,
mDetailEntity.getQuestion(),
mDetailEntity.getCommunity().getId(),
mDetailEntity.getCommunity().getName(),
mSpecialColumn);
}
}
@ -573,6 +586,7 @@ public class AnswerDetailFragment extends NormalFragment {
public void onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.menu_more:
if (mDetailEntity == null) return;
showMoreItemDialog();
break;
case R.id.menu_collect:
@ -631,7 +645,7 @@ public class AnswerDetailFragment extends NormalFragment {
}
private void showMoreItemDialog() {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED) || mDetailEntity != null) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
View view = LayoutInflater.from(getContext()).inflate(R.layout.menu_answer_detail_more, null);
Dialog dialog = new Dialog(getActivity());
dialog.setContentView(view);

View File

@ -32,6 +32,7 @@ import com.gh.common.util.NetworkUtils;
import com.gh.common.util.UploadImageUtils;
import com.gh.common.view.RichEditor;
import com.gh.gamecenter.R;
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.AnswerDetailActivity;
@ -42,6 +43,7 @@ import com.halo.assistant.fragment.user.SelectPortraitFragment;
import com.lightgame.config.CommonDebug;
import com.lightgame.utils.Utils;
import org.greenrobot.eventbus.EventBus;
import org.jetbrains.annotations.NotNull;
import org.json.JSONException;
import org.json.JSONObject;
@ -79,6 +81,7 @@ public class AnswerEditFragment extends NormalFragment {
public final static int SAVE_DRAFTS = 110;
public static final String ANSWER_DRAFT_CHANGE_TAG = "ANSWER_DRAFT_CHANGE_TAG";
private final static String FILE_HOST = "file:///";
private final static int SAVE_DRAFTS_INTERVAL_TIME = 15000;
private final static int SAVE_DRAFTS_TOAST_COUNT = 3;
@ -434,7 +437,6 @@ public class AnswerEditFragment extends NormalFragment {
return false;
} else {
saveAnswerDrafts(true);
// showEditBackDialog();
return true;
}
}
@ -456,13 +458,6 @@ public class AnswerEditFragment extends NormalFragment {
});
}
private void showEditBackDialog() {
DialogUtils.showCancelAlertDialog(getActivity(), "提示", "确定要退出吗?退出后回答将保存到草稿箱"
, "继续写", " 退出", null, () -> {
saveAnswerDrafts(true);
});
}
private void saveAnswerDrafts(boolean isExit) {
String editContent = mEditContent.getHtml();
for (String s : mMapImg.keySet()) {
@ -500,6 +495,7 @@ public class AnswerEditFragment extends NormalFragment {
getActivity().setResult(SAVE_DRAFTS, data);
getActivity().finish();
toast("回答已保存到草稿箱");
EventBus.getDefault().post(new EBReuse(ANSWER_DRAFT_CHANGE_TAG));
} else if (!isExit) {
if (mPostDraftsCount >= SAVE_DRAFTS_TOAST_COUNT) {
mPostDraftsCount = 0;

View File

@ -37,6 +37,7 @@ import com.gh.gamecenter.SuggestionActivity
import com.gh.gamecenter.ViewImageActivity
import com.gh.gamecenter.databinding.ActivityArticleDetailBinding
import com.gh.gamecenter.entity.CommunityEntity
import com.gh.gamecenter.entity.SpecialColumn
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.mvvm.Status
import com.gh.gamecenter.qa.article.edit.ArticleEditActivity
@ -64,6 +65,8 @@ class ArticleDetailActivity : BaseActivity() {
private var mIsShowCommentManager: Boolean = false
private var mIsRecommendsContent: Boolean = false
private var mSpecialColumn: SpecialColumn? = null
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == ARTICLE_PATCH_REQUEST && resultCode == Activity.RESULT_OK) {
@ -576,8 +579,11 @@ class ArticleDetailActivity : BaseActivity() {
UserManager.getInstance().community.name,
intent.extras.getString(EntranceUtils.KEY_PATH))
LogUtils.uploadCommunityArticle(mEntrance, mViewModel.articleId, mViewModel.detailEntity?.title
, mElapsedHelper?.elapsedTime!!, mViewModel.detailEntity?.community)
LogUtils.uploadCommunityArticle(mEntrance,
mViewModel.articleId,
mViewModel.detailEntity?.title,
mElapsedHelper?.elapsedTime!!,
mViewModel.detailEntity?.community, mSpecialColumn)
}
}
@ -585,12 +591,13 @@ class ArticleDetailActivity : BaseActivity() {
const val ARTICLE_PATCH_REQUEST = 123
@JvmStatic
fun getIntent(context: Context, community: CommunityEntity, articleId: String, entrance: String, path: String): Intent {
fun getIntent(context: Context, community: CommunityEntity, articleId: String, entrance: String, path: String, specialColumn: SpecialColumn? = null): Intent {
val intent = Intent(context, ArticleDetailActivity::class.java)
intent.putExtra(EntranceUtils.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path))
intent.putExtra(EntranceUtils.KEY_COMMUNITY_ARTICLE_ID, articleId)
intent.putExtra(EntranceUtils.KEY_COMMUNITY_DATA, community)
intent.putExtra(EntranceUtils.KEY_PATH, path)
intent.putExtra(EntranceUtils.KEY_DATA, specialColumn)
return intent
}

View File

@ -8,6 +8,7 @@ import com.gh.gamecenter.R
import com.gh.gamecenter.baselist.ListFragment
import com.gh.gamecenter.baselist.LoadType
import com.gh.gamecenter.baselist.NormalListViewModel
import com.gh.gamecenter.eventbus.EBReuse
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.article.edit.ArticleEditActivity
import com.gh.gamecenter.qa.draft.CommunityDraftWrapperActivity
@ -19,26 +20,21 @@ import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import okhttp3.ResponseBody
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import retrofit2.HttpException
class ArticleDraftFragment : ListFragment<ArticleDraftEntity, NormalListViewModel<ArticleDraftEntity>>() {
private val mApi = RetrofitManager.getInstance(context).api
private var mAdapter: ArticleDraftAdapter? = null
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == ARTICLE_DRAFT_REQUEST /*&& resultCode == Activity.RESULT_OK*/) {
mBaseHandler.postDelayed({ mListViewModel.load(LoadType.REFRESH) }, 100)
}
}
override fun provideListAdapter(): ArticleDraftAdapter {
if (mAdapter == null) {
mAdapter = ArticleDraftAdapter(context!!
, deleteCallback = { deleteDraft(it) }
, selectCallback = {
if (activity is CommunityDraftWrapperActivity) {
startActivityForResult(ArticleEditActivity.getDraftIntent(context!!, it), ARTICLE_DRAFT_REQUEST)
startActivity(ArticleEditActivity.getDraftIntent(context!!, it))
} else if (activity != null) {
val intent = Intent()
intent.putExtra(ArticleDraftEntity::class.java.simpleName, it)
@ -82,7 +78,10 @@ class ArticleDraftFragment : ListFragment<ArticleDraftEntity, NormalListViewMode
})
}
companion object {
const val ARTICLE_DRAFT_REQUEST: Int = 133
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEventMainThread(reuse: EBReuse) {
if (ArticleEditActivity.ARTICLE_DRAFT_CHANGE_TAG == reuse.type) {
mBaseHandler.postDelayed({ mListViewModel.load(LoadType.REFRESH) }, 100)
}
}
}

View File

@ -33,12 +33,14 @@ import com.gh.common.view.RichEditor
import com.gh.gamecenter.R
import com.gh.gamecenter.SuggestionActivity
import com.gh.gamecenter.entity.CommunityEntity
import com.gh.gamecenter.eventbus.EBReuse
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.article.draft.ArticleDraftActivity
import com.gh.gamecenter.qa.entity.ArticleDetailEntity
import com.gh.gamecenter.qa.entity.ArticleDraftEntity
import com.gh.gamecenter.qa.questions.edit.TagsSelectFragment
import kotterknife.bindView
import org.greenrobot.eventbus.EventBus
class ArticleEditActivity : BaseActivity() {
@ -113,6 +115,7 @@ class ArticleEditActivity : BaseActivity() {
// 保存草稿
mViewModel?.postArticleDrafts?.observe(this, Observer {
if (it!!) {
EventBus.getDefault().post(EBReuse(ARTICLE_DRAFT_CHANGE_TAG))
finish()
} else {
showDraftFailureDialog()
@ -270,6 +273,17 @@ class ArticleEditActivity : BaseActivity() {
}
private fun checkDraft(isExit: Boolean): Boolean {
val draftEntity = mViewModel?.draftEntity
// 检查草稿内容是否有变动
if (draftEntity != null) {
if (draftEntity.community.id == mViewModel?.mSelectCommunityData?.id &&
draftEntity.title == mEditTitle.text.toString() &&
mViewModel?.articleDraftsContent?.value == mEditContent.html) {
return true
}
}
if (mEditContent.html.contains("<img src")
|| !TextUtils.isEmpty(mEditContent.text)
|| !TextUtils.isEmpty(mEditTitle.text.trim())) {
@ -348,6 +362,7 @@ class ArticleEditActivity : BaseActivity() {
companion object {
const val SAVE_DRAFTS_INTERVAL_TIME = 15000
const val ARTICLE_DRAFT_REQUEST_CODE = 105
const val ARTICLE_DRAFT_CHANGE_TAG = "ANSWER_DRAFT_CHANGE_TAG"
@JvmStatic
fun getIntent(context: Context): Intent {

View File

@ -113,7 +113,7 @@ public class AskColumnRepository {
entity.get(i).setOrder(i);
}
RequestBody body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.Companion.getInstance().toJson(entity));
RequestBody body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.toJson(entity));
RetrofitManager.getInstance(mContext).getApi()
.patchUserAskColumnsTags(body, UserManager.getInstance().getUserId(), UserManager.getInstance().getCommunity().getId())

View File

@ -8,6 +8,7 @@ import com.gh.common.util.ImageUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
import com.gh.gamecenter.baselist.ListAdapter
import com.gh.gamecenter.entity.SpecialColumn
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity
import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity
@ -18,7 +19,8 @@ import com.gh.gamecenter.qa.recommends.AskQuestionsRecommendsViewHolder
class HotAdapter(context: Context,
private val mEntrance: String,
private val mPath: String) : ListAdapter<AnswerEntity>(context) {
private val mPath: String,
private val mSpecialColumn: SpecialColumn) : ListAdapter<AnswerEntity>(context) {
override fun getItemViewType(position: Int): Int {
return if (position == itemCount - 1) ItemViewType.ITEM_FOOTER else ItemViewType.ITEM_BODY
@ -50,17 +52,31 @@ class HotAdapter(context: Context,
holder.initQuestionsHotViewHolder(mContext, answerEntity, mEntrance, mPath)
holder.itemView.setOnClickListener {
if ("community_article" == answerEntity.type) {
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, UserManager.getInstance().community, answerEntity.id!!, mEntrance, mPath))
mContext.startActivity(
ArticleDetailActivity.getIntent(
mContext,
UserManager.getInstance().community,
answerEntity.id!!,
mEntrance,
mPath,
mSpecialColumn))
} else {
mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerEntity.id, mEntrance, mPath))
mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerEntity.id, mEntrance, mPath, mSpecialColumn))
}
}
holder.mAskTitle.setOnClickListener {
if ("community_article" == answerEntity.type) {
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, UserManager.getInstance().community, answerEntity.id!!, mEntrance, mPath))
mContext.startActivity(
ArticleDetailActivity.getIntent(
mContext,
UserManager.getInstance().community,
answerEntity.id!!,
mEntrance,
mPath,
mSpecialColumn))
} else {
val questions = answerEntity.questions
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, mEntrance, mPath))
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, mEntrance, mPath, mSpecialColumn))
}
}
answerEntity.user.auth?.let { ImageUtils.display(holder.badgeIcon, it.icon) }

View File

@ -4,6 +4,7 @@ import android.arch.lifecycle.ViewModelProviders
import android.view.View
import com.gh.common.util.EntranceUtils
import com.gh.gamecenter.baselist.ListFragment
import com.gh.gamecenter.entity.SpecialColumn
import com.gh.gamecenter.qa.entity.AnswerEntity
import com.gh.gamecenter.qa.entity.AskTagGroupsEntity
import com.halo.assistant.HaloApp
@ -11,16 +12,20 @@ import com.halo.assistant.HaloApp
class HotFragment : ListFragment<AnswerEntity, HotViewModel>() {
private var mAdapter: HotAdapter? = null
private var mSpecialColumn = SpecialColumn()
override fun provideListAdapter(): HotAdapter? {
if (mAdapter == null) {
mSpecialColumn.name = mListViewModel.tag ?: mListViewModel.columnTagEntity!!.name
mSpecialColumn.tab = "热门"
val path = if (mListViewModel.tag != null) {
mSpecialColumn.type = "标签专栏"
"标签专栏-热门"
} else {
mSpecialColumn.type = "社区专栏"
"专栏-热门"
}
mAdapter = HotAdapter(context!!, mEntrance, path)
mAdapter = HotAdapter(context!!, mEntrance, path, mSpecialColumn)
}
return mAdapter
}

View File

@ -8,6 +8,7 @@ import com.gh.common.util.ImageUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
import com.gh.gamecenter.baselist.ListAdapter
import com.gh.gamecenter.entity.SpecialColumn
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity
import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity
@ -18,7 +19,8 @@ import com.gh.gamecenter.qa.recommends.AskQuestionsRecommendsViewHolder
class RecommendsAdapter(context: Context,
private val mEntrance: String,
private val mPath: String) : ListAdapter<AnswerEntity>(context) {
private val mPath: String,
private val mSpecialColumn: SpecialColumn) : ListAdapter<AnswerEntity>(context) {
override fun getItemViewType(position: Int): Int {
return if (position == itemCount - 1) ItemViewType.ITEM_FOOTER else ItemViewType.ITEM_BODY
@ -50,17 +52,29 @@ class RecommendsAdapter(context: Context,
holder.initQuestionsHotViewHolder(mContext, answerEntity, mEntrance, mPath)
holder.itemView.setOnClickListener {
if ("community_article" == answerEntity.type) {
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, UserManager.getInstance().community, answerEntity.id!!, mEntrance, mPath))
mContext.startActivity(
ArticleDetailActivity.getIntent(mContext,
UserManager.getInstance().community,
answerEntity.id!!,
mEntrance,
mPath,
mSpecialColumn))
} else {
mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerEntity.id, mEntrance, mPath))
mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerEntity.id, mEntrance, mPath, mSpecialColumn))
}
}
holder.mAskTitle.setOnClickListener {
if ("community_article" == answerEntity.type) {
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, UserManager.getInstance().community, answerEntity.id!!, mEntrance, mPath))
mContext.startActivity(
ArticleDetailActivity.getIntent(mContext,
UserManager.getInstance().community,
answerEntity.id!!,
mEntrance,
mPath,
mSpecialColumn))
} else {
val questions = answerEntity.questions
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, mEntrance, mPath))
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, mEntrance, mPath, mSpecialColumn))
}
}

View File

@ -4,6 +4,7 @@ import android.arch.lifecycle.ViewModelProviders
import android.view.View
import com.gh.common.util.EntranceUtils
import com.gh.gamecenter.baselist.ListFragment
import com.gh.gamecenter.entity.SpecialColumn
import com.gh.gamecenter.qa.entity.AnswerEntity
import com.gh.gamecenter.qa.entity.AskTagGroupsEntity
import com.halo.assistant.HaloApp
@ -11,16 +12,20 @@ import com.halo.assistant.HaloApp
class RecommendsFragment : ListFragment<AnswerEntity, RecommendsViewModel>() {
private var mAdapter: RecommendsAdapter? = null
private var mSpecialColumn = SpecialColumn()
override fun provideListAdapter(): RecommendsAdapter? {
if (mAdapter == null) {
mSpecialColumn.tab = "精华"
mSpecialColumn.name = mListViewModel.tag ?: mListViewModel.columnTagEntity!!.name
val path = if (mListViewModel.tag != null) {
mSpecialColumn.type = "标签专栏"
"标签专栏-精华"
} else {
mSpecialColumn.type = "社区专栏"
"专栏-精华"
}
mAdapter = RecommendsAdapter(context!!, mEntrance, path)
mAdapter = RecommendsAdapter(context!!, mEntrance, path, mSpecialColumn)
}
return mAdapter
}

View File

@ -7,13 +7,15 @@ import com.gh.common.constant.ItemViewType
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
import com.gh.gamecenter.baselist.ListAdapter
import com.gh.gamecenter.entity.SpecialColumn
import com.gh.gamecenter.qa.entity.Questions
import com.gh.gamecenter.qa.newest.AskQuestionsNewViewHolder
import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity
class UnansweredAdapter(context: Context,
private val mEntrance: String,
private val mPath: String) : ListAdapter<Questions>(context) {
private val mPath: String,
private val mSpecialColumn: SpecialColumn) : ListAdapter<Questions>(context) {
override fun getItemViewType(position: Int): Int {
return if (position == itemCount - 1) ItemViewType.ITEM_FOOTER else ItemViewType.ITEM_BODY
@ -39,7 +41,7 @@ class UnansweredAdapter(context: Context,
val questions = mEntityList[position]
holder.initAskQuestionsNewViewHolder(questions)
holder.itemView.setOnClickListener {
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, mEntrance, mPath))
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, mEntrance, mPath, mSpecialColumn))
}
} else if (holder is FooterViewHolder) {
holder.initItemPadding()

View File

@ -4,6 +4,7 @@ import android.arch.lifecycle.ViewModelProviders
import android.view.View
import com.gh.common.util.EntranceUtils
import com.gh.gamecenter.baselist.ListFragment
import com.gh.gamecenter.entity.SpecialColumn
import com.gh.gamecenter.qa.entity.AskTagGroupsEntity
import com.gh.gamecenter.qa.entity.Questions
import com.halo.assistant.HaloApp
@ -11,16 +12,20 @@ import com.halo.assistant.HaloApp
class UnansweredFragment : ListFragment<Questions, UnansweredViewModel>() {
private var mAdapter: UnansweredAdapter? = null
private var mSpecialColumn = SpecialColumn()
override fun provideListAdapter(): UnansweredAdapter? {
mSpecialColumn.tab = "待回答"
mSpecialColumn.name = mListViewModel.tag ?: mListViewModel.columnTagEntity!!.name
if (mAdapter == null) {
val path = if (mListViewModel.tag != null) {
mSpecialColumn.type = "标签专栏"
"标签专栏-待回答"
} else {
mSpecialColumn.type = "社区专栏"
"专栏-待回答"
}
mAdapter = UnansweredAdapter(context!!, mEntrance, path)
mAdapter = UnansweredAdapter(context!!, mEntrance, path, mSpecialColumn)
}
return mAdapter
}

View File

@ -92,8 +92,10 @@ public class CommentAdapter extends ListAdapter<CommentEntity> {
String comment;
if (parentUser.getActive()) {
comment = parentUser.getComment();
holder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_5d5d5d));
} else {
comment = mContext.getString(R.string.comment_hide_hint);
holder.quoteContentTv.setTextColor(mContext.getResources().getColor(R.color.text_d5d5d5));
}
holder.quoteContentTv.setText(comment);
} else {

View File

@ -1,6 +1,7 @@
package com.gh.gamecenter.qa.entity
import android.os.Parcelable
import com.gh.gamecenter.entity.CommunityEntity
import com.gh.gamecenter.entity.MeEntity
import com.gh.gamecenter.entity.UserEntity
import com.google.gson.annotations.SerializedName
@ -20,6 +21,7 @@ data class AnswerDetailEntity(var content: String = "",
var me: MeEntity = MeEntity(),
var user: UserEntity = UserEntity(),
var vote: Int = 0,
var community: CommunityEntity = CommunityEntity(),
@SerializedName("comment_count")
var commentCount: Int = 0,
var fold: Boolean? = false) : Parcelable

View File

@ -1,6 +1,5 @@
package com.gh.gamecenter.qa.myqa;
import android.app.Activity;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
@ -27,6 +26,7 @@ import com.gh.gamecenter.retrofit.Response;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.utils.Utils;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
@ -64,6 +64,16 @@ class MyDraftAdapter extends ListAdapter<AnswerEntity> {
return oldItem == newItem;
}
@Override
protected void setListData(List<AnswerEntity> updateData) {
if (updateData != null && mEntityList != null && updateData.size() == mEntityList.size()) {
mEntityList = new ArrayList<>(updateData);
notifyDataSetChanged();
return;
}
super.setListData(updateData);
}
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1) return ItemViewType.ITEM_FOOTER;
@ -119,9 +129,9 @@ class MyDraftAdapter extends ListAdapter<AnswerEntity> {
, () -> deleteAnswerDraft(answerEntity), null);
});
draftViewHolder.itemView.setOnClickListener(v -> {
((Activity) mContext).startActivityForResult(AnswerEditActivity.getIntent(mContext,
mContext.startActivity(AnswerEditActivity.getIntent(mContext,
answerEntity.getQuestions().getId(), answerEntity.getQuestions().getTitle(),
answerEntity.getId(), true, answerEntity.getCommunityName()), MyDraftFragment.ANSWER_DRAFT_REQUEST);
answerEntity.getId(), true, answerEntity.getCommunityName()));
});
break;
case ItemViewType.ITEM_FOOTER:

View File

@ -1,7 +1,5 @@
package com.gh.gamecenter.qa.myqa;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.gh.common.util.EntranceUtils;
@ -9,11 +7,15 @@ import com.gh.gamecenter.baselist.ListAdapter;
import com.gh.gamecenter.baselist.ListFragment;
import com.gh.gamecenter.baselist.LoadType;
import com.gh.gamecenter.baselist.NormalListViewModel;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.qa.answer.edit.AnswerEditFragment;
import com.gh.gamecenter.qa.entity.AnswerEntity;
import com.gh.gamecenter.retrofit.RetrofitManager;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.List;
import io.reactivex.Observable;
@ -24,8 +26,6 @@ import io.reactivex.Observable;
public class MyDraftFragment extends ListFragment<AnswerEntity, NormalListViewModel> {
public static final int ANSWER_DRAFT_REQUEST = 101;
private MyDraftAdapter mAdapter;
public static MyDraftFragment getInstance(String entrance) {
@ -36,15 +36,6 @@ public class MyDraftFragment extends ListFragment<AnswerEntity, NormalListViewMo
return fragment;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ANSWER_DRAFT_REQUEST &&
(resultCode == Activity.RESULT_OK || resultCode == AnswerEditFragment.SAVE_DRAFTS && data != null)) {
mBaseHandler.postDelayed(() -> mListViewModel.load(LoadType.REFRESH), 100);
}
}
@Override
protected ListAdapter provideListAdapter() {
return mAdapter == null ? mAdapter = new MyDraftAdapter(getContext(), mEntrance, this, mListViewModel) : mAdapter;
@ -54,4 +45,12 @@ public class MyDraftFragment extends ListFragment<AnswerEntity, NormalListViewMo
public Observable<List<AnswerEntity>> provideDataObservable(int page) {
return RetrofitManager.getInstance(getContext()).getApi().getMyAnswerDrafts(UserManager.getInstance().getUserId(), page);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(EBReuse reuse) {
if (AnswerEditFragment.ANSWER_DRAFT_CHANGE_TAG.equals(reuse.getType())) {
mListRv.scrollToPosition(0);
mBaseHandler.postDelayed(() -> mListViewModel.load(LoadType.REFRESH), 100);
}
}
}

View File

@ -6,6 +6,7 @@ import android.os.Bundle;
import com.gh.common.util.EntranceUtils;
import com.gh.gamecenter.NormalActivity;
import com.gh.gamecenter.entity.SpecialColumn;
/**
* Created by khy on 10/04/18.
@ -23,6 +24,15 @@ public class QuestionsDetailActivity extends NormalActivity {
return getTargetIntent(context, QuestionsDetailActivity.class, QuestionsDetailFragment.class, bundle);
}
public static Intent getIntent(Context context, String questionId, String entrance, String path, SpecialColumn specialColumn) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questionId);
bundle.putString(EntranceUtils.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path));
bundle.putString(EntranceUtils.KEY_PATH, path);
bundle.putParcelable(EntranceUtils.KEY_DATA, specialColumn);
return getTargetIntent(context, QuestionsDetailActivity.class, QuestionsDetailFragment.class, bundle);
}
public static Intent getIntent(Context context, String questionId, String entrance, String path, boolean isCheckConcern) {
Bundle bundle = new Bundle();
bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, questionId);

View File

@ -46,8 +46,8 @@ import com.gh.gamecenter.baselist.ListAdapter;
import com.gh.gamecenter.baselist.ListFragment;
import com.gh.gamecenter.baselist.LoadType;
import com.gh.gamecenter.entity.MeEntity;
import com.gh.gamecenter.entity.SpecialColumn;
import com.gh.gamecenter.eventbus.EBReuse;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.mvvm.Status;
import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity;
import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity;
@ -98,6 +98,8 @@ public class QuestionsDetailFragment
public static final int QUESTIONS_EDIT_REQUEST = 111;
public static final int QUESTIONS_MODERATOR_HISTORY_REQUEST = 112;
private SpecialColumn mSpecialColumn = null;
@BindView(R.id.reuse_tv_none_data)
TextView mNoDataTv;
@ -173,6 +175,7 @@ public class QuestionsDetailFragment
mIsCheckConcern = arguments.getBoolean(EntranceUtils.KEY_CHECK_QUESTION_CONCERN, false);
mQuestionsId = arguments.getString(EntranceUtils.KEY_QUESTIONS_ID);
mPath = arguments.getString(EntranceUtils.KEY_PATH);
mSpecialColumn = arguments.getParcelable(EntranceUtils.KEY_DATA);
}
super.onCreate(savedInstanceState);
@ -241,7 +244,7 @@ public class QuestionsDetailFragment
MtaHelper.onEventWithTime(
"问题阅读量_按社区",
mElapsedHelper.getElapsedTime(),
UserManager.getInstance().getCommunity().getName(),
mQuestionsDetailEntity.getCommunity().getName(),
StringUtils.combineTwoString(mQuestionsDetailEntity.getTitle(), mQuestionsDetailEntity.getId()));
MtaHelper.onEventWithTime(
@ -253,13 +256,18 @@ public class QuestionsDetailFragment
MtaHelper.onEventWithTime(
"问题阅读量_社区加位置",
mElapsedHelper.getElapsedTime(),
UserManager.getInstance().getCommunity().getName(),
mQuestionsDetailEntity.getCommunity().getName(),
mPath);
Questions questions = new Questions();
questions.setId(mQuestionsId);
questions.setTitle(mQuestionsDetailEntity.getTitle());
LogUtils.uploadQuestionReadTime(mEntrance, mElapsedHelper.getElapsedTime(), questions);
LogUtils.uploadQuestionReadTime(mEntrance,
mElapsedHelper.getElapsedTime(),
questions,
mQuestionsDetailEntity.getCommunity().getId(),
mQuestionsDetailEntity.getCommunity().getName(),
mSpecialColumn);
}
}

View File

@ -251,7 +251,7 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica
ArrayList()
}
val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.getInstance().toJson(entity))
val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.toJson(entity))
val observable = if (questionEntity != null) {
if (!isModeratorPatch) {
questionEntity?.images = entity.images
@ -297,7 +297,7 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica
} else {
ArrayList()
}
GsonUtils.getInstance().toJson(entity)
GsonUtils.toJson(entity)
}
processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", true))

View File

@ -24,6 +24,7 @@ import com.gh.common.util.TextHelper;
import com.gh.gamecenter.R;
import com.gh.gamecenter.db.AskSearchHistoryDao;
import com.gh.gamecenter.eventbus.EBSearch;
import com.gh.gamecenter.manager.UserManager;
import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity;
import com.gh.gamecenter.qa.search.history.HistoryFragment;
import com.lightgame.utils.Util_System_Keyboard;
@ -130,7 +131,7 @@ public class AskSearchActivity extends BaseActivity {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
Util_System_Keyboard.hideSoftKeyboard(this, mSearchEt);
search();
mDao.add(mSearchKey);
mDao.add(mSearchKey, UserManager.getInstance().getCommunity().getId());
}
return false;
});
@ -160,7 +161,7 @@ public class AskSearchActivity extends BaseActivity {
}
}
});
TextHelper.limitTheLengthOfEditText(mSearchEt, 50, ()-> {
TextHelper.limitTheLengthOfEditText(mSearchEt, 50, () -> {
Utils.toast(mSearchEt.getContext(), "最多输入50个字");
});
}
@ -177,7 +178,7 @@ public class AskSearchActivity extends BaseActivity {
} else if (v.getId() == R.id.bar_question_btn) {
if (!TextUtils.isEmpty(mColumnId) || !TextUtils.isEmpty(mQuestionTag)) {
search();
mDao.add(mSearchKey);
mDao.add(mSearchKey, UserManager.getInstance().getCommunity().getId());
Util_System_Keyboard.hideSoftKeyboard(this, mSearchEt);
} else {
String entrance;

View File

@ -5,6 +5,7 @@ import android.text.TextUtils
import com.gh.common.constant.ItemViewType
import com.gh.gamecenter.baselist.ListAdapter
import com.gh.gamecenter.db.AskSearchHistoryDao
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity
import com.gh.gamecenter.qa.entity.Questions
import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity
@ -61,13 +62,13 @@ abstract class BaseAskSearchAdapter<T>(context: Context, val mEntrance: String,
protected fun skipAnswerDetail(answerId: String, tracers: String, path: String) {
mContext.startActivity(AnswerDetailActivity.getIntent(mContext, answerId, tracers, path))
postSearchLog()
mDao.add(mSearchKey)
mDao.add(mSearchKey, UserManager.getInstance().community.id)
}
protected fun skipQuestionDetail(questions: Questions, tracers: String, path: String) {
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, tracers, path))
postSearchLog()
mDao.add(mSearchKey)
mDao.add(mSearchKey, UserManager.getInstance().community.id)
}
private fun postSearchLog() {

View File

@ -13,6 +13,7 @@ import com.gh.common.util.DisplayUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.db.AskSearchHistoryDao
import com.gh.gamecenter.eventbus.EBSearch
import com.gh.gamecenter.manager.UserManager
import com.lightgame.adapter.BaseRecyclerAdapter
import com.lightgame.utils.Util_System_Keyboard
import org.greenrobot.eventbus.EventBus
@ -22,7 +23,7 @@ class HistoryFragmentAdapter(context: Context, dao: AskSearchHistoryDao, history
private val mDao: AskSearchHistoryDao = dao
private val mHistoryList: MutableList<String> = dao.all
private val mHistoryList: MutableList<String> = dao.getAll(UserManager.getInstance().community.id)
init {
if (mHistoryList.isEmpty()) {
@ -51,7 +52,7 @@ class HistoryFragmentAdapter(context: Context, dao: AskSearchHistoryDao, history
holder.textView.setTextColor(ContextCompat.getColor(mContext, R.color.title))
holder.itemView.setOnClickListener { v ->
val key = holder.textView.text.toString()
mDao.add(key)
mDao.add(key, UserManager.getInstance().community.id)
EventBus.getDefault().post(EBSearch("askHistory", key))
Util_System_Keyboard.hideSoftKeyboardByIBinder(mContext, v.windowToken)
}

View File

@ -10,6 +10,7 @@ import com.gh.common.constant.ItemViewType
import com.gh.common.util.NumberUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
import com.gh.gamecenter.manager.UserManager
import com.gh.gamecenter.qa.entity.AskSearchEntity
import com.gh.gamecenter.qa.entity.Questions
import com.gh.gamecenter.qa.search.AskSearchQuestionItemViewHolder
@ -47,7 +48,7 @@ class QuestionAdapter(context: Context, entrance: String, path: String) : BaseAs
questions.id = entity.questions.id
questions.title = entity.questions.title
skipQuestionDetail(questions, mEntrance, mPath)
mDao.add(mSearchKey)
mDao.add(mSearchKey, UserManager.getInstance().community.id)
}
}
ItemViewType.ITEM_FOOTER -> {

View File

@ -49,8 +49,15 @@ class OpenedAdapter(context: Context, val mListViewModel: OpenedViewModel) : Lis
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is OpenedViewHolder) {
val entity = mEntityList[position]
val isSelect = if (mContext is MainActivity) false else mCommunityId == entity.id
holder.bind.entity = entity
holder.bind.isSelect = if (mContext is MainActivity) false else mCommunityId == entity.id
holder.bind.isSelect = isSelect
if (isSelect) {
holder.bind.selectBackground.visibility = View.VISIBLE
} else {
holder.bind.selectBackground.visibility = View.GONE
}
holder.itemView.setOnClickListener {
if (mContext is CommunitiesSelectActivity && !UserManager.getInstance().community.id.isEmpty()) {
UserManager.getInstance().setCommunityData(CommunityEntity(entity.id!!, entity.name!!))

View File

@ -35,11 +35,6 @@ public class VotingFragment extends ListFragment<AskGameSelectEntity, VotingView
private VotingAdapter mAdapter;
@Override
protected int getLayoutId() {
return R.layout.fragment_ask_selectgame;
}
@Override
protected VotingAdapter provideListAdapter() {
return mAdapter == null ? mAdapter = new VotingAdapter(getContext(), this) : mAdapter;

View File

@ -119,7 +119,7 @@ public class AskSubjectAdapter extends ListAdapter<AnswerEntity> {
Questions questions = entity.getQuestions();
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path));
} else {
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getCommunityId(), ""), entity.getId(), mEntrance, path));
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getCommunityId(), ""), entity.getId(), mEntrance, path, null));
}
});
@ -131,7 +131,7 @@ public class AskSubjectAdapter extends ListAdapter<AnswerEntity> {
if ("answer".equals(entity.getType())) {
mContext.startActivity(AnswerDetailActivity.getIntent(mContext, entity.getId(), mEntrance, path));
} else {
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getCommunityId(), ""), entity.getId(), mEntrance, path));
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getCommunityId(), ""), entity.getId(), mEntrance, path, null));
}
});
}

Some files were not shown because too many files have changed in this diff Show More