diff --git a/app/build.gradle b/app/build.gradle
index b20d77649c..7975d04a73 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -159,9 +159,6 @@ android {
buildConfigField "String", "UMENG_APPKEY", "\"${UMENG_APPKEY}\""
buildConfigField "String", "UMENG_MESSAGE_SECRET", "\"${UMENG_MESSAGE_SECRET}\""
buildConfigField "String", "BUGLY_APPID", "\"${BUGLY_APPID}\""
-
- manifestPlaceholders.put("optionalPermission1", "android.permission.INTERNET")
- manifestPlaceholders.put("optionalPermission2", "android.permission.INTERNET")
}
// internal test dev host
internal {
@@ -175,9 +172,6 @@ android {
buildConfigField "String", "UMENG_APPKEY", "\"${DEV_UMENG_APPKEY}\""
buildConfigField "String", "UMENG_MESSAGE_SECRET", "\"${DEV_UMENG_MESSAGE_SECRET}\""
buildConfigField "String", "BUGLY_APPID", "\"${DEV_BUGLY_APPID}\""
-
- manifestPlaceholders.put("optionalPermission1", "android.permission.READ_CALENDAR")
- manifestPlaceholders.put("optionalPermission2", "android.permission.WRITE_CALENDAR")
}
tea {
@@ -192,9 +186,6 @@ android {
buildConfigField "String", "BUGLY_APPID", "\"${BUGLY_APPID}\""
manifestPlaceholders.put("APPLOG_SCHEME", "rangersapplog.byAx6uYt".toLowerCase())
-
- manifestPlaceholders.put("optionalPermission1", "android.permission.INTERNET")
- manifestPlaceholders.put("optionalPermission2", "android.permission.INTERNET")
}
gdt {
@@ -207,9 +198,6 @@ android {
buildConfigField "String", "UMENG_APPKEY", "\"${UMENG_APPKEY}\""
buildConfigField "String", "UMENG_MESSAGE_SECRET", "\"${UMENG_MESSAGE_SECRET}\""
buildConfigField "String", "BUGLY_APPID", "\"${BUGLY_APPID}\""
-
- manifestPlaceholders.put("optionalPermission1", "android.permission.INTERNET")
- manifestPlaceholders.put("optionalPermission2", "android.permission.INTERNET")
}
}
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5083acb860..7654d829c4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,15 +23,9 @@
-
-
-
-
-
-
@@ -86,6 +80,11 @@
android:name="io.sentry.auto-init"
android:value="false" />
+
+
+
+
+
diff --git a/app/src/main/java/com/gh/base/BaseActivity.java b/app/src/main/java/com/gh/base/BaseActivity.java
index 9c07bd990e..99177b250a 100644
--- a/app/src/main/java/com/gh/base/BaseActivity.java
+++ b/app/src/main/java/com/gh/base/BaseActivity.java
@@ -158,9 +158,11 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
}
if (this.getClass().getName().equals(xapkUnzipActivity) && !TextUtils.isEmpty(xapkUrl)) {
DownloadEntity downloadEntity = DownloadManager.getInstance(this).getDownloadEntityByUrl(xapkUrl);
- PackageInstaller.install(this, downloadEntity, false);
- SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "");
- SPUtils.setString(Constants.SP_XAPK_URL, "");
+ if (downloadEntity != null) {
+ PackageInstaller.install(this, downloadEntity, false);
+ SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "");
+ SPUtils.setString(Constants.SP_XAPK_URL, "");
+ }
}
}
diff --git a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt
index 1f9da39d48..e5f74bffb6 100644
--- a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt
+++ b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt
@@ -379,11 +379,12 @@ object DefaultUrlHandler {
DirectUtils.directToAnswerDetail(context, answerId, entrance, "")
}
}
- contains("communities") && contains("article") -> {
+ ((contains("bbs")) && contains("article") ||
+ (contains("communities")) && contains("article")) -> {
var communityId = ""
var type = ""
var typeId = ""
- val split = replace("/communities", "").replace(".html", "").split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
+ val split = replace("/communities", "").replace("/bbs", "").replace(".html", "").split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (text in split) {
if (TextUtils.isEmpty(communityId)) {
communityId = text
@@ -397,7 +398,7 @@ object DefaultUrlHandler {
typeId = text
}
}
- if ("articles" == type) {
+ if ("articles" == type || "article" == type) {
DirectUtils.directToCommunityArticle(
context, typeId, communityId,
entrance, "文章链接")
diff --git a/app/src/main/java/com/gh/common/constant/Constants.java b/app/src/main/java/com/gh/common/constant/Constants.java
index 7b96055328..485f734ece 100644
--- a/app/src/main/java/com/gh/common/constant/Constants.java
+++ b/app/src/main/java/com/gh/common/constant/Constants.java
@@ -176,9 +176,6 @@ public class Constants {
// 是否已经填写邀请码
public static final String SP_HAS_COMPLETE_INVITE_CODE = "has_complete_invite_code";
- // 签到提醒开关
- public static final String SP_SIGN_REMIND = "sign_remind";
-
// 补充配置项
public static final String SP_NEW_SETTINGS = "new_settings";
@@ -190,9 +187,6 @@ public class Constants {
// 悬浮图标Y值
public static final String SP_TASK_FLOAT_LAST_Y = "task_float_last_y";
- // 日程ID
- public static final String SP_SCHEDULE_ID = "schedule_id";
-
// 是否第一次进入新分类2.0
public static final String SP_FIRST_ENTER_CATEGORY_V2 = "first_enter_category_v2";
@@ -262,7 +256,7 @@ public class Constants {
// 邀请好友
public static final String INVITE_FRIENDS_ADDRESS_DEV = "https://static-web.ghzs.com/ghzs_activity_dev/inviteFriends.html#/invite";
- public static final String INVITE_FRIENDS_ADDRESS = "https://static-web.ghzs.com/ghzs_activity/inviteFriends.html#/invite";
+ public static final String INVITE_FRIENDS_ADDRESS = "https://static-web.ghzs.com/ghzs_activity_prod/inviteFriends.html#/invite";
// 等级页面
public static final String LEVEL_ADDRESS_DEV = "https://static-web.ghzs.com/ghzs-userhome-dev/index.html#/level";
diff --git a/app/src/main/java/com/gh/common/dialog/PackageCheckDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/PackageCheckDialogFragment.kt
index 2f4f14ab59..0838f5b080 100644
--- a/app/src/main/java/com/gh/common/dialog/PackageCheckDialogFragment.kt
+++ b/app/src/main/java/com/gh/common/dialog/PackageCheckDialogFragment.kt
@@ -42,6 +42,7 @@ import org.greenrobot.eventbus.ThreadMode
/**
* 包名检测弹窗
*/
+// TODO 将 gameEntity 放到 argument 里再取出,避免重建时为空
class PackageCheckDialogFragment : BaseDialogFragment() {
private lateinit var binding: FragmentPackageCheckBinding
@@ -73,7 +74,9 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
- LogUtils.uploadPackageCheck("pkg_check_pop_click", "出现弹窗", gameEntity, "", "", "", "")
+ gameEntity?.let {
+ LogUtils.uploadPackageCheck("pkg_check_pop_click", "出现弹窗", it, "", "", "", "")
+ }
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
diff --git a/app/src/main/java/com/gh/common/util/CalendarHelper.kt b/app/src/main/java/com/gh/common/util/CalendarHelper.kt
deleted file mode 100644
index fca7644395..0000000000
--- a/app/src/main/java/com/gh/common/util/CalendarHelper.kt
+++ /dev/null
@@ -1,190 +0,0 @@
-package com.gh.common.util
-
-import android.content.ContentUris
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import android.net.Uri
-import android.provider.CalendarContract.*
-import android.text.TextUtils
-import com.gh.common.constant.Constants
-import com.gh.gamecenter.BuildConfig
-import com.gh.gamecenter.R
-import java.util.*
-
-
-/**
- * 签到日历提醒辅助类
- */
-object CalendarHelper {
-
- private val CALENDAR_URL = Calendars.CONTENT_URI
- private val CALENDAR_EVENT_URL = Events.CONTENT_URI
- private val CALENDAR_REMINDER_URL = Reminders.CONTENT_URI
- private const val CALENDARS_NAME = "guanghuan"
- private const val CALENDARS_ACCOUNT_TYPE = BuildConfig.APPLICATION_ID
- private const val CALENDARS_DISPLAY_NAME = "光环助手"
-
-
- private fun checkAndAddCalendarAccount(context: Context): Int {
- val oldId: Int = checkCalendarAccount(context)
- return if (oldId >= 0) {
- oldId
- } else {
- val addId: Long = addCalendarAccount(context)
- if (addId >= 0) {
- checkCalendarAccount(context)
- } else {
- -1
- }
- }
- }
-
- private fun checkCalendarAccount(context: Context): Int {
- val userCursor: Cursor? = context.contentResolver.query(CALENDAR_URL,
- null, null, null, null)
- return userCursor?.use {
- val count: Int = it.count
- if (count > 0) { // 存在现有账户,取第一个账户的id返回
- it.moveToFirst()
- it.getInt(userCursor.getColumnIndex(Calendars._ID))
- } else {
- -1
- }
- } ?: -1
- }
-
- private fun addCalendarAccount(context: Context): Long {
- val value = ContentValues().apply {
- put(Calendars.NAME, CALENDARS_NAME)
- put(Calendars.ACCOUNT_NAME, CALENDARS_DISPLAY_NAME)
- put(Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE)
- put(Calendars.CALENDAR_DISPLAY_NAME, CALENDARS_DISPLAY_NAME)
- put(Calendars.VISIBLE, 1)
- put(Calendars.CALENDAR_COLOR, R.color.theme.toColor())
- put(Calendars.CALENDAR_ACCESS_LEVEL, Calendars.CAL_ACCESS_OWNER)
- put(Calendars.SYNC_EVENTS, 1)
- put(Calendars.CALENDAR_TIME_ZONE, TimeZone.getDefault().id)
- put(Calendars.OWNER_ACCOUNT, CALENDARS_NAME)
- put(Calendars.CAN_ORGANIZER_RESPOND, 0)
- }
-
- var calendarUri: Uri = CALENDAR_URL
- calendarUri = calendarUri.buildUpon()
- .appendQueryParameter(CALLER_IS_SYNCADAPTER, "true")
- .appendQueryParameter(Calendars.ACCOUNT_NAME, CALENDARS_NAME)
- .appendQueryParameter(Calendars.ACCOUNT_TYPE, CALENDARS_ACCOUNT_TYPE)
- .build()
- val result: Uri? = context.contentResolver.insert(calendarUri, value)
- return if (result == null) -1 else ContentUris.parseId(result)
- }
-
- fun insertCalendarEvent(context: Context,
- title: String,
- description: String,
- beginTimeMillis: Long,
- endTimeMillis: Long,
- rRule: String?): Boolean {
- val calendarId = checkAndAddCalendarAccount(context) // 获取日历账户的id
- if (calendarId < 0) { // 获取账户id失败直接返回,添加日历事件失败
- return false
- }
-
- // 判断之前是否已经插入日程,有就返回
- val eventCursor = context.contentResolver.query(CALENDAR_EVENT_URL,
- null, null, null, null)
- eventCursor?.use {
- if (it.count > 0) {
- // 遍历所有事件,找到title跟需要查询的title一样的项
- it.moveToFirst()
- while (!it.isAfterLast) {
- val eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"))
- if (!TextUtils.isEmpty(title) && title == eventTitle) {
- return true
- }
- it.moveToNext()
- }
- }
- }
-
- try {
- /** 插入日程 */
- val eventValues = ContentValues().apply {
- if (rRule != null) put(Events.RRULE, rRule)
- put(Events.DTSTART, beginTimeMillis)
- put(Events.DTEND, endTimeMillis)
- put(Events.TITLE, title)
- put(Events.DESCRIPTION, description)
- put(Events.CALENDAR_ID, calendarId)
- put(Events.EVENT_TIMEZONE, TimeZone.getDefault().id)
- }
-
- // 检测是否存在已保存的日程ID,有则更新
- val scheduleId = SPUtils.getLong(Constants.SP_SCHEDULE_ID)
- if (scheduleId != 0L) {
- val updateUri = ContentUris.withAppendedId(CALENDAR_EVENT_URL, scheduleId)
- val rows = context.contentResolver.update(updateUri, eventValues, null, null)
- if (rows != -1) return true
- }
-
- val eUri: Uri? = context.contentResolver.insert(CALENDAR_EVENT_URL, eventValues)
- val eventId = eUri?.let { ContentUris.parseId(it) }
- if (eventId == 0L) { // 插入失败
- return false
- } else {
- // 保存日程ID
- SPUtils.setLong(Constants.SP_SCHEDULE_ID, eventId ?: 0L)
- }
- /** 插入提醒 - 依赖插入日程成功 */
- val reminderValues = ContentValues()
- // uri.getLastPathSegment();
- reminderValues.put(Reminders.EVENT_ID, eventId)
- reminderValues.put(Reminders.MINUTES, 0) // 准时提醒
- reminderValues.put(Reminders.METHOD, Reminders.METHOD_ALERT)
- val rUri: Uri? = context.contentResolver.insert(CALENDAR_REMINDER_URL, reminderValues)
- if (rUri == null || ContentUris.parseId(rUri) == 0L) {
- return false
- }
- } catch (e: Exception) {
- e.printStackTrace()
- return false
- }
- return true
- }
-
- fun deleteCalendarEvent(context: Context,
- title: String): Boolean {
-
- // 检测是否存在已保存的日程ID,有则根据该ID删除
- val scheduleId = SPUtils.getLong(Constants.SP_SCHEDULE_ID)
- if (scheduleId != 0L) {
- val deleteUri = ContentUris.withAppendedId(CALENDAR_EVENT_URL, scheduleId)
- val rows = context.contentResolver.delete(deleteUri, null, null)
- if (rows != -1) {
- SPUtils.setLong(Constants.SP_SCHEDULE_ID, 0L)
- return true
- }
- }
- val eventCursor = context.contentResolver.query(CALENDAR_EVENT_URL,
- null, null, null, null)
- eventCursor?.use {
- if (it.count > 0) {
- // 遍历所有事件,找到title跟需要查询的title一样的项
- it.moveToFirst()
- while (!it.isAfterLast) {
- val eventTitle = eventCursor.getString(eventCursor.getColumnIndex("title"))
- if (!TextUtils.isEmpty(title) && title == eventTitle) {
- val id = eventCursor.getInt(eventCursor
- .getColumnIndex(Calendars._ID)) // 取得id
- val deleteUri = ContentUris.withAppendedId(CALENDAR_EVENT_URL, id.toLong())
- val rows = context.contentResolver.delete(deleteUri, null, null)
- SPUtils.setLong(Constants.SP_SCHEDULE_ID, 0L)
- return rows != -1
- }
- it.moveToNext()
- }
- }
- }
- return false
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java
index 1a5a06eb42..35d845943c 100644
--- a/app/src/main/java/com/gh/common/util/DialogUtils.java
+++ b/app/src/main/java/com/gh/common/util/DialogUtils.java
@@ -2111,19 +2111,6 @@ public class DialogUtils {
dialog.show();
}
- public static void showSignRemindSuccessDialog(Context context) {
- context = checkDialogContext(context);
-
- final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent);
-
- View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_sign_remind_success, null);
- contentView.findViewById(R.id.closeIv).setOnClickListener(v -> dialog.dismiss());
-
- dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
- dialog.setContentView(contentView);
- dialog.show();
- }
-
public static void showBindPhoneDialog(Context context, ConfirmListener listener) {
context = checkDialogContext(context);
diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java
index 4bee863678..b371fbfd54 100644
--- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java
+++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java
@@ -743,8 +743,6 @@ public class DownloadItemUtils {
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style);
downloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
DeviceRemindDialog.Companion.showDeviceRemindDialog(context, gameEntity);
-
- EnergyTaskHelper.postEnergyTask("download_game", gameEntity.getId(), gameEntity.getApk().get(0).getPackageName());
} else {
Utils.toast(context, msg);
}
diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt
index 12f2a62685..10faaee4ff 100644
--- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt
+++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt
@@ -8,6 +8,7 @@ import com.gh.common.exposure.ExposureUtils
import com.gh.common.exposure.meta.MetaUtil
import com.gh.common.simulator.SimulatorDownloadManager
import com.gh.common.simulator.SimulatorGameManager
+import com.gh.common.util.EnergyTaskHelper.postEnergyTask
import com.gh.common.xapk.XapkInstaller
import com.gh.download.DownloadDataHelper
import com.gh.download.DownloadManager
@@ -126,6 +127,7 @@ object DownloadObserver {
} else {
statDoneEvent(downloadEntity)
+ postEnergyTask("download_game", downloadEntity.gameId, downloadEntity.packageName)
val platform = PlatformUtils.getInstance(mApplication)
.getPlatformName(downloadEntity.platform)
if (platform != null) {
diff --git a/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt b/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt
index cd4b9a6a2d..19a9cdec47 100644
--- a/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt
+++ b/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt
@@ -139,7 +139,9 @@ object EnergyTaskHelper {
isFocusable = true
isFocusableInTouchMode = true
setOnClickListener {
- currentActivity.startActivity(EnergyCenterActivity.getIntent(currentActivity))
+ if (currentActivity::class.java.simpleName != EnergyCenterActivity::class.java.simpleName) {
+ currentActivity.startActivity(EnergyCenterActivity.getIntent(currentActivity))
+ }
}
}
val popWindow = PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT, 88F.dip2px())
diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java
index 095ade8041..982e02238d 100644
--- a/app/src/main/java/com/gh/common/util/EntranceUtils.java
+++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java
@@ -193,6 +193,7 @@ public class EntranceUtils {
public static final String KEY_UUID = "uuid";
public static final String KEY_IS_HOME_VIDEO = "isHomeVideo";
public static final String KEY_IS_HOME = "isHome";
+ public static final String KEY_TAB_COUNT = "tab_count";
public static final String KEY_WEB_SHARE = "webShare";
public static final String KEY_ACTIVITY_NAME = "activityName";//活动名称
public static final String KEY_PAGINATION_TYPE = "paginationType";//活动分页方式
diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt
index 34f469b81c..4c731bf9fc 100644
--- a/app/src/main/java/com/gh/common/util/Extensions.kt
+++ b/app/src/main/java/com/gh/common/util/Extensions.kt
@@ -70,11 +70,16 @@ inline fun FragmentActivity.viewModelProvider(
/**
* 创建以 activity 为观察者上下文的 viewModel
+ * 额外的 key: 用于区分单 activity 多 viewModel 的情况 (如首页tab)
*/
inline fun Fragment.viewModelProviderFromParent(
- provider: ViewModelProvider.Factory? = null
-) =
- ViewModelProviders.of(requireActivity(), provider).get(VM::class.java)
+ provider: ViewModelProvider.Factory? = null,
+ key: String = ""
+) = if (key.isEmpty()) {
+ ViewModelProviders.of(requireActivity(), provider).get(VM::class.java)
+} else {
+ ViewModelProviders.of(requireActivity(), provider).get(key, VM::class.java)
+}
/**
* 创建以 activity 为观察者上下文的 viewModel
@@ -484,8 +489,8 @@ fun Float.sp2px(): Int {
return (this * scale + 0.5f).toInt()
}
-fun Float.roundTo(n : Int) : Float {
- return "%.${n}f".format(this).toFloat()
+fun Float.roundTo(n: Int): Float {
+ return "%.${n}f".format(Locale.CHINA, this).toFloat()
}
/**
@@ -544,14 +549,6 @@ fun Fragment.checkStoragePermissionBeforeAction(action: (() -> Unit)) {
})
}
-fun Fragment.checkCalendarPermissionBeforeAction(action: (() -> Unit)) {
- PermissionHelper.checkCalendarPermissionBeforeAction(requireContext(), object : EmptyCallback {
- override fun onCallback() {
- action.invoke()
- }
- })
-}
-
fun FragmentActivity.checkReadPhoneStateAndStoragePermissionBeforeAction(action: (() -> Unit)) {
PermissionHelper.checkReadPhoneStateAndStoragePermissionBeforeAction(this, object : EmptyCallback {
override fun onCallback() {
@@ -576,14 +573,6 @@ fun FragmentActivity.checkStoragePermissionBeforeAction(action: (() -> Unit)) {
})
}
-fun FragmentActivity.checkCalendarPermissionBeforeAction(action: (() -> Unit)) {
- PermissionHelper.checkCalendarPermissionBeforeAction(this, object : EmptyCallback {
- override fun onCallback() {
- action.invoke()
- }
- })
-}
-
/**
* List related.
*/
diff --git a/app/src/main/java/com/gh/common/util/HomePluggableHelper.kt b/app/src/main/java/com/gh/common/util/HomePluggableHelper.kt
index c2e75b8477..1e87908ee1 100644
--- a/app/src/main/java/com/gh/common/util/HomePluggableHelper.kt
+++ b/app/src/main/java/com/gh/common/util/HomePluggableHelper.kt
@@ -24,17 +24,24 @@ object HomePluggableHelper {
val apkList = gameEntity.getApk()
if (apkList.isNotEmpty()) {
val apk = apkList.first()
- val filterData = mHomePluggableFilterDao.getDataByPkgName(apk.packageName)
- if (filterData?.active == true) {
- val filterTag = filterData.tag
- return filterTag != "never" && apk.version != filterTag
+ tryCatchInRelease {
+ val filterData = mHomePluggableFilterDao.getDataByPkgName(apk.packageName)
+ if (filterData?.active == true) {
+ val filterTag = filterData.tag
+ return filterTag != "never" && apk.version != filterTag
+ }
}
}
return true
}
@JvmStatic
- fun getPermanentInactivePluggablePackage() = mHomePluggableFilterDao.getDataByTag("never")
+ fun getPermanentInactivePluggablePackage(): List? {
+ tryCatchInRelease {
+ return mHomePluggableFilterDao.getDataByTag("never")
+ }
+ return emptyList()
+ }
@JvmStatic
fun activationFilterData() {
diff --git a/app/src/main/java/com/gh/common/util/ImageUtils.kt b/app/src/main/java/com/gh/common/util/ImageUtils.kt
index ba50e66860..356fd00b82 100644
--- a/app/src/main/java/com/gh/common/util/ImageUtils.kt
+++ b/app/src/main/java/com/gh/common/util/ImageUtils.kt
@@ -484,4 +484,22 @@ object ImageUtils {
fun getVideoSnapshot(videoUrl: String, progress: Long): String {
return "$videoUrl?x-oss-process=video/snapshot,t_$progress,f_jpg,w_0,h_0"
}
+
+ /**
+ * 虽然在 Application 里有使用子线程初始化但有可能出现初始化超时(卡住?)的情况,
+ * 这里反射获取 sDraweecontrollerbuildersupplier 根据是否有值确定是否被初始化了
+ */
+ @JvmStatic
+ fun isFrescoInitialized(): Boolean {
+ val clazz = SimpleDraweeView::class.java
+ return try {
+ val field =
+ clazz.getDeclaredField("sDraweecontrollerbuildersupplier")
+ field.isAccessible = true
+ val obj = field[SimpleDraweeView::class.java]
+ obj != null
+ } catch (ignore: java.lang.Exception) {
+ false
+ }
+ }
}
diff --git a/app/src/main/java/com/gh/common/util/LogUtils.java b/app/src/main/java/com/gh/common/util/LogUtils.java
index eba43e674e..7710b9e81f 100644
--- a/app/src/main/java/com/gh/common/util/LogUtils.java
+++ b/app/src/main/java/com/gh/common/util/LogUtils.java
@@ -272,6 +272,7 @@ public class LogUtils {
object.put("device_model", android.os.Build.MODEL);
object.put("jnfj", MetaUtil.getBase64EncodedIMEI());
object.put("G_ID", UserManager.getInstance().getDeviceId());
+ object.put("oaid", HaloApp.getInstance().getOAID());
} catch (JSONException e) {
e.printStackTrace();
}
@@ -602,6 +603,7 @@ public class LogUtils {
metaObject.put("network", meta.getNetwork());
metaObject.put("os", meta.getOs());
metaObject.put("userId", meta.getUserId());
+ metaObject.put("oaid", HaloApp.getInstance().getOAID());
} catch (JSONException e) {
e.printStackTrace();
@@ -954,6 +956,8 @@ public class LogUtils {
}
public static void uploadPackageCheck(String event, String action, GameEntity gameEntity, String linkTitle, String linkDesc, String downloadGameId, String downloadGameName) {
+ if (gameEntity == null) return;
+
PackageDialogEntity packageDialog = gameEntity.getPackageDialog();
if (packageDialog == null) return;
JSONObject object = new JSONObject();
diff --git a/app/src/main/java/com/gh/common/util/PermissionHelper.kt b/app/src/main/java/com/gh/common/util/PermissionHelper.kt
index fbdf8573f2..9bba8e7a47 100644
--- a/app/src/main/java/com/gh/common/util/PermissionHelper.kt
+++ b/app/src/main/java/com/gh/common/util/PermissionHelper.kt
@@ -175,48 +175,6 @@ object PermissionHelper {
}
}
- @SuppressLint("CheckResult")
- @JvmStatic
- fun checkCalendarPermissionBeforeAction(context: Context, emptyCallback: EmptyCallback) {
- if (context is FragmentActivity) {
- val rxPermission = RxPermissions(context)
-
- tryWithDefaultCatch {
- rxPermission
- .requestEachCombined(Manifest.permission.WRITE_CALENDAR, Manifest.permission.READ_CALENDAR)
- .subscribe { permission ->
- when {
- permission.granted -> {
- emptyCallback.onCallback()
- }
- permission.shouldShowRequestPermissionRationale -> {
- DialogUtils.showPermissionDialog(context,
- "权限申请",
- "光环助手需要日历权限,以保证能正常使用相关功能",
- "重试",
- "放弃",
- { checkCalendarPermissionBeforeAction(context, emptyCallback) },
- null)
- }
- else -> {
- DialogUtils.showPermissionDialog(context,
- "权限申请",
- "在设置-应用-光环助手-权限中开启日历权限,以保证能正常使用相关功能",
- "去设置",
- "放弃",
- {
- val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
- intent.data = Uri.parse("package:" + context.getPackageName())
- context.startActivity(intent)
- },
- null)
- }
- }
- }
- }
- }
- }
-
/**
* 跳转到权限设置
*
diff --git a/app/src/main/java/com/gh/common/util/QuickLoginHelper.kt b/app/src/main/java/com/gh/common/util/QuickLoginHelper.kt
index 25cffa95e1..e574e6d0f9 100644
--- a/app/src/main/java/com/gh/common/util/QuickLoginHelper.kt
+++ b/app/src/main/java/com/gh/common/util/QuickLoginHelper.kt
@@ -226,14 +226,14 @@ object QuickLoginHelper {
"", "", "", "") //隐私条款的协议文本,自定义条款,自定义条款链接(支持四份条款)
.setPrivacyText(11, R.color.text_999999.toColor(), R.color.theme_font.toColor(), true, false) //条款文本设置
.setPrivacyMargin(30, 32) //隐私条款距离手机左右边缘的边距
- .setPrivacyOffsetY(230) //隐私条款Y偏移量
+ .setPrivacyOffsetY(280) //隐私条款Y偏移量
// 语言
.setAppLanguageType(0) //0.中文简体1.中文繁体2.英文
// 转场动画
.setAuthPageActIn("anim_auth_in","anim_auth_out")
// .setAuthPageActOut("anim_auth_in","anim_auth_out")
// 整体布局
- .setAuthPageWindowMode(WindowManager.LayoutParams.MATCH_PARENT, 320) //授权页窗口宽高比例
+ .setAuthPageWindowMode(WindowManager.LayoutParams.MATCH_PARENT, 360) //授权页窗口宽高比例
.setWindowBottom(1) //授权页是否居于底部,0=居中;1=底部,设置为1Y轴的偏移 失效
.setFitsSystemWindows(false)
.setThemeId(R.style.quickLoginDialog) //授权页弹窗主题
@@ -247,7 +247,7 @@ object QuickLoginHelper {
closeIv.setOnClickListener {
finishAuthActivity()
}
- changeLoginIv.setOnClickListener {
+ changeLoginBtn.setOnClickListener {
startCodeLoginPage(context, false)
}
descTv.text = "${getOperatorType(context)}提供认证服务"
@@ -274,7 +274,9 @@ object QuickLoginHelper {
private fun startCodeLoginPage(context: Context, entrance: String, isFinishAuth: Boolean, isFromPermission: Boolean) {
if (mPreDialog != null && mPreDialog!!.isShowing) {
- mPreDialog?.dismiss()
+ tryWithDefaultCatch {
+ mPreDialog?.dismiss()
+ }
}
if (isFinishAuth) {
diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java
index 97a4616c03..af3e522e63 100644
--- a/app/src/main/java/com/gh/common/util/ShareUtils.java
+++ b/app/src/main/java/com/gh/common/util/ShareUtils.java
@@ -726,6 +726,10 @@ public class ShareUtils {
return mTitle;
}
+ public String getShareUrl() {
+ return shareUrl;
+ }
+
private class ShareRecyclerViewAdapter extends RecyclerView.Adapter {
private OnItemClickListener listener;
diff --git a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt
index 44d6d7410a..e0acc015f1 100644
--- a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt
+++ b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt
@@ -121,9 +121,14 @@ object XapkInstaller : IXapkUnzipListener {
DownloadManager.getInstance(mContext).updateDownloadEntity(downloadEntity)
}
- SentryHelper.onEvent("XAPK_UNZIP_ERROR",
+ // 仅官网渠道上报 XAPK 异常信息
+ if (HaloApp.getInstance().channel == "GH_206") {
+ SentryHelper.onEvent(
+ "XAPK_UNZIP_ERROR",
"gameName", downloadEntity.name,
- "errorDigest", exception.localizedMessage)
+ "errorDigest", exception.localizedMessage
+ )
+ }
debugOnly {
Utils.log("unzip", "onFailure->$exception")
diff --git a/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java b/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java
index 98a9e0ba9b..fa6258b050 100644
--- a/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java
+++ b/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java
@@ -196,7 +196,9 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA
setNavigationTitle(mName);
mLibaoEntity = (LibaoEntity) HaloApp.get(LibaoEntity.TAG, false);
isClickReceiveBtnIn = getIntent().getBooleanExtra(EntranceUtils.KEY_IS_CLICK_RECEIVE_BTN, false);
- mLibaoEntity.setClickReceiveBtnIn(isClickReceiveBtnIn);
+ if (mLibaoEntity != null) {
+ mLibaoEntity.setClickReceiveBtnIn(isClickReceiveBtnIn);
+ }
mIsScroll = true;
diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java
index f1e17667aa..ca67c05302 100644
--- a/app/src/main/java/com/gh/gamecenter/MainActivity.java
+++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java
@@ -24,7 +24,6 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
-import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.base.AppUncaughtHandler;
import com.gh.base.BaseActivity;
import com.gh.base.fragment.BaseFragment_ViewPager;
@@ -52,6 +51,7 @@ import com.gh.common.util.ErrorHelper;
import com.gh.common.util.ExtensionsKt;
import com.gh.common.util.GsonUtils;
import com.gh.common.util.HomePluggableHelper;
+import com.gh.common.util.ImageUtils;
import com.gh.common.util.LogUtils;
import com.gh.common.util.LunchType;
import com.gh.common.util.MtaHelper;
@@ -176,8 +176,12 @@ public class MainActivity extends BaseActivity {
super.onCreate(savedInstanceState);
setStatusBarColor(Color.TRANSPARENT);
- if (!isFrescoInitialized()) {
- BigImageViewer.initialize(FrescoImageLoader.with(this));
+ if (!ImageUtils.isFrescoInitialized()) {
+ try {
+ BigImageViewer.initialize(FrescoImageLoader.with(this));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
}
Fragment fragmentFromFM = getSupportFragmentManager().findFragmentById(R.id.layout_activity_content);
@@ -966,19 +970,4 @@ public class MainActivity extends BaseActivity {
context.startActivity(intent);
}
- /**
- * 虽然在 Application 里有使用子线程初始化但有可能出现初始化超时(卡住?)的情况,
- * 这里反射获取 sDraweecontrollerbuildersupplier 根据是否有值确定是否被初始化了
- */
- public boolean isFrescoInitialized() {
- Class clazz = SimpleDraweeView.class;
- try {
- Field field = clazz.getDeclaredField("sDraweecontrollerbuildersupplier");
- field.setAccessible(true);
- Object object = field.get(SimpleDraweeView.class);
- return object != null;
- } catch (Exception ignore) {
- return false;
- }
- }
}
diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java
index f51ce9839b..a5d43b8b1d 100644
--- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java
+++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java
@@ -128,7 +128,6 @@ public class DetailViewHolder {
break;
case NORMAL:
MtaHelper.onEvent("游戏详情_新", "下载", mGameEntity.getName());
- EnergyTaskHelper.postEnergyTask("download_game", mGameEntity.getId(), mGameEntity.getApk().get(0).getPackageName());
break;
case PLUGIN:
MtaHelper.onEvent("游戏详情_新", "插件化", mGameEntity.getName());
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/CatalogFragment.kt b/app/src/main/java/com/gh/gamecenter/catalog/CatalogFragment.kt
index a66e8246dc..b6af05b5c7 100644
--- a/app/src/main/java/com/gh/gamecenter/catalog/CatalogFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/catalog/CatalogFragment.kt
@@ -30,7 +30,7 @@ class CatalogFragment : LazyFragment() {
override fun onFragmentFirstVisible() {
mCatalogId = arguments?.getString(EntranceUtils.KEY_CATALOG_ID) ?: ""
mCatalogTitle = arguments?.getString(EntranceUtils.KEY_CATALOG_TITLE) ?: ""
- mViewModel = viewModelProviderFromParent(CatalogViewModel.Factory(mCatalogId, mCatalogTitle))
+ mViewModel = viewModelProviderFromParent(CatalogViewModel.Factory(mCatalogId, mCatalogTitle), mCatalogId)
mViewModel?.validEntranceName = if (mEntrance.contains("首页")) "首页" else "板块"
mViewModel?.logAppearance()
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt
index 8f2065a54c..8b2b1027db 100644
--- a/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt
@@ -32,7 +32,7 @@ class SubCatalogFragment : NormalFragment() {
mCatalogTitle = arguments?.getString(EntranceUtils.KEY_CATALOG_TITLE) ?: ""
mPrimaryCatalogId = arguments?.getString(EntranceUtils.KEY_PRIMARY_CATALOG_ID) ?: ""
mViewModel = viewModelProvider(SubCatalogViewModel.Factory(mCatalogId))
- mCatalogViewModel = viewModelProviderFromParent(CatalogViewModel.Factory(mCatalogId, mCatalogTitle))
+ mCatalogViewModel = viewModelProviderFromParent(CatalogViewModel.Factory(mCatalogId, mCatalogTitle), mCatalogId)
mViewModel?.getSubCatalogs(mPrimaryCatalogId)
}
diff --git a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt
index 7226da3720..0568222554 100644
--- a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt
@@ -5,6 +5,7 @@ import android.view.MenuItem
import android.view.View
import androidx.core.os.bundleOf
import androidx.core.view.GravityCompat
+import androidx.drawerlayout.widget.DrawerLayout
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import com.gh.base.fragment.LazyFragment
@@ -36,7 +37,7 @@ class CategoryV2Fragment : LazyFragment() {
override fun onFragmentFirstVisible() {
mCategoryId = arguments?.getString(EntranceUtils.KEY_CATEGORY_ID) ?: ""
mCategoryTitle = arguments?.getString(EntranceUtils.KEY_CATEGORY_TITLE) ?: ""
- mViewModel = viewModelProviderFromParent(CategoryV2ViewModel.Factory(mCategoryId, mCategoryTitle))
+ mViewModel = viewModelProviderFromParent(CategoryV2ViewModel.Factory(mCategoryId, mCategoryTitle), mCategoryId)
mViewModel?.entrance = if (mEntrance.contains("首页")) "首页" else "板块"
mViewModel?.logAppearance()
@@ -60,6 +61,8 @@ class CategoryV2Fragment : LazyFragment() {
mBinding?.run {
val width = resources.displayMetrics.widthPixels * 260 / 360
drawerLayout.setScrimColor(R.color.black_alpha_30.toColor())
+ // 关闭手势滑动
+ drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
directoryContainer.layoutParams.width = width
directoryRv.layoutParams.width = width
@@ -206,7 +209,7 @@ class CategoryV2Fragment : LazyFragment() {
mCategoryV2ListFragment?.arguments = bundleOf(
EntranceUtils.KEY_CATEGORY_ID to id,
EntranceUtils.KEY_SUB_CATEGORY_ID to sidebars[0].categoryId,
- EntranceUtils.KEY_CATALOG_TITLE to mCategoryTitle,
+ EntranceUtils.KEY_CATEGORY_TITLE to mCategoryTitle,
EntranceUtils.KEY_EXPOSURE_SOURCE to arguments?.getParcelable(EntranceUtils.KEY_EXPOSURE_SOURCE)
)
childFragmentManager
diff --git a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListFragment.kt b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListFragment.kt
index 95240092bd..c603c0485c 100644
--- a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListFragment.kt
@@ -30,6 +30,7 @@ class CategoryV2ListFragment : ListFragment
private var mCategoryId: String = ""
private var mSubCategoryId: String = ""
+ private var mCategoryTitle: String = ""
private var mAdapter: CategoryV2ListAdapter? = null
private var mSelectedViewList = ArrayList()
private var mBinding: FragmentCategoryListBinding? = null
@@ -58,7 +59,7 @@ class CategoryV2ListFragment : ListFragment
?: CategoryV2ListAdapter(
requireContext(),
mListViewModel,
- mCategoryViewModel ?: viewModelProviderFromParent(),
+ mCategoryViewModel ?: viewModelProviderFromParent(CategoryV2ViewModel.Factory(mCategoryId, mCategoryTitle), mCategoryId),
mEntrance).apply { mAdapter = this }
override fun getItemDecoration() = null
@@ -66,8 +67,9 @@ class CategoryV2ListFragment : ListFragment
override fun onCreate(savedInstanceState: Bundle?) {
mCategoryId = arguments?.getString(EntranceUtils.KEY_CATEGORY_ID) ?: ""
mSubCategoryId = arguments?.getString(EntranceUtils.KEY_SUB_CATEGORY_ID) ?: ""
+ mCategoryTitle = arguments?.getString(EntranceUtils.KEY_CATEGORY_TITLE) ?: ""
- mCategoryViewModel = viewModelProviderFromParent()
+ mCategoryViewModel = viewModelProviderFromParent(CategoryV2ViewModel.Factory(mCategoryId, mCategoryTitle), mCategoryId)
mEntrance = arguments?.getString(EntranceUtils.KEY_ENTRANCE) ?: Constants.ENTRANCE_UNKNOWN
super.onCreate(savedInstanceState)
diff --git a/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt b/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt
index 52e3455e93..6b7c58fedd 100644
--- a/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt
@@ -60,13 +60,11 @@ class EnergyCenterFragment : BaseLazyFragment() {
mBinding?.run {
background.setImageResource(R.drawable.bg_energy_center_day)
signTitle.setTextColor(R.color.theme_font.toColor())
- signRemind.setTextColor(R.color.theme_font.toColor())
}
} else {
mBinding?.run {
background.setImageResource(R.drawable.bg_energy_center_night)
signTitle.setTextColor(R.color.white.toColor())
- signRemind.setTextColor(R.color.white.toColor())
}
}
@@ -119,6 +117,7 @@ class EnergyCenterFragment : BaseLazyFragment() {
DialogUtils.showSignSuccessDialog(requireContext()) {
initSignView(it)
mUserHomeViewModel?.getUserEnergy()
+ refreshTaskList()
}
}
@@ -137,11 +136,6 @@ class EnergyCenterFragment : BaseLazyFragment() {
height = screenWidth * 400 / 360
}
- signSwitch.setImageResource(if (SPUtils.getBoolean(Constants.SP_SIGN_REMIND))
- R.drawable.ic_energy_center_switch_on
- else
- R.drawable.ic_energy_center_switch_off)
-
val screenHeight = when {
Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
resources.displayMetrics.heightPixels
@@ -320,7 +314,7 @@ class EnergyCenterFragment : BaseLazyFragment() {
}
}
- @OnClick(R.id.backIv, R.id.userEnergyContainer, R.id.energyRuleTv, R.id.inviteFriends, R.id.signSwitch, R.id.signToday, R.id.signRule,
+ @OnClick(R.id.backIv, R.id.userEnergyContainer, R.id.energyRuleTv, R.id.inviteFriends, R.id.signToday, R.id.signRule,
R.id.oneDay, R.id.twoDay, R.id.threeDay, R.id.fourDay, R.id.fiveDay, R.id.sixDay, R.id.sevenDay)
fun onViewClicked(v: View) {
when (v.id) {
@@ -357,16 +351,6 @@ class EnergyCenterFragment : BaseLazyFragment() {
}
}
- R.id.signSwitch -> {
- IntegralLogHelper.log("click_sign_remind", LOCATION)
-
- ifLogin("光能中心-签到提醒") {
- if (!ClickUtils.isFastDoubleClick()) {
- dealSignRemind()
- }
- }
- }
-
R.id.signRule -> {
IntegralLogHelper.log("click_sign_rule", LOCATION)
DialogUtils.showSignRuleDialog(requireContext())
@@ -455,33 +439,6 @@ class EnergyCenterFragment : BaseLazyFragment() {
mUserHomeViewModel?.signIn()
}
- private fun dealSignRemind() {
- checkCalendarPermissionBeforeAction {
- if (SPUtils.getBoolean(Constants.SP_SIGN_REMIND)) {
- CalendarHelper.deleteCalendarEvent(
- requireContext(),
- R.string.sign_remind_title.toResString())
- SPUtils.setBoolean(Constants.SP_SIGN_REMIND, false)
- mBinding?.signSwitch?.setImageResource(R.drawable.ic_energy_center_switch_off)
- } else {
- val isSuccess = CalendarHelper.insertCalendarEvent(
- requireContext(),
- R.string.sign_remind_title.toResString(),
- R.string.sign_remind_desc.toResString(),
- TimeUtils.getTimeOfToday(10),
- TimeUtils.getTimeOfToday(10, 30),
- "FREQ=DAILY")
- if (isSuccess) {
- SPUtils.setBoolean(Constants.SP_SIGN_REMIND, true)
- DialogUtils.showSignRemindSuccessDialog(requireContext())
- mBinding?.signSwitch?.setImageResource(R.drawable.ic_energy_center_switch_on)
- } else {
- ToastUtils.showToast("添加签到提醒失败")
- }
- }
- }
- }
-
fun openBottomSheet(callback: () -> Unit) {
if (mBehavior?.state == BottomSheetBehavior.STATE_EXPANDED) {
callback.invoke()
diff --git a/app/src/main/java/com/gh/gamecenter/energy/TaskAdapter.kt b/app/src/main/java/com/gh/gamecenter/energy/TaskAdapter.kt
index 5080fb9afe..0633c7437b 100644
--- a/app/src/main/java/com/gh/gamecenter/energy/TaskAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/energy/TaskAdapter.kt
@@ -55,7 +55,7 @@ class TaskAdapter(context: Context) : ListAdapter(context) {
oldItem?.title != null && newItem?.title != null -> true
oldItem?.dailyTask != null && newItem?.dailyTask != null -> {
- oldItem.dailyTask?.id == newItem.dailyTask?.id
+ (oldItem.dailyTask?.id == newItem.dailyTask?.id && oldItem.dailyTask?.status == newItem.dailyTask?.status)
}
else -> super.areItemsTheSame(oldItem, newItem)
@@ -71,7 +71,7 @@ class TaskAdapter(context: Context) : ListAdapter(context) {
oldItem?.title != null && newItem?.title != null -> true
oldItem?.dailyTask != null && newItem?.dailyTask != null -> {
- oldItem.dailyTask?.id == newItem.dailyTask?.id
+ (oldItem.dailyTask?.id == newItem.dailyTask?.id && oldItem.dailyTask?.status == newItem.dailyTask?.status)
}
else -> super.areContentsTheSame(oldItem, newItem)
diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt
index 04caa4b7ea..6768f6db0c 100644
--- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt
@@ -54,9 +54,12 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() {
private var mIsDisplayingLightContent = false
private var mDefaultSelectedTab = -1
+ private var mLastSelectedPosition = 0
private var mViewModel: HomeSearchToolWrapperViewModel? = null
+ private var mFragmentList = ArrayList()
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -124,7 +127,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() {
override fun getInflatedLayout() = FragmentMainHomeWrapperBinding.inflate(layoutInflater).apply { mBinding = this }.root
private fun initViewPager(tabList: ArrayList) {
- val fragmentList = generateFragments(tabList)
+ val fragmentList = generateFragments(tabList).apply { mFragmentList = this }
val tabTitleList = arrayListOf()
tabList.forEach { tabTitleList.add(it.name ?: "") }
@@ -151,6 +154,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() {
viewPager.offscreenPageLimit = fragmentList.size
viewPager.doOnScroll(
onPageSelected = { position ->
+ notifyChildFragmentLifecycle(position)
updateTabTextStyle(position, 0F)
mViewModel?.forumTabPair?.let {
if (it.first == position) {
@@ -246,11 +250,37 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() {
}
}
+ private fun notifyChildFragmentLifecycle(currentSelectedPosition: Int) {
+ tryCatchInRelease {
+ // 补充 Viewpager Fragment 的生命周期, 先调用旧选中 fragment 的 onPause 再当前的 onResume
+ // 避免部分被内嵌的 Fragment 不能正常运作
+ if (mFragmentList.size > mLastSelectedPosition) {
+ val fragment: Fragment = mFragmentList[mLastSelectedPosition]
+ fragment.onPause()
+ val childFragmentManager = fragment.childFragmentManager
+ val fragments = childFragmentManager.fragments
+ for (childFragment in fragments) {
+ childFragment.onPause()
+ }
+ }
+ if (mFragmentList.size > currentSelectedPosition) {
+ val fragment: Fragment = mFragmentList[currentSelectedPosition]
+ fragment.onResume()
+ val childFragmentManager = fragment.childFragmentManager
+ val fragments = childFragmentManager.fragments
+ for (childFragment in fragments) {
+ childFragment.onResume()
+ }
+ }
+ mLastSelectedPosition = currentSelectedPosition
+ }
+ }
+
private fun generateFragments(tabList: ArrayList): ArrayList {
val fragmentList = arrayListOf()
for (tab in tabList) {
val fragment = when (tab.type) {
- "home" -> HomeFragment()
+ "home" -> HomeFragment().with(Bundle())
"top_game_comment" -> AmwayFragment().with(Bundle())
"block" -> GameFragment().with(Bundle().apply {
putParcelable(EntranceUtils.KEY_BLOCK_DATA, tab)
@@ -290,8 +320,9 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() {
"bbs" -> Fragment()
else -> Fragment()
}
+ fragment.arguments?.putInt(EntranceUtils.KEY_TAB_COUNT, tabList.size)
fragment.arguments?.putBoolean(EntranceUtils.KEY_IS_HOME, true)
- fragment.arguments?.putParcelable(EntranceUtils.KEY_EXPOSURE_SOURCE, ExposureSource("首页顶部Tab栏", tab.name!!))
+ fragment.arguments?.putParcelable(EntranceUtils.KEY_EXPOSURE_SOURCE, ExposureSource("首页顶部Tab栏", tab.name ?: ""))
fragmentList.add(fragment)
}
return fragmentList
diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperViewModel.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperViewModel.kt
index 0e8b200995..0cb926c685 100644
--- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperViewModel.kt
+++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperViewModel.kt
@@ -44,6 +44,9 @@ class HomeSearchToolWrapperViewModel(application: Application) : AndroidViewMode
if (tab.default) defaultTabPosition = index
}
+ if (data.size == 0) {
+ data.add(SubjectRecommendEntity(type = "home"))
+ }
tabs.postValue(data)
}
diff --git a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java
index cf2b82a567..598c9fdd35 100644
--- a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java
+++ b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java
@@ -1,6 +1,7 @@
package com.gh.gamecenter.fragment;
import android.Manifest;
+import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
@@ -26,6 +27,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
@@ -60,6 +62,7 @@ import com.gh.gamecenter.user.ApiResponse;
import com.gh.gamecenter.user.LoginTag;
import com.gh.gamecenter.user.UserViewModel;
import com.halo.assistant.HaloApp;
+import com.lightgame.utils.AppManager;
import com.lightgame.view.CheckableImageView;
import org.greenrobot.eventbus.EventBus;
@@ -184,7 +187,7 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList
requireActivity().getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
screenHeight = metrics.heightPixels;
}
- params.topMargin = screenHeight * 2564 / 10000;
+ params.topMargin = screenHeight * 80 / 640;
mLoginPhoneContainer.setLayoutParams(params);
if (mStatus == LoginActivity.STATUS_DEFAULT) {
@@ -243,21 +246,23 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList
if (mStatus == LoginActivity.STATUS_FROM_QUICK_LOGIN_PAGE) {
requireActivity().finish();
} else if (mStatus == LoginActivity.STATUS_FROM_QUICK_LOGIN_PERMISSION) {
- startQuickLogin();
+ showPermissionDialog();
}
break;
case R.id.checkIv:
case R.id.checkClickView1:
case R.id.checkClickView2:
- mCheckIv.setChecked(!mCheckIv.isChecked());
+ updatePolicyCheckedStatus();
break;
case R.id.login_captcha:
MtaHelper.onEvent("我的光环_新", "登录页面", "获取验证码");
final String phoneNum = mLoginPhoneEt.getText().toString().trim().replaceAll(" ", "");
if (PatternUtils.isPhoneNum(phoneNum) && phoneNum.length() == 11) {
- mLoginCaptcha.setEnabled(false);
- ExtensionsKt.showKeyBoard(mLoginPassEt);
- LoginUtils.getPhoneCaptcha(getContext(), phoneNum, LoginFragment.this);
+ if (isAgreePolicy()) {
+ mLoginCaptcha.setEnabled(false);
+ ExtensionsKt.showKeyBoard(mLoginPassEt);
+ LoginUtils.getPhoneCaptcha(getContext(), phoneNum, LoginFragment.this);
+ }
} else {
toast("请输入正确的手机号");
}
@@ -290,24 +295,26 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList
}
}
- private void startQuickLogin() {
+ private void showPermissionDialog() {
if (requireContext().checkCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
- requireActivity().finish();
- QuickLoginHelper.startLogin(requireContext(), "一键登录权限弹窗");
+ startQuickLogin();
} else {
DialogUtils.showQuickLoginPermissionDialog(
requireContext(),
- () -> {
- PermissionHelper.checkReadPhoneStatePermissionBeforeAction(requireContext(), () -> {
- requireActivity().finish();
- QuickLoginHelper.startLogin(requireContext(), "一键登录权限弹窗");
- });
- },
+ () -> PermissionHelper.checkReadPhoneStatePermissionBeforeAction(requireContext(), this::startQuickLogin),
() -> {}
);
}
}
+ private void startQuickLogin() {
+ requireActivity().finish();
+ Activity currentActivity = AppManager.getInstance().getRecentActiveActivity();
+ if (currentActivity != null) {
+ QuickLoginHelper.startLogin(currentActivity, "一键登录权限弹窗");
+ }
+ }
+
private boolean isAgreePolicy() {
if (mCheckIv.isChecked()) {
return true;
@@ -513,4 +520,13 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList
}
}
+
+ private void updatePolicyCheckedStatus() {
+ mCheckIv.setChecked(!mCheckIv.isChecked());
+ if (mCheckIv.isChecked()) {
+ mLoginCaptcha.setTextColor(ContextCompat.getColor(requireContext(), R.color.theme_font));
+ } else {
+ mLoginCaptcha.setTextColor(ContextCompat.getColor(requireContext(), R.color.text_999999));
+ }
+ }
}
diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java
index 075c97cab9..4daf45b981 100644
--- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java
+++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java
@@ -61,6 +61,13 @@ public class SearchToolWrapperFragment extends LazyFragment {
.replace(R.id.wrapper_toolbar, mSearchToolbarFragment)
.replace(R.id.wrapper_main_content, Objects.requireNonNull(mContentFragment)).commitAllowingStateLoss();
+ // 补上底部 tab 的高度
+ inflatedView.findViewById(R.id.wrapperLl).setPadding(
+ 0,
+ 0,
+ 0,
+ (int) requireContext().getResources().getDimension(R.dimen.main_bottom_tab_height));
+
mCachedView.post(() -> mSearchToolbarFragment.updateSearchToolbarColor(Color.WHITE));
}
diff --git a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideListViewHolder.kt b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideListViewHolder.kt
index 9f9f06b839..bb3294f063 100644
--- a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideListViewHolder.kt
+++ b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideListViewHolder.kt
@@ -10,6 +10,7 @@ import com.gh.base.BaseRecyclerViewHolder
import com.gh.common.iinterface.IOffsetable
import com.gh.common.util.TimeUtils
import com.gh.common.util.dip2px
+import com.gh.common.util.tryCatchInRelease
import com.gh.gamecenter.R
import com.gh.gamecenter.databinding.GameHorizontalListBinding
import com.gh.gamecenter.entity.GameEntity
@@ -51,7 +52,10 @@ class GameHorizontalSlideListViewHolder(val binding: GameHorizontalListBinding)
binding.horizontalRv.scrollToPosition(0)
}
} else {
- binding.horizontalRv.scrollBy(offset, offset)
+ // 可能会因为上下复用数据变化而出现 IndexOutOfBoundsException 异常,毕竟有局部更新功能...
+ tryCatchInRelease {
+ binding.horizontalRv.scrollBy(offset, offset)
+ }
}
}
}
diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt
index 27e82f3ef8..9b19f67ccb 100644
--- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt
@@ -479,7 +479,7 @@ class GameDetailFragment : NormalFragment() {
fun onEventMainThread(bean: EBScroll) {
if (mGameEntity?.id == bean.id) {
mViewPager.currentItem = 0
- mAppBarLayout.setExpanded(false)
+ mAppBarLayout.setExpanded(false, false)
}
}
diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLatestServiceAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLatestServiceAdapter.kt
index efc46498e8..5399dd98c2 100644
--- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLatestServiceAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLatestServiceAdapter.kt
@@ -1,11 +1,15 @@
package com.gh.gamecenter.gamedetail.desc
import android.content.Context
-import android.view.*
+import android.view.Gravity
+import android.view.LayoutInflater
import android.view.View.MeasureSpec
+import android.view.ViewGroup
+import android.view.ViewTreeObserver
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.util.TimeUtils
+import com.gh.common.util.safelyGetInRelease
import com.gh.gamecenter.R
import com.gh.gamecenter.databinding.ItemGameDetailLatestServiceBinding
import com.gh.gamecenter.databinding.ItemGameDetailMoreBinding
@@ -79,7 +83,10 @@ class GameLatestServiceAdapter(val context: Context, val datas: ArrayList() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mViewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
+ mViewModel.homeOnlyWithoutOtherTab = arguments?.getInt(EntranceUtils.KEY_TAB_COUNT) == 1
mViewModel.itemDataList.observeNonNull(this, callback = {
mListAdapter.submitList(it)
})
diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt
index 21161726e5..0a802e66cb 100644
--- a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt
@@ -3,6 +3,7 @@ package com.gh.gamecenter.home
import android.content.Context
import android.view.View
import android.view.ViewGroup
+import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gh.common.constant.ItemViewType
@@ -131,7 +132,13 @@ class HomeFragmentAdapter(context: Context,
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
- is HomeSlideListViewHolder -> holder.bindSlideList(mDataList[position], mBasicExposureSource)
+ is HomeSlideListViewHolder -> {
+ // 根据首页是否有其它 tab 设置不同的 marginTop
+ val marginTop = if (viewModel.homeOnlyWithoutOtherTab) 4F.dip2px() else 0
+ (holder.binding.recyclerView.layoutParams as ConstraintLayout.LayoutParams)
+ .setMargins(0, marginTop, 0, 0)
+ holder.bindSlideList(mDataList[position], mBasicExposureSource)
+ }
is HomeRecommendItemViewHolder -> holder.bindRecommend(mDataList[position].recommends!!)
is HomeAmwayListViewHolder -> bindAmway(holder, position)
is HomeGameItemViewHolder -> bindAttachGame(holder, position)
diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt
index d864a47c26..e1ce230e0b 100644
--- a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt
+++ b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt
@@ -46,6 +46,9 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) {
// 所有专题里的所有游戏 ID 集合,供替换时排重用
private var mSubjectGameIdList = hashSetOf()
+ // 首页是否只有首页,不显示其它 tab
+ var homeOnlyWithoutOtherTab = false
+
var itemDataList: MediatorLiveData> = MediatorLiveData()
var positionAndPackageMap = HashMap() // key: packageName + position, value: position
diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt
index 49a9f8c25b..84074bb0ef 100644
--- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt
+++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt
@@ -7,6 +7,7 @@ import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
+import com.gh.common.util.EnergyTaskHelper
import com.gh.common.util.ToastUtils
import com.gh.common.util.createRequestBody
import com.gh.gamecenter.R
@@ -237,6 +238,8 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : BiResponse() {
override fun onSuccess(data: SignStatusEntity) {
+ EnergyTaskHelper.postEnergyTask("sign_in_cumulatively")
+ EnergyTaskHelper.postEnergyTask("sign_in_continuously")
sign.postValue(data)
}
})
diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/MoreFunctionPanelDialog.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/MoreFunctionPanelDialog.kt
index 0a43590a56..b31c89b478 100644
--- a/app/src/main/java/com/gh/gamecenter/qa/dialog/MoreFunctionPanelDialog.kt
+++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/MoreFunctionPanelDialog.kt
@@ -1,7 +1,10 @@
package com.gh.gamecenter.qa.dialog
import android.os.Bundle
-import android.view.*
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
@@ -20,7 +23,6 @@ class MoreFunctionPanelDialog : BaseDraggableDialogFragment() {
private lateinit var binding: DialogGameDetailMoreBinding
var menuItems: ArrayList = arrayListOf()
var title: String = ""
- var shareUrl: String = ""
var shareUtils: ShareUtils? = null
var onItemClickCallback: ((menuItem: MenuItemEntity) -> Unit)? = null
@@ -62,7 +64,7 @@ class MoreFunctionPanelDialog : BaseDraggableDialogFragment() {
MtaHelper.onEvent("内容分享", "短信", shareUtils?.title)
}
binding.copyLinkTv.setOnClickListener {
- shareUtils?.copyLink(shareUrl)
+ shareUtils?.copyLink(shareUtils?.shareUrl)
MtaHelper.onEvent("内容分享", "复制链接", shareUtils?.title)
}
binding.cancelTv.setOnClickListener {
diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersActivity.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersActivity.kt
index 6a3d202823..c3be91738e 100644
--- a/app/src/main/java/com/gh/gamecenter/servers/GameServersActivity.kt
+++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersActivity.kt
@@ -7,9 +7,7 @@ import android.view.View
import android.widget.CheckedTextView
import android.widget.RelativeLayout
import androidx.fragment.app.Fragment
-import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModel
import androidx.viewpager.widget.ViewPager
import com.gh.base.ToolBarActivity
import com.gh.base.adapter.FragmentAdapter
@@ -19,6 +17,7 @@ import com.gh.common.util.MtaHelper
import com.gh.common.util.viewModelProviderFromParent
import com.gh.common.view.DrawableView
import com.gh.gamecenter.R
+import com.halo.assistant.HaloApp
import com.lightgame.view.NoScrollableViewPager
import kotterknife.bindView
@@ -38,7 +37,7 @@ class GameServersActivity : ToolBarActivity() {
private val mServersTestIndex = 1
private val mServersPublishIndex = 0
- private var mViewModel: GameServersViewModel? = null
+ private var mViewModel: GameServersTestViewModel? = null
override fun getLayoutId(): Int {
return R.layout.activity_game_servers
@@ -48,7 +47,8 @@ class GameServersActivity : ToolBarActivity() {
super.onCreate(savedInstanceState)
setToolbarMenu(R.menu.menu_download)
- mViewModel = viewModelProviderFromParent()
+ mViewModel = viewModelProviderFromParent(GameServersTestViewModel.Factory(HaloApp.getInstance(), "general"))
+ mViewModel?.load()
mViewModel?.isTestOnLiveData?.observe(this, Observer {
if (it) {
mViewpager.setScrollable(true)
@@ -134,8 +134,4 @@ class GameServersActivity : ToolBarActivity() {
override fun getActivityNameInChinese(): String {
return "开服表"
}
-}
-
-class GameServersViewModel: ViewModel() {
- val isTestOnLiveData = MutableLiveData()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestFragment.kt
index 287b6f81cf..7ea8765f16 100644
--- a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestFragment.kt
@@ -37,7 +37,6 @@ class GameServersTestFragment : LazyFragment() {
private var mViewModel: GameServersTestViewModel? = null
private var mAdapter: GameServersTestAdapter? = null
- private var mServerViewModel: GameServersViewModel? = null
private var mExposureListener: ExposureListener? = null
private var mDay: String? = null
@@ -80,11 +79,10 @@ class GameServersTestFragment : LazyFragment() {
}
override fun onFragmentFirstVisible() {
- mServerViewModel = viewModelProviderFromParent()
mTestColumnId = arguments?.getString(TEST_COLUMN_ID, DEFAULT_TEST_COLUMN_ID)
?: DEFAULT_TEST_COLUMN_ID
- mViewModel = viewModelProvider(GameServersTestViewModel.Factory(HaloApp.getInstance(), mTestColumnId))
+ mViewModel = viewModelProviderFromParent(GameServersTestViewModel.Factory(HaloApp.getInstance(), mTestColumnId))
super.onFragmentFirstVisible()
@@ -117,7 +115,6 @@ class GameServersTestFragment : LazyFragment() {
if (!isSuccess) {
showConnectionError()
}
- mServerViewModel?.isTestOnLiveData?.postValue(isSuccess)
})
}
diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestViewModel.kt
index fc2e164843..133b5ed977 100644
--- a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestViewModel.kt
+++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestViewModel.kt
@@ -43,6 +43,8 @@ class GameServersTestViewModel(application: Application, private val mColumnId:
val listLiveData = MutableLiveData>()
val loadStatusLiveData = MutableLiveData()
+ val isTestOnLiveData = MutableLiveData()
+
@SuppressLint("CheckResult")
fun load(filter: String = ALL) {
mCurrentTypeFilter = filter
@@ -55,11 +57,13 @@ class GameServersTestViewModel(application: Application, private val mColumnId:
dayList[0] = "过去${data.settings.testTimeRange}天"
transformData(data, filter)
loadStatusLiveData.postValue(true)
+ isTestOnLiveData.postValue(true)
}
override fun onFailure(exception: Exception) {
super.onFailure(exception)
loadStatusLiveData.postValue(false)
+ isTestOnLiveData.postValue(false)
}
})
}
diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectListFragment.kt b/app/src/main/java/com/gh/gamecenter/subject/SubjectListFragment.kt
index 776a1385bf..0779b65c63 100644
--- a/app/src/main/java/com/gh/gamecenter/subject/SubjectListFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectListFragment.kt
@@ -125,7 +125,9 @@ class SubjectListFragment : LazyListFragment()
// 与外部Appbar交互
override fun onTitleClick() {
- if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0 || provideListAdapter().itemCount == 0) {
+ if (mLayoutManager == null
+ || mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0
+ || provideListAdapter().itemCount == 0) {
// do nothing
} else {
mLayoutManager.scrollToPosition(0)
diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt
index f18b712217..cc15ce5b6a 100644
--- a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt
+++ b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt
@@ -903,7 +903,9 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib
fun hideAllButton(isHide: Boolean) {
containerRl.goneIf(isHide)
actionLayout.goneIf(isHide)
- watchedContainer.goneIf(isHide)
+ if (isHide) {
+ watchedContainer.visibility = View.GONE
+ }
}
private fun showBackBtn() {
diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt
index 92d710083b..9b75f2c864 100644
--- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt
@@ -16,7 +16,6 @@ import androidx.lifecycle.Observer
import androidx.recyclerview.widget.OrientationHelper
import androidx.recyclerview.widget.RecyclerView
import com.gh.base.fragment.BaseLazyFragment
-import com.gh.common.constant.Constants
import com.gh.common.exposure.ExposureListener
import com.gh.common.util.*
import com.gh.common.videolog.VideoRecordUtils
@@ -202,6 +201,10 @@ class VideoDetailContainerFragment : BaseLazyFragment(), OnBackPressedListener {
mBinding.attentionNoLoginContainer.visibility = View.GONE
mBinding.recyclerview.visibility = View.GONE
mBinding.refresh.isRefreshing = false
+ if (::mAdapter.isInitialized) {
+ mAdapter.videoList.clear()
+ mAdapter.notifyDataSetChanged()
+ }
} else {
showNoDataErrorView()
toast("内容可能已被删除")
@@ -554,10 +557,14 @@ class VideoDetailContainerFragment : BaseLazyFragment(), OnBackPressedListener {
}
fun findVisibleVideoViewByPosition(): DetailPlayerView? {
- val pos = findVisibleItemPosition()
- val holder = mBinding.recyclerview?.findViewHolderForAdapterPosition(pos)
-
- return holder?.itemView as? DetailPlayerView
+ // 页面被销毁重建时,旧 fragment 可能会收到 onActivityResult 的 callback ,这时 mBinding 为未初始化状态
+ return if (::mBinding.isInitialized) {
+ val pos = findVisibleItemPosition()
+ val holder = mBinding.recyclerview?.findViewHolderForAdapterPosition(pos)
+ holder?.itemView as? DetailPlayerView
+ } else {
+ null
+ }
}
private fun findVisibleItemPosition(): Int {
diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java
index f010c174f9..404bb75ddf 100644
--- a/app/src/main/java/com/halo/assistant/HaloApp.java
+++ b/app/src/main/java/com/halo/assistant/HaloApp.java
@@ -27,6 +27,7 @@ import com.gh.common.util.DeviceUtils;
import com.gh.common.util.DownloadNotificationHelper;
import com.gh.common.util.DownloadObserver;
import com.gh.common.util.HomeBottomBarHelper;
+import com.gh.common.util.ImageUtils;
import com.gh.common.util.PackageHelper;
import com.gh.common.util.PackageUtils;
import com.gh.common.util.SPUtils;
@@ -104,7 +105,12 @@ public class HaloApp extends MultiDexApplication {
}
public String getChannel() {
- return mChannel;
+ // 存在 IO 初始化线程阻塞(万物皆可阻塞)导致 mChannel 为空的情况,这里特殊处理下
+ if (TextUtils.isEmpty(mChannel)) {
+ return "";
+ } else {
+ return mChannel;
+ }
}
public void setOAID(String oaid) {
@@ -141,8 +147,14 @@ public class HaloApp extends MultiDexApplication {
initDataHelper();
Tracker.init(this);
- //初始化Fresco(BigImageViewer 已包含Fresco)
- BigImageViewer.initialize(FrescoImageLoader.with(this));
+ // 初始化 Fresco(BigImageViewer 已包含Fresco)
+ if (!ImageUtils.isFrescoInitialized()) {
+ try {
+ BigImageViewer.initialize(FrescoImageLoader.with(this));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
deviceRamSize = DeviceUtils.getTotalRamSizeOfDevice(this);
diff --git a/app/src/main/res/drawable-xxhdpi/ic_badge_default.png b/app/src/main/res/drawable-xxhdpi/ic_badge_default.png
deleted file mode 100755
index 8af66a3e0f..0000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_badge_default.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_badge_tv.webp b/app/src/main/res/drawable-xxhdpi/ic_badge_tv.webp
deleted file mode 100644
index 5659317023..0000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_badge_tv.webp and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_switch_off.webp b/app/src/main/res/drawable-xxhdpi/ic_energy_center_switch_off.webp
deleted file mode 100644
index 0ef83fe19c..0000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_energy_center_switch_off.webp and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_switch_on.webp b/app/src/main/res/drawable-xxhdpi/ic_energy_center_switch_on.webp
deleted file mode 100644
index 4eccadbe25..0000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_energy_center_switch_on.webp and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_regulation_tag.webp b/app/src/main/res/drawable-xxhdpi/ic_regulation_tag.webp
deleted file mode 100644
index 5b34d96277..0000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_regulation_tag.webp and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_sign_remind_close.webp b/app/src/main/res/drawable-xxhdpi/ic_sign_remind_close.webp
deleted file mode 100644
index 7b1c8668c1..0000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_sign_remind_close.webp and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_sign_remind_success.webp b/app/src/main/res/drawable-xxhdpi/ic_sign_remind_success.webp
deleted file mode 100644
index 9c99bb831d..0000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_sign_remind_success.webp and /dev/null differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_badge_default.webp b/app/src/main/res/drawable-xxxhdpi/ic_badge_default.webp
new file mode 100644
index 0000000000..2e4e81df65
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_badge_default.webp differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_badge_tv.png b/app/src/main/res/drawable-xxxhdpi/ic_badge_tv.png
new file mode 100644
index 0000000000..63c4c8703f
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_badge_tv.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_regulation_tag.webp b/app/src/main/res/drawable-xxxhdpi/ic_regulation_tag.webp
index ed8b2cbcc4..10df064d4c 100644
Binary files a/app/src/main/res/drawable-xxxhdpi/ic_regulation_tag.webp and b/app/src/main/res/drawable-xxxhdpi/ic_regulation_tag.webp differ
diff --git a/app/src/main/res/drawable/bg_user_badge.xml b/app/src/main/res/drawable/bg_user_badge.xml
index 2d2f037e29..6ab93a8791 100644
--- a/app/src/main/res/drawable/bg_user_badge.xml
+++ b/app/src/main/res/drawable/bg_user_badge.xml
@@ -4,9 +4,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_user_concern.xml b/app/src/main/res/drawable/bg_user_concern.xml
index 324bdee8dd..7f7ba6487e 100644
--- a/app/src/main/res/drawable/bg_user_concern.xml
+++ b/app/src/main/res/drawable/bg_user_concern.xml
@@ -4,9 +4,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_user_level.xml b/app/src/main/res/drawable/bg_user_level.xml
index 9114e9bdf4..2c1ed83f19 100644
--- a/app/src/main/res/drawable/bg_user_level.xml
+++ b/app/src/main/res/drawable/bg_user_level.xml
@@ -4,9 +4,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_quick_login.xml b/app/src/main/res/layout/dialog_quick_login.xml
index 97f071a133..2ecb23cd36 100644
--- a/app/src/main/res/layout/dialog_quick_login.xml
+++ b/app/src/main/res/layout/dialog_quick_login.xml
@@ -7,7 +7,7 @@
@@ -18,35 +18,6 @@
android:src="@drawable/bg_quick_login_dialog"
app:corner_radius="12dp" />
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_energy_center.xml b/app/src/main/res/layout/fragment_energy_center.xml
index 32c4defde9..d21d260deb 100644
--- a/app/src/main/res/layout/fragment_energy_center.xml
+++ b/app/src/main/res/layout/fragment_energy_center.xml
@@ -156,29 +156,6 @@
android:layout_toRightOf="@+id/signTitle"
android:src="@drawable/ic_sign_rule" />
-
-
-
-
-
-
@@ -36,7 +30,7 @@
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:textColor="@color/text_333333"
- android:textSize="16sp"
+ android:textSize="14sp"
android:text="@string/login_phone_prefix" />
+ android:textSize="14sp" />
+ android:textSize="14sp" />
@@ -111,26 +105,75 @@
+ android:textSize="14sp" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:orientation="horizontal">
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index ec05857835..eb517a59a4 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -151,11 +151,6 @@
#91F0FD
#F6FBFF
#50DCDC
- #81B5FF
- #20FFB5
- #00DDDD
- #74FFFF
- #60D5FF
#b2b2b2
#9a9a9a
#3a3a3a
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index b2331d6187..d503f4740c 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -24,7 +24,7 @@
16dp
6dp
- 8dp
+ 4dp
122dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c4c3a06661..3f82f98c06 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -789,10 +789,6 @@
签到规则
1、每日可领取2个光能、1个成长值,最多领取连续7天签到奖励,中断或签满7天则重新计算
2、连续签满7天可额外奖励1次免费抽奖机会
- 【光环助手】又有光能可以收了!收能量兑大奖!
- 每日10点连续签到领能量,赶紧行动吧!
- 开启成功
- 系统日历将准时提醒您签到
提示
填写邀请码需验证手机号绑定信息,检测\n到您未绑定手机(仅限新手机号绑定)
diff --git a/channel.txt b/channel.txt
index 3f3564cbfa..8a6a3ec3dc 100644
--- a/channel.txt
+++ b/channel.txt
@@ -1,191 +1,2 @@
GH_TEST
-GH_TEST2
-GH_REFRESH
-GH_100
-GH_101
-GH_102
-GH_103
-GH_104
-GH_106
-GH_107
-GH_108
-GH_109
-GH_110
-GH_111
-GH_113
-GH_114
-GH_115
-GH_116
-GH_117
-GH_118
-GH_119
-GH_120
-GH_121
-GH_123
-GH_127
-GH_200
-GH_201
-GH_202
-GH_203
-GH_204
-GH_205
-GH_206
-GH_222
-GH_307
-GH_333
-GH_600
-GH_601
-GH_602
-GH_603
-GH_604
-GH_605
-GH_606
-GH_607
-GH_608
-GH_609
-GH_610
-GH_611
-GH_612
-GH_613
-GH_614
-GH_615
-GH_616
-GH_617
-GH_618
-GH_619
-GH_620
-GH_621
-GH_622
-GH_623
-GH_624
-GH_625
-GH_626
-GH_627
-GH_628
-GH_629
-GH_630
-GH_631
-GH_632
-GH_633
-GH_634
-GH_635
-GH_636
-GH_637
-GH_638
-GH_639
-GH_640
-GH_641
-GH_642
-GH_643
-GH_644
-GH_645
-GH_646
-GH_647
-GH_648
-GH_649
-GH_650
-GH_651
-GH_652
-GH_653
-GH_654
-GH_655
-GH_656
-GH_657
-GH_658
-GH_659
-GH_660
-GH_661
-GH_662
-GH_663
-GH_664
-GH_665
-GH_666
-GH_667
-GH_667
-GH_668
-GH_669
-GH_670
-GH_671
-GH_672
-GH_673
-GH_674
-GH_675
-GH_676
-GH_677
-GH_678
-GH_679
-GH_680
-GH_681
-GH_682
-GH_683
-GH_684
-GH_685
-GH_686
-GH_687
-GH_688
-GH_689
-GH_690
-GH_691
-GH_692
-GH_693
-GH_694
-GH_695
-GH_696
-GH_697
-GH_698
-GH_699
-GH_700
-GH_701
-GH_702
-GH_703
-GH_704
-GH_705
-GH_706
-GH_707
-GH_708
-GH_709
-GH_710
-GH_711
-GH_712
-GH_713
-GH_714
-GH_715
-GH_716
-GH_717
-GH_718
-GH_719
-GH_720
-GH_721
-GH_722
-GH_723
-GH_724
-GH_725
-GH_726
-GH_727
-GH_728
-GH_729
-GH_730
-GH_731
-GH_732
-GH_733
-GH_734
-GH_735
-GH_736
-GH_737
-GH_738
-GH_739
-GH_740
-GH_741
-GH_742
-GH_743
-GH_744
-GH_745
-GH_746
-GH_747
-GH_748
-GH_749
-GH_750
-GH_777
-GH_787
-GH_888
-GH_999
\ No newline at end of file
+GH_TEST2
\ No newline at end of file
diff --git a/scripts/build_with_simple_backup.sh b/scripts/build_with_simple_backup.sh
index a4e69b9b0e..5dab91e322 100755
--- a/scripts/build_with_simple_backup.sh
+++ b/scripts/build_with_simple_backup.sh
@@ -24,15 +24,15 @@ while getopts "tg" arg
do
case ${arg} in
t)
- ./gradlew rTR -I init.gradle
- ./gradlew rTR -I init.gradle
+ ./gradlew aTR -I init.gradle
+ ./gradlew aTR -I init.gradle
mkdir -p release-app/${versionName}_${versionCode}
cp -R app/build/outputs/apk/tea/release/app-tea-release.apk release-app/${versionName}_${versionCode}/光环助手_${versionName}_${versionCode}_头条推广正式包_${git_sha}_${build_time}.apk
exit
;;
g)
- ./gradlew rGR -I init.gradle
- ./gradlew rGR -I init.gradle
+ ./gradlew aGR -I init.gradle
+ ./gradlew aGR -I init.gradle
mkdir -p release-app/${versionName}_${versionCode}
cp -R app/build/outputs/apk/gdt/release/app-gdt-release.apk release-app/${versionName}_${versionCode}/光环助手_${versionName}_${versionCode}_广点通推广正式包_${git_sha}_${build_time}.apk
exit
@@ -41,8 +41,8 @@ do
done
# 不存在指令时打普通包
-./gradlew rPR -I init.gradle
-./gradlew rPR -I init.gradle
+./gradlew aPR -I init.gradle
+./gradlew aPR -I init.gradle
mkdir -p release-app/${versionName}_${versionCode}
cp -R app/build/outputs/apk/publish/release/app-publish-release.apk release-app/${versionName}_${versionCode}/光环助手_${versionName}_${versionCode}_标准正式包_${git_sha}_${build_time}.apk