diff --git a/app/src/main/java/com/gh/base/ToolBarActivity.java b/app/src/main/java/com/gh/base/ToolBarActivity.java index 555711576a..62a57a0179 100644 --- a/app/src/main/java/com/gh/base/ToolBarActivity.java +++ b/app/src/main/java/com/gh/base/ToolBarActivity.java @@ -193,10 +193,10 @@ public abstract class ToolBarActivity extends BaseActivity implements ToolbarCon private void updateDownloadCountHint(List updateList) { if (mDownloadCountHint == null) return; - int count = DownloadManager.getInstance(getApplicationContext()).getDownloadOrUpdateCount(updateList); - if (count != 0) { + String count = DownloadManager.getInstance(getApplicationContext()).getDownloadOrUpdateCount(updateList); + if (count != null) { mDownloadCountHint.setVisibility(View.VISIBLE); - mDownloadCountHint.setText(String.valueOf(count)); + mDownloadCountHint.setText(count); } else { mDownloadCountHint.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/gh/common/util/SpUtils.kt b/app/src/main/java/com/gh/common/util/SpUtils.kt index 1e098b7a69..da8d44b12e 100644 --- a/app/src/main/java/com/gh/common/util/SpUtils.kt +++ b/app/src/main/java/com/gh/common/util/SpUtils.kt @@ -83,6 +83,16 @@ object SPUtils { } } + @JvmStatic + fun setStringSet(key: String, values: Set) { + sp.edit().putStringSet(key, values).apply() + } + + @JvmStatic + fun getStringSet(key: String): Set { + return sp.getStringSet(key, HashSet())?: HashSet() + } + @JvmStatic fun remove(key: String) { val editor = sp.edit() diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 879167bfc1..9571f10a35 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -10,6 +10,9 @@ import android.os.Message; import android.preference.PreferenceManager; import android.text.TextUtils; +import androidx.annotation.Nullable; +import androidx.collection.ArrayMap; + import com.gh.common.exposure.ExposureEvent; import com.gh.common.util.AppDebugConfig; import com.gh.common.util.DataCollectionUtils; @@ -19,12 +22,14 @@ import com.gh.common.util.MD5Utils; import com.gh.common.util.MtaHelper; import com.gh.common.util.NetworkUtils; import com.gh.common.util.PackageUtils; +import com.gh.common.util.SPUtils; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.GameUpdateEntity; import com.gh.gamecenter.entity.PluginLocation; import com.gh.gamecenter.eventbus.EBDownloadStatus; import com.gh.gamecenter.manager.PackagesManager; +import com.gh.gamecenter.packagehelper.PackageRepository; import com.google.gson.Gson; import com.halo.assistant.HaloApp; import com.lightgame.config.CommonDebug; @@ -47,18 +52,18 @@ import org.greenrobot.eventbus.EventBus; import java.io.File; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; -import androidx.annotation.Nullable; -import androidx.collection.ArrayMap; - import static android.os.Build.MANUFACTURER; public class DownloadManager implements DownloadStatusListener { private static DownloadManager mInstance; private static Gson gson = new Gson(); + private static final String HINT_MARK = "hint_mark"; private Context mContext; private Handler mHandler; @@ -72,6 +77,8 @@ public class DownloadManager implements DownloadStatusListener { private DownloadDao mDownloadDao; + private Set mUpdateMarks; + @Override public void onTaskCancelled(DownloadEntity entity) { EBDownloadStatus status = new EBDownloadStatus("delete", entity.getName(), @@ -134,6 +141,8 @@ public class DownloadManager implements DownloadStatusListener { mContext = context.getApplicationContext(); mDownloadDao = DownloadDao.getInstance(mContext); + mUpdateMarks = SPUtils.getStringSet(HINT_MARK); + //TODO unregister this DownloadStatusManager.getInstance().registerTaskStatusListener(this); @@ -598,11 +607,11 @@ public class DownloadManager implements DownloadStatusListener { mContext.startService(serviceIntent); } } - + public void disableDownloadSpeedLimit() { DownloadSpeedController.disableSpeedLimit(); } - + public void updateSpeedLimitationReleaseDelay(int delay) { DownloadSpeedController.updateLimitationReleaseDelay(delay); } @@ -624,19 +633,86 @@ public class DownloadManager implements DownloadStatusListener { } } - public int getDownloadOrUpdateCount(List updateList) { - int downloadSize = getAll().size(); - if (downloadSize != 0) { - return downloadSize; - } + /** + * @param updateList 更新/插件化数据 + * @return null: 不显示小红点 + */ + @Nullable + public String getDownloadOrUpdateCount(List updateList) { + boolean showRedPoint = false; + int downloadingSize = 0; - int updateSize = 0; - if (updateList != null) { - for (GameUpdateEntity updateEntity : updateList) { - if (updateEntity.isShowPlugin(PluginLocation.only_index)) updateSize++; + for (DownloadEntity downloadEntity : getAll()) { + if (DownloadStatus.done.equals(downloadEntity.getStatus())) { + String mark = downloadEntity.getMeta().get(HINT_MARK); + if (TextUtils.isEmpty(mark)) showRedPoint = true; + } else { + downloadingSize++; } } - return updateSize; + + if (downloadingSize != 0) return String.valueOf(downloadingSize); + + if (showRedPoint) return ""; + + if (updateList != null) { + for (GameUpdateEntity updateEntity : updateList) { + if (updateEntity.isShowPlugin(PluginLocation.only_index) + && !mUpdateMarks.contains(updateEntity.getId() + "" + updateEntity.getPackageName())) { + return ""; + } + } + } + return null; + } + + /** + * 标记下载已完成的任务以及更新数据(用于红点判断) + */ + public void markDownloadAndUpdateData() { + boolean existWriteMark = false; + List all = getAll(); + for (DownloadEntity downloadEntity : all) { + DownloadStatus status = downloadEntity.getStatus(); + if (status == DownloadStatus.done) { + String mark = downloadEntity.getMeta().get(HINT_MARK); + if (TextUtils.isEmpty(mark)) { + downloadEntity.getMeta().put(HINT_MARK, HINT_MARK); + mDownloadDao.newOrUpdate(downloadEntity); + if (!existWriteMark) existWriteMark = true; + } + } + } + + ArrayList updates = PackageRepository.INSTANCE.getGameUpdate(); + for (GameUpdateEntity update : updates) { + String mark = update.getId() + update.getPackageName(); + if (!mUpdateMarks.contains(mark)) { + mUpdateMarks.add(mark); + if (!existWriteMark) existWriteMark = true; + } + } + if (existWriteMark) { + EventBus.getDefault().post(new EBDownloadStatus("download", "", "", "", "", "")); + } + } + + /** + * 重新设置标记数据 + */ + public void resetMarkData() { + ArrayList updates = PackageRepository.INSTANCE.getGameUpdate(); + if (updates.size() == mUpdateMarks.size()) { + SPUtils.setStringSet(HINT_MARK, mUpdateMarks); + return; + } + + Set marks = new HashSet<>(); + for (GameUpdateEntity update : updates) { + String mark = update.getId() + update.getPackageName(); + marks.add(mark); + } + SPUtils.setStringSet(HINT_MARK, marks); } } diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 503845103a..7a3b15fb37 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -25,6 +25,9 @@ import android.view.View; import android.view.Window; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModelProviders; + import com.gh.base.AppUncaughtHandler; import com.gh.base.BaseActivity; import com.gh.base.fragment.BaseFragment_ViewPager; @@ -68,6 +71,7 @@ import com.gh.gamecenter.entity.InnerMetaInfoEntity; import com.gh.gamecenter.entity.NotificationHint; import com.gh.gamecenter.entity.NotificationUgc; import com.gh.gamecenter.entity.SettingsEntity; +import com.gh.gamecenter.eventbus.EBDownloadStatus; import com.gh.gamecenter.eventbus.EBNetworkState; import com.gh.gamecenter.eventbus.EBPackage; import com.gh.gamecenter.eventbus.EBReuse; @@ -120,8 +124,6 @@ import java.util.TimerTask; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import androidx.annotation.NonNull; -import androidx.lifecycle.ViewModelProviders; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import okhttp3.MediaType; @@ -244,6 +246,10 @@ public class MainActivity extends BaseActivity { "游戏", downloadEntity.getName() + ":" + PlatformUtils.getInstance(getApplicationContext()).getPlatformName(downloadEntity.getPlatform())); } } + + if (downloadEntity.getStatus() == DownloadStatus.done) { + EventBus.getDefault().post(new EBDownloadStatus("done", "", "", "", "", "")); + } } }; @@ -378,6 +384,7 @@ public class MainActivity extends BaseActivity { DownloadManager.getInstance(this).removeObserver(dataWatcher); handler.removeCallbacksAndMessages(null); + DownloadManager.getInstance(this).resetMarkData(); } @NonNull diff --git a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java index 8633a0f689..f649e0f127 100644 --- a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java @@ -685,9 +685,12 @@ public class SuggestionActivity extends ToolBarActivity implements OnRequestCall params.put("link", mLinkEt.getText().toString()); if (mGameEntity != null) { - params.put("game_id", mGameEntity.getName()); + params.put("game_id", mGameEntity.getId()); + params.put("suggestion_type", mSuggestType.getType() + "(评论)"); + } else { + params.put("suggestion_type", mSuggestType.getType()); } - params.put("suggestion_type", mSuggestType.getType()); + String message; String content = mSuggestContentEt.getText().toString().trim(); if (mSuggestType == SuggestType.gameCollect) { diff --git a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt index 4c395d13a7..c244f38722 100644 --- a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt @@ -16,6 +16,8 @@ import com.gh.gamecenter.eventbus.EBMiPush import com.gh.gamecenter.eventbus.EBSkip import com.gh.gamecenter.eventbus.EBUISwitch import com.gh.gamecenter.manager.PackagesManager +import com.halo.assistant.HaloApp +import com.lightgame.download.DownloadStatus import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -61,26 +63,10 @@ class DownloadFragment : BaseFragment_TabLayout() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - var updateSize = 0 - for (updateEntity in PackagesManager.getUpdateList()) { - if (updateEntity.isShowPlugin(PluginLocation.only_index)) updateSize++ - } - if (updateSize != 0) { - mUpdateNumber.visibility = View.VISIBLE - mUpdateNumber.text = updateSize.toString() - } else { - mUpdateNumber.visibility = View.INVISIBLE - } + setUpdateHint() + setDownloadHint() - val downloadSize = DownloadManager.getInstance(context).all.size - if (downloadSize != 0) { - mDownloadNumber.visibility = View.VISIBLE - mDownloadNumber.text = downloadSize.toString() - } else { - mDownloadNumber.visibility = View.INVISIBLE - } - - if (downloadSize == 0 && updateSize != 0) { + if (mDownloadNumber.visibility != View.VISIBLE) { mViewPager.currentItem = INDEX_UPDATE } } @@ -110,36 +96,46 @@ class DownloadFragment : BaseFragment_TabLayout() { } } + @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(changed: EBDownloadChanged) { if ("download" == changed.type) { - if (changed.visibility == View.VISIBLE) { - mDownloadNumber.visibility = View.VISIBLE - } else { - mDownloadNumber.visibility = View.INVISIBLE - } - mDownloadNumber.text = changed.size.toString() + setDownloadHint() } else if ("update" == changed.type) { - if (changed.size == -1) { - val number = Integer.valueOf(mUpdateNumber.text.toString()) - if (number == 1) { - mUpdateNumber.visibility = View.INVISIBLE - } else { - mUpdateNumber.text = (number - 1).toString() - } - } else { - if (changed.size != 0) { - if (changed.visibility == View.VISIBLE) { - mUpdateNumber.visibility = View.VISIBLE - } else { - mUpdateNumber.visibility = View.INVISIBLE - } - mUpdateNumber.text = changed.size.toString() - } else { - mUpdateNumber.visibility = View.INVISIBLE - } + setUpdateHint() + } + } + + private fun setDownloadHint() { + val downloadData = DownloadManager.getInstance(context).all + if (downloadData.size > 0) { + mDownloadNumber.visibility = View.VISIBLE + } else { + mDownloadNumber.visibility = View.INVISIBLE + return + } + + var downloadingCount = 0 + for (download in downloadData) { + if (DownloadStatus.done != download.status) { + downloadingCount++ } } + + mDownloadNumber.text = if (downloadingCount > 0) { + downloadingCount.toString() + } else "" + } + + private fun setUpdateHint() { + var updateSize = 0 + for (updateEntity in PackagesManager.getUpdateList()) { + if (updateEntity.isShowPlugin(PluginLocation.only_index)) updateSize++ + } + + mUpdateNumber.visibility = if (updateSize != 0) { + View.VISIBLE + } else View.INVISIBLE } @Subscribe(threadMode = ThreadMode.MAIN) @@ -163,4 +159,13 @@ class DownloadFragment : BaseFragment_TabLayout() { } } } + + override fun onDestroy() { + super.onDestroy() + // 防止卡顿 + HaloApp.getInstance().mainExecutor.execute { + // 标记所有待安装的下载任务以及更新/插件化的更新任务 + DownloadManager.getInstance(HaloApp.getInstance().application).markDownloadAndUpdateData() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java index f5eb7a536c..3392f30ab7 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -140,7 +140,8 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi mNoDataSkip.setVisibility(View.VISIBLE); } } else { - EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, listSize)); + EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, + adapter.getDownloadingList().size())); } } else { location = adapter.getLocation(downloadEntity.getUrl()); @@ -167,14 +168,14 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi mNoDataSkip.setVisibility(View.GONE); } EventBus.getDefault().post(new EBDownloadChanged("download", - View.VISIBLE, 1)); + View.VISIBLE, adapter.getDownloadingList().size())); } else { adapter.getDownloadingList().add(0, downloadEntity); adapter.initLocationMap(); adapter.notifyItemInserted(adapter.getBase() + 1); adapter.notifyItemChanged(adapter.getBase()); EventBus.getDefault().post(new EBDownloadChanged("download", - View.VISIBLE, adapter.getDoneList().size() + adapter.getDownloadingList().size())); + View.VISIBLE, adapter.getDownloadingList().size())); } } } @@ -331,13 +332,13 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi adapter.initLocationMap(); adapter.notifyItemRangeRemoved(0, 2); EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, - adapter.getDoneList().size() + adapter.getDownloadingList().size())); + adapter.getDownloadingList().size())); } else { adapter.getDoneList().remove(location.intValue()); adapter.initLocationMap(); adapter.notifyItemRemoved(location + 1); EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, - adapter.getDoneList().size() + adapter.getDownloadingList().size())); + adapter.getDownloadingList().size())); } // } } diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java index 53bf99811d..3a7cdd45c6 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java @@ -6,16 +6,17 @@ import android.content.pm.PackageInfo; import android.graphics.Bitmap; import android.graphics.Color; import android.os.Message; -import androidx.core.content.ContextCompat; -import androidx.collection.ArrayMap; -import androidx.recyclerview.widget.RecyclerView; -import androidx.recyclerview.widget.RecyclerView.ViewHolder; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.collection.ArrayMap; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; + import com.gh.common.util.BitmapUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DialogUtils; @@ -496,6 +497,8 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { } private void removeDownload(DownloadEntity entry) { + DownloadManager.getInstance(mContext).cancel(entry.getUrl()); + Integer location = locationMap.get(entry.getUrl()); if (location == null) { return; @@ -521,13 +524,13 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { initLocationMap(); notifyItemRangeRemoved(0, 2); EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, - doneList.size() + downloadingList.size())); + downloadingList.size())); } else { doneList.remove(location.intValue()); initLocationMap(); notifyItemRemoved(location + 1); EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, - doneList.size() + downloadingList.size())); + downloadingList.size())); } } else { if (doneList.isEmpty() && downloadingList.size() == 1) { @@ -543,13 +546,13 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { initLocationMap(); notifyItemRangeRemoved(getBase(), 2); EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, - doneList.size() + downloadingList.size())); + downloadingList.size())); } else { downloadingList.remove(location.intValue()); initLocationMap(); notifyItemRemoved(location + getBase() + 1); EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, - doneList.size() + downloadingList.size())); + downloadingList.size())); } } @@ -557,8 +560,6 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { statusMap.remove(entry.getUrl()); notifyItemChanged(doneList.isEmpty() ? 0 : 1 + doneList.size()); - - DownloadManager.getInstance(mContext).cancel(entry.getUrl()); } // 显示删除提示框 diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java index 65dfcc7809..03daba87fb 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java @@ -29,10 +29,8 @@ import com.gh.gamecenter.MessageActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.SearchActivity; import com.gh.gamecenter.entity.GameUpdateEntity; -import com.gh.gamecenter.entity.PluginLocation; import com.gh.gamecenter.eventbus.EBDownloadStatus; import com.gh.gamecenter.eventbus.EBReuse; -import com.gh.gamecenter.manager.PackagesManager; import com.gh.gamecenter.message.MessageUnreadViewModel; import com.gh.gamecenter.packagehelper.PackageViewModel; import com.halo.assistant.HaloApp; @@ -216,21 +214,6 @@ public class SearchToolbarFragment extends BaseFragment implements View.OnClickL mDownloadView.setVisibility(View.INVISIBLE); } - int updateSize = 0; - for (GameUpdateEntity updateEntity : PackagesManager.INSTANCE.getUpdateList()) { - if (updateEntity.isShowPlugin(PluginLocation.only_index)) updateSize++; - } - int downloadSize = DownloadManager.getInstance(getActivity()).getAll().size(); - if (downloadSize != 0) { - mDownloadHintTv.setVisibility(View.VISIBLE); - mDownloadHintTv.setText(String.valueOf(downloadSize)); - } else if (updateSize != 0) { - mDownloadHintTv.setVisibility(View.VISIBLE); - mDownloadHintTv.setText(String.valueOf(updateSize)); - } else { - mDownloadHintTv.setVisibility(View.GONE); - } - mSearchHintTv.setOnClickListener(this); } @@ -294,10 +277,10 @@ public class SearchToolbarFragment extends BaseFragment implements View.OnClickL } private void setDownloadHint(List updateList) { - int count = DownloadManager.getInstance(requireContext()).getDownloadOrUpdateCount(updateList); - if (count != 0) { + String count = DownloadManager.getInstance(requireContext()).getDownloadOrUpdateCount(updateList); + if (count != null) { mDownloadHintTv.setVisibility(View.VISIBLE); - mDownloadHintTv.setText(String.valueOf(count)); + mDownloadHintTv.setText(count); } else { mDownloadHintTv.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index 29b236949d..1c66c4fb2e 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -861,7 +861,7 @@ class GameDetailFragment : NormalFragment() { private fun updateDownloadCountHint(updateList: List?) { val count = DownloadManager.getInstance(requireContext()).getDownloadOrUpdateCount(updateList) - mDownloadCountHint?.goneIf(count == 0) + mDownloadCountHint?.goneIf(count == null) mDownloadCountHint?.text = count.toString() } diff --git a/app/src/main/res/layout/fragment_toolbar.xml b/app/src/main/res/layout/fragment_toolbar.xml index 5742cf3c20..7474af3887 100644 --- a/app/src/main/res/layout/fragment_toolbar.xml +++ b/app/src/main/res/layout/fragment_toolbar.xml @@ -63,7 +63,8 @@ android:background="@drawable/oval_hint_red_bg" android:gravity="center" android:textColor="@android:color/white" - android:textSize="8sp" /> + android:textSize="8sp" + android:visibility="gone" />