Compare commits

..

17 Commits

Author SHA1 Message Date
a305db7b13 tinker_base 4.0.2-182 2020-07-13 17:14:15 +08:00
58b1cd4b12 versionCode 改为182 2020-07-13 16:45:19 +08:00
5e7559e43f 修复一些闪退问题 2020-07-13 16:42:03 +08:00
2a74e35388 修复 7.1.1 系统上 toast 可能出现的闪退问题 2020-07-13 16:41:22 +08:00
5b9bef79da 修复一些闪退问题 2020-07-13 16:01:11 +08:00
9da6cbf097 修复 7.1.1 系统上 toast 可能出现的闪退问题 2020-07-13 15:23:08 +08:00
4a1c81ffb4 预留方法供网页端确定是否已安装某应用 2020-07-13 09:49:51 +08:00
be26f5168b 增加视频上传urlscheme参数 2020-07-11 21:03:55 +08:00
4e6c75995c tinker_base 4.0.2-bugfix 2020-07-10 17:38:36 +08:00
df693ce0c2 versionCode 改为181 2020-07-10 17:00:55 +08:00
f0236d7ad5 sync submodule 2020-07-10 16:59:18 +08:00
1d3e2b5c16 Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-10 16:00:25 +08:00
545d257135 修复一些闪退问题 2020-07-10 16:00:03 +08:00
f5164d2102 修复在模拟器上可能卡启动页的问题 2020-07-10 15:55:58 +08:00
9af83be9a7 修复 7.1.1 系统上 toast 可能出现的闪退问题 2020-07-10 15:40:38 +08:00
ad7543e7bc Merge branch 'dev' of gitlab.ghzs.com:halo/assistant-android into dev 2020-07-09 14:56:24 +08:00
1bd0db013b 处理Picasso获取Bitmap有时不显示问题 2020-07-09 14:56:18 +08:00
22 changed files with 273 additions and 228 deletions

View File

@ -142,6 +142,20 @@ class DefaultJsApi(var context: Context) {
context?.startActivity(ViewImageActivity.getViewImageIntent(context, imageEvent.imageList, imageEvent.position, "浏览器"))
}
@JavascriptInterface
fun isInstalled(event: Any): String {
val localInstalledPackageList = PackageUtils.getAllPackageName(HaloApp.getInstance().application)
val packageNameList: ArrayList<String> = event.toString().toObject() ?: ArrayList()
for (packageName in packageNameList) {
if (!localInstalledPackageList.contains(packageName)) {
return "false"
}
}
return "true"
}
@JavascriptInterface
fun openBase64Image(event: Any) {
val context = CurrentActivityHolder.getCurrentActivity()

View File

@ -13,6 +13,7 @@ import com.gh.common.util.DirectUtils.directToVideoDetail
import com.gh.common.util.EntranceUtils
import com.gh.gamecenter.*
import com.gh.gamecenter.entity.CommunityEntity
import com.gh.gamecenter.entity.SimpleGameEntity
import com.gh.gamecenter.entity.SubjectRecommendEntity
import com.gh.gamecenter.entity.VideoLinkEntity
import com.gh.gamecenter.subject.SubjectActivity
@ -125,11 +126,11 @@ object DefaultUrlHandler {
val categoryId = uri.getQueryParameter("category_id") ?: ""
val link = uri.getQueryParameter("link") ?: ""
val linkEntity = VideoLinkEntity(title, categoryId, link)
// if (!CheckLoginUtils.isLogin()) {
// HaloApp.put(EntranceUtils.HOST_UPLOAD_VIDEO, linkEntity)
// }
val gameId = uri.getQueryParameter("gameId") ?: ""
val gameName = uri.getQueryParameter("gameName") ?: ""
val simpleGameEntity = SimpleGameEntity(gameId, gameName)
CheckLoginUtils.checkLogin(context, null, true, EntranceUtils.ENTRANCE_BROWSER) {
DirectUtils.directToVideoManager(context, linkEntity, EntranceUtils.ENTRANCE_BROWSER, "")
DirectUtils.directToVideoManager(context, linkEntity, simpleGameEntity, EntranceUtils.ENTRANCE_BROWSER, "")
}
}
EntranceUtils.HOST_USERHOME -> {
@ -215,7 +216,7 @@ object DefaultUrlHandler {
}
EntranceUtils.HOST_GAME_UPLOAD -> {
DirectUtils.directGameUpload(context,entrance = entrance, path = "")
DirectUtils.directGameUpload(context, entrance = entrance, path = "")
}
else -> DialogUtils.showLowVersionDialog(context)

View File

@ -677,10 +677,11 @@ object DirectUtils {
* 跳转至上传视频
*/
@JvmStatic
fun directToVideoManager(context: Context, linkEntity: VideoLinkEntity, entrance: String? = null, path: String? = "") {
fun directToVideoManager(context: Context, linkEntity: VideoLinkEntity,simpleGameEntity: SimpleGameEntity, entrance: String? = null, path: String? = "") {
val bundle = Bundle()
bundle.putString(KEY_PATH, path)
bundle.putParcelable(VideoLinkEntity::class.java.simpleName, linkEntity)
bundle.putParcelable(SimpleGameEntity::class.java.simpleName, simpleGameEntity)
bundle.putString(KEY_TO, VideoManagerActivity::class.java.name)
bundle.putString(KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
jumpActivity(context, bundle)

View File

@ -159,7 +159,7 @@ object LoginHelper {
if (mAccessToken?.isSessionValid == true) {
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(context, mAccessToken)
Toast.makeText(context, "授权成功", Toast.LENGTH_SHORT).show()
Utils.toast(context, "授权成功")
}
}

View File

@ -24,6 +24,9 @@ import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
@ -54,9 +57,6 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import static com.gh.common.util.LoginHelper.WEIBO_SCOPE;
/**
@ -247,17 +247,17 @@ public class ShareUtils {
e.printStackTrace();
}
contentView.setOnClickListener(v -> popupWindow.get().dismiss());
contentView.setOnClickListener(v -> safelyDismiss());
contentView.setOnKeyListener((v, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0
&& popupWindow != null
&& popupWindow.get() != null
&& popupWindow.get().isShowing()) {
if (callBack != null) {
callBack.onCancel();
}
popupWindow.get().dismiss();
safelyDismiss();
}
return false;
});
@ -298,7 +298,7 @@ public class ShareUtils {
}
if (mShareEntrance != ShareEntrance.shareGh) {
popupWindow.get().dismiss();
safelyDismiss();
}
}
@ -338,7 +338,7 @@ public class ShareUtils {
loadBitMap(shareIcon, msg, req);
if (mShareEntrance != ShareEntrance.shareGh) {
popupWindow.get().dismiss();
safelyDismiss();
}
}
@ -454,7 +454,7 @@ public class ShareUtils {
}
if (mShareEntrance != ShareEntrance.shareGh) {
popupWindow.get().dismiss();
safelyDismiss();
}
}
@ -499,7 +499,7 @@ public class ShareUtils {
loadBitMap(shareIcon, msg, req);
if (mShareEntrance != ShareEntrance.shareGh) {
popupWindow.get().dismiss();
safelyDismiss();
}
}
@ -520,7 +520,7 @@ public class ShareUtils {
if (mShareEntrance != ShareEntrance.shareGh) {
popupWindow.get().dismiss();
safelyDismiss();
}
}
@ -562,8 +562,8 @@ public class ShareUtils {
e.printStackTrace();
}
if (mShareEntrance != ShareEntrance.shareGh) {
popupWindow.get().dismiss();
if (mShareEntrance != ShareEntrance.shareGh ) {
safelyDismiss();
}
}
@ -575,7 +575,7 @@ public class ShareUtils {
cmb.setText(copyContent);
if (mShareEntrance != ShareEntrance.shareGh) {
Utils.toast(mContext, "复制成功");
popupWindow.get().dismiss();
safelyDismiss();
} else {
Utils.toast(mContext, "复制成功,请到微信/QQ粘贴分享");
}
@ -661,7 +661,7 @@ public class ShareUtils {
break;
case 7:
if (mShareEntrance != ShareEntrance.shareGh) {
popupWindow.get().dismiss();
safelyDismiss();
} else {
shareType = "copy_link";
LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId);
@ -689,6 +689,12 @@ public class ShareUtils {
}
}
}
private void safelyDismiss() {
if (popupWindow.get() != null) {
popupWindow.get().dismiss();
}
}
interface OnItemClickListener {
void onItemClick(int position);

View File

@ -3,6 +3,7 @@ package com.gh.common.util
import android.widget.Toast
import com.halo.assistant.HaloApp
import com.lightgame.utils.toast.ToastHandler
object ToastUtils {
/** 之前显示的内容 */
@ -32,7 +33,7 @@ object ToastUtils {
*/
fun showToast(message: String, gravity: Int = -1, yOffset: Int = 0) {
if (mToast == null) {
mToast = Toast.makeText(HaloApp.getInstance().application, message, Toast.LENGTH_SHORT)
mToast = ToastHandler.INSTANCE.getToastInstance(HaloApp.getInstance().application, message, Toast.LENGTH_SHORT)
if (gravity != -1) mToast!!.setGravity(gravity, 0, yOffset) else
mToast!!.setGravity(DisplayUtils.getToastDefaultGravity(), 0, DisplayUtils.getToastOffset())
mToast!!.show()

View File

@ -61,7 +61,7 @@ object VideoRecordUtils {
if (!UserManager.getInstance().isLoggedIn) return
val requestMap = HashMap<String, Any>()
val videoIds = videoRecordSet.toList().map { it.videoId }
requestMap["g_id"] = HaloApp.getInstance().gid
requestMap["g_id"] = HaloApp.getInstance().gid ?: ""
requestMap["time"] = time
requestMap["video_id"] = videoIds
RetrofitManager.getInstance(HaloApp.getInstance().application).api

View File

@ -194,6 +194,8 @@ public class ExpandTextView extends AppCompatTextView {
msp.replace(expandTextStartPosition, length, finalEndText + mExpandText);
if (expandTextStartPosition + mEndText.length() >= msp.length()) return;
msp.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(@NonNull TextPaint ds) {

View File

@ -269,6 +269,7 @@ public class NestedScrollWebView2 extends DWebView implements NestedScrollingChi
ev.setAction(MotionEvent.ACTION_CANCEL);
returnValue = super.onTouchEvent(ev);
}
initVelocityTrackerIfNotExists();
final VelocityTracker velocityTracker = mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId);

View File

@ -17,11 +17,11 @@ import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.ScrollView
import android.widget.TextView
import com.gh.base.BaseActivity
import com.gh.base.ToolBarActivity
import com.gh.common.util.CommentUtils
import com.gh.common.util.DeviceUtils
import com.gh.common.util.DialogUtils
import com.gh.common.util.tryCatchInRelease
import com.gh.gamecenter.retrofit.Response
import io.reactivex.Observable
import io.reactivex.ObservableOnSubscribe
@ -67,85 +67,85 @@ class NetworkDiagnosisActivity : ToolBarActivity() {
Observable.create(ObservableOnSubscribe<ProgressAndDetail> {
var progress = 0
var progress = 0
// 1.获取当前网络情况network/ip/mac/sim
// 1.获取当前网络情况network/ip/mac/sim
// Network 2G/3G/4G/WIFI
builder.append("Network:")
builder.append(DeviceUtils.getNetwork(applicationContext))
// Network 2G/3G/4G/WIFI
builder.append("Network:")
builder.append(DeviceUtils.getNetwork(applicationContext))
builder.append("\n")
progress += 3
it.onNext(ProgressAndDetail(progress, builder.toString()))
// IP
builder.append("IP:")
builder.append(DeviceUtils.getIPAddress(applicationContext))
builder.append("\n")
progress += 3
it.onNext(ProgressAndDetail(progress, builder.toString()))
// MAC
builder.append("MAC:")
builder.append(DeviceUtils.getMac(applicationContext))
builder.append("\n")
progress += 3
it.onNext(ProgressAndDetail(progress, builder.toString()))
// SIM
builder.append("SIM:")
builder.append(DeviceUtils.getSim(applicationContext))
builder.append("\n")
progress += 3
it.onNext(ProgressAndDetail(progress, builder.toString()))
builder.append("-----------------------------------------------------------------------\n")
// 2.ping域名
val domains = arrayOf("api.ghzs.com", "download.ghzs.com", "apk.ghzs666.com", "image.ghzs666.com", "image.ghzhushou.com")
for (domain in domains) {
builder.append(DeviceUtils.ping(domain))
builder.append("-----------------------------------------------------------------------\n")
progress += 7
it.onNext(ProgressAndDetail(progress, builder.toString()))
}
// 3.okhttp访问链接
val urls = arrayOf("https://api.ghzs.com/v3d3/index/columns", "https://download.ghzs.com/game?id=55097638fc1a6fa45f8b4568&platform=9u", "https://apk.ghzs666.com/packed/5af00abc02b30f7c038b456c.apk", "http://image.ghzs666.com/pic/5b29b3c92924bcaf5d438d38.jpg", "http://image.ghzhushou.com/pic/586cad378ab49e0f1b91b3e8.png")
for (url in urls) {
builder.append("Url:")
builder.append(url)
builder.append("\n")
val client = OkHttpClient()
val request = Request.Builder()
.head()
.url(url)
.build()
try {
val response = client.newCall(request).execute()
builder.append("Success:\n")
builder.append("Response:\n")
builder.append(response.toString())
builder.append("\n")
progress += 3
it.onNext(ProgressAndDetail(progress, builder.toString()))
// IP
builder.append("IP:")
builder.append(DeviceUtils.getIPAddress(applicationContext))
builder.append("Response Header:\n")
builder.append(response.headers().toString())
builder.append("\n")
} catch (e: IOException) {
builder.append("Error:\n")
builder.append(Log.getStackTraceString(e))
}
builder.append("-----------------------------------------------------------------------\n")
progress += 7
it.onNext(ProgressAndDetail(progress, builder.toString()))
}
progress += 3
it.onNext(ProgressAndDetail(progress, builder.toString()))
// MAC
builder.append("MAC:")
builder.append(DeviceUtils.getMac(applicationContext))
builder.append("\n")
progress += 3
it.onNext(ProgressAndDetail(progress, builder.toString()))
// SIM
builder.append("SIM:")
builder.append(DeviceUtils.getSim(applicationContext))
builder.append("\n")
progress += 3
it.onNext(ProgressAndDetail(progress, builder.toString()))
builder.append("-----------------------------------------------------------------------\n")
// 2.ping域名
val domains = arrayOf("api.ghzs.com", "download.ghzs.com", "apk.ghzs666.com", "image.ghzs666.com", "image.ghzhushou.com")
for (domain in domains) {
builder.append(DeviceUtils.ping(domain))
builder.append("-----------------------------------------------------------------------\n")
progress += 7
it.onNext(ProgressAndDetail(progress, builder.toString()))
}
// 3.okhttp访问链接
val urls = arrayOf("https://api.ghzs.com/v3d3/index/columns", "https://download.ghzs.com/game?id=55097638fc1a6fa45f8b4568&platform=9u", "https://apk.ghzs666.com/packed/5af00abc02b30f7c038b456c.apk", "http://image.ghzs666.com/pic/5b29b3c92924bcaf5d438d38.jpg", "http://image.ghzhushou.com/pic/586cad378ab49e0f1b91b3e8.png")
for (url in urls) {
builder.append("Url:")
builder.append(url)
builder.append("\n")
val client = OkHttpClient()
val request = Request.Builder()
.head()
.url(url)
.build()
try {
val response = client.newCall(request).execute()
builder.append("Success:\n")
builder.append("Response:\n")
builder.append(response.toString())
builder.append("\n")
builder.append("Response Header:\n")
builder.append(response.headers().toString())
builder.append("\n")
} catch (e: IOException) {
builder.append("Error:\n")
builder.append(Log.getStackTraceString(e))
}
builder.append("-----------------------------------------------------------------------\n")
progress += 7
it.onNext(ProgressAndDetail(progress, builder.toString()))
}
it.onComplete()
}).subscribeOn(Schedulers.io())
it.onComplete()
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Response<ProgressAndDetail>() {
override fun onNext(response: ProgressAndDetail) {
@ -185,44 +185,46 @@ class NetworkDiagnosisActivity : ToolBarActivity() {
// 等待10秒等待js检查完成
view.postDelayed({
// WebView生成长图也就是超过一屏的图片代码中的bitmap就是最后生成的长图
mWebView.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))
mWebView.layout(0, 0, mWebView.measuredWidth, mWebView.measuredHeight)
mWebView.isDrawingCacheEnabled = true
mWebView.buildDrawingCache()
val bitmap = Bitmap.createBitmap(mWebView.measuredWidth,
mWebView.measuredHeight, Bitmap.Config.ARGB_8888)
tryCatchInRelease {
mWebView.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))
mWebView.layout(0, 0, mWebView.measuredWidth, mWebView.measuredHeight)
mWebView.isDrawingCacheEnabled = true
mWebView.buildDrawingCache()
val bitmap = Bitmap.createBitmap(mWebView.measuredWidth,
mWebView.measuredHeight, Bitmap.Config.ARGB_8888)
// 画布的宽高和WebView的网页保持一致
val canvas = Canvas(bitmap)
val paint = Paint()
canvas.drawBitmap(bitmap, 0F, mWebView.measuredHeight.toFloat(), paint)
mWebView.draw(canvas)
// 画布的宽高和WebView的网页保持一致
val canvas = Canvas(bitmap)
val paint = Paint()
canvas.drawBitmap(bitmap, 0F, mWebView.measuredHeight.toFloat(), paint)
mWebView.draw(canvas)
// 保存成文件
val filePath = bitmap2File(bitmap)
// 保存成文件
val filePath = bitmap2File(bitmap)
builder.append("WebView Long Image Path:\n")
builder.append(filePath)
builder.append("\n")
builder.append("\n")
builder.append(mSuccessHint)
builder.append("WebView Long Image Path:\n")
builder.append(filePath)
builder.append("\n")
builder.append("\n")
builder.append(mSuccessHint)
builder.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = resources.getColor(R.color.theme_font)
ds.isUnderlineText = false
}
builder.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = resources.getColor(R.color.theme_font)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
CommentUtils.copyText(builder.toString().replace(mSuccessHint, ""), applicationContext)
}
}, builder.length - mSuccessHint.length, builder.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
override fun onClick(widget: View) {
CommentUtils.copyText(builder.toString().replace(mSuccessHint, ""), applicationContext)
}
}, builder.length - mSuccessHint.length, builder.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
mResult.text = builder
mResult.setMovementMethod(LinkMovementMethod.getInstance())
setResultProgress(100)
mResult.text = builder
mResult.setMovementMethod(LinkMovementMethod.getInstance())
setResultProgress(100)
}
}, 1000)
}
}
@ -252,7 +254,7 @@ class NetworkDiagnosisActivity : ToolBarActivity() {
override fun handleBackPressed(): Boolean {
if (mProgressData < 100) {
DialogUtils.showAlertDialog(this, "确认退出", "网络诊断还未完成,退出会终止所有诊断进程,确定退出吗?"
,"确定", "取消", DialogUtils.ConfirmListener {
, "确定", "取消", DialogUtils.ConfirmListener {
finish()
}, null)
return true

View File

@ -12,6 +12,7 @@ import com.gh.common.util.EntranceUtils;
import com.gh.common.util.PlatformUtils;
import com.gh.common.util.RunningUtils;
import com.gh.gamecenter.entity.CommunityEntity;
import com.gh.gamecenter.entity.SimpleGameEntity;
import com.gh.gamecenter.entity.SubjectRecommendEntity;
import com.gh.gamecenter.entity.VideoLinkEntity;
import com.gh.gamecenter.manager.UserManager;
@ -97,7 +98,7 @@ public class SkipActivity extends BaseActivity {
DirectUtils.directToArticle(this, path, ENTRANCE_BROWSER);
break;
case HOST_GAME:
DirectUtils.directToGameDetail(this, path, ENTRANCE_BROWSER, false, "libao".equals(to),null);
DirectUtils.directToGameDetail(this, path, ENTRANCE_BROWSER, false, "libao".equals(to), null);
break;
case HOST_COLUMN:
DirectUtils.directToSubject(this, path, uri.getQueryParameter(KEY_NAME), ENTRANCE_BROWSER);
@ -182,11 +183,12 @@ public class SkipActivity extends BaseActivity {
String categoryId = uri.getQueryParameter("category_id");
String link = uri.getQueryParameter("link");
VideoLinkEntity linkEntity = new VideoLinkEntity(title, categoryId, link);
// if (!CheckLoginUtils.isLogin()) {
// HaloApp.put(HOST_UPLOAD_VIDEO, linkEntity);
// }
Bundle nextToBundle = VideoManagerActivity.getVideoManagerBundle(linkEntity, EntranceUtils.ENTRANCE_BROWSER, "");
CheckLoginUtils.checkLogin(this, nextToBundle, true, EntranceUtils.ENTRANCE_BROWSER, null);
gameId = uri.getQueryParameter("gameId");
String gameName = uri.getQueryParameter("gameName");
SimpleGameEntity simpleGameEntity = new SimpleGameEntity(gameId, gameName, "");
Bundle nextToBundle = VideoManagerActivity.getVideoManagerBundle(linkEntity, simpleGameEntity, EntranceUtils.ENTRANCE_BROWSER, "");
CheckLoginUtils.checkLogin(this, nextToBundle, true, EntranceUtils.ENTRANCE_BROWSER, () ->
DirectUtils.directToVideoManager(SkipActivity.this, linkEntity, simpleGameEntity, EntranceUtils.ENTRANCE_BROWSER, "浏览器"));
break;
case HOST_VIDEO_SINGLE:
DirectUtils.directToVideoDetail(this, path, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.getValue(),
@ -283,7 +285,7 @@ public class SkipActivity extends BaseActivity {
break;
case EntranceUtils.HOST_SERVER_BLOCK:
DirectUtils.directToGameServers(this,ENTRANCE_BROWSER, "浏览器");
DirectUtils.directToGameServers(this, ENTRANCE_BROWSER, "浏览器");
break;
case EntranceUtils.HOST_AMWAY_BLOCK:

View File

@ -1,9 +1,8 @@
package com.gh.gamecenter.gamedetail.desc
import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.net.Uri
import android.text.Spanned
import android.view.View
import android.view.ViewGroup
@ -20,7 +19,9 @@ import com.gh.gamecenter.entity.TagEntity
import com.lightgame.adapter.BaseRecyclerAdapter
import com.m7.imkfsdk.utils.DensityUtil
import com.squareup.picasso.Picasso
import com.squareup.picasso.Target
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import java.util.*
class GameDetailCustomColumnAdapter(context: Context)
@ -53,8 +54,8 @@ class GameDetailCustomColumnAdapter(context: Context)
.build()
tryWithDefaultCatch {
Picasso.with(mContext).load(icon)
.priority(Picasso.Priority.HIGH)
/*Picasso.with(mContext).load(icon)
.priority(Picasso.Priority.LOW)
.into(object : Target {
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
viewHolder.contentTv.movementMethod = CustomLinkMovementMethod.getInstance()
@ -68,6 +69,20 @@ class GameDetailCustomColumnAdapter(context: Context)
viewHolder.contentTv.movementMethod = CustomLinkMovementMethod.getInstance()
viewHolder.contentTv.text = spannable
}
})*/
Single.just(icon)
.map {
Picasso.with(mContext).load(Uri.parse(it)).priority(Picasso.Priority.HIGH).get()
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
val bitmapDrawable = BitmapDrawable(mContext.resources, it)
bitmapDrawable.setBounds(0, 0, DensityUtil.dip2px(16F), DensityUtil.dip2px(16F))
spannable.setSpan(CenterImageSpan(bitmapDrawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
viewHolder.contentTv.movementMethod = CustomLinkMovementMethod.getInstance()
viewHolder.contentTv.text = spannable
},{
it.printStackTrace()
})
}
}

View File

@ -80,7 +80,7 @@ class FuLiFragment : BaseFragment<Any>() {
mFuLiViewModel?.fuFiDataLD?.observe(this, Observer {
mViewSkeletonScreen.hide()
reuse_ll_loading.visibility = View.GONE
reuse_ll_loading?.visibility = View.GONE
if (it.status == Status.SUCCESS) {
mAdapter?.itemList = it.data

View File

@ -1,11 +1,9 @@
package com.gh.gamecenter.gamedetail.rating
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.net.Uri
import android.text.SpannableStringBuilder
import android.text.Spanned
@ -36,9 +34,10 @@ import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity.Companion.LAB
import com.gh.gamecenter.gamedetail.rating.logs.CommentLogsActivity
import com.gh.gamecenter.manager.UserManager
import com.m7.imkfsdk.utils.DensityUtil
import com.squareup.picasso.MemoryPolicy
import com.squareup.picasso.NetworkPolicy
import com.squareup.picasso.Picasso
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import java.util.regex.Pattern
class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseRecyclerViewHolder<Any>(binding.root) {
@ -85,45 +84,40 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR
replyContent.highlightColor = Color.TRANSPARENT
if (commentData.replyData!!.user.badge != null) {
Picasso.with(context).load(Uri.parse(commentData.replyData!!.user.badge?.icon))
.priority(Picasso.Priority.HIGH)
.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
.networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)
.into(object : com.squareup.picasso.Target {
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
Single.just(commentData.replyData!!.user.badge?.icon)
.map {
//Target对象保存为弱引用gc时对象被回收导致无法回调因此改为同步方式获取bitmap
//https://github.com/square/picasso/issues/352
Picasso.with(context).load(Uri.parse(it)).priority(Picasso.Priority.HIGH).get()
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
val bitmapDrawable = BitmapDrawable(context.resources, it)
bitmapDrawable.setBounds(0, 0, DensityUtil.dip2px(16F), DensityUtil.dip2px(16F))
contentSpan.setSpan(CenterImageSpan(bitmapDrawable), commentData.replyData?.user?.name!!.length + 2, commentData.replyData?.user?.name!!.length + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
contentSpan.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.isUnderlineText = false
}
}
override fun onBitmapFailed(errorDrawable: Drawable?) {
}
override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
val bitmapDrawable = BitmapDrawable(context.resources, bitmap)
bitmapDrawable.setBounds(0, 0, DensityUtil.dip2px(16F), DensityUtil.dip2px(16F))
contentSpan.setSpan(CenterImageSpan(bitmapDrawable), commentData.replyData?.user?.name!!.length + 2, commentData.replyData?.user?.name!!.length + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
contentSpan.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.isUnderlineText = false
override fun onClick(widget: View) {
val key = when (path) {
"游戏详情:介绍" -> "游戏详情-玩家评论"
"游戏详情:评分" -> "游戏详情-评论列表"
"评论详情" -> "游戏评论详情"
else -> ""
}
MtaHelper.onEvent("进入徽章墙_用户记录", key, "${commentData.replyData?.user?.name}${commentData.replyData?.user?.id}")
MtaHelper.onEvent("徽章中心", "进入徽章中心", key)
DirectUtils.directToBadgeWall(context, commentData.replyData!!.user.id, commentData.replyData!!.user.name, commentData.replyData!!.user.icon)
}
override fun onClick(widget: View) {
val key = when (path) {
"游戏详情:介绍" -> "游戏详情-玩家评论"
"游戏详情:评分" -> "游戏详情-评论列表"
"评论详情" -> "游戏评论详情"
else -> ""
}
MtaHelper.onEvent("进入徽章墙_用户记录", key, "${commentData.replyData?.user?.name}${commentData.replyData?.user?.id}")
MtaHelper.onEvent("徽章中心", "进入徽章中心", key)
DirectUtils.directToBadgeWall(context, commentData.replyData!!.user.id, commentData.replyData!!.user.name, commentData.replyData!!.user.icon)
}
}, commentData.replyData?.user?.name!!.length + 2, commentData.replyData?.user?.name!!.length + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
userName.movementMethod = CustomLinkMovementMethod.getInstance()
replyContent.text = contentSpan
}
}, commentData.replyData?.user?.name!!.length + 2, commentData.replyData?.user?.name!!.length + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
replyContent.movementMethod = CustomLinkMovementMethod.getInstance()
replyContent.text = contentSpan
},{
it.printStackTrace()
})
} else {
name = "${commentData.replyData?.user?.name}${commentData.replyData?.content}"

View File

@ -1,11 +1,10 @@
package com.gh.gamecenter.gamedetail.rating
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.net.Uri
import android.text.SpannableStringBuilder
import android.text.Spanned
@ -48,10 +47,10 @@ import com.gh.gamecenter.manager.UserManager
import com.lightgame.download.DownloadStatus
import com.lightgame.utils.Utils
import com.m7.imkfsdk.utils.DensityUtil
import com.squareup.picasso.MemoryPolicy
import com.squareup.picasso.NetworkPolicy
import com.squareup.picasso.Picasso
import com.squareup.picasso.Target
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
class RatingReplyAdapter(context: Context,
val entrance: String,
@ -452,38 +451,34 @@ class RatingReplyAdapter(context: Context,
}
}
@SuppressLint("CheckResult")
private fun RatingReplyItemBinding.setBadgeSpan(user: UserEntity, replyNameSpannable: SpannableStringBuilder, startIndex: Int, endIndex: Int) {
Picasso.with(mContext).load(Uri.parse(user.badge?.icon))
.priority(Picasso.Priority.HIGH)
.into(object : Target {
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
Single.just(user.badge?.icon)
.map {
Picasso.with(mContext).load(Uri.parse(it)).priority(Picasso.Priority.HIGH).get()
}.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
val bitmapDrawable = BitmapDrawable(mContext.resources, it)
bitmapDrawable.setBounds(0, 0, DensityUtil.dip2px(16F), DensityUtil.dip2px(16F))
replyNameSpannable.setSpan(CenterImageSpan(bitmapDrawable), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
replyNameSpannable.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.isUnderlineText = false
}
}
override fun onClick(widget: View) {
MtaHelper.onEvent("进入徽章墙_用户记录", "游戏评论详情", "${user.name}${user.id}")
MtaHelper.onEvent("徽章中心", "进入徽章中心", "游戏评论详情")
DirectUtils.directToBadgeWall(mContext, user.id, user.name, user.icon)
}
override fun onBitmapFailed(errorDrawable: Drawable?) {
}
override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
val bitmapDrawable = BitmapDrawable(mContext.resources, bitmap)
bitmapDrawable.setBounds(0, 0, DensityUtil.dip2px(16F), DensityUtil.dip2px(16F))
replyNameSpannable.setSpan(CenterImageSpan(bitmapDrawable), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
replyNameSpannable.setSpan(object : ClickableSpan() {
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.isUnderlineText = false
}
override fun onClick(widget: View) {
MtaHelper.onEvent("进入徽章墙_用户记录", "游戏评论详情", "${user.name}${user.id}")
MtaHelper.onEvent("徽章中心", "进入徽章中心", "游戏评论详情")
DirectUtils.directToBadgeWall(mContext, user.id, user.name, user.icon)
}
}, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
userName.movementMethod = CustomLinkMovementMethod.getInstance()
userName.text = replyNameSpannable
}
}, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
userName.movementMethod = CustomLinkMovementMethod.getInstance()
userName.text = replyNameSpannable
},{
it.printStackTrace()
})
}

View File

@ -88,7 +88,7 @@ class GameServersActivity : ToolBarActivity() {
private fun setPageScrollState(state: Int) {
runOnIoThread {
for (fragment in mFragments) {
if (fragment.userVisibleHint) {
if (fragment.userVisibleHint && fragment.host != null) {
val fragments = fragment.childFragmentManager.fragments
for (childFragment in fragments) {
if (childFragment is GameServersContentFragment) {

View File

@ -164,6 +164,11 @@ class UploadVideoActivity : ToolBarActivity() {
} else {
setNavigationTitle("视频上传")
}
mViewModel.gameEntity = intent.getParcelableExtra(SimpleGameEntity::class.java.simpleName)
if (mViewModel.gameEntity != null) {
mBinding.gameName.text = mViewModel.gameEntity?.name ?: ""
mBinding.gameName.setTextColor(resources.getColor(R.color.text_333333))
}
}
private fun initViewModel() {
@ -751,12 +756,14 @@ class UploadVideoActivity : ToolBarActivity() {
fun getIntent(context: Context,
videoPath: String,
linkEntity: VideoLinkEntity,
simpleGameEntity: SimpleGameEntity? = null,
entrance: String,
path: String): Intent {
val intent = Intent(context, UploadVideoActivity::class.java)
intent.putExtra(EntranceUtils.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path))
intent.putExtra(EntranceUtils.KEY_PATH, path)
intent.putExtra(VideoLinkEntity::class.java.simpleName, linkEntity)
intent.putExtra(SimpleGameEntity::class.java.simpleName, simpleGameEntity)
intent.putExtra(EntranceUtils.KEY_PATH_VIDEO, videoPath)
return intent
}

View File

@ -11,6 +11,7 @@ import com.gh.base.BaseActivity
import com.gh.base.BaseActivity_TabLayout
import com.gh.common.util.*
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.SimpleGameEntity
import com.gh.gamecenter.entity.VideoLinkEntity
import com.gh.gamecenter.video.upload.view.UploadVideoActivity
import com.zhihu.matisse.Matisse
@ -20,6 +21,7 @@ import com.zhihu.matisse.internal.utils.PathUtils
class VideoManagerActivity : BaseActivity_TabLayout() {
private var mVideoLink: VideoLinkEntity? = null
private var mSimpleGameEntity: SimpleGameEntity? = null
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
@ -28,7 +30,7 @@ class VideoManagerActivity : BaseActivity_TabLayout() {
if (uris.size > 0) {
val videoPath = PathUtils.getPath(this, uris[0]) ?: ""
val intent = if (mVideoLink != null) {
UploadVideoActivity.getIntent(this, videoPath, mVideoLink!!, mEntrance, "视频投稿")
UploadVideoActivity.getIntent(this, videoPath, mVideoLink!!, mSimpleGameEntity, mEntrance, "视频投稿")
} else {
UploadVideoActivity.getIntent(this, videoPath, mEntrance, "视频投稿")
}
@ -47,6 +49,7 @@ class VideoManagerActivity : BaseActivity_TabLayout() {
setNavigationTitle("视频投稿")
setToolbarMenu(R.menu.menu_text)
mVideoLink = intent.getParcelableExtra(VideoLinkEntity::class.java.simpleName)
mSimpleGameEntity = intent.getParcelableExtra(SimpleGameEntity::class.java.simpleName)
val menuItem = getMenuItem(R.id.menu_text)
val container = menuItem.actionView.findViewById<View>(R.id.menu_text)
@ -106,10 +109,11 @@ class VideoManagerActivity : BaseActivity_TabLayout() {
}
@JvmStatic
fun getVideoManagerBundle(linkEntity: VideoLinkEntity, entrance: String? = null, path: String? = ""): Bundle {
fun getVideoManagerBundle(linkEntity: VideoLinkEntity, simpleGameEntity: SimpleGameEntity, entrance: String? = null, path: String? = ""): Bundle {
val bundle = Bundle()
bundle.putString(EntranceUtils.KEY_PATH, path)
bundle.putParcelable(VideoLinkEntity::class.java.simpleName, linkEntity)
bundle.putParcelable(SimpleGameEntity::class.java.simpleName, simpleGameEntity)
bundle.putString(EntranceUtils.KEY_TO, VideoManagerActivity::class.java.name)
bundle.putString(EntranceUtils.KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path))
return bundle

View File

@ -164,8 +164,6 @@ public class HaloApp extends TinkerAppLike {
FixedRateJobHelper.begin();
AntiBotHelper.getManager();
// 耗时操作
AppExecutor.getIoExecutor().execute(() -> {
//Leto.init(getApplication(), Config.LETO_APPID);
@ -193,6 +191,8 @@ public class HaloApp extends TinkerAppLike {
if (!TextUtils.isEmpty(barData.getIconUnselect())) {
Picasso.with(getApplication()).load(Uri.parse(barData.getIconUnselect())).fetch();
}
AntiBotHelper.getManager();
});
PlayerFactory.setPlayManager(Exo2PlayerManager.class);
CacheFactory.setCacheManager(ExoPlayerCacheManager.class);

View File

@ -7,7 +7,7 @@ ext {
targetSdkVersion = 26
// application info
versionCode = 180
versionCode = 182
versionName = "4.0.2"
applicationId = "com.gh.gamecenter"

View File

@ -51,8 +51,8 @@ SENSITIVE_API_HOST=https\://and-core-api.ghzs.com/v4d0d2/
# 请不要手动改动下面的值除非你明确需要以某个apk作为基准包需要打包请以scripts/tinker*.sh为准
TINKER_ENABLE=
TINKER_ID=2aa4166
TINKER_BASE_APK_DIR=app-0709-10-15-40_2aa4166
TINKER_ID=58b1cd4
TINKER_BASE_APK_DIR=app-0713-16-50-31_58b1cd4
android.useAndroidX=true
android.enableJetifier=true