diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index 6b225cf601..da49cfd762 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -125,10 +125,14 @@ class DefaultJsApi(var context: Context) { handler.complete(false) } }) + + LoginHelper.unregisterCallback() } override fun onLoginFailure(loginType: LoginTag, error: String) { handler.complete(false) + + LoginHelper.unregisterCallback() } }) } diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index 89f0c41d81..537570d6ee 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -1768,8 +1768,8 @@ object DirectUtils { fun directToSuggestion( context: Context, type: SuggestType, - suggestHintType: String, - content: String, + suggestHintType: String? = null, + content: String? = null, isQaFeedback: Boolean = false, qaContentId: String = "" ) { @@ -1788,8 +1788,8 @@ object DirectUtils { fun directToSuggestion( context: Context, type: SuggestType, - suggestHintType: String, - content: String, + suggestHintType: String? = null, + content: String? = null, game: SimpleGameEntity, platform: String = "" ) { diff --git a/app/src/main/java/com/gh/common/util/LoginHelper.kt b/app/src/main/java/com/gh/common/util/LoginHelper.kt index 07e9585186..fbeb23dc73 100644 --- a/app/src/main/java/com/gh/common/util/LoginHelper.kt +++ b/app/src/main/java/com/gh/common/util/LoginHelper.kt @@ -22,8 +22,6 @@ import com.tencent.tauth.Tencent import com.tencent.tauth.UiError import org.json.JSONException import org.json.JSONObject -import java.lang.ref.WeakReference - /** * 第三方登录辅助类 @@ -42,7 +40,7 @@ object LoginHelper { private var mQqLoginListener: IUiListener private var mAccessToken: Oauth2AccessToken? = null // weibo - private var mLoginCallback: WeakReference? = null + private var mLoginCallback: LoginCallback? = null init { val context = HaloApp.getInstance().application.applicationContext @@ -70,11 +68,11 @@ object LoginHelper { ) content.put("access_token", o.getString("access_token")) - mLoginCallback?.get()?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功 + mLoginCallback?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功 } catch (e: JSONException) { val errorString = "QQ登录数据回调异常::$e" - mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, errorString) // 回调QQ登录失败 + mLoginCallback?.onLoginFailure(LoginTag.qq, errorString) // 回调QQ登录失败 Utils.log(errorString) e.printStackTrace() @@ -83,7 +81,7 @@ object LoginHelper { } override fun onCancel() { - mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录取消") + mLoginCallback?.onLoginFailure(LoginTag.qq, "登录取消") Utils.log("QQ 登录取消") } @@ -92,7 +90,7 @@ object LoginHelper { } override fun onError(p0: UiError?) { - mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录失败") + mLoginCallback?.onLoginFailure(LoginTag.qq, "登录失败") Utils.log("QQ 登录失败") } } @@ -110,22 +108,22 @@ object LoginHelper { @JvmStatic fun onWechatLoginSuccess(content: JSONObject) { - mLoginCallback?.get()?.onLoginSuccess(LoginTag.wechat, content) + mLoginCallback?.onLoginSuccess(LoginTag.wechat, content) } @JvmStatic fun onWechatLoginFailure(error: String) { - mLoginCallback?.get()?.onLoginFailure(LoginTag.wechat, error) + mLoginCallback?.onLoginFailure(LoginTag.wechat, error) } @JvmStatic fun onDouYinLoginSuccess(content: JSONObject) { - mLoginCallback?.get()?.onLoginSuccess(LoginTag.douyin, content) + mLoginCallback?.onLoginSuccess(LoginTag.douyin, content) } @JvmStatic fun onDouYinLoginFailure(error: String) { - mLoginCallback?.get()?.onLoginFailure(LoginTag.douyin, error) + mLoginCallback?.onLoginFailure(LoginTag.douyin, error) } @JvmStatic @@ -136,7 +134,7 @@ object LoginHelper { // QQ登录 @JvmStatic fun loginWithQQ(loginCallback: LoginCallback, activity: Activity) { - mLoginCallback = WeakReference(loginCallback) + mLoginCallback = loginCallback if (!mTencent.isSessionValid) { Utils.log("QQLogin") mTencent.login(activity, "all", mQqLoginListener) @@ -153,7 +151,7 @@ object LoginHelper { // 微信登录 @JvmStatic fun loginWithWechat(loginCallback: LoginCallback) { - mLoginCallback = WeakReference(loginCallback) + mLoginCallback = loginCallback val register = mIWXAPI.registerApp(Config.WECHAT_APPID) val req = SendAuth.Req() @@ -180,7 +178,7 @@ object LoginHelper { } mWBAPI = WBAPIFactory.createWBAPI(context) //初始化微博分享 - mLoginCallback = WeakReference(loginCallback) + mLoginCallback = loginCallback mWBAPI.registerApp( context, AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE) @@ -208,19 +206,18 @@ object LoginHelper { ) content.put("refresh_token", token.refreshToken) // content.put("refresh_token_expire", Utils.getTime(mContext) + 86400 * 30); // refresh_token 有效期30天 - mLoginCallback?.get()?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调 + mLoginCallback?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调 } } } override fun onError(error: com.sina.weibo.sdk.common.UiError?) { - mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博") + mLoginCallback?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博") } override fun onCancel() { - mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "取消授权") + mLoginCallback?.onLoginFailure(LoginTag.weibo, "取消授权") } - }) // 第一次启动本应用,AccessToken 不可用 @@ -240,6 +237,14 @@ object LoginHelper { // douYinOpenApi.authorize(request) } + /** + * 移除登录 callback 引用,避免内存泄漏 + */ + @JvmStatic + fun unregisterCallback() { + mLoginCallback = null + } + interface LoginCallback { fun onLoginSuccess(loginType: LoginTag, jsonContent: JSONObject) diff --git a/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt b/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt index 2d0862d2ed..9e401f3d39 100644 --- a/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt @@ -16,7 +16,6 @@ import android.net.Uri import android.os.Bundle import android.text.TextUtils import android.util.Base64 -import android.util.DisplayMetrics import android.util.SparseArray import android.view.View import android.view.ViewGroup @@ -58,9 +57,11 @@ import com.github.piasy.biv.view.BigImageView import com.github.piasy.biv.view.FrescoImageViewFactory import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers -import java.io.* +import java.io.BufferedOutputStream +import java.io.File +import java.io.FileOutputStream import java.util.* -import kotlin.collections.ArrayList +import kotlin.math.abs import kotlin.math.roundToInt /** @@ -172,9 +173,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { mIndicatorTv.text = String.format("%d/%d", mInitialPosition + 1, mUrlList!!.size) // init slide - val outMetrics = DisplayMetrics() - windowManager?.defaultDisplay?.getMetrics(outMetrics) - val widthPixels = outMetrics.widthPixels + val widthPixels = DisplayUtils.getScreenWidth() mLimitWidth = if (NetworkUtils.isWifiOr4GConnected(this)) { widthPixels * 2 } else { @@ -417,8 +416,6 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { } private fun finishWithAnimation(fadeOnly: Boolean) { - updateOriginPosition(mViewPager.currentItem) - val animatorSet = AnimatorSet() val translateXAnimator = ValueAnimator.ofFloat(0F, mTranslationX).apply { @@ -469,7 +466,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { } } - private fun shouldResize() = !(mImageRatio == mViewRatio || scaleWithoutResize()) + private fun shouldResize() = !(abs(mImageRatio - mViewRatio) <= 0.1F || scaleWithoutResize()) private fun justChangeBoundsAndTransform() = mImageRatio < mViewRatio && mIsFromImageContainerView && adapter?.count == 1 @@ -608,8 +605,6 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { } private fun performExitAnimation(view: DraggableBigImageView, scale: Float, fadeOnly: Boolean) { - updateOriginPosition(mViewPager.currentItem) - val finalScale = mOriginWidth / mTargetWidth val finalTranslationX = mOriginLeft - (1 - finalScale) * mTargetWidth / 2 val finalTranslationY = mOriginTop - ((1 - finalScale) * mTargetHeight + (mTargetHeight * finalScale - mOriginHeight)) / 2 @@ -726,7 +721,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { return ObjectAnimator.ofFloat(startHeight.toFloat(), endHeight.toFloat()).apply { addUpdateListener { sceneRoot.findViewById(R.id.viewimage_iv_show)?.ssiv?.run { - if (scaleWithoutResize()) { + if (abs(mImageRatio - mViewRatio) > 0.1F && scaleWithoutResize()) { maxScale = scale setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP) } @@ -768,6 +763,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { } imageView.setDragListener(object : DraggableBigImageView.DragListener { override fun onRelease(draggableBigImageView: DraggableBigImageView, scale: Float) { + updateOriginPosition(mViewPager.currentItem) performExitAnimation(draggableBigImageView, scale, isFadeOnly()) } @@ -812,7 +808,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { // } // }) ssiv.setOnClickListener { - finishWithAnimation(isFadeOnly()) + onBackPressed() } } } @@ -875,6 +871,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { private fun isFadeOnly() = mViewPager.currentItem >= mOriginLeftList?.size ?: 0 || mOriginLeft == 0 || mOriginTop == 0 override fun onBackPressed() { + updateOriginPosition(mViewPager.currentItem) finishWithAnimation(isFadeOnly()) } 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 a8b40111f4..7c67ed1c9d 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java @@ -447,6 +447,11 @@ public class LoginFragment } } + @Override + public void onDestroy() { + super.onDestroy(); + LoginHelper.unregisterCallback(); + } private void login(JSONObject content, LoginTag loginTag) { if (loginTag.equals(LoginTag.phone)) { diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt index a95622c158..5513beb884 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt @@ -222,7 +222,9 @@ class HomeFragment : LazyFragment() { override fun onDestroy() { super.onDestroy() - mScrollCalculatorHelper.currentPlayer?.release() + if (::mScrollCalculatorHelper.isInitialized) { + mScrollCalculatorHelper.currentPlayer?.release() + } } private fun handleAutoScroll(resumeScroll: Boolean) {