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