From c1bf0a628fa6669b87ed924d7be328e12cd6f1f3 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Tue, 26 Jan 2021 11:25:42 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=85=89=E7=8E=AF=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B1=87=E6=80=BB=EF=BC=882021=E5=B9=B41?= =?UTF-8?q?=E6=9C=88=EF=BC=89=E7=AC=AC1=E3=80=812=E7=82=B9=20https://git.g?= =?UTF-8?q?hzs.com/pm/halo-app-issues/-/issues/1138?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/util/PackageInstaller.kt | 16 +- .../SimulatorManagementViewHolder.kt | 4 + .../simulatorgame/SimulatorGameFragment.kt | 13 +- .../SimulatorManagementAdapter.kt | 171 ++++++++++++++++-- .../SimulatorManagementFragment.kt | 41 ++++- .../ic_simulator_game_option.png | Bin 449 -> 0 bytes .../ic_simulator_game_option.webp | Bin 0 -> 574 bytes .../drawable-xxhdpi/ic_simulator_manager.webp | Bin 1952 -> 1672 bytes .../drawable-xxhdpi/ic_simulator_unable.webp | Bin 0 -> 834 bytes .../ic_simulator_uninstall.webp | Bin 0 -> 748 bytes .../ic_simulator_game_option.png | Bin 0 -> 442 bytes .../ic_simulator_game_option.webp | Bin 498 -> 0 bytes .../ic_simulator_manager.webp | Bin 2474 -> 2376 bytes .../drawable-xxxhdpi/ic_simulator_unable.webp | Bin 0 -> 1094 bytes .../ic_simulator_uninstall.webp | Bin 0 -> 782 bytes .../res/drawable/selector_simulator_item.xml | 7 + .../res/layout/fragment_simulator_list.xml | 39 ++++ .../layout_menu_simulator_uninstall.xml | 30 +++ .../res/layout/popup_simulator_uninstall.xml | 36 ++++ app/src/main/res/layout/simulator_item.xml | 21 ++- app/src/main/res/values/colors.xml | 1 + 21 files changed, 358 insertions(+), 21 deletions(-) delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_simulator_game_option.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_simulator_game_option.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_simulator_unable.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_simulator_uninstall.webp create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_simulator_game_option.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_simulator_game_option.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_simulator_unable.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_simulator_uninstall.webp create mode 100644 app/src/main/res/drawable/selector_simulator_item.xml create mode 100644 app/src/main/res/layout/fragment_simulator_list.xml create mode 100644 app/src/main/res/layout/layout_menu_simulator_uninstall.xml create mode 100644 app/src/main/res/layout/popup_simulator_uninstall.xml diff --git a/app/src/main/java/com/gh/common/util/PackageInstaller.kt b/app/src/main/java/com/gh/common/util/PackageInstaller.kt index d335cbae39..6e7450361e 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -119,15 +119,25 @@ object PackageInstaller { */ @JvmStatic fun uninstall(context: Context, path: String) { + val packageName = PackageUtils.getPackageNameByPath(context, path) + uninstallForPackageName(context, packageName) + } + + /** + * 根据包名卸载应用 + */ + @JvmStatic + fun uninstallForPackageName(context: Context, pkn: String) { + if (pkn.isBlank()) return + val uninstallIntent = Intent() uninstallIntent.action = Intent.ACTION_DELETE uninstallIntent.addCategory(Intent.CATEGORY_DEFAULT) if (context !is Activity) { uninstallIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } - val packageName = PackageUtils.getPackageNameByPath(context, path) - uninstallIntent.data = Uri.parse("package:$packageName") - InstallUtils.getInstance(context).addUninstall(packageName) + uninstallIntent.data = Uri.parse("package:$pkn") + InstallUtils.getInstance(context).addUninstall(pkn) context.startActivity(uninstallIntent) } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/SimulatorManagementViewHolder.kt b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/SimulatorManagementViewHolder.kt index 502a10e3cb..a1244288c6 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/SimulatorManagementViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/SimulatorManagementViewHolder.kt @@ -1,12 +1,16 @@ package com.gh.gamecenter.adapter.viewholder import android.view.View +import android.widget.ImageView +import android.widget.RelativeLayout import android.widget.TextView import com.gh.base.BaseRecyclerViewHolder import com.gh.gamecenter.R import kotterknife.bindView class SimulatorManagementViewHolder(view: View) : BaseRecyclerViewHolder(view) { + val container by bindView(R.id.container) val simulatorName by bindView(R.id.simulator_name) + val selectIv by bindView(R.id.select_iv) val simulatorInstallBtn by bindView(R.id.simulator_install_btn) } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt index e4200cfd31..d86487f55c 100644 --- a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt @@ -39,8 +39,11 @@ class SimulatorGameFragment : NormalFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mViewModel = viewModelProvider() + } + + override fun onResume() { + super.onResume() mViewModel.getSimulators() } @@ -86,6 +89,7 @@ class SimulatorGameFragment : NormalFragment() { } } } else { + mReuseNoData.visibility = View.GONE list.forEachIndexed { index, entity -> mTabContainer.goneIf(list.size == 1) mTypeAliasList.add(entity.typeAlias) @@ -96,6 +100,7 @@ class SimulatorGameFragment : NormalFragment() { if (mViewPager.adapter != null) { // 删除了一个tab里面所有游戏后刷新adapter mViewPager.adapter?.notifyDataSetChanged() + updateTabLayout() } else { initViewPager() } @@ -135,12 +140,16 @@ class SimulatorGameFragment : NormalFragment() { setIndicatorWidth(20) } + updateTabLayout() + BaseFragment_TabLayout.initTabStyle(mTabLayout, mViewPager.currentItem) + } + + private fun updateTabLayout() { for (i in 0 until mTabLayout.tabCount) { val tab = mTabLayout.getTabAt(i) ?: continue val tabTitle = if (tab.text != null) tab.text.toString() else "" val tabView = BaseFragment_TabLayout.createDefaultTabCustomView(tabTitle) tab.customView = tabView } - BaseFragment_TabLayout.initTabStyle(mTabLayout, mViewPager.currentItem) } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementAdapter.kt b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementAdapter.kt index bed03c6d9b..ef2a501783 100644 --- a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementAdapter.kt @@ -1,18 +1,37 @@ package com.gh.gamecenter.simulatorgame import android.content.Context +import android.view.Gravity +import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.PopupWindow +import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.g00fy2.versioncompare.Version import com.gh.common.simulator.SimulatorDownloadManager -import com.gh.common.util.PackageUtils -import com.gh.common.util.toColor +import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.SimulatorManagementViewHolder import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.entity.SimulatorEntity -class SimulatorManagementAdapter(context: Context) : ListAdapter(context) { +class SimulatorManagementAdapter(context: Context, + var fragment: SimulatorManagementFragment) : ListAdapter(context) { + + private var mSingleSelectedPosition = -1 + private var mSingleSelectFlag = false + private var mShowSelectFlag = false + private var mSelectList = ArrayList() + private var mPopWindow: PopupWindow? = null + + override fun setListData(updateData: MutableList?) { + mSelectList.clear() + updateData?.forEach { _ -> + mSelectList.add(false) + } + super.setListData(updateData) + } override fun getItemCount() = mEntityList.size @@ -22,28 +41,156 @@ class SimulatorManagementAdapter(context: Context) : ListAdapter { + val simulator = mEntityList[position] + val isInstalled = PackageUtils.isInstalledFromAllPackage(mContext, simulator.apk?.packageName) + holder.simulatorInstallBtn.run { - val simulator = mEntityList[position] holder.simulatorName.text = simulator.name - if (PackageUtils.isInstalledFromAllPackage(mContext, simulator.apk?.packageName)) { + var shouldShowUpdate = false + + if (isInstalled) { val versionFromInstalledApp = PackageUtils.getVersionByPackage(simulator.apk?.packageName) - val shouldShowUpdate = Version(simulator.apk?.version).isHigherThan(versionFromInstalledApp) + shouldShowUpdate = Version(simulator.apk?.version).isHigherThan(versionFromInstalledApp) text = if (shouldShowUpdate) "更新" else "已安装" setTextColor(if (shouldShowUpdate) R.color.theme.toColor() else R.color.text_999999.toColor()) - setOnClickListener { - if (shouldShowUpdate) { - SimulatorDownloadManager.getInstance().showDownloadDialog(context, simulator, SimulatorDownloadManager.SimulatorLocation.SIMULATOR_MANAGE) - } - } } else { text = "安装" setTextColor(R.color.theme.toColor()) - setOnClickListener { + } + + setOnClickListener { + if (isInstalled) { + if (shouldShowUpdate) { + SimulatorDownloadManager.getInstance().showDownloadDialog(context, simulator, SimulatorDownloadManager.SimulatorLocation.SIMULATOR_MANAGE) + } else { + holder.itemView.performClick() + } + } else { SimulatorDownloadManager.getInstance().showDownloadDialog(mContext, simulator, SimulatorDownloadManager.SimulatorLocation.SIMULATOR_MANAGE) } } } + + holder.selectIv.run { + goneIf(!mShowSelectFlag) + setImageResource(when { + mSelectList[position] && isInstalled -> R.drawable.ic_simulator_selected + + !mSelectList[position] && isInstalled -> R.drawable.ic_simulator_unselect + + else -> { + mSelectList[position] = false + R.drawable.ic_simulator_unable + } + }) + setOnClickListener { + if (isInstalled) { + setImageResource(if (mSelectList[position]) + R.drawable.ic_simulator_unselect + else + R.drawable.ic_simulator_selected) + mSelectList[position] = !mSelectList[position] + } + } + } + + if (mSingleSelectFlag) { + holder.container.setBackgroundResource(R.color.bg_F6FBFF) + } else { + holder.container.setBackgroundResource(R.color.white) + } + + holder.itemView.setOnClickListener { + if (isInstalled && !mShowSelectFlag) { + showUnInstallWindow(position) + } + } } } } + + private fun showUnInstallWindow(position: Int = -1) { + if (mPopWindow != null && mPopWindow!!.isShowing) { + if (!mShowSelectFlag) mSingleSelectFlag = false + mPopWindow?.dismiss() + } else if (mPopWindow != null) { + if (!mShowSelectFlag) mSingleSelectFlag = true + mPopWindow?.showAtLocation(fragment.requireActivity().window.decorView, Gravity.BOTTOM, 0, 0) + } else { + if (!mShowSelectFlag) mSingleSelectFlag = true + val contentView = View.inflate(mContext, R.layout.popup_simulator_uninstall, null) + contentView.isFocusable = true + contentView.isFocusableInTouchMode = true + val unInstallBtn = contentView.findViewById(R.id.unInstallBtn) + + mPopWindow = PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT) + mPopWindow?.showAtLocation(fragment.requireActivity().window.decorView, Gravity.BOTTOM, 0, 0) + + unInstallBtn.setOnClickListener { + val dialog = DialogUtils.showNewAlertDialog(mContext, + "卸载模拟器", + "即将卸载模拟器,是否确定卸载?", + "取消", + "确定", + {}, + { unInstallSimulator() }) + dialog?.window?.findViewById(R.id.content)?.setTextColor(R.color.text_333333.toColor()) + } + } + + if (!mShowSelectFlag) { + if (mSingleSelectFlag) { + mSingleSelectedPosition = position + } + + if (mSingleSelectedPosition != -1) { + notifyItemChanged(mSingleSelectedPosition) + } + } + } + + private fun unInstallSimulator() { + if (mShowSelectFlag) { + if (mSelectList.contains(true)) { + mSelectList.forEachIndexed { index, b -> + if (b) { + val simulator = mEntityList[index] + PackageInstaller.uninstallForPackageName(mContext, simulator.apk?.packageName ?: "") + } + } + } else { + ToastUtils.showToast("请选择模拟器") + } + } else { + val simulator = mEntityList[mSingleSelectedPosition] + PackageInstaller.uninstallForPackageName(mContext, simulator.apk?.packageName ?: "") + dismissPopWindow() + } + + } + + fun showUnInstallWindowAndSelectIv(show: Boolean) { + mShowSelectFlag = show + mSingleSelectFlag = false + mSingleSelectedPosition = -1 + for (i in 0 until mSelectList.size) { + mSelectList[i] = false + } + notifyDataSetChanged() + dismissPopWindow(true) + if (show) showUnInstallWindow() + } + + fun dismissPopWindow(isForce: Boolean = false) { + if (!isForce && mShowSelectFlag) return + + if (mPopWindow != null && mPopWindow!!.isShowing) { + mSingleSelectFlag = false + mPopWindow?.dismiss() + } + + if (mSingleSelectedPosition != -1) { + notifyItemChanged(mSingleSelectedPosition) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementFragment.kt b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementFragment.kt index 65e53aeace..642db6d12d 100644 --- a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementFragment.kt @@ -1,11 +1,18 @@ package com.gh.gamecenter.simulatorgame import android.os.Bundle +import android.util.Log +import android.view.MenuItem +import android.view.View +import android.widget.ImageView +import android.widget.TextView import com.gh.common.util.EntranceUtils import com.gh.common.util.dip2px import com.gh.common.util.viewModelProvider import com.gh.common.view.SpacingItemDecoration +import com.gh.gamecenter.R import com.gh.gamecenter.baselist.ListFragment +import com.gh.gamecenter.databinding.FragmentSimulatorListBinding import com.gh.gamecenter.entity.SimulatorEntity import com.gh.gamecenter.eventbus.EBPackage import org.greenrobot.eventbus.Subscribe @@ -14,6 +21,7 @@ import org.greenrobot.eventbus.ThreadMode class SimulatorManagementFragment : ListFragment() { private lateinit var mSimulatorEntity: SimulatorEntity + private lateinit var mBinding: FragmentSimulatorListBinding private var mAdapter: SimulatorManagementAdapter? = null //安装、卸载事件 @@ -24,6 +32,8 @@ class SimulatorManagementFragment : ListFragment(R.id.unInstallIv) + val completeTv = menuItem.actionView.findViewById(R.id.completeTv) + val showFlag = unInstallIv.visibility == View.VISIBLE + if (showFlag) { + unInstallIv.visibility = View.GONE + completeTv.visibility = View.VISIBLE + } else { + unInstallIv.visibility = View.VISIBLE + completeTv.visibility = View.GONE + } + mAdapter?.showUnInstallWindowAndSelectIv(showFlag) + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mBinding.blankView.setOnClickListener { + mAdapter?.dismissPopWindow() + } + } + + override fun provideListAdapter() = mAdapter ?: SimulatorManagementAdapter(requireContext(), this).apply { mAdapter = this } override fun provideListViewModel() = viewModelProvider() diff --git a/app/src/main/res/drawable-xxhdpi/ic_simulator_game_option.png b/app/src/main/res/drawable-xxhdpi/ic_simulator_game_option.png deleted file mode 100644 index 1b08fb8edaba638306c68f2a4c861dde1e520518..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*1?o)An?649Q@9 zJJpb{$w9z1QbQ+qZ(}R33zxKh!b?$`_NmW5NW~pE#>Cv)YQA9W5(SIkoJ|L3Dqc)U z{+L-d^L+e2n*>iG83hI=bo4=#(fsMERax)m+~zyHVaZ3&$6IwyU!T(dRU&S4taXv6nAAORgNTI{*22#N*F1?uBq2 zFy*SBbZGOj(rcA^vW9!Jm_>?|TR)q6Z#VfCy=$pw+*U^UFZbQIGFF|>532x*#$CRo z>-%XH?*;d&B}c7Ra<1E~ml@OjGF1A3teWp-+ozfCj?wF~tp(zxFR#v9Y**4Vf8zdd oi+@G;3uMnYGO#$HAqT||Y_B@+y^k~voe2s)Pgg&ebxsLQ0Fw}y`2YX_ diff --git a/app/src/main/res/drawable-xxhdpi/ic_simulator_game_option.webp b/app/src/main/res/drawable-xxhdpi/ic_simulator_game_option.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2ce9fcdd7e218ce2d123c4b178d8fcfee842aa4 GIT binary patch literal 574 zcmV-E0>S-KNk&FC0ssJ4MM6+kP&il$0000G0000l001ul06|PpNT>h+00F0=ppB$B z%gh}=Sik@g5ygZVB*AdGu+b4O{J61wRtPX9CLG|%jU+|NnPp~XX3qaVt~_509Q8J}ah8Lk_L?OAMVgJX6o6HJ-Fe{3f;aYKXgA=N+QTg{)} Mew#8G@Bjb+0I}H%*Z=?k literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_simulator_manager.webp b/app/src/main/res/drawable-xxhdpi/ic_simulator_manager.webp index 57fcc5ebab64668a412fadaf7b841708c8c00b18..3424f8e3496fe5dc769707e666452771c5edc569 100644 GIT binary patch literal 1672 zcmV;326y>VNk&G11^@t8MM6+kP&il$0000G0000u0027x06|PpNF)OQ00BScpp7I) zI(N@~;178NhKR_=S%N{}Yb!&nqOKn)ftd8w@2D*kh!sq%Qiv^od#ps_h}abpY}+;@ z>6LBUwr$&P+qP}n?tTNUuZZXY#Ep#TKP0!297)O3`k0+E(O)1_5v414ez5QMN=Z1` zDzM?yKNh(s>jKC=6(@hP%8%n^WRv8DPptEC-bXeFAAZOt?hjf28(o*>jGwo3H}!1& zBFDJYL6&46`Yz@Bx;HO~fS~;SU!^48p)4|%JoB0**V{?fd0h_kYC4IG1drU4lill& zCY6|h`*NVW!@;B#P<`RIl=80N>kcJ5g!McVQtk>M4fcO0AG7a z#S_k+-C-m$o($o2Es&bW09<(q8qX*Lco0i!p0JumNn|{S7{DCqxD4PBiA={&IF+^Q z9xem8>_-CA33$T5??Te?ZTvN(R(5X(^S|0%|VG#q6!MVs>6AW*Q-* zsw&tQMJh1^sz4*bWI|m&uNjulnItlneb}Jx?z5rp3M>`uPO{3mN)I5#p@#@T+g_C!K=L$ezlf%qF23q zi}^{*@;|ulaiYz6j5dT5i#?lh;VEzW=WXO$S3;16>Q|mri)9^qj3HUL3Ka?0RI2@VUdimhx^-`sb`bY0DSnE@FpxL zFtgxIKfX7d#}mZ#>tr#|jZF?%*xL_Gq3=inoImkw)`!VBd14Bga!XXBV$Bj@)39aY zIv=KMB-hyE@VlF?i!T~e@ZfUV%YaHqI{duw+jjhT129t1tz`qv^UQZyM{8{Y2z89~ zVY?wf{yDmltKS@g=i|vK=Hb57jIWku_Wep6s^j_5YfLHCZQ#?_f`Qk|I*k_8(v^bh zbiFfD>t1mS*>fnltm*|hd897iF>#CR;>h=#v(fZ!@qe#nmvkcEr(0ELga5D@V2!mR z$joQ2b>=S#HfyA`p$0$Y_fph*$62``Y7M%CS6_h2yAlpbP0A}@su)ZzFXB(+3X5fU z^JK(+HEH5O_Hk*Txxn3YDZPO0m;3`oGgyk{u3Q2{l;TK0Ot5crZ z-e@>@bFmlrxnNuUUAoQhqa_j21BS^Nli_YH)}2_*A4nd!0J8KIxqa16tV!mlpoHfZ zfI6Uy8Y*irx002`-4`%#lj!YCOWp~fabzeugFr>w$H@-7inBAsI%V|(r3-$%vOH(8 zDg-FIlG*1LgH__GzG;8xAv~$@T?<$K6c&*e(gi64dBi2f##i}SFE4QB&e00y_&z~z z$~vjZ!qoIAZ*UQH-1H SRU=s=#XN;~(##<80000cfiaW- literal 1952 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 MIPKNPoAdwx0EqXN9RL6T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_simulator_uninstall.webp b/app/src/main/res/drawable-xxhdpi/ic_simulator_uninstall.webp new file mode 100644 index 0000000000000000000000000000000000000000..931d1b206a4c7d8ce0986e30927c043139d47848 GIT binary patch literal 748 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 literal 2474 zcmV;b303w|Nk&GZ2><|BMM6+kP&il$0000G0000>002(_06|PpNPPqV00H-=pluuJ zobg9}ABBj><(qG=aStO`+4+=DuEux=<;u>P#~?>!=a(O--L`E?l6FKIW!tuG+qP}n zw%ujhRe5p3H1JWeqjd~_DyHD}E?vN%e@kyAwt$4J`?8~F{@9cP3EPq5o z{+<>Wjl}sLN^^IYgpDm8O32rp?d$!K;yaCCuY1%N33;K0J@u|roHhXV7hD;XFtoOi zHTU9NN_|U`5Y?(@B;=PiR*GJv_(*v~z5PoGbLP54_0uSQ)DkAfPWmMv&m;?qrBV20 zlpBT?*^(pR9-aFl^}$sIVQ}3m0*=-!qW(-(7~bQ(&fh>$C9Fy70P_3FDiBbkm6OnOo6c@@BMu|D@KDBVbw7J{iw{V3uCu3^1MrfB`RMEuvPURjBP{p z2wky&f~|r3szK(g)|}Acv}y*Bt!iSZoxg-ctQ{032872_t=5#+HWz`ds_|YC(c7=@uiyU18Cb<&3-$tBO6x$h?7Y zMAKXaceg79^x1ru$_a4BQtIl26gjeJ*E|d_Y?}!Vz^oQ5!t* zGFQ;V5$%3cd3DE}YCyrZw^dJJT%mPOGQ(7Ea6?@=Eh4*-ai!9z&7A~c$u&(^v8g!9T$I~e%@eramw3rkhkT=_!$iHN5akS_q8S8W{@kNm>;|3iLN zDFfV%$8Wj${(I2>?d`>l!>dRptM&m|syQPD_Gn!x#=Z&@PX40BjDusUt5&Ht0QXhu z@Z**3lWeHJ=rL{ndUomXuDu?sW&m4dk%6mo8n^_>-L|FE(AGddYmr~}%^T6Fb$TySWui5CMW(L#P1Q0R91;?V{i8y`%YW)CK$< zl|NzSk9#{*|B2qR$2>rH8~?5I_xvY-H;a1!e;xj%{^R>6;;+(o?fG<56uhEX`jG)T3nPM`_QQXf-#S>VA)~g0hV@XWP66&duEXESj(>JO~T&!Jag3F+OG>?C40f7R;Y^t-`=G4+ospaAtdk6 zodrPAj#!m9J<`D1fE;6l=QZ{jBt}zcu{>&)^}IG@=JI9I;L6f(I!}pC4r!I1kfjJs zVL0Xwc^UUMAEW#rh0p`Voe^D?$@DP6tTEKN8K6VExv)u&Jx33*0m zj0uNB*EF?jQ)#0}WBe)24*`L>3n9VI5K)UJOqxzDJ)mEW=ElMJag6f~5nmgcfM}mX zyQ#U3bhGLsu?VWpZVq~>wGm5OwCppSe!|D2ZU3fY@%0m${H!Q_HoAu7*y8jZBKZw9 zfbU?yXz{Pu&eD0j`+&91FzNe~gr^9JKkCCS1_o10Jnd0RK=40JBJt)MuM0sWSPJLU zXB*xz5@o4-l~azPd>M0Z-4a;`(|JL+XKx$NC`_YpmVT)Xee*hhH@-Hhv~^*w()8rB22K;7t78V^`W1&iy%1{t`WeyfoP+H}lK8v~}E{v$tq%u`>|<^CC$ zI`{lKUWihGIHM1jcd|4to@$>0v$AD^dh&gA%)pyr#kD!aUfGOK1B7<5?X4*)SUdx9 zfcE@gU+s$iR*-hffCev18#`zdjn2#~wL-x|G|lqSHPO6a+~a&7b{ouLuYXfC52ib0 z&XBVbRR+sv=98A^KXQW&mtG%{H!0#tmH@o4DGu`@fq^2`p=v o4L|XsLX-3waoBcl(RpyUFzdI~tw)K8Ed>9}C(V?(3@88q0I_1=1^@s6 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_simulator_unable.webp b/app/src/main/res/drawable-xxxhdpi/ic_simulator_unable.webp new file mode 100644 index 0000000000000000000000000000000000000000..e08a5160b86e18df9baf2ffdbb558e9498306dd5 GIT binary patch literal 1094 zcmV-M1iAZCNk&FK1ONb6MM6+kP&il$0000G0000#002J#06|PpNIn4o00GaSpp7Io zczpMa3jQM^0Oe|)zrBOEP&<*Ckr>h7Fp{mdK{;pJ==Wc$6XL0WBclHf+(uHQ_A>Kz z-xFN0s+-p1(jd^IY@m?6L517k(mC@XJ!GIW7E1?k@P+?%~soUvWA~+-RT1r1@*L)|{*|>d)nu>cl{f<2{!< z0092~{upN2f2zc~ovdVelvPg?xv*<#c@IJ-mKPvXz}smr*9694917fo`w24DhaK2Ii#te=l9 z&QTY#b@L4Ji7@)@r~^Ya@%6$+zM&n)|DgjZx(}JN&fWtD#s3u_@_iacXpQ=e(h+0b z7p^N$j`JC`V3l}T3;l7E+?_9C(uKA3Rci8XDSvdPZn8}ANTTfewC-<_bcio=(MG{r zSu}K#&)H}?WNuSpG&f$aJ8J@N(5Lo)jU6mg7`uaacAEz~{sq1+ma@?Z!1_lYo7O?h zJuZ;Gd7uz}B%L@5p(f)3hRaq95^8d8-flRDJ*qzPO@BjE*J{ni2Ka7infQm{aKGqf9 zh_v4qixhPP4&_JxIlCw)0NkGA+vEKcaF(UcwhCLqJjB&3#XT zb7_8mQ_i#m16_9IszU2_DN+|bRA0Rtps`v1=)f`EeiHxsx1#I|ZZelu+j<%Lr8Z4e_iP*y2%<<(18*_1q9o6(?;$vGcz+Y zGc$Pqn~6G=Yz>pY9nt>@Fp@p{kCru{$N1TA1^fNDkboDJNi_I?D~T(3IU+IQM{e+# z3nAwRfU*kKh)@3J)x#4t6M|`bu&Rc(EvqbUw7EXeCJtybV8(7WK`=m3U1N5Ins0PG zP%Dkux`>x9QxkAJQcGa`&84`tsYsQM^OO!-6sftfDW%hLJw`0qrN<&QuE!EJ@pHf& zHKa#3)via;c4h^7pmb(;XRJt*0$-t7*CypQT-y{_pza&os=cQcIHstyTjf&aUZN*C z`tqc+;ra?kn+Gp#-ad}%=R97AR5V%-nFAU zmtt7!DKP~C09H^qAeaFF0FVv4#aiaTBm&gO{Sc|hIp=6NYQqpJ^_;96& zXVIEJTYc1YYa}D~9rAqjjd6bJ%qW+A5A&}I!T=L_9AMnFF#rJm|KWy2V21WUknIB1 zUkOz6A;x1&ug-CkfFJWnfB!i+4fqx+2h;IxU8ll1-Xp4VBSmKIZ~yLkuMRjt$TJAu z&%-Rg^KkW>5yM0}4Rt}3#Ss+K5|gvExtu3T2VI!-ar&9YCZromcQwr9cakrB9RPjf zWOLU};&69_h=67IGNo04ux_IeF?aWf;-v$ISau#|Jn4VUO3D@}hG%yWS36WZi0Rwm zmOp^5Ct;(FRG#;AbOw?h)UhZ=r0(HV`b4QUt!ah;JM-T!nFA)vAsPj$`y4zYh0E{T z3jwg^CvA5W*?4}&lCF#G2b`6Mtww+coS3ddeUENzjj@_=!2d=A2X(e+O~PaE^I}e| MM(EW?IsgCw0D?YXZ2$lO literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/selector_simulator_item.xml b/app/src/main/res/drawable/selector_simulator_item.xml new file mode 100644 index 0000000000..2202af744f --- /dev/null +++ b/app/src/main/res/drawable/selector_simulator_item.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_simulator_list.xml b/app/src/main/res/layout/fragment_simulator_list.xml new file mode 100644 index 0000000000..4206881671 --- /dev/null +++ b/app/src/main/res/layout/fragment_simulator_list.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_menu_simulator_uninstall.xml b/app/src/main/res/layout/layout_menu_simulator_uninstall.xml new file mode 100644 index 0000000000..7aae4929da --- /dev/null +++ b/app/src/main/res/layout/layout_menu_simulator_uninstall.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/popup_simulator_uninstall.xml b/app/src/main/res/layout/popup_simulator_uninstall.xml new file mode 100644 index 0000000000..9fa903f7bf --- /dev/null +++ b/app/src/main/res/layout/popup_simulator_uninstall.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/simulator_item.xml b/app/src/main/res/layout/simulator_item.xml index 1629a8d023..25f016bd95 100644 --- a/app/src/main/res/layout/simulator_item.xml +++ b/app/src/main/res/layout/simulator_item.xml @@ -5,18 +5,31 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" - android:paddingLeft="16dp" - android:paddingRight="16dp" android:orientation="vertical"> + android:layout_height="wrap_content" + android:paddingLeft="16dp" + android:paddingRight="16dp"> + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cf42bf0ec4..0d00845e3b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -136,6 +136,7 @@ #7CE7F8 #E6F8FA #91F0FD + #F6FBFF #b2b2b2 #9a9a9a #3a3a3a From fd424b0204a51434a0d7375aa3f6f5e342b0ddf4 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 26 Jan 2021 11:54:20 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=B0=86=E6=8E=A5=E6=94=B6=E5=88=B0?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=AE=8C=E6=88=90=E4=BA=8B=E4=BB=B6=E5=90=8E?= =?UTF-8?q?=E7=9A=84=E6=93=8D=E4=BD=9C=E4=BB=8E=20DownloadService=20?= =?UTF-8?q?=E7=A7=BB=E8=87=B3=20DownloadManger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/download/DownloadManager.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 4811057bfa..c7cd482c13 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -52,6 +52,7 @@ import com.lightgame.download.DownloadService; import com.lightgame.download.DownloadStatus; import com.lightgame.download.DownloadStatusListener; import com.lightgame.download.DownloadStatusManager; +import com.lightgame.download.DownloadTask; import com.lightgame.download.FileUtils; import com.lightgame.download.HttpDnsManager; import com.lightgame.utils.Utils; @@ -633,7 +634,7 @@ public class DownloadManager implements DownloadStatusListener { FileUtils.deleteFile(entry.getPath()); } mDownloadDao.delete(url); - Utils.log(DownloadManager.class.getSimpleName(), "cancel==>file and record were deleted!"); + Utils.log(DownloadManager.class.getSimpleName(), "cancel==>record were deleted!"); } if (entry != null) { if (automatic) { @@ -642,7 +643,23 @@ public class DownloadManager implements DownloadStatusListener { entry.getMeta().put(DownloadDataHelper.DOWNLOAD_CANCEL_WAY, DownloadDataHelper.DOWNLOAD_CANCEL_MANUAL); } entry.setStatus(DownloadStatus.cancel); - startDownloadService(entry, DownloadStatus.cancel); + +// startDownloadService(entry, DownloadStatus.cancel); + + // 将原来安装完成后在 downloadService 完成的功能放到这里,尝试避免因为 ANR 造成闪退 + mDownloadDao.removeErrorMessage(entry.getUrl()); + + DownloadTask task = DataChanger.INSTANCE.getDownloadingTasks().get(entry.getUrl()); + if (task != null) { + task.cancel(); + // 改任务队列的状态 + DataChanger.INSTANCE.getDownloadingTasks().remove(entry.getUrl()); + DataChanger.INSTANCE.notifyDataChanged(entry); + } + DataChanger.INSTANCE.getDownloadEntries().remove(entry.getUrl()); + DataChanger.INSTANCE.notifyDataChanged(entry); + DownloadStatusManager.getInstance().onTaskCancelled(entry); + Utils.log(DownloadManager.class.getSimpleName(), "cancel"); } } From db33ed0d0d1fc961766e4ab803b37c4db2355416 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 26 Jan 2021 12:00:49 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E9=99=90=E5=88=B6=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/Extensions.kt | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) 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 41e02d6c2d..d68f5d5619 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -732,26 +732,29 @@ fun Context.doOnMainProcessOnly(callback: EmptyCallback) { doOnMainProcessOnly { callback.onCallback() } } +/** + * 虽然现在我们没有了友盟以后只是单进程APP,但在 debug 模式下还有 whatTheStack 这个进程如果不限定主进程会出现奇奇怪怪的问题 (BroadcastReceiver相关) + */ inline fun Context.doOnMainProcessOnly(f: () -> Unit) { -// val processName = PackageUtils.obtainProcessName(this) -// if (processName == null || BuildConfig.APPLICATION_ID == processName) { + val processName = PackageUtils.obtainProcessName(this) + if (processName == null || BuildConfig.APPLICATION_ID == processName) { f.invoke() -// } else { -// tryWithDefaultCatch { -// Utils.log("Block one useless sub process method call from ${Thread.currentThread().stackTrace[3].methodName} -> ${Thread.currentThread().stackTrace[2].methodName}.") -// } -// } + } else { + tryWithDefaultCatch { + Utils.log("Block one useless sub process method call from ${Thread.currentThread().stackTrace[3].methodName} -> ${Thread.currentThread().stackTrace[2].methodName}.") + } + } } inline fun doOnMainProcessOnly(f: () -> Unit) { -// val processName = PackageUtils.obtainProcessName(HaloApp.getInstance().application) -// if (processName == null || BuildConfig.APPLICATION_ID == processName) { + val processName = PackageUtils.obtainProcessName(HaloApp.getInstance().application) + if (processName == null || BuildConfig.APPLICATION_ID == processName) { f.invoke() -// } else { -// tryWithDefaultCatch { -// Utils.log("Block one useless sub process method call from ${Thread.currentThread().stackTrace[3].methodName} -> ${Thread.currentThread().stackTrace[2].methodName}.") -// } -// } + } else { + tryWithDefaultCatch { + Utils.log("Block one useless sub process method call from ${Thread.currentThread().stackTrace[3].methodName} -> ${Thread.currentThread().stackTrace[2].methodName}.") + } + } } /**