From c44353fa13ef8fc78298170d2a1e5c79cbd8452b Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Fri, 22 Jun 2018 16:22:20 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E8=AF=8A=E6=96=AD=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 + .../java/com/gh/common/util/DeviceUtils.java | 45 ++- .../gh/gamecenter/NetworkDiagnosisActivity.kt | 265 ++++++++++++++++++ .../gamedetail/GameDetailKaiFuAdapter.java | 5 +- .../qa/column/detail/hot/HotFragment.kt | 11 + .../detail/recommends/RecommendsFragment.kt | 11 + .../detail/unanswered/UnansweredFragment.kt | 11 + .../assistant/fragment/SettingsFragment.java | 7 +- .../res/layout/activity_network_diagnosis.xml | 45 +++ app/src/main/res/layout/fragment_setting.xml | 12 + 10 files changed, 411 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/NetworkDiagnosisActivity.kt create mode 100644 app/src/main/res/layout/activity_network_diagnosis.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9f860dca3d..9a717a0f51 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -318,6 +318,10 @@ android:name = "com.gh.gamecenter.qa.column.detail.AskColumnDetailActivity" android:screenOrientation = "portrait" /> + + (R.id.network_diagnosis_result) + private val mProgress by bindView(R.id.network_diagnosis_progress) + private val mWebView by bindView(R.id.network_diagnosis_web) + private val mScrollView by bindView(R.id.network_diagnosis_scrollview) + + private val builder = SpannableStringBuilder() + + private val mSuccessHint = "诊断完毕。( 点击复制 )\n" + + private var mProgressData = 0 + + + override fun getLayoutId(): Int { + return R.layout.activity_network_diagnosis + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setNavigationTitle("网络诊断") + // 5.0后,Android对WebView做了优化,此为关闭该优化 + if (android.os.Build.VERSION.SDK_INT >= 21) { + WebView.enableSlowWholeDocumentDraw() + } + + Observable + .create(Observable.OnSubscribe { + + var progress = 0 + + // 1.获取当前网络情况,network/ip/mac/sim + + // 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") + 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.onCompleted() + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onNext(response: ProgressAndDetail?) { + mResult.text = response?.detail + setResultProgress(response?.progress ?: 0) + } + + override fun onCompleted() { + initWebView() + } + }) + + } + + + fun setResultProgress(progress: Int) { + mProgress.text = "正在进行网络诊断 $progress%" + mBaseHandler.post(Runnable { + mScrollView.fullScroll(ScrollView.FOCUS_DOWN) + }) + + mProgressData = progress + } + + @SuppressLint("SetJavaScriptEnabled") + fun initWebView() { + mWebView.loadUrl("https://cdn.dns-detect.alicdn.com/https/doc.html") + // 开启JavaScript + mWebView.settings.javaScriptEnabled = true + // 开启LocalStorage + mWebView.settings.domStorageEnabled = true + // 监听页面加载完成 + mWebView.webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView, url: String) { + super.onPageFinished(view, url) + + // 等待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) + + // 画布的宽高和WebView的网页保持一致 + val canvas = Canvas(bitmap) + val paint = Paint() + canvas.drawBitmap(bitmap, 0F, mWebView.measuredHeight.toFloat(), paint) + mWebView.draw(canvas) + + // 保存成文件 + val filePath = bitmap2File(bitmap) + + // TODO upload image or copy image to share + + 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) + 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) + + mResult.text = builder + mResult.setMovementMethod(LinkMovementMethod.getInstance()) + setResultProgress(100) + }, 1000) + } + } + } + + fun bitmap2File(bitmap: Bitmap): String { + try { + val file = File(Environment.getExternalStorageDirectory().absolutePath + "/Pictures/ghzhushou/" + + (UUID.randomUUID().toString().replace("-".toRegex(), "")) + + ".jpg" + ) + if (!file.exists()) { + file.getParentFile().mkdirs() + file.createNewFile() + } + val fos = FileOutputStream(file) + bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos) + fos.flush() + fos.close() + return file.getAbsolutePath(); + } catch (e: IOException) { + e.printStackTrace() + } + return "" + } + + override fun handleBackPressed(): Boolean { + if (mProgressData < 100) { + DialogUtils.showAlertDialog(this, "确认退出", "网络诊断还未完成,退出会终止所有诊断进程,确定退出吗?" + ,"确定", "取消", DialogUtils.ConfirmListener { + finish() + }, null) + return true + } else { + return false + } + + } +} diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailKaiFuAdapter.java b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailKaiFuAdapter.java index 27aa16fc2b..2ad96c6ec0 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailKaiFuAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailKaiFuAdapter.java @@ -3,7 +3,9 @@ package com.gh.gamecenter.gamedetail; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Paint; import android.graphics.drawable.ColorDrawable; import android.preference.PreferenceManager; import android.support.v4.content.ContextCompat; @@ -28,15 +30,12 @@ import com.gh.gamecenter.entity.CalendarEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.KaiFuCalendarEntity; import com.gh.gamecenter.entity.MeEntity; -import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.kaifu.add.AddKaiFuActivity; import com.gh.gamecenter.kaifu.patch.PatchKaifuActivity; import com.gh.gamecenter.retrofit.Response; import com.lightgame.adapter.BaseRecyclerAdapter; import com.lightgame.utils.Utils; -import org.greenrobot.eventbus.EventBus; - import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; diff --git a/app/src/main/java/com/gh/gamecenter/qa/column/detail/hot/HotFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/column/detail/hot/HotFragment.kt index 5eb6d45c54..ded87a6dde 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/column/detail/hot/HotFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/column/detail/hot/HotFragment.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.qa.column.detail.hot import android.arch.lifecycle.ViewModelProviders +import android.view.View import com.gh.common.util.EntranceUtils import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.qa.entity.AnswerEntity @@ -25,4 +26,14 @@ class HotFragment : ListFragment() { return ViewModelProviders.of(this, factory).get(HotViewModel::class.java) } + override fun onLoadEmpty() { + super.onLoadEmpty() + mListRv.visibility = View.VISIBLE + } + + override fun onLoadError() { + super.onLoadError() + mListRv.visibility = View.VISIBLE + } + } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/column/detail/recommends/RecommendsFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/column/detail/recommends/RecommendsFragment.kt index 94648f1751..0b120cfcd3 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/column/detail/recommends/RecommendsFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/column/detail/recommends/RecommendsFragment.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.qa.column.detail.recommends import android.arch.lifecycle.ViewModelProviders +import android.view.View import com.gh.common.util.EntranceUtils import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.qa.entity.AnswerEntity @@ -25,4 +26,14 @@ class RecommendsFragment : ListFragment() { return ViewModelProviders.of(this, factory).get(RecommendsViewModel::class.java) } + override fun onLoadEmpty() { + super.onLoadEmpty() + mListRv.visibility = View.VISIBLE + } + + override fun onLoadError() { + super.onLoadError() + mListRv.visibility = View.VISIBLE + } + } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/column/detail/unanswered/UnansweredFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/column/detail/unanswered/UnansweredFragment.kt index b12a0086af..107a0318c7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/column/detail/unanswered/UnansweredFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/column/detail/unanswered/UnansweredFragment.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.qa.column.detail.unanswered import android.arch.lifecycle.ViewModelProviders +import android.view.View import com.gh.common.util.EntranceUtils import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.qa.entity.AskTagGroupsEntity @@ -25,4 +26,14 @@ class UnansweredFragment : ListFragment() { return ViewModelProviders.of(this, factory).get(UnansweredViewModel::class.java) } + override fun onLoadEmpty() { + super.onLoadEmpty() + mListRv.visibility = View.VISIBLE + } + + override fun onLoadError() { + super.onLoadError() + mListRv.visibility = View.VISIBLE + } + } \ No newline at end of file diff --git a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java index be344f74d0..4a0293353a 100644 --- a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java @@ -27,6 +27,7 @@ import com.gh.common.util.StringUtils; import com.gh.gamecenter.AboutActivity; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.MainActivity; +import com.gh.gamecenter.NetworkDiagnosisActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.entity.LoginTokenEntity; import com.gh.gamecenter.eventbus.EBReuse; @@ -215,7 +216,8 @@ public class SettingsFragment extends NormalFragment { R.id.setting_rl_cache, R.id.setting_cv_font_size, R.id.setting_rl_concerngame, R.id.setting_rl_about, R.id.setting_logout_rl, R.id.setting_rl_kc_path, - R.id.setting_rl_download_path, R.id.setting_rl_pic_path + R.id.setting_rl_download_path, R.id.setting_rl_pic_path, + R.id.setting_network_diagnosis }) @Override public void onClick(final View v) { @@ -291,6 +293,9 @@ public class SettingsFragment extends NormalFragment { e.printStackTrace(); } break; + case R.id.setting_network_diagnosis: + startActivity(new Intent(getContext(), NetworkDiagnosisActivity.class)); + break; default: break; } diff --git a/app/src/main/res/layout/activity_network_diagnosis.xml b/app/src/main/res/layout/activity_network_diagnosis.xml new file mode 100644 index 0000000000..72fe7f4e6c --- /dev/null +++ b/app/src/main/res/layout/activity_network_diagnosis.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index ccb9a71594..814cb3394e 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -290,5 +290,17 @@ android:textColor = "@color/hint" android:textSize = "13sp" /> + + + \ No newline at end of file