From da664e58694c070e2e362fe5ee13de6dc4f283f5 Mon Sep 17 00:00:00 2001 From: huangzhuanghua <401742778@qq.com> Date: Sun, 4 Sep 2016 18:35:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=95=B4=E7=90=86=E3=80=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/base/BaseFragment.java | 72 ++ .../com/gh/common/util/DownloadItemUtils.java | 39 +- .../com/gh/common/view/DownloadDialog.java | 8 +- .../java/com/gh/download/DownloadManager.java | 31 +- .../java/com/gh/gamecenter/MainActivity.java | 324 ++++---- .../com/gh/gamecenter/PluginActivity.java | 36 +- .../com/gh/gamecenter/SubjectActivity.java | 36 +- .../gh/gamecenter/adapter/PluginAdapter.java | 26 +- .../gh/gamecenter/adapter/SubjectAdapter.java | 20 +- .../com/gh/gamecenter/game/Game1Fragment.java | 185 ++--- .../gamecenter/game/Game1FragmentAdapter.java | 137 +-- .../com/gh/gamecenter/game/Game2Fragment.java | 158 ++-- .../gamecenter/game/Game2FragmentAdapter.java | 45 +- .../com/gh/gamecenter/game/Game3Fragment.java | 148 +--- .../gamecenter/game/Game3FragmentAdapter.java | 44 +- .../com/gh/gamecenter/game/GameFragment.java | 1 - .../gh/gamecenter/news/NewNews4Fragment.java | 224 ----- .../news/NewNews4FragmentAdapter.java | 329 -------- .../com/gh/gamecenter/news/News4Fragment.java | 254 ++++-- .../gamecenter/news/News4FragmentAdapter.java | 783 ++++++------------ .../com/gh/gamecenter/news/NewsFragment.java | 2 +- .../gamecenter/personal/ConcernFragment.java | 102 ++- .../personal/ConcernFragmentAdapter.java | 94 ++- .../personal/InstallFragmentAdapter.java | 59 +- .../res/drawable-hdpi/collection_colse.png | Bin 0 -> 3066 bytes ...pen_collection.png => collection_open.png} | Bin .../res/drawable-hdpi/colse_collection.png | Bin 1144 -> 0 bytes app/src/main/res/drawable-hdpi/frame_left.png | Bin 2623 -> 4146 bytes .../main/res/drawable-xhdpi/logo_black.png | Bin 28840 -> 28861 bytes app/src/main/res/layout/activity_main.xml | 18 +- app/src/main/res/layout/concern_rv_item.xml | 144 ++-- ...plugin1_fragment.xml => fragment_game.xml} | 6 +- app/src/main/res/layout/fragment_news4.xml | 45 +- .../main/res/layout/game_download_item.xml | 2 +- 34 files changed, 1327 insertions(+), 2045 deletions(-) create mode 100644 app/src/main/java/com/gh/base/BaseFragment.java delete mode 100644 app/src/main/java/com/gh/gamecenter/news/NewNews4Fragment.java delete mode 100644 app/src/main/java/com/gh/gamecenter/news/NewNews4FragmentAdapter.java create mode 100644 app/src/main/res/drawable-hdpi/collection_colse.png rename app/src/main/res/drawable-hdpi/{open_collection.png => collection_open.png} (100%) delete mode 100644 app/src/main/res/drawable-hdpi/colse_collection.png rename app/src/main/res/layout/{plugin1_fragment.xml => fragment_game.xml} (86%) diff --git a/app/src/main/java/com/gh/base/BaseFragment.java b/app/src/main/java/com/gh/base/BaseFragment.java new file mode 100644 index 0000000000..e2bc77b364 --- /dev/null +++ b/app/src/main/java/com/gh/base/BaseFragment.java @@ -0,0 +1,72 @@ +package com.gh.base; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.gh.common.util.Utils; + +import java.lang.reflect.Field; + +import de.greenrobot.event.EventBus; + +/** + * Created by LGT on 2016/9/4. + */ +public class BaseFragment extends Fragment { + + protected View view; + + protected boolean isDestroy; + + protected void init(int layout) { + view = View.inflate(getActivity(), layout, null); + + //简化findViewById + try { + Class clazz = this.getClass(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + int id = Utils.getId(field.getName()); + if (id != -1) { + Utils.log("reflect name = " + field.getName()); + field.setAccessible(true); + Class fieldType = field.getType(); + Object injectedValue = fieldType.cast(view.findViewById(id)); + field.set(this, injectedValue); + field.setAccessible(false); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + isDestroy = false; + EventBus.getDefault().register(this); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + if(container != null){ + container.removeView(view); + } + return view; + } + + @Override + public void onDestroy() { + super.onDestroy(); + view = null; + isDestroy = true; + EventBus.getDefault().unregister(this); + } +} diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index 786ec70b66..6b7ac74584 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -56,18 +56,17 @@ public class DownloadItemUtils { } // 更新下载进度条 - public static void processDate(GameEntity detailedEntity, + public static void processDate(Context context, + GameEntity detailedEntity, DownloadEntry downloadEntry, - ArrayMap> platformMap, - Handler handler, RecyclerView.Adapter adapter, int index, ArrayMap statusMap) { - LinkedBlockingQueue queue = platformMap.get(downloadEntry.getName()); + LinkedBlockingQueue queue = DownloadManager.getInstance(context).getQueue(downloadEntry.getName()); if (queue == null) { queue = new LinkedBlockingQueue<>(); - platformMap.put(downloadEntry.getName(), queue); + DownloadManager.getInstance(context).putQueue(downloadEntry.getName(), queue); } String platform = downloadEntry.getMeta().get("platform"); @@ -93,7 +92,7 @@ public class DownloadItemUtils { Message msg = Message.obtain(); msg.obj = downloadEntry.getName(); msg.what = Constants.DOWNLOAD_ROLL; - handler.sendMessageDelayed(msg, 3000); + DownloadManager.getInstance(context).sendMessageDelayed(msg, 3000); } } if (platform.equals(queue.peek())) { @@ -170,7 +169,6 @@ public class DownloadItemUtils { TextView download_percentage, TextView downloadBtn, GameEntity entity, - ArrayMap> platformMap, ArrayMap statusMap, boolean isShowPlatform) { @@ -228,7 +226,7 @@ public class DownloadItemUtils { DownloadEntry downloadEntry; - LinkedBlockingQueue queue = platformMap.get(entity.getName()); + LinkedBlockingQueue queue = DownloadManager.getInstance(context).getQueue(entity.getName()); if (queue != null && !queue.isEmpty()) { downloadEntry = entryMap.get(queue.peek()); } else { @@ -342,7 +340,6 @@ public class DownloadItemUtils { TextView download_percentage, TextView downloadBtn, GameEntity entity, - ArrayMap> platformMap, ArrayMap statusMap, boolean isShowPlatform) { @@ -363,7 +360,7 @@ public class DownloadItemUtils { download_percentage, downloadBtn, entity, statusMap, isShowPlatform); } else { updatePluginItem(context, textView, game_progressbar, game_ll_info, download_speed, - download_percentage, downloadBtn, entity, platformMap, statusMap, isShowPlatform); + download_percentage, downloadBtn, entity, statusMap, isShowPlatform); } } @@ -376,10 +373,9 @@ public class DownloadItemUtils { TextView download_percentage, TextView downloadBtn, GameEntity entity, - ArrayMap> platformMap, ArrayMap statusMap) { updateItem(context, textView, game_progressbar, game_ll_info, download_speed, - download_percentage, downloadBtn, entity, platformMap, statusMap, true); + download_percentage, downloadBtn, entity, statusMap, true); } public static void setNormalOnClickListener(final Context context, @@ -483,28 +479,9 @@ public class DownloadItemUtils { int position, RecyclerView.Adapter adapter, ArrayMap statusMap, - ArrayMap> platformMap, String entrance, DismissEntity dismissEntity, String location) { - setOnClickListener(context, downloadBtn, download_speed, download_percentage, - entity, position, adapter, statusMap, platformMap, entrance, true, - dismissEntity, location); - } - - public static void setOnClickListener(Context context, - TextView downloadBtn, - TextView download_speed, - TextView download_percentage, - GameEntity entity, - int position, - RecyclerView.Adapter adapter, - ArrayMap statusMap, - ArrayMap> platformMap, - String entrance, - boolean isShowPlatform, - DismissEntity dismissEntity, - String location) { if (entity.getApk().size() == 1) { setNormalOnClickListener(context, downloadBtn, entity, position, adapter, statusMap, entrance); diff --git a/app/src/main/java/com/gh/common/view/DownloadDialog.java b/app/src/main/java/com/gh/common/view/DownloadDialog.java index 9a1f75b98f..2df32076b7 100644 --- a/app/src/main/java/com/gh/common/view/DownloadDialog.java +++ b/app/src/main/java/com/gh/common/view/DownloadDialog.java @@ -686,12 +686,12 @@ public class DownloadDialog { || clickCollectionPosition != location && clickCollectionPosition != -1){ llCollection.setVisibility(View.VISIBLE); showCollectionLayout(apkEntity.getApkCollection()); - viewHolder.download_item_open_collection.setImageResource(R.drawable.colse_collection); + viewHolder.download_item_open_collection.setImageResource(R.drawable.collection_colse); colseCollectionPosition = location; notifyDataSetChanged(); } else { llCollection.setVisibility(View.GONE); - viewHolder.download_item_open_collection.setImageResource(R.drawable.open_collection); + viewHolder.download_item_open_collection.setImageResource(R.drawable.collection_open); } clickCollectionPosition = location; } else if (viewHolder.download_item_tv_status.getVisibility() == View.GONE) { @@ -919,9 +919,9 @@ public class DownloadDialog { ImageUtils.getInstance(context).display(apkEntity.getApkCollection().getIcon(),viewHolder.download_item_iv_pic); viewHolder.download_item_open_collection.setVisibility(View.VISIBLE); if (colseCollectionPosition == location){ - viewHolder.download_item_open_collection.setImageResource(R.drawable.colse_collection); + viewHolder.download_item_open_collection.setImageResource(R.drawable.collection_colse); }else { - viewHolder.download_item_open_collection.setImageResource(R.drawable.open_collection); + viewHolder.download_item_open_collection.setImageResource(R.drawable.collection_open); } } } diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index b207164df8..830ce05707 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -14,6 +14,7 @@ import com.gh.common.util.Utils; import java.io.File; import java.util.List; import java.util.Map.Entry; +import java.util.concurrent.LinkedBlockingQueue; public class DownloadManager { @@ -23,11 +24,13 @@ public class DownloadManager { private Handler handler; private ArrayMap lastTimeMap; + private ArrayMap> platformMap; private DownloadManager(Context context) { this.context = context; - lastTimeMap = new ArrayMap(); + lastTimeMap = new ArrayMap<>(); + platformMap = new ArrayMap<>(); handler = new Handler(context.getMainLooper()){ @Override @@ -42,6 +45,16 @@ public class DownloadManager { if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) { pause(url); } + } else if (msg.what == Constants.DOWNLOAD_ROLL) { + String name = (String) msg.obj; + LinkedBlockingQueue queue = platformMap.get(name); + if (queue.size() > 1) { + queue.offer(queue.poll()); + Message message = Message.obtain(); + message.obj = name; + message.what = Constants.DOWNLOAD_ROLL; + sendMessageDelayed(message, 3000); + } } } }; @@ -52,6 +65,22 @@ public class DownloadManager { lastTimeMap.put(url, time); } + public void putQueue(String name, LinkedBlockingQueue queue) { + platformMap.put(name, queue); + } + + public LinkedBlockingQueue getQueue(String name) { + return platformMap.get(name); + } + + public void removePlatform(String name, String platform) { + LinkedBlockingQueue queue = platformMap.get(name); + if (queue != null) { + queue.remove(platform); + platformMap.put(name, queue); + } + } + public void sendMessageDelayed(Message msg, long delayMillis) { handler.sendMessageDelayed(msg, delayMillis); } diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 5bc469c0ef..23a8401ee6 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -16,12 +16,14 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.NotificationCompat; import android.support.v4.util.ArrayMap; +import android.text.Html; import android.text.TextUtils; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; @@ -104,12 +106,10 @@ public class MainActivity extends BaseFragmentActivity implements public static ArrayMap uninstallMap; public static String searchHint; - + private GameFragment gameFragment; private NewsFragment newsFragment; - - private GameFragment pluginFragmentActivity; - private PersonalFragment home3Fragment; - private View home1Layout, home2Layout, home3Layout; + private PersonalFragment personalFragment; + private LinearLayout home1Layout, home2Layout, home3Layout; private ImageView home1Image, home2Image, home3Image; private TextView home1Title, home2Title, home3Title; @@ -133,10 +133,8 @@ public class MainActivity extends BaseFragmentActivity implements // 黄壮华 添加观察者 修改2015/8/15 private DataWatcher dataWatcher = new DataWatcher() { @Override - public void onDataChanged( - HashMap downloadingEntries) { - for (Map.Entry entry : downloadingEntries - .entrySet()) { + public void onDataChanged(HashMap downloadingEntries) { + for (Map.Entry entry : downloadingEntries.entrySet()) { final DownloadEntry downloadEntry = entry.getValue(); // 链接被劫持 if (DownloadStatus.hijack.equals(downloadEntry.getStatus())) { @@ -145,7 +143,7 @@ public class MainActivity extends BaseFragmentActivity implements // 弹出提示框 EventBus.getDefault().post(new EBShowDialog("hijack")); //记录链接被劫持 - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("url", downloadEntry.getUrl()); map.put("game", downloadEntry.getName()); map.put("platform", downloadEntry.getMeta().get("platform")); @@ -154,10 +152,10 @@ public class MainActivity extends BaseFragmentActivity implements continue; } if (downloadEntry.getName().contains("光环助手") && isShowDownload) { - app_tv_speed.setText(SpeedUtils.getSpeed(downloadEntry.getSpeed()) - + "(剩" + SpeedUtils.getRemainTime(downloadEntry.getSize(), - downloadEntry.getProgress(), - downloadEntry.getSpeed() * 1024) + ")"); + app_tv_speed.setText(String.format("%s(剩%s)", + SpeedUtils.getSpeed(downloadEntry.getSpeed()), + SpeedUtils.getRemainTime(downloadEntry.getSize(), + downloadEntry.getProgress(), downloadEntry.getSpeed() * 1024))); app_pb_progress.setProgress((int) (downloadEntry .getPercent() * 10)); app_tv_percent.setText(downloadEntry.getPercent() + "%"); @@ -180,15 +178,12 @@ public class MainActivity extends BaseFragmentActivity implements } } else { - Map kv = new HashMap(); - kv.put("版本", downloadEntry.getMeta() - .get("platform")); + Map kv = new HashMap<>(); + kv.put("版本", downloadEntry.getMeta().get("platform")); kv.put("状态", "下载完成"); - String isUpdate = downloadEntry.getMeta().get( - "isUpdate"); - String entrance = downloadEntry.getMeta().get( - "entrance"); + String isUpdate = downloadEntry.getMeta().get("isUpdate"); + String entrance = downloadEntry.getMeta().get("entrance"); if (isUpdate != null && "true".equals(isUpdate)) { DataUtils.onEvent(MainActivity.this, "游戏更新", downloadEntry.getName(), kv); @@ -196,7 +191,7 @@ public class MainActivity extends BaseFragmentActivity implements DataUtils.onEvent(MainActivity.this, "游戏下载", downloadEntry.getName(), kv); - Map kv2 = new HashMap(); + Map kv2 = new HashMap<>(); kv2.put("版本", downloadEntry.getMeta().get("platform")); kv2.put("状态", "下载完成"); @@ -205,7 +200,7 @@ public class MainActivity extends BaseFragmentActivity implements downloadEntry.getName(), kv2); } if (downloadEntry.getMeta().get("isPlugin") != null) { - Map kv6 = new HashMap(); + Map kv6 = new HashMap<>(); kv6.put("下载", "下载完成"); kv6.put("版本", downloadEntry.getMeta().get("platform")); @@ -213,7 +208,7 @@ public class MainActivity extends BaseFragmentActivity implements downloadEntry.getName(), kv6); } - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("game", downloadEntry.getName()); if (downloadEntry.getMeta().get("isPlugin") != null) { map.put("method", "插件化"); @@ -399,9 +394,9 @@ public class MainActivity extends BaseFragmentActivity implements initViews(); setTabSelection(currentTab); - entryMap = new ArrayMap(); - doneMap = new ArrayMap(); - uninstallMap = new ArrayMap(); + uninstallMap = new ArrayMap<>(); + entryMap = new ArrayMap<>(); + doneMap = new ArrayMap<>(); getSearchHints(); @@ -429,18 +424,16 @@ public class MainActivity extends BaseFragmentActivity implements handler.postDelayed(new Runnable() { @Override public void run() { - ArrayList concernList = new ArrayList(); - ConcernManager concernManager = new ConcernManager( - MainActivity.this); + ArrayList concernList = new ArrayList<>(); + ConcernManager concernManager = new ConcernManager(MainActivity.this); for (ConcernInfo entity : concernManager.getAllConcern()) { if (entity.isConcern()) { concernList.add(entity.getGameName()); } } - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("type", Build.MODEL); - map.put("system", Build.VERSION.SDK_INT + "=" - + Build.VERSION.RELEASE); + map.put("system", Build.VERSION.SDK_INT + "=" + Build.VERSION.RELEASE); map.put("install", PackageManager.getInstalledList()); map.put("concern", concernList); map.put("createdOn", System.currentTimeMillis() / 1000); @@ -458,50 +451,52 @@ public class MainActivity extends BaseFragmentActivity implements String version = PackageUtils.getVersion(getApplicationContext()); String TD_CHANNEL_ID = (String) PackageUtils.getMetaData(this, getPackageName(), "TD_CHANNEL_ID"); String url = "http://api.ghzhushou.com/v1d45/hotfix?channel=" + TD_CHANNEL_ID + "&version=" + version; - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, new Response.Listener() { - @Override - public void onResponse(JSONArray response) { - Utils.log("hotfix = " + response.toString()); - try { - for (int i = 0; i < response.length(); i++) { - JSONObject jsonObject = response.getJSONObject(i); - String clazz = jsonObject.getString("class"); - final String url = jsonObject.getString("url"); - String fileName = url.substring(url.lastIndexOf("/")); - File directory = new File(getFilesDir().getAbsolutePath() + File.separator + "hotfix"); - if (!directory.exists() || !directory.isDirectory()) { - directory.mkdirs(); - } - File file = new File(directory.getAbsolutePath() + File.separator + fileName); - if (file.exists()) { - break; - } - //下载文件 - final String savePath = file.getAbsolutePath(); - new Thread(){ - @Override - public void run() { - try { - FileUtils.downloadFile(url, savePath); - } catch (IOException e) { - e.printStackTrace(); - } - Utils.log(savePath + " download success"); - } - }.start(); - //存储class - sp.edit().putString(file.getName(),clazz).apply(); - } - } catch (JSONException e) { - e.printStackTrace(); - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - Utils.log("hotfix = " + error.toString()); - } - }); + JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { + Utils.log("hotfix = " + response.toString()); + try { + for (int i = 0; i < response.length(); i++) { + JSONObject jsonObject = response.getJSONObject(i); + String clazz = jsonObject.getString("class"); + final String url = jsonObject.getString("url"); + String fileName = url.substring(url.lastIndexOf("/")); + File directory = new File(getFilesDir().getAbsolutePath() + File.separator + "hotfix"); + if (!directory.exists() || !directory.isDirectory()) { + directory.mkdirs(); + } + File file = new File(directory.getAbsolutePath() + File.separator + fileName); + if (file.exists()) { + break; + } + //下载文件 + final String savePath = file.getAbsolutePath(); + new Thread(){ + @Override + public void run() { + try { + FileUtils.downloadFile(url, savePath); + } catch (IOException e) { + e.printStackTrace(); + } + Utils.log(savePath + " download success"); + } + }.start(); + //存储class + sp.edit().putString(file.getName(),clazz).apply(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + Utils.log("hotfix = " + error.toString()); + } + }); AppController.addToRequestQueue(request, MainActivity.class); } @@ -510,82 +505,72 @@ public class MainActivity extends BaseFragmentActivity implements JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( Config.HOST + "v2/disclaimer", new Response.Listener() { - @Override public void onResponse(JSONObject response) { - Utils.log(response.toString()); if (!isDestroy) { try { boolean isShow = response.getBoolean("isShow"); - sp.edit() - .putBoolean("isShowDisclaimer", isShow) - .apply(); + sp.edit().putBoolean("isShowDisclaimer", isShow).apply(); if (isShow) { - String content = response - .getString("content"); - sp.edit().putString("disclaimer", content) - .apply(); + String content = response.getString("content"); + sp.edit().putString("disclaimer", content).apply(); if (isFirst) { DialogUtils.showDisclaimerDialog(MainActivity.this, content); } } } catch (JSONException e) { - e.printStackTrace(); } } } - }, new Response.ErrorListener() { + }, + new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { - Utils.log(error.toString()); sp.edit().putBoolean("isShowDisclaimer", false).apply(); } }); AppController.addToRequestQueue(request, MainActivity.class); } - private Class intentClass(String to) { - Class aClass = null; + private Class intentClass(String to) { try { - aClass = Class.forName("com.gh.gamecenter."+to); + return Class.forName("com.gh.gamecenter." + to); } catch (ClassNotFoundException e) { e.printStackTrace(); } - - return aClass; + return null; } + Runnable runnable = new Runnable() { @Override public void run() { - String to = getIntent().getExtras().getString("to"); if(!TextUtils.isEmpty(to)){ - Intent toIntent = new Intent(getApplicationContext(),intentClass(to)); - - if("NewsActivity".equals(to)){ + Intent toIntent = new Intent(getApplicationContext(), intentClass(to)); + if ("NewsActivity".equals(to)) { toIntent.putExtra("newsId", getIntent().getExtras().getString("newsId")); toIntent.putExtra("entrance", getIntent().getExtras().getString("entrance")); - }else if("DownloadManagerActivity".equals(to)){ + } else if("DownloadManagerActivity".equals(to)) { toIntent.putExtra("packageName" , getIntent().getExtras().getString("packageName")); toIntent.putExtra("currentItem" , 1); - }else if ("GameDetailsActivity".equals(to)){ + } else if ("GameDetailsActivity".equals(to)) { toIntent.putExtra("gameId", getIntent().getExtras().getString("gameId")); toIntent.putExtra("entrance", getIntent().getExtras().getString("entrance")); - }else if ("SubjectActivity".equals(to)){ + } else if ("SubjectActivity".equals(to)) { toIntent.putExtra("id", getIntent().getExtras().getString("id")); toIntent.putExtra("name", getIntent().getExtras().getString("name")); toIntent.putExtra("order", getIntent().getExtras().getBoolean("order")); - }else if ("ViewImageActivity".equals(to)){ + } else if ("ViewImageActivity".equals(to)) { toIntent.putExtra("urls" , getIntent().getExtras().getStringArrayList("urls")); toIntent.putExtra("current" , getIntent().getExtras().getInt("current",0)); toIntent.putExtra("ScaleType" , getIntent().getExtras().getString("ScaleType")); } startActivity(toIntent); - }else { + } else { String from = getIntent().getStringExtra("from"); if (!TextUtils.isEmpty(from)) { if (from.equals("plugin")) { @@ -613,7 +598,7 @@ public class MainActivity extends BaseFragmentActivity implements JSONObject jsonObject = new JSONObject(getIntent() .getStringExtra("data")); JSONArray jsonArray = jsonObject.getJSONArray("apk"); - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject apk = jsonArray.getJSONObject(i); String packageName = apk.getString("package"); @@ -703,10 +688,8 @@ public class MainActivity extends BaseFragmentActivity implements + "&channel=" + TD_CHANNEL_ID; JsonObjectExtendedRequest updateRequest = new JsonObjectExtendedRequest( url, new Response.Listener() { - @Override public void onResponse(JSONObject response) { - Utils.log("update=" + response.toString()); if (!isDestroy) { if (response.length() != 0) { @@ -771,10 +754,10 @@ public class MainActivity extends BaseFragmentActivity implements } } - }, new Response.ErrorListener() { + }, + new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { - Utils.log("update=" + error.toString()); } }); @@ -782,23 +765,23 @@ public class MainActivity extends BaseFragmentActivity implements } private void showUpdateDialog(final String md5) { - dialog = new Dialog(this); - View view = View.inflate(this, R.layout.app_update_hint_dialog, - null); - TextView content = (TextView) view - .findViewById(R.id.updeta_content); - TextView size = (TextView) view - .findViewById(R.id.update_app_size); - TextView versison = (TextView) view.findViewById(R.id.update_app_version); + final Dialog updateDialog = new Dialog(this); + View view = View.inflate(this, R.layout.app_update_hint_dialog, null); - versison.setText("光环助手V"+appEntity.getVersion()+"更新内容:"); - size.setText("大小:"+appEntity.getSize()); - content.setText(appEntity.getContent()+""); + TextView content = (TextView) view.findViewById(R.id.updeta_content); + content.setText(Html.fromHtml(appEntity.getContent())); + + TextView versison = (TextView) view.findViewById(R.id.update_app_version); + versison.setText(String.format("光环助手V%s更新内容:",appEntity.getVersion())); + + TextView size = (TextView) view.findViewById(R.id.update_app_size); + size.setText(String.format("大小:%s", appEntity.getSize())); if (appEntity.isIs_force()) { - dialog.setCanceledOnTouchOutside(false); - dialog.setCancelable(false); + updateDialog.setCanceledOnTouchOutside(false); + updateDialog.setCancelable(false); } + view.findViewById(R.id.update_cannel).setOnClickListener( new OnClickListener() { @Override @@ -806,7 +789,7 @@ public class MainActivity extends BaseFragmentActivity implements if (appEntity.isIs_force()) { finish(); } else { - dialog.dismiss(); + updateDialog.dismiss(); } } }); @@ -814,11 +797,10 @@ public class MainActivity extends BaseFragmentActivity implements new OnClickListener() { @Override public void onClick(View v) { - dialog.dismiss(); + updateDialog.dismiss(); String path = FileUtils.getDownloadPath( MainActivity.this, - "光环助手V" + appEntity.getVersion() + "_" + md5 - + ".apk"); + "光环助手V" + appEntity.getVersion() + "_" + md5 + ".apk"); File file = new File(path); if (file.exists() && file.length() > 0) { startActivity(PackageUtils.getInstallIntent(path)); @@ -828,9 +810,9 @@ public class MainActivity extends BaseFragmentActivity implements } } }); - dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); - dialog.setContentView(view); - dialog.show(); + updateDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + updateDialog.setContentView(view); + updateDialog.show(); } private void showDownloadDialog(String md5) { @@ -878,7 +860,7 @@ public class MainActivity extends BaseFragmentActivity implements downloadEntry.setUrl(appEntity.getUrl()); downloadEntry.setName("光环助手V" + appEntity.getVersion()); downloadEntry.setPath(path); - HashMap meta = new HashMap(); + HashMap meta = new HashMap<>(); meta.put("platform", "官方版"); downloadEntry.setMeta(meta); @@ -926,15 +908,15 @@ public class MainActivity extends BaseFragmentActivity implements } private void initViews() { - home1Layout = findViewById(R.id.home1_layout); - home2Layout = findViewById(R.id.home2_layout); - home3Layout = findViewById(R.id.home3_layout); - home1Image = (ImageView) findViewById(R.id.message_image); - home2Image = (ImageView) findViewById(R.id.contacts_image); - home3Image = (ImageView) findViewById(R.id.news_image); - home1Title = (TextView) findViewById(R.id.message_title); - home2Title = (TextView) findViewById(R.id.contacts_title); - home3Title = (TextView) findViewById(R.id.news_title); + home1Layout = (LinearLayout) findViewById(R.id.main_ll_game); + home2Layout = (LinearLayout) findViewById(R.id.main_ll_news); + home3Layout = (LinearLayout) findViewById(R.id.main_ll_personal); + home1Image = (ImageView) findViewById(R.id.main_iv_game); + home2Image = (ImageView) findViewById(R.id.main_iv_news); + home3Image = (ImageView) findViewById(R.id.main_iv_personal); + home1Title = (TextView) findViewById(R.id.main_tv_game); + home2Title = (TextView) findViewById(R.id.main_tv_news); + home3Title = (TextView) findViewById(R.id.main_tv_personal); home1Layout.setOnClickListener(this); home2Layout.setOnClickListener(this); home3Layout.setOnClickListener(this); @@ -943,15 +925,15 @@ public class MainActivity extends BaseFragmentActivity implements @Override public void onClick(View v) { switch (v.getId()) { - case R.id.home1_layout: + case R.id.main_ll_game: EventBus.getDefault().post(new EBUISwitch("MainActivity", 0)); setTabSelection(0); break; - case R.id.home2_layout: + case R.id.main_ll_news: EventBus.getDefault().post(new EBUISwitch("MainActivity", 1)); setTabSelection(1); break; - case R.id.home3_layout: + case R.id.main_ll_personal: EventBus.getDefault().post(new EBUISwitch("MainActivity", 2)); setTabSelection(2); break; @@ -969,23 +951,23 @@ public class MainActivity extends BaseFragmentActivity implements home1Layout.setClickable(false); home1Image.setImageResource(R.drawable.home1_selected); home1Title.setTextColor(getResources().getColor(R.color.theme)); - if (pluginFragmentActivity == null) { + if (gameFragment == null) { List list = getSupportFragmentManager().getFragments(); if (list != null) { for (Fragment fragment : list) { if (fragment.getClass().equals(GameFragment.class)) { - pluginFragmentActivity = (GameFragment) fragment; - transaction.show(pluginFragmentActivity); + gameFragment = (GameFragment) fragment; + transaction.show(gameFragment); break; } } } - if (pluginFragmentActivity == null) { - pluginFragmentActivity = new GameFragment(); - transaction.add(R.id.main_content, pluginFragmentActivity); + if (gameFragment == null) { + gameFragment = new GameFragment(); + transaction.add(R.id.main_content, gameFragment); } } else { - transaction.show(pluginFragmentActivity); + transaction.show(gameFragment); } currentTab = 0; break; @@ -1017,23 +999,23 @@ public class MainActivity extends BaseFragmentActivity implements home3Layout.setClickable(false); home3Image.setImageResource(R.drawable.home3_selected); home3Title.setTextColor(getResources().getColor(R.color.theme)); - if (home3Fragment == null) { + if (personalFragment == null) { List list = getSupportFragmentManager().getFragments(); if (list != null) { for (Fragment fragment : list) { if (fragment.getClass().equals(PersonalFragment.class)) { - home3Fragment = (PersonalFragment) fragment; - transaction.show(home3Fragment); + personalFragment = (PersonalFragment) fragment; + transaction.show(personalFragment); break; } } } - if (home3Fragment == null) { - home3Fragment = new PersonalFragment(); - transaction.add(R.id.main_content, home3Fragment); + if (personalFragment == null) { + personalFragment = new PersonalFragment(); + transaction.add(R.id.main_content, personalFragment); } } else { - transaction.show(home3Fragment); + transaction.show(personalFragment); } currentTab = 2; break; @@ -1062,11 +1044,11 @@ public class MainActivity extends BaseFragmentActivity implements * 将所有的Fragment都置为隐藏状态。 */ private void hideFragments(FragmentTransaction transaction) { - if (home3Fragment != null) { - transaction.hide(home3Fragment); + if (personalFragment != null) { + transaction.hide(personalFragment); } - if (pluginFragmentActivity != null) { - transaction.hide(pluginFragmentActivity); + if (gameFragment != null) { + transaction.hide(gameFragment); } if (newsFragment != null) { transaction.hide(newsFragment); @@ -1081,18 +1063,19 @@ public class MainActivity extends BaseFragmentActivity implements } private void uploadData(String id, String platform) { - HashMap params = new HashMap(); + HashMap params = new HashMap<>(); params.put("game", id); params.put("platform", platform); JSONObject jsonObject = new JSONObject(params); JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Method.POST, Config.HOST + "v2/stat/download", - jsonObject.toString(), new Response.Listener() { + Method.POST, Config.HOST + "v2/stat/download", jsonObject.toString(), + new Response.Listener() { @Override public void onResponse(JSONObject response) { Utils.log("download = " + response); } - }, new Response.ErrorListener() { + }, + new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Utils.log("download = " + error); @@ -1127,7 +1110,7 @@ public class MainActivity extends BaseFragmentActivity implements getApplicationContext()).get(url); if (downloadEntry != null && downloadEntry.getMeta().get("isPlugin") != null) { - Map kv6 = new HashMap(); + Map kv6 = new HashMap<>(); kv6.put("安装或卸载", "安装完成"); DataUtils.onEvent(this, "插件化", downloadEntry.getName(), kv6); } @@ -1143,7 +1126,7 @@ public class MainActivity extends BaseFragmentActivity implements if (downloadEntry.getMeta().get("isPlugin") != null && downloadEntry.getMeta().get("package_name") .equals(packageName)) { - Map kv6 = new HashMap(); + Map kv6 = new HashMap<>(); kv6.put("安装或卸载", "卸载完成"); DataUtils.onEvent(this, "插件化", downloadEntry.getName(), kv6); break; @@ -1193,7 +1176,7 @@ public class MainActivity extends BaseFragmentActivity implements } if ("卸载".equals(busFour.getType())) { ArrayList list = PackageManager.getUpdateList(); - GameUpdateEntity game = null; + GameUpdateEntity game; int index = -1; for (int i = 0, size = list.size(); i < size; i++) { game = list.get(i); @@ -1210,7 +1193,7 @@ public class MainActivity extends BaseFragmentActivity implements } } - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("type", busFour.getType()); map.put("packageName", busFour.getPackageName()); map.put("createdOn", System.currentTimeMillis() / 1000); @@ -1220,8 +1203,7 @@ public class MainActivity extends BaseFragmentActivity implements @Override public void finish() { // 上传数据 - DataCollectionManager.getInstance(getApplicationContext()) - .statClickData(); + DataCollectionManager.getInstance(getApplicationContext()).statClickData(); super.finish(); } @@ -1232,8 +1214,8 @@ public class MainActivity extends BaseFragmentActivity implements AppController.canclePendingRequests(GameFragment.class); AppController.canclePendingRequests(NewsFragment.class); DownloadManager.getInstance(this).removeObserver(dataWatcher); - pluginFragmentActivity = null; - home3Fragment = null; + gameFragment = null; + personalFragment = null; home1Layout = null; home2Layout = null; home3Layout = null; diff --git a/app/src/main/java/com/gh/gamecenter/PluginActivity.java b/app/src/main/java/com/gh/gamecenter/PluginActivity.java index 132299ac7f..55c3c1f090 100644 --- a/app/src/main/java/com/gh/gamecenter/PluginActivity.java +++ b/app/src/main/java/com/gh/gamecenter/PluginActivity.java @@ -37,28 +37,6 @@ public class PluginActivity extends BaseActivity { private LinearLayout reuse_no_connection; private boolean isEverpause = false; - private boolean isDestroy = false; - - private Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - if (!isDestroy) { - if (msg.what == Constants.DOWNLOAD_ROLL) { - String name = (String) msg.obj; - if (adapter != null) { - LinkedBlockingQueue queue = adapter.getPlatformMap().get(name); - if (queue.size() > 1) { - queue.offer(queue.poll()); - Message msg2 = Message.obtain(); - msg2.obj = name; - msg2.what = Constants.DOWNLOAD_ROLL; - sendMessageDelayed(msg2, 3000); - } - } - } - } - } - }; private DataWatcher dataWatcher = new DataWatcher() { @Override @@ -73,12 +51,10 @@ public class PluginActivity extends BaseActivity { Integer location = adapter.getLocationMap().get( downloadEntry.getName() + " - " + downloadEntry.getMeta().get("PluginPlatform")); if (location != null) { - int index = location; - GameEntity detailedEntity = getEntityByLocation(index); - + GameEntity detailedEntity = adapter.getPluginList().get(location); if (detailedEntity != null) { - DownloadItemUtils.processDate(detailedEntity, - downloadEntry, adapter.getPlatformMap(), handler, adapter, index, adapter.getStatusMap()); + DownloadItemUtils.processDate(PluginActivity.this, detailedEntity, + downloadEntry, adapter, location, adapter.getStatusMap()); } } } @@ -154,10 +130,6 @@ public class PluginActivity extends BaseActivity { } } - private GameEntity getEntityByLocation(int position) { - return adapter.getPluginList().get(position); - } - @Override protected void onPause() { super.onPause(); @@ -184,13 +156,11 @@ public class PluginActivity extends BaseActivity { @Override protected void onDestroy() { super.onDestroy(); - isDestroy = true; AppController.canclePendingRequests(PluginActivity.class); plugin_list = null; adapter = null; plugin_pb_loading = null; reuse_no_connection = null; - handler = null; dataWatcher = null; } } diff --git a/app/src/main/java/com/gh/gamecenter/SubjectActivity.java b/app/src/main/java/com/gh/gamecenter/SubjectActivity.java index 2241fbdd4b..ca681e5dbe 100644 --- a/app/src/main/java/com/gh/gamecenter/SubjectActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SubjectActivity.java @@ -43,27 +43,6 @@ public class SubjectActivity extends BaseActivity { private LinearLayoutManager layoutManager; private int page = 1; - private Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - if (!isDestroy) { - if (msg.what == Constants.DOWNLOAD_ROLL) { - String name = (String) msg.obj; - if (adapter != null) { - LinkedBlockingQueue queue = adapter.getPlatformMap().get(name); - if (queue.size() > 1) { - queue.offer(queue.poll()); - Message msg2 = Message.obtain(); - msg2.obj = name; - msg2.what = Constants.DOWNLOAD_ROLL; - sendMessageDelayed(msg2, 3000); - } - } - } - } - } - }; - // 黄壮华 添加观察者 修改2015/8/15 private DataWatcher dataWatcher = new DataWatcher() { @Override @@ -75,14 +54,10 @@ public class SubjectActivity extends BaseActivity { Integer location = adapter.getLocationMap().get(downloadEntry.getName()); if (location != null) { - int index = location; - - GameEntity detailedEntity = adapter.getList().get(index); - + GameEntity detailedEntity = adapter.getList().get(location); if (detailedEntity != null) { - DownloadItemUtils.processDate(detailedEntity, - downloadEntry, adapter.getPlatformMap(), handler, adapter, - index, adapter.getStatusMap()); + DownloadItemUtils.processDate(SubjectActivity.this, detailedEntity, downloadEntry, + adapter, location, adapter.getStatusMap()); } } @@ -128,10 +103,10 @@ public class SubjectActivity extends BaseActivity { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - if (!isDestroy && newState == RecyclerView.SCROLL_STATE_IDLE && adapter.getItemCount() == layoutManager.findLastVisibleItemPosition()+1&&adapter.isLoaded()){ + if (!isDestroy && adapter.isLoaded() && newState == RecyclerView.SCROLL_STATE_IDLE + && adapter.getItemCount() == layoutManager.findLastVisibleItemPosition() + 1){ page++; adapter.initList(page); - } } }); @@ -209,7 +184,6 @@ public class SubjectActivity extends BaseActivity { adapter = null; subject_pb_loading = null; reuse_no_connection = null; - handler = null; dataWatcher = null; } } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/PluginAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/PluginAdapter.java index ede814fbf4..d04e56c715 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/PluginAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/PluginAdapter.java @@ -59,7 +59,6 @@ public class PluginAdapter extends RecyclerView.Adapter private List pluginList; private ArrayMap locationMap; - private ArrayMap> platformMap; private ArrayMap> gameMap; private ArrayMap nameMap; private ArrayMap statusMap; @@ -75,13 +74,12 @@ public class PluginAdapter extends RecyclerView.Adapter plugin_pb_loading = pbLoading; reuse_no_connection = linearLayout; - pluginList = new ArrayList(); + pluginList = new ArrayList<>(); - locationMap = new ArrayMap(); - platformMap = new ArrayMap>(); - gameMap = new ArrayMap>(); - nameMap = new ArrayMap(); - statusMap = new ArrayMap(); + locationMap = new ArrayMap<>(); + gameMap = new ArrayMap<>(); + nameMap = new ArrayMap<>(); + statusMap = new ArrayMap<>(); dismissEntity = new DismissEntity(false); // 黄壮华 添加 初始化游戏状态 修改2015/8/21 @@ -102,7 +100,7 @@ public class PluginAdapter extends RecyclerView.Adapter ConcernManager concernManager = new ConcernManager(context); List infos = concernManager.getInstalledGame(); final int size = infos.size(); - final List list = new ArrayList(); + final List list = new ArrayList<>(); count = 0; for (ConcernInfo info : infos) { JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( @@ -259,14 +257,12 @@ public class PluginAdapter extends RecyclerView.Adapter DownloadItemUtils.setOnClickListener(context, viewHolder.downloadBtn, viewHolder.download_speed, viewHolder.download_percentage, entity, i, - PluginAdapter.this, - statusMap, platformMap, "游戏-插件", - dismissEntity, "主页:" + entity.getName()); + PluginAdapter.this, statusMap, "游戏-插件", dismissEntity, + "主页:" + entity.getName()); DownloadItemUtils.updateItem(context, viewHolder.gameDes, viewHolder.game_progressbar, viewHolder.game_ll_info, viewHolder.download_speed, - viewHolder.download_percentage, viewHolder.downloadBtn, entity, platformMap, - statusMap); + viewHolder.download_percentage, viewHolder.downloadBtn, entity, statusMap); } } @@ -283,10 +279,6 @@ public class PluginAdapter extends RecyclerView.Adapter return locationMap; } - public ArrayMap> getPlatformMap() { - return platformMap; - } - public ArrayMap> getGameMap() { return gameMap; } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java index a6802de5a9..4bdb8e8188 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/SubjectAdapter.java @@ -74,7 +74,6 @@ public class SubjectAdapter extends RecyclerView.Adapter locationMap; - private ArrayMap> platformMap; private ArrayMap> gameMap; private ArrayMap nameMap; private ArrayMap statusMap; @@ -98,7 +97,6 @@ public class SubjectAdapter extends RecyclerView.Adapter(); - platformMap = new ArrayMap<>(); gameMap = new ArrayMap<>(); nameMap = new ArrayMap<>(); statusMap = new ArrayMap<>(); @@ -317,8 +315,7 @@ public class SubjectAdapter extends RecyclerView.Adapter getList() { @@ -416,10 +412,6 @@ public class SubjectAdapter extends RecyclerView.Adapter> getPlatformMap() { - return platformMap; - } - public ArrayMap> getGameMap() { return gameMap; } diff --git a/app/src/main/java/com/gh/gamecenter/game/Game1Fragment.java b/app/src/main/java/com/gh/gamecenter/game/Game1Fragment.java index c65c9d6804..8ce9b342a4 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game1Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game1Fragment.java @@ -4,19 +4,17 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v4.util.ArrayMap; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.LinearLayout; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; import com.gh.base.AppController; +import com.gh.base.BaseFragment; import com.gh.common.constant.Constants; import com.gh.common.util.DownloadItemUtils; import com.gh.common.util.Utils; @@ -39,26 +37,19 @@ import java.util.List; import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; -import de.greenrobot.event.EventBus; - /** * Created by khy on 2016/6/27. */ -public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener { +public class Game1Fragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener { - private View view; - private RecyclerView recyclerview; - private SwipeRefreshLayout game_swipe_refresh; + private SwipeRefreshLayout fm_game_swipe_refresh; + private RecyclerView fm_game_rv_list; private Game1FragmentAdapter adapter; private LinearLayout reuse_no_connection; - private ProgressBarCircularIndeterminate game_pb_loading; + private ProgressBarCircularIndeterminate fm_game_pb_loading; //下载用到的map - private ArrayMap locationMap; private ArrayMap> gameMap; - private ArrayMap> platformMap; - private ArrayMap nameMap; - private ArrayMap pluginNameMap; private ArrayMap statusMap; private DismissEntity dismissEntity; @@ -66,59 +57,34 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr private int currentItem; private boolean isEverpause; - private boolean isDestroy; - private Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - if (!isDestroy) { - if (msg.what == Constants.DOWNLOAD_ROLL) { - String name = (String) msg.obj; - if (platformMap != null) { - LinkedBlockingQueue queue = platformMap.get(name); - if (queue.size() > 1) { - queue.offer(queue.poll()); - Message msg2 = Message.obtain(); - msg2.obj = name; - msg2.what = Constants.DOWNLOAD_ROLL; - sendMessageDelayed(msg2, 3000); - } - } - } - } - } - }; + private Handler handler = new Handler(); private DataWatcher dataWatcher = new DataWatcher() { - @Override - public void onDataChanged( - HashMap downloadingEntries) { - if (!game_swipe_refresh.isRefreshing()) { + public void onDataChanged(HashMap downloadingEntries) { + if (!fm_game_swipe_refresh.isRefreshing()) { for (Map.Entry entry : downloadingEntries.entrySet()) { DownloadEntry downloadEntry = entry.getValue(); - Integer location = locationMap.get(downloadEntry.getName()); + Integer location = adapter.getLocationMap().get(downloadEntry.getName()); if (location != null) { - int index = location; - GameEntity detailedEntity = getEntityByLocation(index); - + GameEntity detailedEntity = getEntityByLocation(location); if (detailedEntity != null) { - DownloadItemUtils.processDate(detailedEntity, - downloadEntry, platformMap, handler, adapter, index, statusMap); + DownloadItemUtils.processDate(getActivity(), detailedEntity, + downloadEntry, adapter, location, statusMap); } } //特殊 插件化update if (downloadEntry.getMeta().get("PluginPlatform") != null) { - location = locationMap.get(downloadEntry.getName() + " - " + downloadEntry.getMeta().get("PluginPlatform")); + location = adapter.getLocationMap().get(downloadEntry.getName() + + " - " + downloadEntry.getMeta().get("PluginPlatform")); if (location != null) { - int index = location; - GameEntity detailedEntity = getEntityByLocation(index); - + GameEntity detailedEntity = getEntityByLocation(location); if (detailedEntity != null) { - DownloadItemUtils.processDate(detailedEntity, - downloadEntry, platformMap, handler, adapter, index, statusMap); + DownloadItemUtils.processDate(getActivity(), detailedEntity, + downloadEntry, adapter, location, statusMap); } } } @@ -131,73 +97,47 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - view = View.inflate(getActivity(), R.layout.plugin1_fragment, null); + init(R.layout.fragment_game); - locationMap = new ArrayMap(); - gameMap = new ArrayMap>(); - platformMap = new ArrayMap>(); - nameMap = new ArrayMap(); - pluginNameMap = new ArrayMap(); - statusMap = new ArrayMap(); + gameMap = new ArrayMap<>(); + statusMap = new ArrayMap<>(); dismissEntity = new DismissEntity(false); currentItem = 0; isEverpause = false; - isDestroy = false; //初始化gamemap DownloadItemUtils.initializeGameMap(getActivity(), gameMap); - reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); reuse_no_connection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.VISIBLE); + fm_game_swipe_refresh.setRefreshing(true); + fm_game_rv_list.setVisibility(View.VISIBLE); + fm_game_pb_loading.setVisibility(View.VISIBLE); reuse_no_connection.setVisibility(View.GONE); handler.postDelayed(runnable, 1000); } }); - game_swipe_refresh = (SwipeRefreshLayout) view.findViewById(R.id.game_swipe_refresh); - game_swipe_refresh.setColorSchemeResources(R.color.theme); - game_swipe_refresh.setOnRefreshListener(this); + fm_game_swipe_refresh.setColorSchemeResources(R.color.theme); + fm_game_swipe_refresh.setOnRefreshListener(this); - game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); - - recyclerview = (RecyclerView) view.findViewById(R.id.game_list); - recyclerview.setHasFixedSize(true); - recyclerview.setLayoutManager(new LinearLayoutManager(getActivity())); - adapter = new Game1FragmentAdapter(Game1Fragment.this, locationMap, gameMap, - platformMap, nameMap, pluginNameMap,recyclerview, game_swipe_refresh, reuse_no_connection, - statusMap, dismissEntity, game_pb_loading, false); - recyclerview.setAdapter(adapter); -// recyclerview.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); - - EventBus.getDefault().register(this); - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - if(container != null){ - container.removeView(view); - } - return view; + fm_game_rv_list.setHasFixedSize(true); + fm_game_rv_list.setLayoutManager(new LinearLayoutManager(getActivity())); + adapter = new Game1FragmentAdapter(Game1Fragment.this, fm_game_rv_list, fm_game_swipe_refresh, + reuse_no_connection, fm_game_pb_loading, gameMap, statusMap, + dismissEntity, false); + fm_game_rv_list.setAdapter(adapter); } //下载被删除事件 public void onEventMainThread(EBDownloadDelete busThree) { - LinkedBlockingQueue queue = platformMap.get(busThree.getName()); - if (queue != null) { - queue.remove(busThree.getPlatform()); - platformMap.put(busThree.getName(), queue); - } - Integer location = locationMap.get(busThree.getName()); + DownloadManager.getInstance(getActivity()).removePlatform(busThree.getName(), busThree.getPlatform()); + + Integer location = adapter.getLocationMap().get(busThree.getName()); if (location != null) { int index = location; GameEntity detailedEntity = getEntityByLocation(index); @@ -212,7 +152,7 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr } //特殊 插件化update if (busThree.getPluginPlatform() != null) { - location = locationMap.get(busThree.getName() + " - " + busThree.getPluginPlatform()); + location = adapter.getLocationMap().get(busThree.getName() + " - " + busThree.getPluginPlatform()); int index = location; Utils.log(location); GameEntity detailedEntity = getEntityByLocation(index); @@ -232,19 +172,21 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr //安装、卸载事件 public void onEventMainThread(EBPackage busFour) { - String name = nameMap.get(busFour.getPackageName()); + String name = adapter.getNameMap().get(busFour.getPackageName()); if (name != null) { - Integer location = locationMap.get(name); + Integer location = adapter.getLocationMap().get(name); if (location != null) { if ("安装".equals(busFour.getType())) { GameEntity detailedEntity = getEntityByLocation(location); - for (ApkEntity apkEntity : detailedEntity.getApk()) { - if (apkEntity.getPackageName().equals( - busFour.getPackageName())) { - detailedEntity.getEntryMap().remove( - apkEntity.getPlatform()); - adapter.notifyItemChanged(location); - break; + if (detailedEntity != null) { + for (ApkEntity apkEntity : detailedEntity.getApk()) { + if (apkEntity.getPackageName().equals( + busFour.getPackageName())) { + detailedEntity.getEntryMap().remove( + apkEntity.getPlatform()); + adapter.notifyItemChanged(location); + break; + } } } } else if ("卸载".equals(busFour.getType())) { @@ -253,9 +195,9 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr } } //特殊 插件化 - name = pluginNameMap.get(busFour.getPackageName()); + name = adapter.getPluginNameMap().get(busFour.getPackageName()); if (name != null) { - Integer location = locationMap.get(name); + Integer location = adapter.getLocationMap().get(name); if (location != null) { if ("安装".equals(busFour.getType()) || "卸载".equals(busFour.getType())) { List list = adapter.getPluginList(); @@ -276,14 +218,14 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr public void onEventMainThread(EBNetworkState busNetworkState) { if (busNetworkState.isNetworkConnected()) { if (reuse_no_connection.getVisibility() == View.VISIBLE) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.GONE); + fm_game_swipe_refresh.setRefreshing(true); + fm_game_rv_list.setVisibility(View.VISIBLE); + fm_game_pb_loading.setVisibility(View.GONE); reuse_no_connection.setVisibility(View.GONE); handler.postDelayed(runnable, 1000); } else if (adapter.isNetworkError()) { adapter.setNetworkError(false); -// adapter.notifyItemChanged(adapter.getItemCount() - 1); + adapter.notifyItemChanged(adapter.getItemCount() - 1); adapter.load(); } } @@ -302,7 +244,7 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr currentItem = busNine.getPosition(); if (busNine.getPosition() == 0) { adapter.startAutoScroll(); - if (game_pb_loading.getVisibility() == View.VISIBLE) { + if (fm_game_pb_loading.getVisibility() == View.VISIBLE) { adapter.load(); } } else { @@ -375,10 +317,10 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr @Override public void run() { if (!isDestroy) { - adapter = new Game1FragmentAdapter(Game1Fragment.this, locationMap, gameMap, - platformMap, nameMap, pluginNameMap, recyclerview, game_swipe_refresh, reuse_no_connection, - statusMap, dismissEntity, game_pb_loading, true); - recyclerview.setAdapter(adapter); + adapter = new Game1FragmentAdapter(Game1Fragment.this, fm_game_rv_list, fm_game_swipe_refresh, + reuse_no_connection, fm_game_pb_loading, gameMap, statusMap, + dismissEntity, true); + fm_game_rv_list.setAdapter(adapter); } } }; @@ -391,20 +333,13 @@ public class Game1Fragment extends Fragment implements SwipeRefreshLayout.OnRefr @Override public void onDestroy() { super.onDestroy(); - isDestroy = true; AppController.canclePendingRequests(Game1Fragment.class); - EventBus.getDefault().unregister(this); - view = null; - recyclerview = null; + fm_game_rv_list = null; adapter = null; reuse_no_connection = null; - game_swipe_refresh = null; - game_pb_loading = null; - locationMap = null; + fm_game_swipe_refresh = null; + fm_game_pb_loading = null; gameMap = null; - platformMap = null; - nameMap = null; - pluginNameMap = null; statusMap = null; dismissEntity = null; handler = null; diff --git a/app/src/main/java/com/gh/gamecenter/game/Game1FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/game/Game1FragmentAdapter.java index f632a85836..577ff6d176 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game1FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game1FragmentAdapter.java @@ -78,18 +78,18 @@ import java.util.concurrent.LinkedBlockingQueue; public class Game1FragmentAdapter extends RecyclerView.Adapter { private class ITEM_TYPE { - public static final int slide = 0;// 滚动图 - public static final int head = 1;// 专题头部 - public static final int game_normal_type = 2;// 游戏布局1 - public static final int game_test_type = 3;// 游戏布局2 - public static final int image = 4;// 大图布局 - public static final int footer_view = 5;// 加载布局 + public static final int slide = 0; // 滚动图 + public static final int head = 1; // 专题头部 + public static final int game_normal_type = 2; // 游戏布局1 + public static final int game_test_type = 3; // 游戏布局2 + public static final int image = 4; // 大图布局 + public static final int footer_view = 5; // 加载布局 } private Game1Fragment fragment; private Context context; - private RecyclerView recyclerview; + private RecyclerView game_list; private SwipeRefreshLayout game_swipe_refresh; private LinearLayout reuse_no_connection; private ProgressBarCircularIndeterminate game_pb_loading; @@ -98,6 +98,15 @@ public class Game1FragmentAdapter extends RecyclerView.Adapter pluginList; private List subjectList; + private ArrayMap locationMap; + private ArrayMap nameMap; + private ArrayMap pluginNameMap; + + private ArrayMap> gameMap; + private ArrayMap statusMap; + + private DismissEntity dismissEntity; + private int pluginSize; private boolean isNetworkError; @@ -105,46 +114,35 @@ public class Game1FragmentAdapter extends RecyclerView.Adapter locationMap; - private ArrayMap> gameMap; - private ArrayMap> platformMap; - private ArrayMap nameMap; - private ArrayMap pluginNameMap; - private ArrayMap statusMap; - - private DismissEntity dismissEntity; - public Game1FragmentAdapter(Game1Fragment fragment, - ArrayMap lMap, - ArrayMap> gMap, - ArrayMap> pMap, - ArrayMap nMap, - ArrayMap pnMap, RecyclerView rView, SwipeRefreshLayout refreshLayout, LinearLayout linearLayout, + ProgressBarCircularIndeterminate pbLoading, + ArrayMap> gMap, ArrayMap sMap, DismissEntity dEntity, - ProgressBarCircularIndeterminate pbLoading, boolean isLoad) { this.fragment = fragment; this.context = fragment.getActivity(); - locationMap = lMap; - gameMap = gMap; - platformMap = pMap; - nameMap = nMap; - pluginNameMap = pnMap; - recyclerview = rView; + + game_list = rView; game_swipe_refresh = refreshLayout; reuse_no_connection = linearLayout; game_pb_loading = pbLoading; + + gameMap = gMap; statusMap = sMap; dismissEntity = dEntity; - slideList = new ArrayList(); - pluginList = new ArrayList(); - subjectList = new ArrayList(); + slideList = new ArrayList<>(); + pluginList = new ArrayList<>(); + subjectList = new ArrayList<>(); + + locationMap = new ArrayMap<>(); + nameMap = new ArrayMap<>(); + pluginNameMap = new ArrayMap<>(); pluginSize = 0; @@ -158,6 +156,18 @@ public class Game1FragmentAdapter extends RecyclerView.Adapter getLocationMap() { + return locationMap; + } + + public ArrayMap getNameMap() { + return nameMap; + } + + public ArrayMap getPluginNameMap() { + return pluginNameMap; + } + public void load() { new Thread(new Runnable() { @Override @@ -300,7 +310,7 @@ public class Game1FragmentAdapter extends RecyclerView.Adapter infos = concernManager.getInstalledGame(); final int size = infos.size(); - final List list = new ArrayList(); + final List list = new ArrayList<>(); count = 0; for (ConcernInfo info : infos) { JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( @@ -373,7 +383,7 @@ public class Game1FragmentAdapter extends RecyclerView.Adapter apkList = new ArrayList(); + ArrayList apkList = new ArrayList<>(); apkList.add(apkEntity); entity.setApk(apkList); pluginList.add(entity); @@ -617,7 +627,7 @@ public class Game1FragmentAdapter extends RecyclerView.Adapter kv = new HashMap<>(); kv.put("名字", gameEntity.getName()); kv.put("位置", i + 1); - DataUtils.onEvent(context, "点击", "游戏-插件-" + name, kv); + DataUtils.onEvent(context, "点击", "游戏-插件-" + subjectEntity.getName(), kv); AppController.put("GameEntity", gameEntity); Intent intent = new Intent(context, GameDetailsActivity.class); - intent.putExtra("entrance", "游戏-插件-" + name); + intent.putExtra("entrance", "游戏-插件-" + subjectEntity.getName()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } @@ -673,8 +700,8 @@ public class Game1FragmentAdapter extends RecyclerView.Adapter locationMap; private ArrayMap> gameMap; - private ArrayMap> platformMap; - private ArrayMap nameMap; private ArrayMap statusMap; private DismissEntity dismissEntity; private boolean isEverpause; - private boolean isDestroy; - private Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - if (!isDestroy) { - if (msg.what == Constants.DOWNLOAD_ROLL) { - String name = (String) msg.obj; - if (platformMap != null) { - LinkedBlockingQueue queue = platformMap.get(name); - if (queue.size() > 1) { - queue.offer(queue.poll()); - Message msg2 = Message.obtain(); - msg2.obj = name; - msg2.what = Constants.DOWNLOAD_ROLL; - sendMessageDelayed(msg2, 3000); - } - } - } - } - } - }; + private Handler handler = new Handler(); DataWatcher dataWatcher = new DataWatcher() { @Override public void onDataChanged(HashMap downloadingEntries) { - if (!game_swipe_refresh.isRefreshing()) { + if (!fm_game_swipe_refresh.isRefreshing()) { for (Map.Entry stringDownloadEntryEntry : downloadingEntries.entrySet()) { DownloadEntry downloadEntry = stringDownloadEntryEntry.getValue(); - Integer location = locationMap.get(downloadEntry.getName()); + Integer location = adapter.getLocationMap().get(downloadEntry.getName()); if (location != null) { - int index = location; - GameEntity detailedEntity = getEntityByLocation(index); - + GameEntity detailedEntity = getEntityByLocation(location); if (detailedEntity != null) { - DownloadItemUtils.processDate(detailedEntity, - downloadEntry, platformMap, handler, adapter, index, statusMap); + DownloadItemUtils.processDate(getActivity(), detailedEntity, + downloadEntry, adapter, location, statusMap); } } } @@ -111,70 +81,44 @@ public class Game2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - view = View.inflate(getActivity(), R.layout.plugin1_fragment, null); + init(R.layout.fragment_game); - locationMap = new ArrayMap(); - gameMap = new ArrayMap>(); - platformMap = new ArrayMap>(); - nameMap = new ArrayMap(); - statusMap = new ArrayMap(); + gameMap = new ArrayMap<>(); + statusMap = new ArrayMap<>(); dismissEntity = new DismissEntity(false); isEverpause = false; - isDestroy = false; //初始化gamemap DownloadItemUtils.initializeGameMap(getActivity(), gameMap); - reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); reuse_no_connection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.VISIBLE); + fm_game_swipe_refresh.setRefreshing(true); + fm_game_rv_list.setVisibility(View.VISIBLE); + fm_game_pb_loading.setVisibility(View.VISIBLE); reuse_no_connection.setVisibility(View.GONE); handler.postDelayed(runnable, 1000); } }); - game_swipe_refresh = (SwipeRefreshLayout) view.findViewById(R.id.game_swipe_refresh); - game_swipe_refresh.setColorSchemeResources(R.color.theme); - game_swipe_refresh.setOnRefreshListener(this); + fm_game_swipe_refresh.setColorSchemeResources(R.color.theme); + fm_game_swipe_refresh.setOnRefreshListener(this); - game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); - - recyclerview = (RecyclerView) view.findViewById(R.id.game_list); - recyclerview.setHasFixedSize(true); - recyclerview.setLayoutManager(new LinearLayoutManager(getActivity())); - adapter = new Game2FragmentAdapter(Game2Fragment.this, locationMap, gameMap, - platformMap, nameMap, recyclerview, game_swipe_refresh, reuse_no_connection, - statusMap, dismissEntity, game_pb_loading, false); - recyclerview.setAdapter(adapter); -// recyclerview.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); - - EventBus.getDefault().register(this); - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - if (container != null) { - container.removeView(view); - } - return view; + fm_game_rv_list.setHasFixedSize(true); + fm_game_rv_list.setLayoutManager(new LinearLayoutManager(getActivity())); + adapter = new Game2FragmentAdapter(Game2Fragment.this, fm_game_swipe_refresh, + fm_game_rv_list, reuse_no_connection, fm_game_pb_loading, gameMap, statusMap, dismissEntity, false); + fm_game_rv_list.setAdapter(adapter); } //下载被删除事件 public void onEventMainThread(EBDownloadDelete busThree) { - LinkedBlockingQueue queue = platformMap.get(busThree.getName()); - if (queue != null) { - queue.remove(busThree.getPlatform()); - platformMap.put(busThree.getName(), queue); - } - Integer location = locationMap.get(busThree.getName()); + DownloadManager.getInstance(getActivity()).removePlatform(busThree.getName(), busThree.getPlatform()); + + Integer location = adapter.getLocationMap().get(busThree.getName()); if (location != null) { int index = location; GameEntity detailedEntity = getEntityByLocation(index); @@ -198,19 +142,21 @@ public class Game2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr //安装、卸载事件 public void onEventMainThread(EBPackage busFour) { - String name = nameMap.get(busFour.getPackageName()); + String name = adapter.getNameMap().get(busFour.getPackageName()); if (name != null) { - Integer location = locationMap.get(name); + Integer location = adapter.getLocationMap().get(name); if (location != null) { if ("安装".equals(busFour.getType())) { GameEntity detailedEntity = getEntityByLocation(location); - for (ApkEntity apkEntity : detailedEntity.getApk()) { - if (apkEntity.getPackageName().equals( - busFour.getPackageName())) { - detailedEntity.getEntryMap().remove( - apkEntity.getPlatform()); - adapter.notifyItemChanged(location); - break; + if (detailedEntity != null) { + for (ApkEntity apkEntity : detailedEntity.getApk()) { + if (apkEntity.getPackageName().equals( + busFour.getPackageName())) { + detailedEntity.getEntryMap().remove( + apkEntity.getPlatform()); + adapter.notifyItemChanged(location); + break; + } } } } else if ("卸载".equals(busFour.getType())) { @@ -224,9 +170,9 @@ public class Game2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr public void onEventMainThread(EBNetworkState busNetworkState) { if (busNetworkState.isNetworkConnected()) { if (reuse_no_connection.getVisibility() == View.VISIBLE) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.GONE); + fm_game_swipe_refresh.setRefreshing(true); + fm_game_rv_list.setVisibility(View.VISIBLE); + fm_game_pb_loading.setVisibility(View.GONE); reuse_no_connection.setVisibility(View.GONE); handler.postDelayed(runnable, 1000); } @@ -241,7 +187,7 @@ public class Game2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr } } else if ("GameFragment".equals(busNine.getFrom())) { if (busNine.getPosition() == 1) { - if (game_pb_loading.getVisibility() == View.VISIBLE) { + if (fm_game_pb_loading.getVisibility() == View.VISIBLE) { adapter.load(); } } @@ -293,10 +239,10 @@ public class Game2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr @Override public void run() { if (!isDestroy) { - adapter = new Game2FragmentAdapter(Game2Fragment.this, locationMap, gameMap, - platformMap, nameMap, recyclerview, game_swipe_refresh, reuse_no_connection, - statusMap, dismissEntity, game_pb_loading, true); - recyclerview.setAdapter(adapter); + adapter = new Game2FragmentAdapter(Game2Fragment.this, fm_game_swipe_refresh, + fm_game_rv_list, reuse_no_connection, fm_game_pb_loading, gameMap, + statusMap, dismissEntity, true); + fm_game_rv_list.setAdapter(adapter); } } }; @@ -309,19 +255,13 @@ public class Game2Fragment extends Fragment implements SwipeRefreshLayout.OnRefr @Override public void onDestroy() { super.onDestroy(); - isDestroy = true; AppController.canclePendingRequests(Game2Fragment.class); - EventBus.getDefault().unregister(this); - view = null; - recyclerview = null; + fm_game_rv_list = null; adapter = null; reuse_no_connection = null; - game_swipe_refresh = null; - game_pb_loading = null; - locationMap = null; + fm_game_swipe_refresh = null; + fm_game_pb_loading = null; gameMap = null; - platformMap = null; - nameMap = null; statusMap = null; dismissEntity = null; handler = null; diff --git a/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java index d2f829b794..c717f77dd7 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java @@ -80,46 +80,53 @@ public class Game2FragmentAdapter extends RecyclerView.Adapter subjectList; private ArrayMap locationMap; - private ArrayMap> gameMap; - private ArrayMap> platformMap; private ArrayMap nameMap; + + private ArrayMap> gameMap; private ArrayMap statusMap; private DismissEntity dismissEntity; public Game2FragmentAdapter(Game2Fragment fragment, - ArrayMap lMap, - ArrayMap> gMap, - ArrayMap> pMap, - ArrayMap nMap, - RecyclerView rView, SwipeRefreshLayout refreshLayout, + RecyclerView rView, LinearLayout linearLayout, + ProgressBarCircularIndeterminate pbLoading, + ArrayMap> gMap, ArrayMap sMap, DismissEntity dEntity, - ProgressBarCircularIndeterminate pbLoading, boolean isLoad) { this.fragment = fragment; this.context = fragment.getActivity(); - locationMap = lMap; - gameMap = gMap; - platformMap = pMap; - nameMap = nMap; + recyclerview = rView; game_swipe_refresh = refreshLayout; reuse_no_connection = linearLayout; game_pb_loading = pbLoading; + + gameMap = gMap; statusMap = sMap; dismissEntity = dEntity; - subjectList = new ArrayList(); + subjectList = new ArrayList<>(); + + locationMap = new ArrayMap<>(); + nameMap = new ArrayMap<>(); if (isLoad) { load(); } } + public ArrayMap getLocationMap() { + return locationMap; + } + + public ArrayMap getNameMap() { + return nameMap; + } + public void load() { new Thread(new Runnable() { @Override @@ -452,12 +459,12 @@ public class Game2FragmentAdapter extends RecyclerView.Adapter= offset && position <= subjectList.get(i).getData().size() + offset) { int index = position - offset - 1; - if (index<0){ + if (index < 0){ index = 0; } gameEntity = subjectList.get(i).getData().get(index); diff --git a/app/src/main/java/com/gh/gamecenter/game/Game3Fragment.java b/app/src/main/java/com/gh/gamecenter/game/Game3Fragment.java index 568c22d018..9c2cf52323 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game3Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game3Fragment.java @@ -4,20 +4,18 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v4.util.ArrayMap; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.LinearLayout; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; import com.gh.base.AppController; +import com.gh.base.BaseFragment; import com.gh.common.constant.Constants; import com.gh.common.util.DownloadItemUtils; import com.gh.download.DataWatcher; @@ -36,8 +34,6 @@ import com.gh.gamecenter.eventbus.EBUISwitch; import java.util.HashMap; import java.util.concurrent.LinkedBlockingQueue; -import de.greenrobot.event.EventBus; - /** * * @author 温冠超 @@ -46,66 +42,39 @@ import de.greenrobot.event.EventBus; * @update 2015-8-11 * @des 主页插件fragment */ -public class Game3Fragment extends Fragment implements OnRefreshListener { +public class Game3Fragment extends BaseFragment implements OnRefreshListener { - private View view; - private RecyclerView recyclerview; - private SwipeRefreshLayout game_swipe_refresh; + private SwipeRefreshLayout fm_game_swipe_refresh; + private RecyclerView fm_game_rv_list; private Game3FragmentAdapter adapter; private LinearLayoutManager layoutManager; private LinearLayout reuse_no_connection; - private ProgressBarCircularIndeterminate game_pb_loading; + private ProgressBarCircularIndeterminate fm_game_pb_loading; // 黄壮华 添加 记录信息的map 修改2015/8/15 - private ArrayMap locationMap; private ArrayMap> gameMap; - private ArrayMap> platformMap; - private ArrayMap nameMap; private ArrayMap statusMap; - private boolean isEverpause; - private boolean isDestroy; - private DismissEntity dismissEntity; - private Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - if (!isDestroy) { - if (msg.what == Constants.DOWNLOAD_ROLL) { - String name = (String) msg.obj; - if (platformMap != null) { - LinkedBlockingQueue queue = platformMap.get(name); - if (queue.size() > 1) { - queue.offer(queue.poll()); - Message msg2 = Message.obtain(); - msg2.obj = name; - msg2.what = Constants.DOWNLOAD_ROLL; - sendMessageDelayed(msg2, 3000); - } - } - } - } - } - }; + private boolean isEverpause; + + private Handler handler = new Handler(); // 黄壮华 添加观察者 修改2015/8/15 private DataWatcher dataWatcher = new DataWatcher() { @Override public void onDataChanged(HashMap downloadingEntries) { - if (!game_swipe_refresh.isRefreshing()) { + if (!fm_game_swipe_refresh.isRefreshing()) { for (java.util.Map.Entry entry : downloadingEntries.entrySet()) { DownloadEntry downloadEntry = entry.getValue(); - Integer location = locationMap.get(downloadEntry.getName()); + Integer location = adapter.getLocationMap().get(downloadEntry.getName()); if (location != null) { - int index = location; - GameEntity detailedEntity = adapter.getList().get(index); - + GameEntity detailedEntity = adapter.getList().get(location); if (detailedEntity != null) { - DownloadItemUtils.processDate(detailedEntity, - downloadEntry, platformMap, handler, - adapter, index, statusMap); + DownloadItemUtils.processDate(getActivity(), detailedEntity, + downloadEntry, adapter, location, statusMap); } } } @@ -115,55 +84,43 @@ public class Game3Fragment extends Fragment implements OnRefreshListener { @Override public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - view = View.inflate(getActivity(), R.layout.plugin1_fragment, null); + init(R.layout.fragment_game); - locationMap = new ArrayMap<>(); gameMap = new ArrayMap<>(); - platformMap = new ArrayMap<>(); - nameMap = new ArrayMap<>(); statusMap = new ArrayMap<>(); dismissEntity = new DismissEntity(false); isEverpause = false; - isDestroy = false; // 黄壮华 添加 初始化游戏状态 修改2015/8/21 DownloadItemUtils.initializeGameMap(getActivity(), gameMap); - reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); reuse_no_connection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.VISIBLE); + fm_game_swipe_refresh.setRefreshing(true); + fm_game_rv_list.setVisibility(View.VISIBLE); + fm_game_pb_loading.setVisibility(View.VISIBLE); reuse_no_connection.setVisibility(View.GONE); handler.postDelayed(runnable, 1000); } }); - game_swipe_refresh = (SwipeRefreshLayout) view.findViewById(R.id.game_swipe_refresh); - game_swipe_refresh.setColorSchemeResources(R.color.theme); - game_swipe_refresh.setOnRefreshListener(this); + fm_game_swipe_refresh.setColorSchemeResources(R.color.theme); + fm_game_swipe_refresh.setOnRefreshListener(this); - game_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.game_pb_loading); - - recyclerview = (RecyclerView) view.findViewById(R.id.game_list); - recyclerview.setHasFixedSize(true); + fm_game_rv_list.setHasFixedSize(true); layoutManager = new LinearLayoutManager(getActivity()); - recyclerview.setLayoutManager(layoutManager); + fm_game_rv_list.setLayoutManager(layoutManager); // 黄壮华 传递引用 修改2015/8/15 - adapter = new Game3FragmentAdapter(Game3Fragment.this, locationMap, - gameMap, platformMap, nameMap, recyclerview, - game_swipe_refresh, reuse_no_connection, statusMap, - dismissEntity,game_pb_loading, false); - recyclerview.setAdapter(adapter); - recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { - + adapter = new Game3FragmentAdapter(Game3Fragment.this, fm_game_swipe_refresh, + fm_game_rv_list, reuse_no_connection, fm_game_pb_loading, gameMap, + statusMap, dismissEntity, false); + fm_game_rv_list.setAdapter(adapter); + fm_game_rv_list.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { @@ -178,28 +135,13 @@ public class Game3Fragment extends Fragment implements OnRefreshListener { } }); -// recyclerview.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); - - EventBus.getDefault().register(this); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - if (container != null) { - container.removeView(view); - } - return view; } //下载被删除事件 public void onEventMainThread(EBDownloadDelete busThree) { - LinkedBlockingQueue queue = platformMap.get(busThree.getName()); - if (queue != null) { - queue.remove(busThree.getPlatform()); - platformMap.put(busThree.getName(), queue); - } - Integer location = locationMap.get(busThree.getName()); + DownloadManager.getInstance(getActivity()).removePlatform(busThree.getName(), busThree.getPlatform()); + + Integer location = adapter.getLocationMap().get(busThree.getName()); if (location != null) { int index = location; @@ -222,9 +164,9 @@ public class Game3Fragment extends Fragment implements OnRefreshListener { //安装、卸载事件 public void onEventMainThread(EBPackage busFour) { - String name = nameMap.get(busFour.getPackageName()); + String name = adapter.getNameMap().get(busFour.getPackageName()); if (name != null) { - int location = locationMap.get(name); + int location = adapter.getLocationMap().get(name); if ("安装".equals(busFour.getType())) { GameEntity detailedEntity = adapter.getList().get(location); for (ApkEntity apkEntity : detailedEntity.getApk()) { @@ -244,9 +186,9 @@ public class Game3Fragment extends Fragment implements OnRefreshListener { public void onEventMainThread(EBNetworkState busNetworkState) { if (busNetworkState.isNetworkConnected()) { if (reuse_no_connection.getVisibility() == View.VISIBLE) { - game_swipe_refresh.setRefreshing(true); - recyclerview.setVisibility(View.VISIBLE); - game_pb_loading.setVisibility(View.GONE); + fm_game_swipe_refresh.setRefreshing(true); + fm_game_rv_list.setVisibility(View.VISIBLE); + fm_game_pb_loading.setVisibility(View.GONE); reuse_no_connection.setVisibility(View.GONE); handler.postDelayed(runnable, 1000); } else if (adapter.isNetworkError()) { @@ -264,7 +206,7 @@ public class Game3Fragment extends Fragment implements OnRefreshListener { } } else if ("GameFragment".equals(busNine.getFrom())) { if (busNine.getPosition() == 2) { - if (game_pb_loading.getVisibility() == View.VISIBLE) { + if (fm_game_pb_loading.getVisibility() == View.VISIBLE) { adapter.load(); } } @@ -302,11 +244,9 @@ public class Game3Fragment extends Fragment implements OnRefreshListener { @Override public void run() { if (!isDestroy) { - adapter = new Game3FragmentAdapter(Game3Fragment.this, - locationMap, gameMap, platformMap, nameMap, recyclerview, - game_swipe_refresh, reuse_no_connection, statusMap, dismissEntity, - game_pb_loading, true); - recyclerview.setAdapter(adapter); + adapter = new Game3FragmentAdapter(Game3Fragment.this, fm_game_swipe_refresh, + fm_game_rv_list, reuse_no_connection, fm_game_pb_loading, gameMap, statusMap, dismissEntity, true); + fm_game_rv_list.setAdapter(adapter); } } }; @@ -319,24 +259,18 @@ public class Game3Fragment extends Fragment implements OnRefreshListener { @Override public void onDestroy() { super.onDestroy(); - isDestroy = true; AppController.canclePendingRequests(Game3Fragment.class); - EventBus.getDefault().unregister(this); - view = null; - recyclerview = null; - game_swipe_refresh = null; + fm_game_rv_list = null; + fm_game_swipe_refresh = null; adapter = null; layoutManager = null; reuse_no_connection = null; - locationMap = null; gameMap = null; - platformMap = null; - nameMap = null; statusMap = null; dismissEntity = null; handler = null; dataWatcher = null; - game_pb_loading = null; + fm_game_pb_loading = null; } } diff --git a/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java index 749b88d9d8..606f2f0204 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java @@ -78,51 +78,59 @@ public class Game3FragmentAdapter extends // 黄壮华 获取引用 修改2015/8/15 private ArrayMap locationMap; - private ArrayMap> gameMap; - private ArrayMap> platformMap; private ArrayMap nameMap; + + private ArrayMap> gameMap; private ArrayMap statusMap; private DismissEntity dismissEntity; // 黄壮华 获取引用 修改2015/8/15 public Game3FragmentAdapter(Game3Fragment fment, - ArrayMap lMap, - ArrayMap> gMap, - ArrayMap> pMap, - ArrayMap nMap, RecyclerView rView, SwipeRefreshLayout swipeRefreshLayout, + RecyclerView rView, LinearLayout linearLayout, + ProgressBarCircularIndeterminate pbLoading, + ArrayMap> gMap, ArrayMap sMap, DismissEntity dEntity, - ProgressBarCircularIndeterminate pbLoading, boolean isLoad) { this.fragment = fment; this.context = fment.getActivity(); - locationMap = lMap; - gameMap = gMap; - platformMap = pMap; - nameMap = nMap; - statusMap = sMap; - recyclerView = rView; + game_swipe_refresh = swipeRefreshLayout; + recyclerView = rView; reuse_no_connection = linearLayout; game_pb_loading = pbLoading; + gameMap = gMap; + statusMap = sMap; + dismissEntity = dEntity; + locationMap = new ArrayMap<>(); + nameMap = new ArrayMap<>(); + isRemove = false; isLoading = false; isNetworkError = false; - list = new ArrayList(); + list = new ArrayList<>(); if (isLoad) { load(); } } + public ArrayMap getLocationMap() { + return locationMap; + } + + public ArrayMap getNameMap() { + return nameMap; + } + public void load() { new Thread(new Runnable() { @Override @@ -309,11 +317,11 @@ public class Game3FragmentAdapter extends @Override public void onClick(View v) { - Map kv = new HashMap(); + Map kv = new HashMap<>(); kv.put("入口", "游戏-单机"); DataUtils.onEvent(context, "游戏详情", entity.getName(), kv); - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("location", "单机"); map.put("createOn", System.currentTimeMillis() / 1000); map.put("game", entity.getName()); @@ -331,13 +339,13 @@ public class Game3FragmentAdapter extends DownloadItemUtils.setOnClickListener(context, holder.downloadBtn, holder.download_speed, holder.download_percentage, entity, position, this, - statusMap, platformMap, "游戏-单机", false, dismissEntity, + statusMap, "游戏-单机", dismissEntity, "单机:" + entity.getName()); DownloadItemUtils.updateItem(context, holder.gameDes, holder.game_progressbar, holder.game_ll_info, holder.download_speed, holder.download_percentage, - holder.downloadBtn, entity, platformMap, statusMap, + holder.downloadBtn, entity, statusMap, false); } diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragment.java b/app/src/main/java/com/gh/gamecenter/game/GameFragment.java index 60ecc5ae15..59239f5e0b 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragment.java +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragment.java @@ -80,7 +80,6 @@ public class GameFragment extends Fragment implements OnClickListener, @Override public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); view = View.inflate(getActivity(), R.layout.plugin_container_fragments, null); diff --git a/app/src/main/java/com/gh/gamecenter/news/NewNews4Fragment.java b/app/src/main/java/com/gh/gamecenter/news/NewNews4Fragment.java deleted file mode 100644 index dff1671a3f..0000000000 --- a/app/src/main/java/com/gh/gamecenter/news/NewNews4Fragment.java +++ /dev/null @@ -1,224 +0,0 @@ -package com.gh.gamecenter.news; - -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; - -import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.common.constant.Config; -import com.gh.common.util.ConcernUtils; -import com.gh.common.util.MD5Utils; -import com.gh.common.util.Utils; -import com.gh.gamecenter.R; -import com.gh.gamecenter.db.info.ConcernInfo; -import com.gh.gamecenter.manager.ConcernManager; - -import org.json.JSONArray; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** - * Created by khy on 2016/8/15. - */ -public class NewNews4Fragment extends Fragment implements NewNews4FragmentAdapter.OnCallBackListener{ - - private View mView; - private RecyclerView mRecyclerView; - private NewNews4FragmentAdapter mNews4FragmentAdapter; - private LinearLayoutManager mLayoutManager; - private LinearLayout noConnection; - private LinearLayout reuse_none_data; - private SwipeRefreshLayout mSwipeRefreshLayout; - private ProgressBarCircularIndeterminate mProgressBar; - - private boolean isLoadOver = true; - private boolean isRemove = false; - private boolean isNetworkError = false; - - private int page = 1; - - private List gameIdList; - - private ConcernManager manager; - - private Handler handler = new Handler(){ - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - if (msg.what == 0){ - StringBuffer concernKey = new StringBuffer(); - concernKey.setLength(0); - StringBuffer gameIdPostData = new StringBuffer(); - for (int i = 0, size = gameIdList.size(); i < size; i++){ - if (i < 5) { - gameIdPostData.append(gameIdList.get(i)); - gameIdPostData.append("-"); - } - } - for (int i = 0; i < gameIdList.size(); i++) { - concernKey.append(gameIdList.get(i)); - } - String contentMD5 = MD5Utils.getContentMD5(concernKey.toString()); - - if (gameIdPostData.length() > 0) { - gameIdPostData.deleteCharAt(gameIdPostData.length() - 1); - } - mNews4FragmentAdapter = new NewNews4FragmentAdapter(getActivity(), NewNews4Fragment.this, - contentMD5, gameIdPostData.toString(), page); - mRecyclerView.setAdapter(mNews4FragmentAdapter); - } - } - }; - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mView = View.inflate(getActivity(), R.layout.fragment_news4, null); - mRecyclerView = (RecyclerView) mView.findViewById(R.id.news4_rv); - mSwipeRefreshLayout = (SwipeRefreshLayout) mView.findViewById(R.id.news4_swipe_refresh); - mProgressBar = (ProgressBarCircularIndeterminate) mView.findViewById(R.id.news4_pb_loading); - noConnection = (LinearLayout) mView.findViewById(R.id.reuse_no_connection); - reuse_none_data = (LinearLayout) mView.findViewById(R.id.reuse_none_data); - mLayoutManager = new LinearLayoutManager(getActivity()); - mRecyclerView.setLayoutManager(mLayoutManager); - - manager = new ConcernManager(getActivity()); - - gameIdList = new ArrayList<>(); - - loadConcernGameId(); - - mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - if (mNews4FragmentAdapter != null &&newState == RecyclerView.SCROLL_STATE_IDLE - &&mLayoutManager.findLastVisibleItemPosition() + 1 == mNews4FragmentAdapter.getItemCount() - &&isLoadOver &&!isRemove &&!isNetworkError){ - isLoadOver = false; - page++; - mNews4FragmentAdapter.LoadJosnData(page); - } - } - }); - - mSwipeRefreshLayout.setColorSchemeResources(R.color.theme); - mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - page = 1; - isRemove = false; - loadConcernGameId(); - } - }); - noConnection.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - noConnection.setVisibility(View.GONE); - mProgressBar.setVisibility(View.VISIBLE); - handler.postDelayed(new Runnable() { - @Override - public void run() { - isNetworkError = false; - loadConcernGameId(); - } - },1000); - } - }); - } - - private void loadConcernGameId() { - List concernGame = manager.getConcernGame(); - gameIdList.clear(); - for (ConcernInfo concernInfo : concernGame) { - gameIdList.add(concernInfo.getId()); - } - - // 对数据进行排序 - Collections.sort(gameIdList, new Comparator() { - @Override - public int compare(String lhs, String rhs) { - return lhs.compareTo(rhs); - } - }); - - handler.sendEmptyMessage(0); - reuse_none_data.setVisibility(View.GONE); - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - if (container != null) { - container.removeView(mView); - } - return mView; - } - - @Override - public void isLoadOver(boolean loadOver) { - isLoadOver = loadOver; - - if (mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing()){ - mSwipeRefreshLayout.setRefreshing(false); - } - if (mProgressBar != null && mProgressBar.getVisibility() == View.VISIBLE){ - mProgressBar.setVisibility(View.GONE); - } - } - - @Override - public void isRemove(boolean remove) { - isRemove = remove; - } - - @Override - public void isNetworkError(boolean netWorkError) { - isNetworkError = netWorkError; - if (isNetworkError){ - noConnection.setVisibility(View.VISIBLE); - }else { - noConnection.setVisibility(View.GONE); - } - } - - public void updateConcern() { - String uuid = ConcernUtils.uuid(getActivity()); - - ConcernUtils.updateConcernData(Config.HOST + "v2d0/device/" + uuid + "/concern", new JSONArray(gameIdList), - new ConcernUtils.DownJsonListener() { - @Override - public void downSucced(String str) { - Utils.log("更新设备游戏成功"); - } - - @Override - public void downFailed() { - Utils.log("更新设备游戏失败"); - } - }); - } - - @Override - public void concernNewsData(boolean noDate) { - if (noDate){ - if (mSwipeRefreshLayout.isRefreshing()){ - mSwipeRefreshLayout.setRefreshing(false); - } - reuse_none_data.setVisibility(View.VISIBLE); - } - } - -} diff --git a/app/src/main/java/com/gh/gamecenter/news/NewNews4FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/news/NewNews4FragmentAdapter.java deleted file mode 100644 index fb2c983ab7..0000000000 --- a/app/src/main/java/com/gh/gamecenter/news/NewNews4FragmentAdapter.java +++ /dev/null @@ -1,329 +0,0 @@ -package com.gh.gamecenter.news; - -import android.content.Context; -import android.content.Intent; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; -import com.gh.common.util.DisplayUtils; -import com.gh.common.util.ImageUtils; -import com.gh.common.util.Utils; -import com.gh.gamecenter.NewsActivity; -import com.gh.gamecenter.R; -import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; -import com.gh.gamecenter.entity.ConcernEntity; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import org.json.JSONArray; - -import java.lang.reflect.Type; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Locale; - -/** - * Created by khy on 2016/8/15. - */ -public class NewNews4FragmentAdapter extends RecyclerView.Adapter { - - private Context mContext; - private List concernList; - public OnCallBackListener callBackListener; - - private String concernKey ; - private String gameIdPostData; - - private boolean keyRequestError = false; - private boolean isKeyGetData = false; - private boolean isNetworkError = false; - private boolean isRemove = false; - - private int page ; - - public NewNews4FragmentAdapter(Context context, NewNews4Fragment newNews4Fragment, String concernKey, String gameIdPostData, int page) { - this.mContext = context; - this.concernKey = concernKey; - this.gameIdPostData = gameIdPostData; - this.page = page; - concernList = new ArrayList<>(); - callBackListener = (OnCallBackListener) newNews4Fragment; - LoadJosnData(page); - } - - public void LoadJosnData(final int p) { - - page = p; - final String url; - - if (keyRequestError){ - url= Config.HOST+ "v2d0/zixun/guanzhu?"+ "game_id="+ gameIdPostData+ "&limit=10&page="+ page+ "×tamp="+ System.currentTimeMillis(); - isKeyGetData = false; - }else { - url= Config.HOST+ "v2d0/zixun/guanzhu?"+ "key="+ concernKey+ "&limit=10&page="+ page+ "×tamp="+ System.currentTimeMillis(); - isKeyGetData= true; - } - if (page == 1){ - concernList.clear(); - notifyDataSetChanged(); - } - final JsonArrayExtendedRequest request= new JsonArrayExtendedRequest(url - , new Response.Listener() { - @Override - public void onResponse(JSONArray response) { - - Type listType = new TypeToken>() { - }.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - - concernList.addAll(list); - notifyDataSetChanged(); - callBackListener.isLoadOver(true); - if (concernList.size() == 0){ - callBackListener.concernNewsData(true); - }else { - callBackListener.concernNewsData(false); - } - if (list.isEmpty() || (list.size() < 10)) { - notifyItemChanged(getItemCount() - 1); - callBackListener.isRemove(true); - isRemove = true; - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - int statusCode = 0; - try { - statusCode = error.networkResponse.statusCode; - } catch (NullPointerException e) { - e.printStackTrace(); - Utils.log("资讯-关注页面出现异常"+e.toString()); - } - - if (statusCode == 409 && isKeyGetData){ - keyRequestError = true; - if (gameIdPostData.length() > 5){ - LoadJosnData(page); - callBackListener.updateConcern(); - }else { - callBackListener.concernNewsData(true); - } - }else { - callBackListener.isLoadOver(true); - callBackListener.isNetworkError(true); - isNetworkError = true; - } - } - }); - AppController.addToRequestQueue(request, NewsFragment.class); - } - - @Override - public int getItemViewType(int position) { - if (position == concernList.size()) { - return 0; - }else { - return 1; - } - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == 0){ - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.refresh_footerview, parent, false); - return new FooterViewHolder(view); - } - return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.concern_rv_item, parent, false)); - } - - @Override - public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { - - if (holder instanceof ViewHolder){ - - ViewHolder viewHolder = ((ViewHolder) holder); - ConcernEntity concernEntity = concernList.get(position); - - if (concernEntity.getImg().size() == 0) { - viewHolder.contentPicLl.setVisibility(View.GONE); - } else { - viewHolder.contentPicLl.setVisibility(View.VISIBLE); - addContentPic(mContext.getResources().getDisplayMetrics().widthPixels - - DisplayUtils.dip2px(mContext, 34), viewHolder.contentPicLl, concernEntity.getImg()); - } - - ImageUtils.getInstance(mContext).display(concernEntity.getGameIcon(), viewHolder.concernThumb); - viewHolder.concernContent.setText(concernEntity.getContent()); - viewHolder.concernTitle.setText(concernEntity.getGameName()); - SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); - - try { - long today = format.parse(format.format(new Date())).getTime(); - long day = Long.valueOf(concernEntity.getTime() + "000"); - if (day >= today && day < today + 86400 * 1000) { - format.applyPattern("HH:mm"); - viewHolder.concerntTime.setText("今天 " + format.format(day)); - } else if (day >= today - 86400 * 1000 && day < today) { - format.applyPattern("HH:mm"); - viewHolder.concerntTime.setText("昨天 " + format.format(day)); - } else { - format.applyPattern("yyyy年MM月dd日 HH:mm"); - viewHolder.concerntTime.setText(format.format(day)); - } - } catch (ParseException e) { - e.printStackTrace(); - format.applyPattern("yyyy年MM月dd日 HH:mm"); - viewHolder.concerntTime.setText(format.format(Long.valueOf(concernEntity.getTime() + "000"))); - } - - viewHolder.view.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = new Intent(mContext, NewsActivity.class); - intent.putExtra("newsId", concernList.get(position).getId()); - intent.putExtra("entrance", "资讯-关注"); - mContext.startActivity(intent); - } - }); - - }else if (holder instanceof FooterViewHolder){ - - FooterViewHolder viewHolder = ((FooterViewHolder) holder); - if (isNetworkError) { - viewHolder.footerview_progressbar.setVisibility(View.GONE); - viewHolder.footerview_tv_loading.setText("加载失败,点击重试"); - viewHolder.itemView.setClickable(true); - viewHolder.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - isNetworkError = false; - notifyItemChanged(getItemCount() - 1); - LoadJosnData(page); - } - }); - - } else if (isRemove) { - viewHolder.footerview_progressbar.setVisibility(View.GONE); - viewHolder.footerview_tv_loading.setText("加载完毕"); - viewHolder.itemView.setClickable(false); - } else { - viewHolder.footerview_progressbar.setVisibility(View.VISIBLE); - viewHolder.footerview_tv_loading.setText("加载中..."); - viewHolder.itemView.setClickable(false); - } - } - - } - - @Override - public int getItemCount() { - if (concernList.isEmpty()){ - return 0; - } - return concernList.size()+ 1; - } - - public class ViewHolder extends RecyclerView.ViewHolder { - View view; - ImageView concernThumb; - LinearLayout contentPicLl; - TextView concernTitle, concerntTime, concernContent, concernRead; - - public ViewHolder(View itemView) { - super(itemView); - view = itemView; - concernContent = (TextView) view.findViewById(R.id.concern_rv_item_content); - concernRead = (TextView) view.findViewById(R.id.concern_rv_item_read); - concernThumb = (ImageView) view.findViewById(R.id.concern_rv_item_thumb); - concerntTime = (TextView) view.findViewById(R.id.concern_rv_item_time); - concernTitle = (TextView) view.findViewById(R.id.concern_rv_item_title); - contentPicLl = (LinearLayout) view.findViewById(R.id.concern_rv_item_iv_ll); - } - } - - private void addContentPic(int width, LinearLayout linearLayout, List list) { - - int allSize = list.size(); - LinearLayout ll; - ImageView imageView; - int index = 0; - linearLayout.removeAllViews(); - for (int i = 0; i < Math.ceil(list.size()/ 3.0); i++) { - switch (allSize% 3) { - case 1: - ll = new LinearLayout(mContext); - ll.setOrientation(LinearLayout.HORIZONTAL); - ll.removeAllViews(); - imageView = new ImageView(mContext); - imageView.setLayoutParams(new ViewGroup.LayoutParams(width, width / 2)); - ImageUtils.getInstance(mContext).display(list.get(index), imageView, ImageView.ScaleType.CENTER_CROP); - ll.addView(imageView); - ll.setPadding(DisplayUtils.dip2px(mContext, 2), 0, DisplayUtils.dip2px(mContext, 2), DisplayUtils.dip2px(mContext, 4)); - linearLayout.addView(ll); - allSize = allSize - 1; - index = index + 1; - break; - case 2: - ll = new LinearLayout(mContext); - ll.setOrientation(LinearLayout.HORIZONTAL); - ll.removeAllViews(); - for (int j = 0; j < list.size() % 3; j++) { - imageView = new ImageView(mContext); - LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, width / 2 - DisplayUtils.dip2px(mContext, 4)); - layoutParams.setMargins(DisplayUtils.dip2px(mContext, 2), 0, DisplayUtils.dip2px(mContext, 2), DisplayUtils.dip2px(mContext, 4)); - layoutParams.weight = 1; - imageView.setLayoutParams(layoutParams); - ImageUtils.getInstance(mContext).display(list.get(index), imageView, ImageView.ScaleType.CENTER_CROP); - ll.addView(imageView); - index = index + 1; - } - linearLayout.addView(ll); - allSize = allSize - 2; - - break; - case 0: - ll = new LinearLayout(mContext); - ll.setOrientation(LinearLayout.HORIZONTAL); - ll.removeAllViews(); - for (int j = 0; j < 3; j++) { - imageView = new ImageView(mContext); - LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, width / 3 - DisplayUtils.dip2px(mContext, 4)); - layoutParams.setMargins(DisplayUtils.dip2px(mContext, 2), 0, DisplayUtils.dip2px(mContext, 2), DisplayUtils.dip2px(mContext, 4)); - layoutParams.weight = 1; - imageView.setLayoutParams(layoutParams); - ImageUtils.getInstance(mContext).display(list.get(index), imageView, ImageView.ScaleType.CENTER_CROP); - ll.addView(imageView); - index = index + 1; - } - linearLayout.addView(ll); - allSize = allSize - 3; - break; - } - } - - } - public interface OnCallBackListener{ - void isLoadOver(boolean loadOver); - void isRemove(boolean remove); - void isNetworkError(boolean netWorkError); - void updateConcern(); - void concernNewsData(boolean noDate);//关注新闻是否为空 - } - -} diff --git a/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java index 14c13b3885..eecf875409 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java @@ -1,9 +1,11 @@ package com.gh.gamecenter.news; -import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -12,123 +14,211 @@ import android.view.ViewGroup; import android.widget.LinearLayout; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.AppController; -import com.gh.common.view.VerticalItemDecoration; -import com.gh.gamecenter.ConcernActivity; +import com.gh.common.constant.Config; +import com.gh.common.util.ConcernUtils; +import com.gh.common.util.MD5Utils; +import com.gh.common.util.Utils; import com.gh.gamecenter.R; -import com.gh.gamecenter.eventbus.EBConcernChanged; -import com.gh.gamecenter.eventbus.EBNetworkState; -import com.gh.gamecenter.eventbus.EBPackage; -import com.gh.gamecenter.eventbus.EBUISwitch; +import com.gh.gamecenter.db.info.ConcernInfo; +import com.gh.gamecenter.manager.ConcernManager; -import de.greenrobot.event.EventBus; +import org.json.JSONArray; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; /** - * Created by khy on 2016/6/29. + * Created by khy on 2016/8/15. */ -public class News4Fragment extends Fragment { +public class News4Fragment extends Fragment implements News4FragmentAdapter.OnCallBackListener{ - private View view; - private RecyclerView news_list; - private News4FragmentAdapter adapter; - private ProgressBarCircularIndeterminate news_pb_loading; - private LinearLayout reuse_no_connection; + private View mView; + private RecyclerView mRecyclerView; + private News4FragmentAdapter mNews4FragmentAdapter; + private LinearLayoutManager mLayoutManager; + private LinearLayout noConnection; private LinearLayout reuse_none_data; + private SwipeRefreshLayout mSwipeRefreshLayout; + private ProgressBarCircularIndeterminate mProgressBar; + private boolean isLoadOver = true; + private boolean isRemove = false; + private boolean isNetworkError = false; + + private int page = 1; + + private List gameIdList; + + private ConcernManager manager; + + private Handler handler = new Handler(){ + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (msg.what == 0){ + StringBuffer concernKey = new StringBuffer(); + concernKey.setLength(0); + StringBuffer gameIdPostData = new StringBuffer(); + for (int i = 0, size = gameIdList.size(); i < size; i++){ + if (i < 5) { + gameIdPostData.append(gameIdList.get(i)); + gameIdPostData.append("-"); + } + } + for (int i = 0; i < gameIdList.size(); i++) { + concernKey.append(gameIdList.get(i)); + } + String contentMD5 = MD5Utils.getContentMD5(concernKey.toString()); + + if (gameIdPostData.length() > 0) { + gameIdPostData.deleteCharAt(gameIdPostData.length() - 1); + } + mNews4FragmentAdapter = new News4FragmentAdapter(getActivity(), News4Fragment.this, + contentMD5, gameIdPostData.toString(), page); + mRecyclerView.setAdapter(mNews4FragmentAdapter); + } + } + }; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - view = View.inflate(getActivity(), R.layout.fragment_news3, null); + mView = View.inflate(getActivity(), R.layout.fragment_news4, null); + mRecyclerView = (RecyclerView) mView.findViewById(R.id.news4_rv); + mSwipeRefreshLayout = (SwipeRefreshLayout) mView.findViewById(R.id.news4_swipe_refresh); + mProgressBar = (ProgressBarCircularIndeterminate) mView.findViewById(R.id.news4_pb_loading); + noConnection = (LinearLayout) mView.findViewById(R.id.reuse_no_connection); + reuse_none_data = (LinearLayout) mView.findViewById(R.id.reuse_none_data); + mLayoutManager = new LinearLayoutManager(getActivity()); + mRecyclerView.setLayoutManager(mLayoutManager); - news_pb_loading = (ProgressBarCircularIndeterminate) view.findViewById(R.id.news_pb_loading); + manager = new ConcernManager(getActivity()); - reuse_none_data = (LinearLayout) view.findViewById(R.id.reuse_none_data); - reuse_none_data.setOnClickListener(new View.OnClickListener() { + gameIdList = new ArrayList<>(); + + loadConcernGameId(); + + mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override - public void onClick(View v) { - startActivity(new Intent(getActivity(), ConcernActivity.class)); + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (mNews4FragmentAdapter != null &&newState == RecyclerView.SCROLL_STATE_IDLE + &&mLayoutManager.findLastVisibleItemPosition() + 1 == mNews4FragmentAdapter.getItemCount() + &&isLoadOver &&!isRemove &&!isNetworkError){ + isLoadOver = false; + page++; + mNews4FragmentAdapter.loadJosnData(page); + } } }); - reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); - reuse_no_connection.setOnClickListener(new View.OnClickListener() { + mSwipeRefreshLayout.setColorSchemeResources(R.color.theme); + mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + page = 1; + isRemove = false; + loadConcernGameId(); + } + }); + noConnection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - news_list.setVisibility(View.VISIBLE); - news_pb_loading.setVisibility(View.VISIBLE); - reuse_no_connection.setVisibility(View.GONE); - adapter = new News4FragmentAdapter(getActivity(), news_list, - news_pb_loading, reuse_no_connection, reuse_none_data, true); - news_list.setAdapter(adapter); + noConnection.setVisibility(View.GONE); + mProgressBar.setVisibility(View.VISIBLE); + handler.postDelayed(new Runnable() { + @Override + public void run() { + isNetworkError = false; + loadConcernGameId(); + } + },1000); + } + }); + } + + private void loadConcernGameId() { + List concernGame = manager.getConcernGame(); + gameIdList.clear(); + for (ConcernInfo concernInfo : concernGame) { + gameIdList.add(concernInfo.getId()); + } + + // 对数据进行排序 + Collections.sort(gameIdList, new Comparator() { + @Override + public int compare(String lhs, String rhs) { + return lhs.compareTo(rhs); } }); - news_list = (RecyclerView) view.findViewById(R.id.news_list); - news_list.setHasFixedSize(true); - news_list.setLayoutManager(new LinearLayoutManager(getActivity())); - adapter = new News4FragmentAdapter(getActivity(), news_list, - news_pb_loading, reuse_no_connection, reuse_none_data, false); - news_list.setAdapter(adapter); - news_list.addItemDecoration(new VerticalItemDecoration(getActivity(), 1)); - - EventBus.getDefault().register(this); + handler.sendEmptyMessage(0); + reuse_none_data.setVisibility(View.GONE); } @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (container != null) { - container.removeView(view); + container.removeView(mView); } - return view; + return mView; } - //关注改变事件 - public void onEventMainThread(EBConcernChanged busSeven) { - adapter.update(); - } + @Override + public void isLoadOver(boolean loadOver) { + isLoadOver = loadOver; - //安装、卸载事件 - public void onEventMainThread(EBPackage busFour) { - adapter.update(); - } - - //Fragment界面切换事件 - public void onEventMainThread(EBUISwitch busNine) { - if ("NewsFragment".equals(busNine.getFrom())) { - if (busNine.getPosition() == 3) { - if (news_pb_loading.getVisibility() == View.VISIBLE) { - adapter.load(); - } - } + if (mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing()){ + mSwipeRefreshLayout.setRefreshing(false); } - } - - //连接上网络事件 - public void onEventMainThread(EBNetworkState busNetworkState) { - if (busNetworkState.isNetworkConnected()) { - if (reuse_no_connection.getVisibility() == View.VISIBLE) { - news_list.setVisibility(View.VISIBLE); - news_pb_loading.setVisibility(View.VISIBLE); - reuse_no_connection.setVisibility(View.GONE); - adapter = new News4FragmentAdapter(getActivity(), news_list, - news_pb_loading, reuse_no_connection, reuse_none_data, true); - news_list.setAdapter(adapter); - } + if (mProgressBar != null && mProgressBar.getVisibility() == View.VISIBLE){ + mProgressBar.setVisibility(View.GONE); } } @Override - public void onDestroy() { - super.onDestroy(); - AppController.canclePendingRequests(News4Fragment.class); - EventBus.getDefault().unregister(this); - view = null; - news_list = null; - adapter = null; - news_pb_loading = null; - reuse_no_connection = null; + public void isRemove(boolean remove) { + isRemove = remove; } + + @Override + public void isNetworkError(boolean netWorkError) { + isNetworkError = netWorkError; + if (isNetworkError){ + noConnection.setVisibility(View.VISIBLE); + }else { + noConnection.setVisibility(View.GONE); + } + } + + public void updateConcern() { + String uuid = ConcernUtils.uuid(getActivity()); + + ConcernUtils.updateConcernData(Config.HOST + "v2d0/device/" + uuid + "/concern", new JSONArray(gameIdList), + new ConcernUtils.DownJsonListener() { + @Override + public void downSucced(String str) { + Utils.log("更新设备游戏成功"); + } + + @Override + public void downFailed() { + Utils.log("更新设备游戏失败"); + } + }); + } + + @Override + public void concernNewsData(boolean noDate) { + if (noDate){ + if (mSwipeRefreshLayout.isRefreshing()){ + mSwipeRefreshLayout.setRefreshing(false); + } + reuse_none_data.setVisibility(View.VISIBLE); + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/news/News4FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/news/News4FragmentAdapter.java index 4fc5fd26fc..6149b2bd8a 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News4FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/news/News4FragmentAdapter.java @@ -2,11 +2,10 @@ package com.gh.gamecenter.news; import android.content.Context; import android.content.Intent; -import android.support.v4.util.ArrayMap; import android.support.v7.widget.RecyclerView; +import android.text.Html; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; @@ -14,579 +13,335 @@ import android.widget.TextView; import com.android.volley.Response; import com.android.volley.VolleyError; -import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; import com.gh.base.AppController; import com.gh.common.constant.Config; -import com.gh.common.constant.Constants; -import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; -import com.gh.common.util.GameViewUtils; import com.gh.common.util.ImageUtils; -import com.gh.common.util.NewsUtils; -import com.gh.common.util.TimestampUtils; -import com.gh.gamecenter.ConcernActivity; -import com.gh.gamecenter.GameDetailsActivity; +import com.gh.common.util.Utils; +import com.gh.common.view.CardLinearLayout; +import com.gh.gamecenter.NewsActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; -import com.gh.gamecenter.db.info.ConcernInfo; -import com.gh.gamecenter.db.info.GameInfo; -import com.gh.gamecenter.db.info.SuspectedGameInfo; -import com.gh.gamecenter.entity.ApkEntity; -import com.gh.gamecenter.entity.GameDigestEntity; -import com.gh.gamecenter.entity.GameEntity; -import com.gh.gamecenter.entity.NewsEntity; -import com.gh.gamecenter.manager.ConcernManager; -import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.manager.GameManager; -import com.gh.gamecenter.manager.SuspectedGameManager; +import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.json.JSONArray; -import org.json.JSONObject; import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; +import java.util.Date; import java.util.List; -import java.util.Map; +import java.util.Locale; /** - * - * @author 温冠超 - * @email 294299195@qq.com - * @date 2015-8-5 modified 2015-8-21 资讯首页模块 + * Created by khy on 2016/8/15. */ -public class News4FragmentAdapter extends - RecyclerView.Adapter { +public class News4FragmentAdapter extends RecyclerView.Adapter { - public static class ITEM_TYPE { - public static final int GAME = 1;// 游戏布局类型 - public static final int NEWS = 2;// 游戏新闻列表类型 - public static final int FOOTER = 3;// 刷新布局类型 + private Context mContext; + private List concernList; + public OnCallBackListener callBackListener; + + private String concernKey ; + private String gameIdPostData; + + private boolean keyRequestError = false; + private boolean isKeyGetData = false; + private boolean isNetworkError = false; + private boolean isRemove = false; + + private int page ; + + public News4FragmentAdapter(Context context, News4Fragment newNews4Fragment, String concernKey, String gameIdPostData, int page) { + this.mContext = context; + this.concernKey = concernKey; + this.gameIdPostData = gameIdPostData; + this.page = page; + concernList = new ArrayList<>(); + callBackListener = (OnCallBackListener) newNews4Fragment; + loadJosnData(page); } - private Context context; + public void loadJosnData(final int p) { - private RecyclerView news_list; - private ProgressBarCircularIndeterminate news_pb_loading; - private LinearLayout reuse_no_connection; - private LinearLayout news_tv_none; + page = p; + final String url; - private List concernList; - private List concernGameList; - private ArrayMap> concernNewsMap; - - private ConcernManager concernManager; - - private int count_game;// 游戏+游戏新闻 的数目 - - public News4FragmentAdapter(Context con, - RecyclerView recyclerView, - ProgressBarCircularIndeterminate pbLoading, - LinearLayout linearLayout, - LinearLayout textView, - boolean isLoad) { - context = con; - news_list = recyclerView; - news_pb_loading = pbLoading; - reuse_no_connection = linearLayout; - news_tv_none = textView; - - concernManager = new ConcernManager(context); - concernGameList = new ArrayList(); - concernNewsMap = new ArrayMap>(); - - concernList = new ArrayList(); - - count_game = 0; - - if (isLoad) { - load(); + if (keyRequestError){ + url= Config.HOST+ "v2d0/zixun/guanzhu?"+ "game_id="+ gameIdPostData+ "&limit=10&page="+ page+ "×tamp="+ System.currentTimeMillis(); + isKeyGetData = false; + }else { + url= Config.HOST+ "v2d0/zixun/guanzhu?"+ "key="+ concernKey+ "&limit=10&page="+ page+ "×tamp="+ System.currentTimeMillis(); + isKeyGetData= true; } - } - - public void load() { - // 获取关注的信息 - concernList = concernManager.getAllConcernBySort(); - if (concernList != null && !concernList.isEmpty()) { - sortList(concernList); - initGameNews(); - } else { - news_list.setVisibility(View.GONE); - news_pb_loading.setVisibility(View.GONE); - news_tv_none.setVisibility(View.VISIBLE);//空指针 - } - } - - private void sortList(List list) { - Comparator comparator = new Comparator() { - @Override - public int compare(ConcernInfo lhs, ConcernInfo rhs) { - - if (rhs.getWeight() == 2 && lhs.getWeight() == 2) { - return 0; - } else if (rhs.getWeight() == 2 && lhs.getWeight() == 1) { - return 1; - } else if (rhs.getWeight() == 1 && lhs.getWeight() == 2) { - return -1; - } else { - if ("已关注".equals(rhs.getTag()) - && "已安装".equals(lhs.getTag())) { - return 1; - } else if ("已安装".equals(rhs.getTag()) - && "已关注".equals(lhs.getTag())) { - return -1; - } else { - return 0; - } - } - - } - }; - Collections.sort(list, comparator); - } - - private int count; - - private void initGameNews() { - final List cList = new ArrayList(); - count = 0; - final int size = concernList.size(); - for (int i = 0; i < size; i++) { - final int index = i; - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - TimestampUtils.addTimestamp( - Config.HOST + "v1d45/game/" + concernList.get(i).getId() - + "/news?limit=3&offset=0", Constants.NEWS_CD), - new Response.Listener() { - @Override - public void onResponse(JSONArray response) { - Gson gson = new Gson(); - Type listType = new TypeToken>() {}.getType(); - List list = gson.fromJson(response.toString(), listType); - if (list != null && !list.isEmpty()) { - cList.add(concernList.get(index)); - concernNewsMap.put(concernList.get(index).getGameName(), list); - } - count++; - if (count == size) { - refresh(cList); - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - count++; - if (count == size) { - refresh(cList); - } - } - }); - AppController.addToRequestQueue(request, News4Fragment.class); - } - } - - private void refresh(List list) { - if (list.isEmpty()) { - news_list.setVisibility(View.GONE); - news_pb_loading.setVisibility(View.GONE); - news_tv_none.setVisibility(View.VISIBLE); - } else { - concernList = list; - List ids = new ArrayList(); - for (int i = 0; i < concernList.size(); i++) { - ids.add(concernList.get(i).getId()); - } - news_list.setVisibility(View.VISIBLE); - news_pb_loading.setVisibility(View.GONE); - refreshCount(); - initGame(ids); - } - } - - private void initGame(List ids) { - count = 0; - final int size = ids.size(); - for (int i = 0; i < size; i++) { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - TimestampUtils.addTimestamp(Config.HOST + "v1d45/game/" - + ids.get(i) + "/digest", Constants.GAME_CD), - new Response.Listener() { - @Override - public void onResponse(JSONObject response) { - Gson gson = new Gson(); - GameEntity gameEntity = gson.fromJson(response.toString(), GameEntity.class); - if (gameEntity != null) { - concernGameList.add(gameEntity); - } - count++; - if (count == size) { - processingGameData(); - } - } - }, new Response.ErrorListener() { - - @Override - public void onErrorResponse(VolleyError error) { - count++; - if (count == size) { - processingGameData(); - } - } - }); - AppController.addToRequestQueue(request, News4Fragment.class); - } - } - - private void processingGameData() { - if (!concernGameList.isEmpty()) { - List list = new ArrayList(); - for (int i = 0, size = concernList.size(); i < size; i++) { - String id = concernList.get(i).getId(); - for (GameEntity gameEntity : concernGameList) { - if (gameEntity.getId().equals(id)) { - list.add(gameEntity); - break; - } - } - } - concernGameList = list; - GameManager manager = new GameManager(context); - for (int i = 0, size = concernGameList.size(); i < size; i++) { - for (ApkEntity apkEntity : concernGameList.get(i).getApk()) { - manager.addOrUpdate(new GameInfo(apkEntity.getPackageName(), - concernGameList.get(i).getId(), concernGameList.get(i).getName())); - } - } + if (page == 1){ + concernList.clear(); notifyDataSetChanged(); } - SuspectedGameManager manager = new SuspectedGameManager(context); - List list = manager.getAllGame(); - if (list != null && !list.isEmpty()) { - news_pb_loading.setVisibility(View.VISIBLE); - List params = new ArrayList(); - for (SuspectedGameInfo entity : list) { - params.add(entity.getPackageName()); - } - initSuspectedGame(params); - } - } + final JsonArrayExtendedRequest request= new JsonArrayExtendedRequest(url, + new Response.Listener() { + @Override + public void onResponse(JSONArray response) { - private void initSuspectedGame(final List params) { - count = 0; - final List list = new ArrayList(); - final List useParams = new ArrayList(); - for (int i = 0, size = params.size(); i < size; i++) { - final String packageName = params.get(i); - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - TimestampUtils.addTimestamp(Config.HOST - + "v1d45/support/package/" + packageName - + "/game/digest", Constants.GAME_CD), - new Response.Listener() { + Type listType = new TypeToken>() {}.getType(); + Gson gson = new Gson(); + List list = gson.fromJson(response.toString(), listType); - @Override - public void onResponse(JSONObject response) { - count++; - if (response.length() != 0) { - list.add(response); - useParams.add(packageName); - } - if (params.size() == count) { - processingData(list, params, useParams); - } + concernList.addAll(list); + + notifyItemRangeInserted(concernList.size() - list.size(), list.size()); + + callBackListener.isLoadOver(true); + if (concernList.size() == 0){ + callBackListener.concernNewsData(true); + }else { + callBackListener.concernNewsData(false); } - }, new Response.ErrorListener() { - - @Override - public void onErrorResponse(VolleyError error) { - count++; - if (params.size() == count) { - if (list.isEmpty()) { - news_pb_loading.setVisibility(View.GONE); - } else { - processingData(list, params, useParams); + if (list.isEmpty() || (list.size() < 10)) { + notifyItemChanged(getItemCount() - 1); + callBackListener.isRemove(true); + isRemove = true; } } - } - }); - AppController.addToRequestQueue(request, NewsFragment.class); - } - } + }, + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + int statusCode = 0; + try { + statusCode = error.networkResponse.statusCode; + } catch (NullPointerException e) { + e.printStackTrace(); + Utils.log("资讯-关注页面出现异常" + e.toString()); + } - private void processingData(List data, List params, - List useParams) { - Gson gson = new Gson(); - ConcernManager manager = new ConcernManager(context); - for (int i = 0, size = data.size(); i < size; i++) { - GameDigestEntity gameDigestEntity = gson.fromJson(data.get(i) - .toString(), GameDigestEntity.class); - GameInfo gameEntity = new GameInfo(); - gameEntity.setId(gameDigestEntity.getId()); - gameEntity.setPackageName(useParams.get(i)); - manager.updateByEntity(gameEntity, false); - } - - SuspectedGameManager suspectedGameManager = new SuspectedGameManager(context); - for (String packageName : params) { - suspectedGameManager.deleteSuspectedGame(packageName); - } - - if (data.size() > 0) { - update(); - } else { - news_pb_loading.setVisibility(View.GONE); - } - } - - public void update() { - news_pb_loading.setVisibility(View.VISIBLE); - concernList = concernManager.getAllConcernBySort(); - if (concernList != null && !concernList.isEmpty()) { - sortList(concernList); - initGameNews(); - } else { - news_list.setVisibility(View.GONE); - news_pb_loading.setVisibility(View.GONE); - news_tv_none.setVisibility(View.VISIBLE); - } - } - - private void refreshCount() { - - count_game = 0; - - if (!concernList.isEmpty()) { - int count = 0; - for (int i = 0, size = concernList.size(); i < size; i++) { - count += (concernNewsMap.get(concernList.get(i).getGameName()) - .size() + 1); - } - count_game = count; - } - - notifyDataSetChanged(); - } - - @Override - public int getItemCount() { - if (count_game == 0) { - return 0; - } - return count_game + 1; + if (statusCode == 409 && isKeyGetData) { + keyRequestError = true; + if (gameIdPostData.length() > 5){ + loadJosnData(page); + callBackListener.updateConcern(); + }else { + callBackListener.concernNewsData(true); + } + } else { + callBackListener.isLoadOver(true); + callBackListener.isNetworkError(true); + isNetworkError = true; + } + } + }); + AppController.addToRequestQueue(request, NewsFragment.class); } @Override public int getItemViewType(int position) { - - if (position >= 0 && position < count_game) { - for (int i = 0, size = concernList.size(); i < size; i++) { - int offset = 0; - for (int j = 0; j < i; j++) { - offset += (concernNewsMap.get( - concernList.get(j).getGameName()).size() + 1); - } - if (position == offset) { - return ITEM_TYPE.GAME; - } else if (position > offset - && position <= concernNewsMap.get( - concernList.get(i).getGameName()).size() - + offset) { - return ITEM_TYPE.NEWS; - } - } + if (position == concernList.size()) { + return 0; + }else { + return 1; } - - return ITEM_TYPE.FOOTER; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == ITEM_TYPE.GAME) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.news_list_item_gamenormal_type, parent, false); - return new GameNormalViewHolder(view); - } else if (viewType == ITEM_TYPE.NEWS) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.home_list_item_newsnormal_type, parent, false); - return new TextNewsTypeViewHolder(view); - } else { + if (viewType == 0){ View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.refresh_footerview, parent, false); return new FooterViewHolder(view); } + return new ConcernViewHolder(LayoutInflater.from(mContext).inflate(R.layout.concern_rv_item, parent, false)); } @Override - public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { - if (viewHolder instanceof GameNormalViewHolder) { - ((GameNormalViewHolder) viewHolder).initViewHolder(position); - } else if (viewHolder instanceof TextNewsTypeViewHolder) { - ((TextNewsTypeViewHolder) viewHolder).initViewHolder(position); - } else if (viewHolder instanceof FooterViewHolder) { - FooterViewHolder holder = (FooterViewHolder) viewHolder; - holder.footerview_progressbar.setVisibility(View.GONE); - holder.footerview_tv_loading.setText("管理我的关注"); - holder.footerview_tv_loading.setBackgroundResource(R.drawable.border_blue_bg); - int padding = DisplayUtils.dip2px(context, 5); - holder.footerview_tv_loading.setPadding(padding, padding, padding, padding); - holder.footerview_tv_loading.setTextColor(context.getResources().getColor(R.color.theme)); - holder.itemView.setClickable(true); - holder.itemView.setOnClickListener(new OnClickListener() { + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (holder instanceof ConcernViewHolder) { + + ConcernViewHolder viewHolder = ((ConcernViewHolder) holder); + + // 第一个 + if (position == 0) { + ((CardLinearLayout) viewHolder.itemView).setmTop(DisplayUtils.dip2px(mContext, 8)); + } else { + ((CardLinearLayout) viewHolder.itemView).setmTop(0); + } + + // 最后一个 + if (position == concernList.size() - 1) { + ((CardLinearLayout) viewHolder.itemView).setBottom(true); + } else { + ((CardLinearLayout) viewHolder.itemView).setBottom(false); + } + + final ConcernEntity concernEntity = concernList.get(position); + + if (concernEntity.getImg().size() == 0) { + viewHolder.contentPicLl.setVisibility(View.GONE); + } else { + viewHolder.contentPicLl.setVisibility(View.VISIBLE); + addContentPic(mContext.getResources().getDisplayMetrics().widthPixels + - DisplayUtils.dip2px(mContext, 34), viewHolder.contentPicLl, concernEntity.getImg()); + } + + ImageUtils.getInstance(mContext).display(concernEntity.getGameIcon(), viewHolder.concernThumb); + viewHolder.concernContent.setText(Html.fromHtml(concernEntity.getContent())); + viewHolder.concernTitle.setText(concernEntity.getGameName()); + SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); + + try { + long today = format.parse(format.format(new Date())).getTime(); + long day = Long.valueOf(concernEntity.getTime() + "000"); + if (day >= today && day < today + 86400 * 1000) { + format.applyPattern("HH:mm"); + viewHolder.concerntTime.setText("今天 " + format.format(day)); + } else if (day >= today - 86400 * 1000 && day < today) { + format.applyPattern("HH:mm"); + viewHolder.concerntTime.setText("昨天 " + format.format(day)); + } else { + format.applyPattern("yyyy年MM月dd日 HH:mm"); + viewHolder.concerntTime.setText(format.format(day)); + } + } catch (ParseException e) { + e.printStackTrace(); + format.applyPattern("yyyy年MM月dd日 HH:mm"); + viewHolder.concerntTime.setText(format.format(Long.valueOf(concernEntity.getTime() + "000"))); + } + + viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - context.startActivity(new Intent(context, ConcernActivity.class)); + Intent intent = new Intent(mContext, NewsActivity.class); + intent.putExtra("newsId", concernEntity.getId()); + intent.putExtra("entrance", "资讯-关注"); + mContext.startActivity(intent); } }); - } - } - private class GameNormalViewHolder extends RecyclerView.ViewHolder { + } else if (holder instanceof FooterViewHolder) { - public ImageView gameThumb; - public TextView gameName; - public LinearLayout labelList; - public ImageView gameInfo; - - public GameNormalViewHolder(View v) { - super(v); - - gameThumb = (ImageView) v.findViewById(R.id.news_game_thumb); - gameName = (TextView) v.findViewById(R.id.news_game_name); - labelList = (LinearLayout) v.findViewById(R.id.news_label_list); - gameInfo = (ImageView) v.findViewById(R.id.gamenormal_game_info); - } - - public void initViewHolder(int position) { - if (position >= 0 && position < count_game) { - for (int i = 0, size = concernList.size(); i < size; i++) { - int offset = 0; - for (int j = 0; j < i; j++) { - offset += (concernNewsMap.get( - concernList.get(j).getGameName()).size() + 1); - } - if (position == offset) { - if (concernGameList.isEmpty()) { - init(concernList.get(i)); - } else { - init(concernGameList.get(i), concernList.get(i).getTag()); - } - } - } - } - } - - private void init(ConcernInfo concernEntity) { - ImageUtils.getInstance(context).display(concernEntity.getIcon(), gameThumb); - gameName.setText(concernEntity.getGameName()); - String tag = concernEntity.getTag(); - if (tag != null) { - GameViewUtils.setLabelList(context, labelList, tag); - } - itemView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - - } - }); - } - - private void init(final GameEntity entry, String tag) { - ImageUtils.getInstance(context).display(entry.getIcon(), gameThumb); - gameName.setText(entry.getName()); - if (tag != null) { - GameViewUtils.setLabelList(context, labelList, tag); - } - itemView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - - Map kv = new HashMap(); - kv.put("入口", "关注-我的游戏"); - DataUtils.onEvent(context, "游戏详情", entry.getName(), kv); - - Map map = new HashMap(); - map.put("location", "我的游戏"); - map.put("createOn", System.currentTimeMillis() / 1000); - map.put("game", entry.getName()); - map.put("page", "关注"); - DataCollectionManager.onEvent(context, "click-item", map); - - AppController.put("GameEntity", entry); - Intent intent = new Intent(context, GameDetailsActivity.class); - intent.putExtra("entrance", "关注-我的游戏"); - intent.putExtra("current", 1); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } - }); - } - } - - private class TextNewsTypeViewHolder extends RecyclerView.ViewHolder { - - public TextView newsType; - public TextView newsTitle; - - public TextNewsTypeViewHolder(View v) { - super(v); - - newsType = (TextView) v.findViewById(R.id.news_type); - newsTitle = (TextView) v.findViewById(R.id.news_title); - } - - public void initViewHolder(final int position) { - NewsEntity newsEntity = null; - String from = null; - if (position >= 0 && position < count_game) { - for (int i = 0, size = concernList.size(); i < size; i++) { - int offset = 0; - for (int j = 0; j < i; j++) { - offset += (concernNewsMap.get( - concernList.get(j).getGameName()).size() + 1); - } - if (position > offset && position <= concernNewsMap.get( - concernList.get(i).getGameName()).size() + offset) { - newsEntity = concernNewsMap.get( - concernList.get(i).getGameName()).get(position - offset - 1); - from = "我的游戏"; - } - } - } - if (newsEntity != null) { - final NewsEntity entity = newsEntity; - final String entrance = from; - newsType.setBackgroundResource(NewsUtils - .getDrawableIdByType(entity.getType())); - newsType.setText(entity.getType()); - newsTitle.setText(entity.getTitle()); - itemView.setOnClickListener(new OnClickListener() { + FooterViewHolder viewHolder = ((FooterViewHolder) holder); + if (isNetworkError) { + viewHolder.footerview_progressbar.setVisibility(View.GONE); + viewHolder.footerview_tv_loading.setText("加载失败,点击重试"); + viewHolder.itemView.setClickable(true); + viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Map kv = new HashMap(); - kv.put("文章类型", entity.getType()); - kv.put("入口", "关注-" + entrance); - DataUtils.onEvent(context, "资讯-关注", entity.getTitle(), kv); - - Map map = new HashMap(); - map.put("location", entrance); - map.put("createOn", System.currentTimeMillis() / 1000); - map.put("news", entity.getTitle()); - map.put("page", "关注"); - DataCollectionManager.onEvent(context, "click-item", map); - - //统计阅读量 - NewsUtils.statNewsViews(entity.getId()); - NewsUtils.startNewsActivity(context, entity, "资讯-关注-" + entrance); + isNetworkError = false; + notifyItemChanged(getItemCount() - 1); + loadJosnData(page); } }); + + } else if (isRemove) { + viewHolder.footerview_progressbar.setVisibility(View.GONE); + viewHolder.footerview_tv_loading.setText("加载完毕"); + viewHolder.itemView.setClickable(false); + } else { + viewHolder.footerview_progressbar.setVisibility(View.VISIBLE); + viewHolder.footerview_tv_loading.setText("加载中..."); + viewHolder.itemView.setClickable(false); } } } + @Override + public int getItemCount() { + if (concernList.isEmpty()){ + return 0; + } + return concernList.size()+ 1; + } + + public class ConcernViewHolder extends RecyclerView.ViewHolder { + + ImageView concernThumb; + LinearLayout contentPicLl; + TextView concernTitle, concerntTime, concernContent, concernRead; + + public ConcernViewHolder(View itemView) { + super(itemView); + + concernContent = (TextView) itemView.findViewById(R.id.concern_rv_item_content); + concernRead = (TextView) itemView.findViewById(R.id.concern_rv_item_read); + concernThumb = (ImageView) itemView.findViewById(R.id.concern_rv_item_thumb); + concerntTime = (TextView) itemView.findViewById(R.id.concern_rv_item_time); + concernTitle = (TextView) itemView.findViewById(R.id.concern_rv_item_title); + contentPicLl = (LinearLayout) itemView.findViewById(R.id.concern_rv_item_iv_ll); + } + } + + private void addContentPic(int width, LinearLayout linearLayout, List list) { + + int allSize = list.size(); + LinearLayout ll; + ImageView imageView; + int index = 0; + linearLayout.removeAllViews(); + for (int i = 0; i < Math.ceil(list.size()/ 3.0); i++) { + switch (allSize% 3) { + case 1: + ll = new LinearLayout(mContext); + ll.setOrientation(LinearLayout.HORIZONTAL); + ll.removeAllViews(); + imageView = new ImageView(mContext); + imageView.setLayoutParams(new ViewGroup.LayoutParams(width, width / 2)); + ImageUtils.getInstance(mContext).display(list.get(index), imageView, ImageView.ScaleType.CENTER_CROP); + ll.addView(imageView); + ll.setPadding(DisplayUtils.dip2px(mContext, 2), 0, DisplayUtils.dip2px(mContext, 2), DisplayUtils.dip2px(mContext, 4)); + linearLayout.addView(ll); + allSize = allSize - 1; + index = index + 1; + break; + case 2: + ll = new LinearLayout(mContext); + ll.setOrientation(LinearLayout.HORIZONTAL); + ll.removeAllViews(); + for (int j = 0; j < list.size() % 3; j++) { + imageView = new ImageView(mContext); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, width / 2 - DisplayUtils.dip2px(mContext, 4)); + layoutParams.setMargins(DisplayUtils.dip2px(mContext, 2), 0, DisplayUtils.dip2px(mContext, 2), DisplayUtils.dip2px(mContext, 4)); + layoutParams.weight = 1; + imageView.setLayoutParams(layoutParams); + ImageUtils.getInstance(mContext).display(list.get(index), imageView, ImageView.ScaleType.CENTER_CROP); + ll.addView(imageView); + index = index + 1; + } + linearLayout.addView(ll); + allSize = allSize - 2; + + break; + case 0: + ll = new LinearLayout(mContext); + ll.setOrientation(LinearLayout.HORIZONTAL); + ll.removeAllViews(); + for (int j = 0; j < 3; j++) { + imageView = new ImageView(mContext); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, width / 3 - DisplayUtils.dip2px(mContext, 4)); + layoutParams.setMargins(DisplayUtils.dip2px(mContext, 2), 0, DisplayUtils.dip2px(mContext, 2), DisplayUtils.dip2px(mContext, 4)); + layoutParams.weight = 1; + imageView.setLayoutParams(layoutParams); + ImageUtils.getInstance(mContext).display(list.get(index), imageView, ImageView.ScaleType.CENTER_CROP); + ll.addView(imageView); + index = index + 1; + } + linearLayout.addView(ll); + allSize = allSize - 3; + break; + } + } + + } + public interface OnCallBackListener{ + void isLoadOver(boolean loadOver); + void isRemove(boolean remove); + void isNetworkError(boolean netWorkError); + void updateConcern(); + void concernNewsData(boolean noDate);//关注新闻是否为空 + } + } diff --git a/app/src/main/java/com/gh/gamecenter/news/NewsFragment.java b/app/src/main/java/com/gh/gamecenter/news/NewsFragment.java index 7aad647ca4..a095508a1f 100644 --- a/app/src/main/java/com/gh/gamecenter/news/NewsFragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/NewsFragment.java @@ -237,7 +237,7 @@ public class NewsFragment extends Fragment implements View.OnClickListener, View return new News3Fragment(); } else { // return new News4Fragment(); - return new NewNews4Fragment(); + return new News4Fragment(); } } diff --git a/app/src/main/java/com/gh/gamecenter/personal/ConcernFragment.java b/app/src/main/java/com/gh/gamecenter/personal/ConcernFragment.java index 1fb85cbabe..172fe2a64f 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/ConcernFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/ConcernFragment.java @@ -1,8 +1,11 @@ package com.gh.gamecenter.personal; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.util.ArrayMap; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -10,20 +13,34 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; +import com.gh.base.BaseFragment; +import com.gh.common.constant.Constants; import com.gh.common.util.DisplayUtils; +import com.gh.common.util.DownloadItemUtils; import com.gh.common.util.Utils; +import com.gh.download.DataWatcher; +import com.gh.download.DownloadEntry; +import com.gh.download.DownloadManager; import com.gh.gamecenter.R; +import com.gh.gamecenter.entity.DismissEntity; +import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.eventbus.EBMoveTop; +import com.gh.gamecenter.eventbus.EBNetworkState; +import com.gh.gamecenter.eventbus.EBPWDismiss; +import com.gh.gamecenter.eventbus.EBPackage; import com.gh.gamecenter.eventbus.EBSlide; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; + import de.greenrobot.event.EventBus; /** * Created by LGT on 2016/8/12. */ -public class ConcernFragment extends Fragment { +public class ConcernFragment extends BaseFragment { - private View view; private RecyclerView fm_concern_rv_show; private LinearLayoutManager linearLayoutManager; private ConcernFragmentAdapter adapter; @@ -32,18 +49,39 @@ public class ConcernFragment extends Fragment { private int dis; private int distance; + private boolean isEverpause; + + private DataWatcher dataWatcher = new DataWatcher() { + @Override + public void onDataChanged(HashMap downloadingEntries) { + for (Map.Entry entry : downloadingEntries.entrySet()) { + DownloadEntry downloadEntry = entry.getValue(); + + Integer location = adapter.getLocationMap().get(downloadEntry.getName()); + if (location != null) { + GameEntity detailedEntity = adapter.getGameList().get(location); + if (detailedEntity != null) { + DownloadItemUtils.processDate(getActivity(), detailedEntity, downloadEntry, + adapter, location + 2, adapter.getStatusMap()); + } + } + } + } + }; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - view = View.inflate(getActivity(), R.layout.fm_concern, null); + isEverpause = false; + + init(R.layout.fm_concern); topMargin = 0; dis = 0; distance = DisplayUtils.dip2px(getActivity(), 230) - DisplayUtils.getInternalDimensionSize(getActivity().getResources(), "status_bar_height"); - fm_concern_rv_show = (RecyclerView) view.findViewById(R.id.fm_concern_rv_show); fm_concern_rv_show.setHasFixedSize(true); linearLayoutManager = new LinearLayoutManager(getActivity()); fm_concern_rv_show.setLayoutManager(linearLayoutManager); @@ -85,16 +123,12 @@ public class ConcernFragment extends Fragment { } }); - EventBus.getDefault().register(this); } - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - if (container != null) { - container.removeView(view); + public void onEventMainThread(EBPWDismiss dismiss) { + if (adapter != null) { + adapter.getDismissEntity().setShow(false); } - return view; } public void onEventMainThread(EBSlide busOne) { @@ -113,10 +147,54 @@ public class ConcernFragment extends Fragment { } } + //连接上网络事件 + public void onEventMainThread(EBNetworkState busNetworkState) { + if (busNetworkState.isNetworkConnected()) { + + } + } + + //安装、卸载事件 + public void onEventMainThread(EBPackage busFour) { + String name = adapter.getNameMap().get(busFour.getPackageName()); + if (name != null) { + Integer location = adapter.getLocationMap().get(name); + if (location != null) { + if ("安装".equals(busFour.getType())) { + + } else if ("卸载".equals(busFour.getType())) { + + } + } + } + } + + @Override + public void onResume() { + super.onResume(); + if (isEverpause) { + //修改游戏下载状态 + DownloadItemUtils.initializeGameMap(getActivity(), adapter.getGameMap()); + for (GameEntity entity : adapter.getGameList()) { + entity.setEntryMap(adapter.getGameMap().get(entity.getName())); + } + adapter.notifyDataSetChanged(); + } + isEverpause = false; + DownloadManager.getInstance(getActivity()).addObserver(dataWatcher); + } + + @Override + public void onPause() { + super.onPause(); + isEverpause = true; + adapter.getStatusMap().clear(); + DownloadManager.getInstance(getActivity()).removeObserver(dataWatcher); + } + @Override public void onDestroy() { super.onDestroy(); - EventBus.getDefault().unregister(this); } } diff --git a/app/src/main/java/com/gh/gamecenter/personal/ConcernFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/personal/ConcernFragmentAdapter.java index 7d9a23dc8e..f42c4267a1 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/ConcernFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/personal/ConcernFragmentAdapter.java @@ -2,6 +2,7 @@ package com.gh.gamecenter.personal; import android.content.Context; import android.content.Intent; +import android.support.v4.util.ArrayMap; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -18,11 +19,13 @@ import com.gh.common.constant.Config; import com.gh.common.constant.Constants; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; +import com.gh.common.util.DownloadItemUtils; import com.gh.common.util.GameViewUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.TimestampUtils; import com.gh.common.util.Utils; import com.gh.common.view.CardLinearLayout; +import com.gh.download.DownloadEntry; import com.gh.gamecenter.ConcernActivity; import com.gh.gamecenter.GameDetailsActivity; import com.gh.gamecenter.R; @@ -30,8 +33,12 @@ import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.adapter.viewholder.GameNormalViewHolder; import com.gh.gamecenter.adapter.viewholder.ReuseViewHolder; import com.gh.gamecenter.db.info.ConcernInfo; +import com.gh.gamecenter.db.info.GameInfo; +import com.gh.gamecenter.entity.ApkEntity; +import com.gh.gamecenter.entity.DismissEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.manager.ConcernManager; +import com.gh.gamecenter.manager.GameManager; import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; import com.google.gson.Gson; @@ -41,6 +48,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.LinkedBlockingQueue; /** * Created by LGT on 2016/8/15. @@ -54,6 +62,14 @@ public class ConcernFragmentAdapter extends RecyclerView.Adapter concernList; private List gameList; + //下载用到的map + private ArrayMap> gameMap; + private ArrayMap statusMap; + private ArrayMap locationMap; + private ArrayMap nameMap; + + private DismissEntity dismissEntity; + private boolean isRemove; public ConcernFragmentAdapter(Context context, RecyclerView recyclerView) { @@ -65,6 +81,15 @@ public class ConcernFragmentAdapter extends RecyclerView.Adapter(); + locationMap = new ArrayMap<>(); + gameMap = new ArrayMap<>(); + nameMap = new ArrayMap<>(); + statusMap = new ArrayMap<>(); + dismissEntity = new DismissEntity(false); + + //初始化gamemap + DownloadItemUtils.initializeGameMap(context, gameMap); + ConcernManager concernManager = new ConcernManager(context); concernList = concernManager.getConcernGame(); @@ -128,9 +153,30 @@ public class ConcernFragmentAdapter extends RecyclerView.Adapter kv = new HashMap(); + Map kv = new HashMap<>(); kv.put("名字", entity.getName()); kv.put("位置", i + 1); - DataUtils.onEvent(context, "点击", "我的光环-已安装", kv); + DataUtils.onEvent(context, "点击", "我的光环-已关注", kv); if (entity.getPluginPlatform() != null) { Intent intent = new Intent(context, GameDetailsActivity.class); intent.putExtra("gameId", entity.getId()); - intent.putExtra("entrance", "我的光环-已安装"); + intent.putExtra("entrance", "我的光环-已关注"); context.startActivity(intent); } else { AppController.put("GameEntity", entity); Intent intent = new Intent(context, GameDetailsActivity.class); - intent.putExtra("entrance", "我的光环-已安装"); + intent.putExtra("entrance", "我的光环-已关注"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } } }); -// DownloadItemUtils.setOnClickListener(context, holder.downloadBtn, -// holder.download_speed, holder.download_percentage, entity, i, -// this, -// statusMap, platformMap, "我的光环-已安装", -// dismissEntity, "我的光环-已安装" + ":" + entity.getName()); + DownloadItemUtils.setOnClickListener(context, holder.downloadBtn, + holder.download_speed, holder.download_percentage, entity, i, + this, statusMap, "我的光环-已关注", + dismissEntity, "我的光环-已关注" + ":" + entity.getName()); -// DownloadItemUtils.updateItem(context, holder.labelList, -// holder.game_progressbar, holder.game_ll_info, holder.download_speed, -// holder.download_percentage, holder.downloadBtn, entity, platformMap, -// statusMap, entity.getPluginPlatform() != null); + DownloadItemUtils.updateItem(context, holder.gameDes, + holder.game_progressbar, holder.game_ll_info, holder.download_speed, + holder.download_percentage, holder.downloadBtn, entity, statusMap, true); + } + + public ArrayMap getLocationMap() { + return locationMap; + } + + public ArrayMap> getGameMap() { + return gameMap; + } + + public ArrayMap getNameMap() { + return nameMap; + } + + public ArrayMap getStatusMap() { + return statusMap; + } + + public DismissEntity getDismissEntity() { + return dismissEntity; + } + + public List getGameList() { + return gameList; } } diff --git a/app/src/main/java/com/gh/gamecenter/personal/InstallFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/personal/InstallFragmentAdapter.java index d53b6b2fa6..fc2cb67d2a 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/InstallFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/personal/InstallFragmentAdapter.java @@ -70,8 +70,8 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter(); - sortedList = new ArrayList(); + gameList = new ArrayList<>(); + sortedList = new ArrayList<>(); isRemove = false; @@ -82,7 +82,7 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter ids = new ArrayList(); + List ids = new ArrayList<>(); for (MyGameInfo info : sortedList) { if (!ids.contains(info.getGame_id())) { ids.add(info.getGame_id()); @@ -97,10 +97,10 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter signatureList = new ArrayList(); - ArrayList unsignatureList = new ArrayList(); - ArrayList noopenList = new ArrayList(); - ArrayList oftenuseList = new ArrayList(); + ArrayList signatureList = new ArrayList<>(); + ArrayList unsignatureList = new ArrayList<>(); + ArrayList noopenList = new ArrayList<>(); + ArrayList oftenuseList = new ArrayList<>(); PackageManager pManager = new PackageManager(context); TrafficUtils tUtils = TrafficUtils.getInstance(context); @@ -176,7 +176,7 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter ids) { - final List result = new ArrayList(); + final List result = new ArrayList<>(); final int size = ids.size(); count = 0; for (int i = 0; i < ids.size(); i++) { @@ -184,7 +184,6 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter() { - @Override public void onResponse(JSONObject response) { result.add(response); @@ -193,21 +192,21 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter data) { Gson gson = new Gson(); - List gameList = new ArrayList(); + List gameList = new ArrayList<>(); for (int i = 0, size = data.size(); i < size; i++) { gameList.add(gson.fromJson(data.get(i).toString(), GameEntity.class)); } @@ -228,7 +227,7 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter 1) { for (ApkEntity apkEntity : newEntity.getApk()) { if (sortedList.get(i).getPackage_name().equals(apkEntity.getPackageName())) { - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); list.add(apkEntity); newEntity.setApk(list); break; @@ -250,19 +249,19 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter> map = new ArrayMap>(); - ArrayList keys = new ArrayList(); + ArrayMap> map = new ArrayMap<>(); + ArrayList keys = new ArrayList<>(); ArrayList list; for (GameEntity gameEntity : this.gameList) { list = map.get(gameEntity.getId()); if (list == null) { - list = new ArrayList(); + list = new ArrayList<>(); map.put(gameEntity.getId(), list); keys.add(gameEntity.getId()); } list.add(gameEntity); } - list = new ArrayList(); + list = new ArrayList<>(); for (String key : keys) { list.addAll(map.get(key)); } @@ -375,7 +374,7 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter kv = new HashMap(); + Map kv = new HashMap<>(); kv.put("名字", entity.getName()); kv.put("位置", i + 1); DataUtils.onEvent(context, "点击", "我的光环-已安装", kv); diff --git a/app/src/main/res/drawable-hdpi/collection_colse.png b/app/src/main/res/drawable-hdpi/collection_colse.png new file mode 100644 index 0000000000000000000000000000000000000000..73e975cc10a360f88648d893b539b212e0a1c063 GIT binary patch literal 3066 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 T)wE%EumvVYW|yiBTw?wQ!c@m1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/open_collection.png b/app/src/main/res/drawable-hdpi/collection_open.png similarity index 100% rename from app/src/main/res/drawable-hdpi/open_collection.png rename to app/src/main/res/drawable-hdpi/collection_open.png diff --git a/app/src/main/res/drawable-hdpi/colse_collection.png b/app/src/main/res/drawable-hdpi/colse_collection.png deleted file mode 100644 index 6d7bb065d53b7769a8d34723b1f9f8908e166caf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1144 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 aXRzW=9$GYSmn_x(OQ#G8Ln?yTeeySLeSaeW diff --git a/app/src/main/res/drawable-xhdpi/logo_black.png b/app/src/main/res/drawable-xhdpi/logo_black.png index d41c3f144624298b8c20ee1d24139e5fb97aa738..46011adf3b38e4afdd9ca380c9d2790880c8728d 100644 GIT binary patch delta 25896 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 delta 25864 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 F@qd#{qb~pe diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ace250cf88..87aeec32b9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -30,7 +30,7 @@ android:baselineAligned="false" > - + android:orientation="vertical" + android:background="@drawable/reuse_listview_item_style" + android:paddingLeft="12dp" + android:paddingRight="12dp" + android:paddingTop="15dp" + android:paddingBottom="15dp" + app:left="8dp" + app:bottom="8dp" + app:right="8dp"> - - - - + android:layout_height="wrap_content"> + + + + + + - - - - - - - - + + + + + + + + - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/plugin1_fragment.xml b/app/src/main/res/layout/fragment_game.xml similarity index 86% rename from app/src/main/res/layout/plugin1_fragment.xml rename to app/src/main/res/layout/fragment_game.xml index 18c43643c6..71dab34d6b 100644 --- a/app/src/main/res/layout/plugin1_fragment.xml +++ b/app/src/main/res/layout/fragment_game.xml @@ -4,19 +4,19 @@ android:layout_height="match_parent" > - - + + - + android:layout_height="wrap_content" + android:background="@color/background"> + + - - - + - + - + - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/game_download_item.xml b/app/src/main/res/layout/game_download_item.xml index ffabaa0eaa..712628a477 100644 --- a/app/src/main/res/layout/game_download_item.xml +++ b/app/src/main/res/layout/game_download_item.xml @@ -57,7 +57,7 @@ android:layout_height="18dp" android:layout_marginRight="7dp" android:layout_marginTop="7dp" - android:src="@drawable/open_collection" + android:src="@drawable/collection_open" android:visibility="gone" android:layout_alignParentRight="true" android:gravity="center"/>