Compare commits
53 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3e512634c6 | |||
| 7045354808 | |||
| dbcc97a250 | |||
| 050081b7b1 | |||
| 993d1e7635 | |||
| a86a3c1f71 | |||
| b0a192ad9a | |||
| ea7b478c6b | |||
| b673383f59 | |||
| 06ae366b74 | |||
| 6b9cf7094e | |||
| 5ae22bd2bc | |||
| e951551531 | |||
| 272e5fb6cc | |||
| 7dc17d09c1 | |||
| cfacbe739d | |||
| 0a72226ba5 | |||
| 5f22a14643 | |||
| 5562e38c2f | |||
| f9027f7a61 | |||
| 6d0e437ad4 | |||
| 3abc53d3b3 | |||
| d0e4c2c3ab | |||
| 5be50c1638 | |||
| 7c525aec79 | |||
| 63d5edf892 | |||
| c9f2cf178a | |||
| fc98de3bc0 | |||
| dd8360f5e8 | |||
| bc9b815b47 | |||
| 2a93995221 | |||
| 0e93f6521c | |||
| b3a6d0ce94 | |||
| de60d05190 | |||
| 2a2ce9a490 | |||
| 639644e3c3 | |||
| 2378e6e94e | |||
| 87d9feae70 | |||
| 4a93d129bb | |||
| 39e5e2e9f9 | |||
| 8a5f777c65 | |||
| 22c693e042 | |||
| 36d04f5841 | |||
| 409123337d | |||
| b180a210cb | |||
| 32dfdc4d08 | |||
| 4d46888995 | |||
| 69db836231 | |||
| f82b9ad308 | |||
| 3ac91b1216 | |||
| 8d4b3e0851 | |||
| 67d8f46217 | |||
| f357136936 |
@ -30,4 +30,9 @@
|
||||
- 删除TINKER_VERISON_NAME
|
||||
- tinker打包方式变更(以小版本作为Base包,防止与数据后台小版本更新发生冲突)
|
||||
* 社区增加版主功能(版主可以对存在的相关内容进行修改/隐藏操作,内容包括问题/回答/回答评论)
|
||||
* 社区互动引导优化(问答推荐增加`推荐关注`,回答详情增加一些交互动效)
|
||||
* 社区互动引导优化(问答推荐增加`推荐关注`,回答详情增加一些交互动效)
|
||||
|
||||
### Ver 3.6.1
|
||||
* 可以后台控制关闭资讯功能
|
||||
* 版块、分类、专题详情、游戏详情、礼包详情增加预览骨架
|
||||
* 下载按钮状态可以通过接口屏蔽相应的包
|
||||
@ -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());
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
/**
|
||||
* 规则:最多三条消息,以旧换新
|
||||
*
|
||||
|
||||
@ -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()) {
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@ -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,
|
||||
|
||||
@ -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),
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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) {
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
113
app/src/main/java/com/gh/common/util/GameRepositoryHelper.kt
Normal file
113
app/src/main/java/com/gh/common/util/GameRepositoryHelper.kt
Normal 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)
|
||||
}
|
||||
|
||||
}
|
||||
@ -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) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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 {
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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); // 反向颜色
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
// }
|
||||
//}
|
||||
@ -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
|
||||
|
||||
@ -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()) {
|
||||
|
||||
@ -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"));
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
|
||||
@ -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<>();
|
||||
|
||||
@ -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 + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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 "官方版"
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
)
|
||||
|
||||
}
|
||||
@ -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
|
||||
@ -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
|
||||
@ -19,4 +19,8 @@ class VersionVoteEntity {
|
||||
var me: MeEntity? = null
|
||||
|
||||
var reply: String? = null
|
||||
|
||||
var open : Boolean = true
|
||||
|
||||
var link: LinkEntity = LinkEntity()
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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(), "(工具栏)");
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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])
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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!!)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
// 登录事件
|
||||
|
||||
@ -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())
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()) {
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
@ -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:
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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())
|
||||
|
||||
@ -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) }
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
@ -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:
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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 -> {
|
||||
|
||||
@ -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!!))
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
Reference in New Issue
Block a user