From 1a3f0f87d58a6446e7470397c19a08391e1f3569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=8E=89=E4=B9=85?= Date: Mon, 15 Aug 2022 15:14:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B0=9D=E8=AF=95=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E9=94=99=E8=AF=AF=E7=89=88=E6=9C=AC=20WebVie?= =?UTF-8?q?w=20=E7=9A=84=E7=94=A8=E6=88=B7=E9=97=AA=E9=80=80=20https://git?= =?UTF-8?q?.shanqu.cc/halo/android/assistant-android/-/issues/78?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/PackageUtils.java | 61 +++++++++++++------ .../UnAvaliableWebviewViewHolder.kt | 7 +++ .../rating/edit/RatingEditActivity.kt | 9 ++- .../newsdetail/NewsDetailAdapter.java | 18 +++++- .../qa/article/detail/ArticleDetailAdapter.kt | 17 ++++-- .../newdetail/NewQuestionDetailAdapter.kt | 21 +++++-- .../halo/assistant/fragment/WebFragment.kt | 12 +--- .../main/res/layout/fragment_web_warning.xml | 14 +++-- 8 files changed, 114 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/adapter/viewholder/UnAvaliableWebviewViewHolder.kt diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index 0b1e3391ca..163a8d5691 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -61,6 +61,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; +import java.util.zip.ZipException; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; @@ -915,32 +916,58 @@ public class PackageUtils { File file = new File(path); List abiList = new ArrayList<>(); if (!file.exists()) return abiList; - InputStream inputStream; + ZipFile zipFile = null; + String elementName; try { - inputStream = new FileInputStream(file); - ZipInputStream zipInputStream = new ZipInputStream(inputStream); - ZipEntry zipEntry; - while ((zipEntry = zipInputStream.getNextEntry()) != null) { - final String name = zipEntry.getName(); - if (name.startsWith("lib/armeabi-v7a") - || name.startsWith("lib/arm64-v8a") - || name.startsWith("lib/x86") - || name.startsWith("lib/armeabi") - || name.startsWith("lib/x86_64")) { - String abiName = name.substring(4, name.lastIndexOf("/")); - if (!abiList.contains(abiName)) { - abiList.add(abiName); + zipFile = new ZipFile(file); + final Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + if (entry.isDirectory()) { + continue; + } + elementName = entry.getName(); + if (elementName.startsWith("lib/")) { + if (elementName.startsWith("lib/armeabi-v7a") + || elementName.startsWith("lib/arm64-v8a") + || elementName.startsWith("lib/x86") + || elementName.startsWith("lib/armeabi") + || elementName.startsWith("lib/x86_64")) { + String abiName = elementName.substring(4, elementName.lastIndexOf("/")); + if (!abiList.contains(abiName)) { + abiList.add(abiName); + } } } } - zipInputStream.close(); - inputStream.close(); - } catch (FileNotFoundException e) { + return abiList; + } catch (ZipException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); + } finally { + if (zipFile != null) { + try { + zipFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } return abiList; } + public static boolean checkWebViewIsAvailable(Context context) { + List webViewAbiList = HaloApp.getInstance().webViewAbiList; + if (webViewAbiList != null) { + return Build.CPU_ABI.equals("arm64-v8a") && webViewAbiList.contains(Build.CPU_ABI); + } else { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + return true; + } else { + return WebViewCompat.getCurrentWebViewPackage(context) != null; + } + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/UnAvaliableWebviewViewHolder.kt b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/UnAvaliableWebviewViewHolder.kt new file mode 100644 index 0000000000..947298ce19 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/UnAvaliableWebviewViewHolder.kt @@ -0,0 +1,7 @@ +package com.gh.gamecenter.adapter.viewholder + +import androidx.recyclerview.widget.RecyclerView +import com.gh.gamecenter.databinding.FragmentWebWarningBinding + +class UnAvaliableWebviewViewHolder(val binding: FragmentWebWarningBinding): RecyclerView.ViewHolder(binding.root) { +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt index 2e4f409632..bb62aa5965 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt @@ -66,9 +66,10 @@ class RatingEditActivity : ToolBarActivity(), KeyboardHeightObserver { private var mLoadError = false private var mKeyboardHeightProvider: KeyboardHeightProvider? = null private var mIsKeyBoardShow = false + private var mIsWebViewInstalled = true // 当前设备是否存在可用的 WebView override fun getLayoutId(): Int { - return R.layout.activity_rating_edit + return if (mIsWebViewInstalled) R.layout.activity_rating_edit else R.layout.fragment_web_warning } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -79,7 +80,12 @@ class RatingEditActivity : ToolBarActivity(), KeyboardHeightObserver { } override fun onCreate(savedInstanceState: Bundle?) { + mIsWebViewInstalled = PackageUtils.checkWebViewIsAvailable(this) super.onCreate(savedInstanceState) + if (!mIsWebViewInstalled) { + findViewById(R.id.toolbar).visibility = View.VISIBLE + return + } setToolbarMenu(R.menu.menu_game_comment) mGame = intent.getParcelableExtra(GameEntity.TAG) ?: GameEntity(id = "") mFromAmway = intent.getBooleanExtra(EntranceConsts.KEY_AMWAY, false) @@ -436,6 +442,7 @@ class RatingEditActivity : ToolBarActivity(), KeyboardHeightObserver { } override fun handleBackPressed(): Boolean { + if (!mIsWebViewInstalled) return false mBinding.mWebView.callHandler("getComment", OnReturnValue { content -> logRatingClickEvent(content, false) diff --git a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java index 7be0417894..94ff0ec49c 100644 --- a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java @@ -33,6 +33,7 @@ import com.gh.common.util.DataCollectionUtils; import com.gh.common.util.DialogUtils; import com.gh.common.util.DirectUtils; import com.gh.common.util.NewsUtils; +import com.gh.common.util.PackageUtils; import com.gh.common.view.RichEditor; import com.gh.gamecenter.GameDetailActivity; import com.gh.gamecenter.ImageViewerActivity; @@ -43,7 +44,9 @@ import com.gh.gamecenter.adapter.viewholder.CommentViewHolder; import com.gh.gamecenter.adapter.viewholder.GameDetailNewsViewHolder; import com.gh.gamecenter.adapter.viewholder.NewsDetailCommentListViewHolder; import com.gh.gamecenter.adapter.viewholder.NewsDetailGameViewHolder; +import com.gh.gamecenter.adapter.viewholder.UnAvaliableWebviewViewHolder; import com.gh.gamecenter.common.callback.OnRequestCallBackListener; +import com.gh.gamecenter.common.retrofit.Response; import com.gh.gamecenter.common.utils.DialogHelper; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.ImageUtils; @@ -55,6 +58,7 @@ import com.gh.gamecenter.core.utils.MtaHelper; import com.gh.gamecenter.core.utils.NumberUtils; import com.gh.gamecenter.core.utils.RandomUtils; import com.gh.gamecenter.core.utils.StringUtils; +import com.gh.gamecenter.databinding.FragmentWebWarningBinding; import com.gh.gamecenter.databinding.GamedetailItemNewsBinding; import com.gh.gamecenter.databinding.NewsDetailCommentBinding; import com.gh.gamecenter.databinding.NewsdetailItemContentBinding; @@ -69,7 +73,6 @@ import com.gh.gamecenter.entity.MtaEvent; import com.gh.gamecenter.entity.NewsDetailEntity; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.qa.editor.OnLinkClickListener; -import com.gh.gamecenter.common.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.halo.assistant.fragment.SettingsFragment; import com.lightgame.adapter.BaseRecyclerAdapter; @@ -155,7 +158,13 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case 0: - return new NewsDetailContentViewHolder(NewsdetailItemContentBinding.inflate(mLayoutInflater, parent, false)); + boolean isWebViewInstalled = PackageUtils.checkWebViewIsAvailable(mContext); + if (isWebViewInstalled) { + return new NewsDetailContentViewHolder(NewsdetailItemContentBinding.inflate(mLayoutInflater, parent, false)); + } else { + FragmentWebWarningBinding binding = FragmentWebWarningBinding.inflate(mLayoutInflater, parent, false); + return new UnAvaliableWebviewViewHolder(binding); + } case 1: return new NewsDetailGameViewHolder(NewsdetailItemGameBinding.inflate(mLayoutInflater, parent, false)); case 2: @@ -179,6 +188,11 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { ((GameDetailNewsViewHolder) holder).binding.gamedetailItemNewsTitle.setText("大家都在看"); } else if (holder instanceof NewsDetailCommentListViewHolder) { initNewsDetailNewsCommentViewHolder((NewsDetailCommentListViewHolder) holder); + } else if (holder instanceof UnAvaliableWebviewViewHolder) { + if (mCommentEntityList == null) { + mListener.loadDone(mNewsDetailEntity.getGameId()); + getNewsMore(); + } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailAdapter.kt index d9f8f9385e..48df930841 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailAdapter.kt @@ -3,12 +3,15 @@ package com.gh.gamecenter.qa.article.detail import android.content.Context import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.gh.common.util.PackageUtils +import com.gh.gamecenter.adapter.viewholder.UnAvaliableWebviewViewHolder import com.gh.gamecenter.baselist.LoadStatus +import com.gh.gamecenter.databinding.FragmentWebWarningBinding import com.gh.gamecenter.databinding.ItemArticleDetailContentBinding import com.gh.gamecenter.qa.comment.base.BaseCommentAdapter -class ArticleDetailAdapter(context: Context, var mViewModel: ArticleDetailViewModel, type: AdapterType, entrance: String) - : BaseCommentAdapter(context, mViewModel, type, entrance) { +class ArticleDetailAdapter(context: Context, var mViewModel: ArticleDetailViewModel, type: AdapterType, entrance: String) : + BaseCommentAdapter(context, mViewModel, type, entrance) { var articleDetailVH: ArticleDetailContentViewHolder? = null @@ -26,8 +29,14 @@ class ArticleDetailAdapter(context: Context, var mViewModel: ArticleDetailViewMo override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { ITEM_ARTICLE_DETAIL -> { - val binding: ItemArticleDetailContentBinding = ItemArticleDetailContentBinding.inflate(mLayoutInflater, parent, false) - ArticleDetailContentViewHolder(binding, mViewModel).apply { articleDetailVH = this } + val isWebViewInstalled = PackageUtils.checkWebViewIsAvailable(mContext) + if (isWebViewInstalled) { + val binding: ItemArticleDetailContentBinding = ItemArticleDetailContentBinding.inflate(mLayoutInflater, parent, false) + ArticleDetailContentViewHolder(binding, mViewModel).apply { articleDetailVH = this } + } else { + val binding: FragmentWebWarningBinding = FragmentWebWarningBinding.inflate(mLayoutInflater, parent, false) + UnAvaliableWebviewViewHolder(binding) + } } else -> super.onCreateViewHolder(parent, viewType) diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt index 9a239aaa48..896941d9e8 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt @@ -4,16 +4,19 @@ import android.content.Context import android.text.SpannableStringBuilder import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.gh.common.util.PackageUtils import com.gh.gamecenter.core.utils.SpanBuilder import com.gh.gamecenter.common.view.CustomLinkMovementMethod import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.UnAvaliableWebviewViewHolder import com.gh.gamecenter.baselist.LoadStatus +import com.gh.gamecenter.databinding.FragmentWebWarningBinding import com.gh.gamecenter.databinding.ItemArticleDetailContentBinding import com.gh.gamecenter.qa.answer.detail.SimpleAnswerDetailActivity import com.gh.gamecenter.qa.comment.base.BaseCommentAdapter class NewQuestionDetailAdapter(context: Context, var mViewModel: NewQuestionDetailViewModel, type: AdapterType, val entrance: String) : - BaseCommentAdapter(context, mViewModel, type, entrance) { + BaseCommentAdapter(context, mViewModel, type, entrance) { var questionDetailVH: QuestionDetailContentViewHolder? = null @@ -32,8 +35,14 @@ class NewQuestionDetailAdapter(context: Context, var mViewModel: NewQuestionDeta override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { ITEM_QUESTION_DETAIL -> { - val binding: ItemArticleDetailContentBinding = ItemArticleDetailContentBinding.inflate(mLayoutInflater, parent, false) - QuestionDetailContentViewHolder(binding, mViewModel).apply { questionDetailVH = this } + val isWebViewInstalled = PackageUtils.checkWebViewIsAvailable(mContext) + if (isWebViewInstalled) { + val binding: ItemArticleDetailContentBinding = ItemArticleDetailContentBinding.inflate(mLayoutInflater, parent, false) + QuestionDetailContentViewHolder(binding, mViewModel).apply { questionDetailVH = this } + } else { + val binding: FragmentWebWarningBinding = FragmentWebWarningBinding.inflate(mLayoutInflater, parent, false) + UnAvaliableWebviewViewHolder(binding) + } } else -> super.onCreateViewHolder(parent, viewType) @@ -54,8 +63,10 @@ class NewQuestionDetailAdapter(context: Context, var mViewModel: NewQuestionDeta val spannableStringBuilder = SpannableStringBuilder() if (comment?.type == "answer") { val detailSpan = SpanBuilder("[查看回答详情]").click(0, 8, R.color.theme_font) { - val intent = SimpleAnswerDetailActivity.getIntent(holder.itemView.context, comment.id - ?: "", entrance, "问题详情") + val intent = SimpleAnswerDetailActivity.getIntent( + holder.itemView.context, comment.id + ?: "", entrance, "问题详情" + ) holder.itemView.context.startActivity(intent) }.build() spannableStringBuilder.append(detailSpan) diff --git a/app/src/main/java/com/halo/assistant/fragment/WebFragment.kt b/app/src/main/java/com/halo/assistant/fragment/WebFragment.kt index 78c1d5339d..4e9c8f7906 100644 --- a/app/src/main/java/com/halo/assistant/fragment/WebFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/WebFragment.kt @@ -675,17 +675,7 @@ class WebFragment : LazyFragment(), IScrollable { Constants.LOGOUT_ADDRESS_DEV == mBinding?.newsWebview?.url || Constants.LOGOUT_ADDRESS == mBinding?.newsWebview?.url private fun updateIsWebViewInstalled() { - val webViewAbiList = HaloApp.getInstance().webViewAbiList - mIsWebViewInstalled = - if (webViewAbiList != null) { - Build.CPU_ABI == "arm64-v8a" && webViewAbiList.contains(Build.CPU_ABI) - } else { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - true - } else { - WebViewCompat.getCurrentWebViewPackage(requireContext()) != null - } - } + mIsWebViewInstalled = PackageUtils.checkWebViewIsAvailable(requireContext()) } fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/res/layout/fragment_web_warning.xml b/app/src/main/res/layout/fragment_web_warning.xml index 96550e48c3..1282b58c62 100644 --- a/app/src/main/res/layout/fragment_web_warning.xml +++ b/app/src/main/res/layout/fragment_web_warning.xml @@ -2,17 +2,21 @@ + android:layout_height="wrap_content"> + + + app:layout_constraintTop_toBottomOf="@+id/toolbar" /> \ No newline at end of file