package com.thankcreate.care.tool.misc; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HTTP; import org.json.JSONArray; import org.json.JSONObject; import android.R.bool; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.Log; import com.thankcreate.care.App; import com.thankcreate.care.AppConstants; import com.thankcreate.care.R; import com.thankcreate.care.tool.converter.BlessConverter; import com.thankcreate.care.tool.ui.ToastHelper; import com.thankcreate.care.viewmodel.BlessItemViewModel; import com.thankcreate.care.viewmodel.ChatItemViewModel; public class BlessHelper { private List<String> listImagePath = new ArrayList<String>(); private int defaultBkgIdArray[] = {R.drawable.bkg_blessing_1, R.drawable.bkg_blessing_2, R.drawable.bkg_blessing_3}; private final int MAX_BKG_COUNT = 3; private final int MIN_BLESS_ITEM_COUNT = 3; // 注意,此处defaultName和defaultContent的长度比须到少是MIN_BLESS_ITEM_COUNT private final String defaultName[] = {"tankery", "豪子", "一个孤独的散步者"}; private final String defaultContent[] = {"生命中最悲哀的事莫过于放弃追逐你所爱的人,看着她远离。无论你追逐多久,你还是要让他走。", "人生为棋,我愿为卒,行动虽慢,可谁曾见我后退一步", "不要期待得到爱,慢慢地等待你的爱在她的心中生根发芽,即使不会,你也当满足,因为你心中已有一片绿洲。"}; public void cacheBlessImages() { fetchListImagePath(new FetchCompleteListener() { @Override public void fetchComplete() { try { fetchImages(); } catch (Exception e) { e.printStackTrace(); } } }); } public List<Drawable> getBlessImages(Context context) { List<Drawable> resList = new ArrayList<Drawable>(); File myDir = App.getAppContext().getFilesDir(); File blessingDir = new File(myDir, AppConstants.BLESSING_BACKGROUND_DIR); if(!blessingDir.exists()) { try { blessingDir.mkdirs(); } catch (Exception e) { return resList; } } File alreadyExistsFile[] = blessingDir.listFiles(); // 如果当前image本地存储文件夹里多于MAX_BKG_COUNT张,则只取MAX_BKG_COUNT张 // 绝对多数情况下,应该是小于或等于MAX_BKG_COUNT张的 int localCount = alreadyExistsFile.length > MAX_BKG_COUNT ? MAX_BKG_COUNT : alreadyExistsFile.length; for(int i = 0; i < localCount; i++) { try { Bitmap bitmap = BitmapFactory.decodeFile(alreadyExistsFile[i].getAbsolutePath()); if(bitmap != null) { BitmapDrawable bd = new BitmapDrawable(context.getResources(), bitmap); resList.add(bd); } } catch (Exception e) { continue; } } // 看看当前加载的张数是否小于MAX_BKG_COUNT张,如果少了,直接从包内的默认bkg中加载 int remainCount = MAX_BKG_COUNT - resList.size(); if(remainCount > 0) { for(int i = 0 ; i < remainCount; i++) { try { Drawable defaultDrawable = context.getResources().getDrawable(defaultBkgIdArray[i]); resList.add(defaultDrawable); } catch (Exception e) { continue; } } } return resList; } private void fetchImages() { if(listImagePath == null || listImagePath.size() == 0) return; // 先检查本地是否已经下载过这些图了,直接通过文件名来检测 File myDir = App.getAppContext().getFilesDir(); File blessingDir = new File(myDir, AppConstants.BLESSING_BACKGROUND_DIR); if(!blessingDir.exists()) { try { blessingDir.mkdirs(); } catch (Exception e) { return; } } String alreadyExistsFileStr[] = blessingDir.list(); for (String fullURL : listImagePath) { try { String fileName = StringTool.getFileName(fullURL); if(!isOneOf(fileName, alreadyExistsFileStr)) { fetchImage(fullURL); } } catch (Exception e) { continue; } } // 本地缓存的图中,删掉listImagePath中不存在的内容 // 这是因为每次都是直接拿本地那个目录中的所有图 // 如果不删,旧图会一直堆积 List<String> listImageName = new ArrayList<String>(); for (String path: listImagePath) { listImageName.add(StringTool.getFileName(path)); } String[] listImageNameArray = {}; listImageNameArray = listImageName.toArray(listImageNameArray); File allFile[] = blessingDir.listFiles(); if(allFile == null || allFile.length == 0) return; for (File file : allFile) { String fileName = StringTool.getFileName(file.getAbsolutePath()); if(!isOneOf(fileName ,listImageNameArray)) { file.delete(); } } } /** * 如果url是空的话,直接返回true,这样从后续逻辑上就不会去做图片下载了 * @param url * @param urlArray * @return */ private boolean isOneOf(String url, String urlArray[]) { if(urlArray == null || urlArray.length == 0) return false; if(url == null) return true; for(int i = 0; i < urlArray.length; i++) { if(url.equalsIgnoreCase(urlArray[i])) { return true; } } return false; } private void fetchImage(String fullURL) { if(fullURL == null || StringTool.isNullOrEmpty(fullURL)) return; File myDir = App.getAppContext().getFilesDir(); File blessingDir = new File(myDir, AppConstants.BLESSING_BACKGROUND_DIR); if(!blessingDir.exists()) { try { blessingDir.mkdirs(); } catch (Exception e) { return; } } try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(fullURL); HttpResponse response = httpClient.execute(request); InputStream is = response.getEntity().getContent(); Bitmap bmp =BitmapFactory.decodeStream(is); if(bmp == null) return; String fileName = StringTool.getFileName(fullURL); File imageFile = new File(blessingDir ,fileName); FileOutputStream fout = new FileOutputStream(imageFile); bmp.compress(Bitmap.CompressFormat.JPEG, 100, fout); fout.flush(); fout.close(); } catch (Exception e) { return; } } private void fetchListImagePath(final FetchCompleteListener listener) { new Thread(new Runnable() { @Override public void run() { try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(AppConstants.BLESS_IMAGES_PATH_DOC_URL); HttpResponse response = httpClient.execute(request); InputStream is = response.getEntity().getContent(); String plainPath = StreamTool.inputStreamToString(is); String pathArray[] = plainPath.split(";"); for (int i = 0; i < pathArray.length; i++) { listImagePath.add(pathArray[i].trim()); } } catch (Exception e) { listImagePath.clear(); } finally { listener.fetchComplete(); } } }).start(); } public interface FetchCompleteListener { public void fetchComplete(); } public interface FetchBlessItemListener { public void fetchComplete(List<BlessItemViewModel> resList); } public void cacheBlessPassedItem() { fetchBlessItem(10, true, new FetchBlessItemListener() { @Override public void fetchComplete(List<BlessItemViewModel> resList) { if(resList == null || resList.size() == 0) return; // 存到缓存 try { File myDir = App.getAppContext().getFilesDir(); File cacheFile = new File(myDir, AppConstants.CACHE_BLESS_ITEM); FileOutputStream fos = new FileOutputStream(cacheFile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(resList); oos.close(); } catch (Exception e) { e.printStackTrace(); } } }); } public List<BlessItemViewModel> getCachedBlessPassedItem() { List<BlessItemViewModel> listModel = null; try { File myDir = App.getAppContext().getFilesDir(); File cacheFile = new File(myDir, AppConstants.CACHE_BLESS_ITEM); FileInputStream fis = new FileInputStream(cacheFile); ObjectInputStream ois = new ObjectInputStream(fis); listModel = (ArrayList<BlessItemViewModel>) ois.readObject(); ois.close(); } catch (Exception e) { listModel = null; e.printStackTrace(); } if(listModel == null) listModel = new ArrayList<BlessItemViewModel>(); // 如果连最低项数都达不到,插入写死的几条 int remain = MIN_BLESS_ITEM_COUNT - listModel.size(); if(remain > 0) { for(int i = 0; i < remain; ++i) { BlessItemViewModel item = new BlessItemViewModel(); item.title = defaultName[i]; item.content = defaultContent[i]; listModel.add(item); } } return listModel; } public void fetchBlessItem(final int count, final boolean isPassed, final FetchBlessItemListener listener) { if(listener == null) return; final List<BlessItemViewModel> resList = new ArrayList<BlessItemViewModel>(); new Thread(new Runnable() { @Override public void run() { try { DefaultHttpClient httpClient = new DefaultHttpClient(); String paramCount; if(count == 0) paramCount = "20"; else { paramCount = String.valueOf(count); } String paramNeedPassed = isPassed ? "1" : "0"; String finalString = String.format("%s?count=%s&needPassed=%s", AppConstants.BLESS_GET_URL, paramCount, paramNeedPassed); HttpGet request = new HttpGet(finalString); HttpResponse response = httpClient.execute(request); InputStream is = response.getEntity().getContent(); String plainJsonStr = StreamTool.inputStreamToString(is); JSONArray itemsArray = new JSONArray(plainJsonStr); if(itemsArray != null && itemsArray.length() != 0 ) { for(int i = 0 ; i < itemsArray.length(); i++) { JSONObject ob = itemsArray.getJSONObject(i); BlessItemViewModel item = BlessConverter.convertToViewModel(ob); if(item != null) { resList.add(item); } } } } catch (Exception e) { ToastHelper.show(">_< 获取祝福墙时失败,请确保网络连接正常。"); } listener.fetchComplete(resList); } }).start(); } public interface PostBlessItemListener { public void postComplete(); } public void postBlessItem(String name, String content, final PostBlessItemListener listener) { Log.i("timestamp", String.valueOf(System.currentTimeMillis())); if(listener == null) return; if(StringTool.isNullOrEmpty(name)) { name = "匿名"; } if(content == null) content = ""; final String finalName = name; final String finalContent = content; new Thread(new Runnable() { @Override public void run() { try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost request = new HttpPost(AppConstants.BLESS_POST_URL); List<NameValuePair> parms= new ArrayList<NameValuePair>(); parms.add(new BasicNameValuePair("name", finalName)); parms.add(new BasicNameValuePair("content", finalContent)); request.setEntity(new UrlEncodedFormEntity(parms, HTTP.UTF_8)); HttpResponse response = httpClient.execute(request); InputStream is = response.getEntity().getContent(); is.close(); } catch (Exception e) { ToastHelper.show(">_< 发送,请确保网络连接正常。"); } listener.postComplete(); } }).start(); } }