From dfbcb3dc76cf3e7c05ce5cdd9d81cf4d64a9f511 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 1 Aug 2013 18:58:15 +0800 Subject: [PATCH 001/241] 1 modify onBottom mutli called bug DropDownListView 2 modify FileNameRuleCurrentTime bug 3 PackageUtils installSilent add more result --- AndroidManifest.xml | 4 +- .../service/impl/FileNameRuleCurrentTime.java | 31 ++-- .../common/service/impl/ImageCache.java | 8 +- .../common/service/impl/ImageSDCardCache.java | 8 +- .../android/common/util/ImageUtils.java | 14 +- .../android/common/util/PackageUtils.java | 142 ++++++++++++++---- .../android/common/view/DropDownListView.java | 11 +- 7 files changed, 157 insertions(+), 61 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c6d9fa9..fee4676 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="16" + android:versionName="3.3.1" > diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java b/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java index 9b9099f..20aa017 100644 --- a/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java +++ b/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java @@ -38,10 +38,6 @@ public String getFileName(String imageUrl) { case TO_MILLIS: time = now.getTimeInMillis(); break; - case HOUR_OF_DAY_TO_MILLIS: - time = ((now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE)) * 60 + now.get(Calendar.SECOND)) - * 1000 + now.get(Calendar.MILLISECOND); - break; case YEAR: time = now.get(Calendar.YEAR); break; @@ -51,17 +47,24 @@ public String getFileName(String imageUrl) { case MILLISECOND: time = now.get(Calendar.MILLISECOND); break; - case HOUR_OF_DAY_TO_MINUTE: + case HOUR_OF_DAY_TO_MILLIS: + time = ((now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE)) * 60 + now.get(Calendar.SECOND)) + * 1000 + now.get(Calendar.MILLISECOND); + break; + case HOUR_OF_DAY_TO_SECONDS: + time = (now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE)) * 60 + now.get(Calendar.SECOND); + break; + case HOUR_OF_DAY_TO_MINUTES: time = now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE); break; case HOUR_TO_MILLIS: time = ((now.get(Calendar.HOUR) * 60 + now.get(Calendar.MINUTE)) * 60 + now.get(Calendar.SECOND)) * 1000 + now.get(Calendar.MILLISECOND); break; - case MINUTE_TO_SECOND: + case MINUTE_TO_SECONDS: time = now.get(Calendar.MINUTE) * 60 + now.get(Calendar.SECOND); break; - case TO_SECOND: + case TO_SECONDS: time = now.getTimeInMillis() / 1000; break; default: @@ -81,20 +84,22 @@ public String getFileName(String imageUrl) { *
  • {@link #MILLISECOND} milliseconds of current time, E.g., at 2012-7-6 14:37:58.365 PM result is 365
  • *
  • {@link #HOUR_OF_DAY_TO_MILLIS} milliseconds of current time from hour(24 hours), E.g., at 2012-7-6 * 14:37:58.365 PM result is 52678365
  • - *
  • {@link #HOUR_OF_DAY_TO_MINUTE} seconds of current time from hour(24 hours), E.g., at 2012-7-6 14:37:58.365 PM - * result is 877
  • + *
  • {@link #HOUR_OF_DAY_TO_SECONDS} seconds of current time from hour(24 hours), E.g., at 2012-7-6 14:37:58.365 + * PM result is 52678
  • + *
  • {@link #HOUR_OF_DAY_TO_MINUTES} minutes of current time from hour(24 hours), E.g., at 2012-7-6 14:37:58.365 + * PM result is 877
  • *
  • {@link #HOUR_TO_MILLIS} milliseconds of current time from hour(12 hours), E.g., at 2012-7-6 14:37:58.365 PM * result is 9478365
  • - *
  • {@link #MINUTE_TO_SECOND} seconds of current time from hour(12 hours), E.g., at 2012-7-6 14:37:58.365 PM + *
  • {@link #MINUTE_TO_SECONDS} seconds of current time from hour(12 hours), E.g., at 2012-7-6 14:37:58.365 PM * result is 2278
  • *
  • {@link #TO_MILLIS} current time in milliseconds, E.g., at 2012-7-6 14:37:58.365 PM result is 1341556678365
  • - *
  • {@link #TO_SECOND} current time in seconds, E.g., at 2012-7-6 14:37:58.365 PM result is 1341556678
  • + *
  • {@link #TO_SECONDS} current time in seconds, E.g., at 2012-7-6 14:37:58.365 PM result is 1341556678
  • * * * @author Trinea 2012-7-6 */ public enum TimeRule { - YEAR, DAY_OF_MONTH, MILLISECOND, HOUR_OF_DAY_TO_MILLIS, HOUR_OF_DAY_TO_MINUTE, HOUR_TO_MILLIS, - MINUTE_TO_SECOND, TO_MILLIS, TO_SECOND + YEAR, DAY_OF_MONTH, MILLISECOND, HOUR_OF_DAY_TO_MILLIS, HOUR_OF_DAY_TO_SECONDS, HOUR_OF_DAY_TO_MINUTES, + HOUR_TO_MILLIS, MINUTE_TO_SECONDS, TO_MILLIS, TO_SECONDS } } diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index c413ad5..da825bb 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -178,12 +178,12 @@ public int getHttpReadTimeOut() { } /** - * set http read image time out, if less than 0, not set. default is not set + * set http read image time out, if less than 0, not set. default is not set, in mills * - * @param httpReadTimeOut + * @param readTimeOutMillis */ - public void setHttpReadTimeOut(int httpReadTimeOut) { - this.httpReadTimeOut = httpReadTimeOut; + public void setHttpReadTimeOut(int readTimeOutMillis) { + this.httpReadTimeOut = readTimeOutMillis; } /** diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 4f4e4cc..d1d90d2 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -244,12 +244,12 @@ public int getHttpReadTimeOut() { } /** - * set http read image time out, if less than 0, not set. default is not set + * set http read image time out, if less than 0, not set. default is not set, in mills * - * @param httpReadTimeOut + * @param readTimeOutMillis */ - public void setHttpReadTimeOut(int httpReadTimeOut) { - this.httpReadTimeOut = httpReadTimeOut; + public void setHttpReadTimeOut(int readTimeOutMillis) { + this.httpReadTimeOut = readTimeOutMillis; } /** diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 1631065..708d7eb 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -110,18 +110,18 @@ public static Drawable byteToDrawable(byte[] b) { * get input stream from network by imageurl, you need to close inputStream yourself * * @param imageUrl - * @param readTimeOut read time out, if less than 0, not set + * @param readTimeOutMillis read time out, if less than 0, not set, in mills * @return * @throws MalformedURLException * @throws IOException */ - public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut) { + public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis) { InputStream stream = null; try { URL url = new URL(imageUrl); HttpURLConnection con = (HttpURLConnection)url.openConnection(); - if (readTimeOut > 0) { - con.setReadTimeout(readTimeOut); + if (readTimeOutMillis > 0) { + con.setReadTimeout(readTimeOutMillis); } stream = con.getInputStream(); } catch (MalformedURLException e) { @@ -138,11 +138,11 @@ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut * get drawable by imageUrl * * @param imageUrl - * @param readTimeOut read time out, if less than 0, not set + * @param readTimeOutMillis read time out, if less than 0, not set, in mills * @return */ - public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOut) { - InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOut); + public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis) { + InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOutMillis); Drawable d = Drawable.createFromStream(stream, "src"); closeInputStream(stream); return d; diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 2098517..782f770 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -9,7 +9,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.util.Log; - import cn.trinea.android.common.util.ShellUtils.CommandResult; /** @@ -86,7 +85,7 @@ public static boolean installNormal(Context context, String filePath) { * @param context file path of package * @param filePath file path of package * @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see - * {@link PackageUtils#INSTALL_FAILED_*} + * {@link PackageUtils#INSTALL_FAILED_*}. same to {@link PackageManager#INSTALL_*} */ public static int installSilent(Context context, String filePath) { if (filePath == null || filePath.length() == 0) { @@ -160,6 +159,28 @@ public static int installSilent(Context context, String filePath) { return INSTALL_FAILED_PACKAGE_CHANGED; } else if (commandResult.errorMsg.contains("INSTALL_FAILED_UID_CHANGED")) { return INSTALL_FAILED_UID_CHANGED; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_NOT_APK")) { + return INSTALL_PARSE_FAILED_NOT_APK; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_MANIFEST")) { + return INSTALL_PARSE_FAILED_BAD_MANIFEST; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION")) { + return INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_NO_CERTIFICATES")) { + return INSTALL_PARSE_FAILED_NO_CERTIFICATES; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES")) { + return INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING")) { + return INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME")) { + return INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID")) { + return INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_MANIFEST_MALFORMED")) { + return INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; + } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_MANIFEST_EMPTY")) { + return INSTALL_PARSE_FAILED_MANIFEST_EMPTY; + } else if (commandResult.errorMsg.contains("INSTALL_FAILED_INTERNAL_ERROR")) { + return INSTALL_FAILED_INTERNAL_ERROR; } } return INSTALL_FAILED_OTHER; @@ -225,159 +246,224 @@ public static boolean isSystemApplication(PackageManager packageManager, String * Installation return code
    * install success. */ - public static final int INSTALL_SUCCEEDED = 1; + public static final int INSTALL_SUCCEEDED = 1; /** * Installation return code
    * the package is already installed. */ - public static final int INSTALL_FAILED_ALREADY_EXISTS = -1; + public static final int INSTALL_FAILED_ALREADY_EXISTS = -1; /** * Installation return code
    * the package archive file is invalid. */ - public static final int INSTALL_FAILED_INVALID_APK = -2; + public static final int INSTALL_FAILED_INVALID_APK = -2; /** * Installation return code
    * the URI passed in is invalid. */ - public static final int INSTALL_FAILED_INVALID_URI = -3; + public static final int INSTALL_FAILED_INVALID_URI = -3; /** * Installation return code
    * the package manager service found that the device didn't have enough storage space to install the app. */ - public static final int INSTALL_FAILED_INSUFFICIENT_STORAGE = -4; + public static final int INSTALL_FAILED_INSUFFICIENT_STORAGE = -4; /** * Installation return code
    * a package is already installed with the same name. */ - public static final int INSTALL_FAILED_DUPLICATE_PACKAGE = -5; + public static final int INSTALL_FAILED_DUPLICATE_PACKAGE = -5; /** * Installation return code
    * the requested shared user does not exist. */ - public static final int INSTALL_FAILED_NO_SHARED_USER = -6; + public static final int INSTALL_FAILED_NO_SHARED_USER = -6; /** * Installation return code
    * a previously installed package of the same name has a different signature than the new package (and the old * package's data was not removed). */ - public static final int INSTALL_FAILED_UPDATE_INCOMPATIBLE = -7; + public static final int INSTALL_FAILED_UPDATE_INCOMPATIBLE = -7; /** * Installation return code
    * the new package is requested a shared user which is already installed on the device and does not have matching * signature. */ - public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8; + public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8; /** * Installation return code
    * the new package uses a shared library that is not available. */ - public static final int INSTALL_FAILED_MISSING_SHARED_LIBRARY = -9; + public static final int INSTALL_FAILED_MISSING_SHARED_LIBRARY = -9; /** * Installation return code
    * the new package uses a shared library that is not available. */ - public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10; + public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10; /** * Installation return code
    * the new package failed while optimizing and validating its dex files, either because there was not enough storage * or the validation failed. */ - public static final int INSTALL_FAILED_DEXOPT = -11; + public static final int INSTALL_FAILED_DEXOPT = -11; /** * Installation return code
    * the new package failed because the current SDK version is older than that required by the package. */ - public static final int INSTALL_FAILED_OLDER_SDK = -12; + public static final int INSTALL_FAILED_OLDER_SDK = -12; /** * Installation return code
    * the new package failed because it contains a content provider with the same authority as a provider already * installed in the system. */ - public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13; + public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13; /** * Installation return code
    * the new package failed because the current SDK version is newer than that required by the package. */ - public static final int INSTALL_FAILED_NEWER_SDK = -14; + public static final int INSTALL_FAILED_NEWER_SDK = -14; /** * Installation return code
    * the new package failed because it has specified that it is a test-only package and the caller has not supplied * the {@link #INSTALL_ALLOW_TEST} flag. */ - public static final int INSTALL_FAILED_TEST_ONLY = -15; + public static final int INSTALL_FAILED_TEST_ONLY = -15; /** * Installation return code
    * the package being installed contains native code, but none that is compatible with the the device's CPU_ABI. */ - public static final int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE = -16; + public static final int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE = -16; /** * Installation return code
    * the new package uses a feature that is not available. */ - public static final int INSTALL_FAILED_MISSING_FEATURE = -17; + public static final int INSTALL_FAILED_MISSING_FEATURE = -17; /** * Installation return code
    * a secure container mount point couldn't be accessed on external media. */ - public static final int INSTALL_FAILED_CONTAINER_ERROR = -18; + public static final int INSTALL_FAILED_CONTAINER_ERROR = -18; /** * Installation return code
    * the new package couldn't be installed in the specified install location. */ - public static final int INSTALL_FAILED_INVALID_INSTALL_LOCATION = -19; + public static final int INSTALL_FAILED_INVALID_INSTALL_LOCATION = -19; /** * Installation return code
    * the new package couldn't be installed in the specified install location because the media is not available. */ - public static final int INSTALL_FAILED_MEDIA_UNAVAILABLE = -20; + public static final int INSTALL_FAILED_MEDIA_UNAVAILABLE = -20; /** * Installation return code
    * the new package couldn't be installed because the verification timed out. */ - public static final int INSTALL_FAILED_VERIFICATION_TIMEOUT = -21; + public static final int INSTALL_FAILED_VERIFICATION_TIMEOUT = -21; /** * Installation return code
    * the new package couldn't be installed because the verification did not succeed. */ - public static final int INSTALL_FAILED_VERIFICATION_FAILURE = -22; + public static final int INSTALL_FAILED_VERIFICATION_FAILURE = -22; /** * Installation return code
    * the package changed from what the calling program expected. */ - public static final int INSTALL_FAILED_PACKAGE_CHANGED = -23; + public static final int INSTALL_FAILED_PACKAGE_CHANGED = -23; /** * Installation return code
    * the new package is assigned a different UID than it previously held. */ - public static final int INSTALL_FAILED_UID_CHANGED = -24; + public static final int INSTALL_FAILED_UID_CHANGED = -24; + + /** + * Installation return code
    + * if the parser was given a path that is not a file, or does not end with the expected '.apk' extension. + */ + public static final int INSTALL_PARSE_FAILED_NOT_APK = -100; + + /** + * Installation return code
    + * if the parser was unable to retrieve the AndroidManifest.xml file. + */ + public static final int INSTALL_PARSE_FAILED_BAD_MANIFEST = -101; + + /** + * Installation return code
    + * if the parser encountered an unexpected exception. + */ + public static final int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION = -102; + + /** + * Installation return code
    + * if the parser did not find any certificates in the .apk. + */ + public static final int INSTALL_PARSE_FAILED_NO_CERTIFICATES = -103; + + /** + * Installation return code
    + * if the parser found inconsistent certificates on the files in the .apk. + */ + public static final int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES = -104; + + /** + * Installation return code
    + * if the parser encountered a CertificateEncodingException in one of the files in the .apk. + */ + public static final int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING = -105; + + /** + * Installation return code
    + * if the parser encountered a bad or missing package name in the manifest. + */ + public static final int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME = -106; + + /** + * Installation return code
    + * if the parser encountered a bad shared user id name in the manifest. + */ + public static final int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID = -107; + /** + * Installation return code
    + * if the parser encountered some structural problem in the manifest. + */ + public static final int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED = -108; + + /** + * Installation return code
    + * if the parser did not find any actionable tags (instrumentation or application) in the manifest. + */ + public static final int INSTALL_PARSE_FAILED_MANIFEST_EMPTY = -109; + + /** + * Installation return code
    + * if the system failed to install the package because of system issues. + */ + public static final int INSTALL_FAILED_INTERNAL_ERROR = -110; /** * Installation return code
    * other reason */ - public static final int INSTALL_FAILED_OTHER = -1000000; + public static final int INSTALL_FAILED_OTHER = -1000000; } diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index 0435ae3..0f4a4cc 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -111,6 +111,9 @@ public class DropDownListView extends ListView implements OnScrollListener { /** y of point which user touch down **/ private float actionDownPointY; + /** whether is on bottom loading **/ + private boolean isOnBottomLoading = false; + public DropDownListView(Context context){ super(context); init(context); @@ -521,7 +524,8 @@ private void onBottomBegin() { * on bottom loading, you can call it by manual, but you should manual call onBottomComplete at the same time. */ public void onBottom() { - if (isOnBottomStyle) { + if (isOnBottomStyle && !isOnBottomLoading) { + isOnBottomLoading = true; onBottomBegin(); footerButton.performClick(); } @@ -541,6 +545,7 @@ public void onBottomComplete() { } else { footerButton.setText(footerDefaultText); } + isOnBottomLoading = false; } } @@ -888,8 +893,8 @@ private void measureHeaderLayout(View child) { */ private void getAttrs(Context context, AttributeSet attrs) { TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.drop_down_list_attr); - isDropDownStyle = ta.getBoolean(R.styleable.drop_down_list_attr_isDropDownStyle, true); - isOnBottomStyle = ta.getBoolean(R.styleable.drop_down_list_attr_isOnBottomStyle, true); + isDropDownStyle = ta.getBoolean(R.styleable.drop_down_list_attr_isDropDownStyle, false); + isOnBottomStyle = ta.getBoolean(R.styleable.drop_down_list_attr_isOnBottomStyle, false); isAutoLoadOnBottom = ta.getBoolean(R.styleable.drop_down_list_attr_isAutoLoadOnBottom, false); ta.recycle(); } From 97505aaf188966560b5afddab505280c8357a0cc Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 7 Aug 2013 22:57:28 +0800 Subject: [PATCH 002/241] Update README.md --- README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index eef5172..9873cd2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Trinea](http://img.hb.aicdn.com/651ca2996898c9298248b25c1a8b4d464d4cc25f123e-hjMrz5_fw580)个人博客 [http://www.trinea.cn/](http://www.trinea.cn/) +![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)个人博客 [http://www.trinea.cn/](http://www.trinea.cn/) ------------- 总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 具体使用可见[总结的一些android公共库](http://www.trinea.cn/?p=778)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: @@ -7,29 +7,35 @@ #####1. 图片内存缓存 使用见:[图片内存缓存的使用](http://www.trinea.cn/?p=704) 适用:应用中获取图片较多且图片不大的应用,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果如如下: -![ImageCahe](http://img.hb.aicdn.com/5f6ef0ecc5a20ff7a5dd8a94684af7b0f7580d8524b6f-yOCNXi_fw580) +![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) #####2. 图片SD卡缓存 使用见:[图片SD卡缓存的使用](http://www.trinea.cn/?p=757) 适用:应用中获取图片较多且图片较大的情况,在微博、花瓣、美丽说、path这类应用中可以起到很好的效果。效果如如下: -![ImageSDCardCache](http://img.hb.aicdn.com/37f1265d1c2132277694a39d6036d462f848b3625e51-8YB0M2_fw580) +![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview 使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/滚动到底部加载更多及下拉刷新listview的使用) -实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281) +实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281)。效果如如下: +![DropDownListView](http://farm8.staticflickr.com/7376/9312162951_74b597ebaa_o.jpg) #####2. 滑动一页(一个Item)的Gallery -使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery%E6%BB%91%E5%8A%A8%E4%B8%80%E9%A1%B5%E4%B8%80%E4%B8%AAitem%E6%95%88%E6%9E%9C/) +使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery%E6%BB%91%E5%8A%A8%E4%B8%80%E9%A1%B5%E4%B8%80%E4%B8%AAitem%E6%95%88%E6%9E%9C/)。效果如如下: +![ViewPager1](http://farm8.staticflickr.com/7330/9321381014_fb404e2430_o.jpg) +![ViewPager2](http://farm3.staticflickr.com/2827/9321380982_d8619d1601_o.jpg) #####3. 滑动到底部或顶部响应的ScrollView -使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%BA%95%E9%83%A8%E6%88%96%E9%A1%B6%E9%83%A8%E5%93%8D%E5%BA%94%E7%9A%84scrollview%E4%BD%BF%E7%94%A8/) +使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%BA%95%E9%83%A8%E6%88%96%E9%A1%B6%E9%83%A8%E5%93%8D%E5%BA%94%E7%9A%84scrollview%E4%BD%BF%E7%94%A8/)。效果如如下: +![ScrollView](http://farm4.staticflickr.com/3669/9459686814_1a523ceeb6_o.jpg) ####三. 工具类 #####1. Android系统下载管理DownloadManager使用 使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android%E7%B3%BB%E7%BB%9F%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D%E5%8F%8A%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B/) 功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E5%A2%9E%E5%BC%BA%E5%92%8Cbug%E4%BF%AE%E6%94%B9/) +效果如如下: +![downloadManagerDemo](http://www.trinea.cn/wp-content/uploads/2013/05/downloadDemo2.gif) #####2. Android APK root权限静默安装 使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android%E5%B8%B8%E7%94%A8%E4%BB%A3%E7%A0%81%E4%B9%8Bapk-root%E6%9D%83%E9%99%90%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85/) #####3. Android root权限 From 2279a10adc46c12291770ab71f4c20b6358cde1a Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 7 Aug 2013 22:59:18 +0800 Subject: [PATCH 003/241] Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9873cd2..223e22e 100644 --- a/README.md +++ b/README.md @@ -6,27 +6,27 @@ 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 使用见:[图片内存缓存的使用](http://www.trinea.cn/?p=704) -适用:应用中获取图片较多且图片不大的应用,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果如如下: +适用:应用中获取图片较多且图片不大的应用,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: ![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) #####2. 图片SD卡缓存 使用见:[图片SD卡缓存的使用](http://www.trinea.cn/?p=757) -适用:应用中获取图片较多且图片较大的情况,在微博、花瓣、美丽说、path这类应用中可以起到很好的效果。效果如如下: +适用:应用中获取图片较多且图片较大的情况,在微博、花瓣、美丽说、path这类应用中可以起到很好的效果。效果图如下: ![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview 使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/滚动到底部加载更多及下拉刷新listview的使用) -实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281)。效果如如下: +实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281)。效果图如下: ![DropDownListView](http://farm8.staticflickr.com/7376/9312162951_74b597ebaa_o.jpg) #####2. 滑动一页(一个Item)的Gallery -使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery%E6%BB%91%E5%8A%A8%E4%B8%80%E9%A1%B5%E4%B8%80%E4%B8%AAitem%E6%95%88%E6%9E%9C/)。效果如如下: +使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery%E6%BB%91%E5%8A%A8%E4%B8%80%E9%A1%B5%E4%B8%80%E4%B8%AAitem%E6%95%88%E6%9E%9C/)。效果图如下: ![ViewPager1](http://farm8.staticflickr.com/7330/9321381014_fb404e2430_o.jpg) ![ViewPager2](http://farm3.staticflickr.com/2827/9321380982_d8619d1601_o.jpg) #####3. 滑动到底部或顶部响应的ScrollView -使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%BA%95%E9%83%A8%E6%88%96%E9%A1%B6%E9%83%A8%E5%93%8D%E5%BA%94%E7%9A%84scrollview%E4%BD%BF%E7%94%A8/)。效果如如下: +使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%BA%95%E9%83%A8%E6%88%96%E9%A1%B6%E9%83%A8%E5%93%8D%E5%BA%94%E7%9A%84scrollview%E4%BD%BF%E7%94%A8/)。效果图如下: ![ScrollView](http://farm4.staticflickr.com/3669/9459686814_1a523ceeb6_o.jpg) @@ -34,8 +34,8 @@ #####1. Android系统下载管理DownloadManager使用 使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android%E7%B3%BB%E7%BB%9F%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D%E5%8F%8A%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B/) 功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E5%A2%9E%E5%BC%BA%E5%92%8Cbug%E4%BF%AE%E6%94%B9/) -效果如如下: -![downloadManagerDemo](http://www.trinea.cn/wp-content/uploads/2013/05/downloadDemo2.gif) +效果图如下: +![downloadManagerDemo](http://www.trinea.cn/wp-content/uploads/2013/05/downloadDemo2.gif) #####2. Android APK root权限静默安装 使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android%E5%B8%B8%E7%94%A8%E4%BB%A3%E7%A0%81%E4%B9%8Bapk-root%E6%9D%83%E9%99%90%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85/) #####3. Android root权限 From 3f589a78d67a7fa95dee0c4bad50836ca3dfa937 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 7 Aug 2013 23:00:42 +0800 Subject: [PATCH 004/241] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 223e22e..8c38c88 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)个人博客 [http://www.trinea.cn/](http://www.trinea.cn/) ------------- -总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 -具体使用可见[总结的一些android公共库](http://www.trinea.cn/?p=778)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: +总结的一些android公共库,包含缓存(图片缓存(http://www.trinea.cn/?p=704)、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 +具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From e3c00d866b0cf6249262ec03fc29a4dc552057d5 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 7 Aug 2013 23:02:04 +0800 Subject: [PATCH 005/241] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c38c88..1d6df06 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)个人博客 [http://www.trinea.cn/](http://www.trinea.cn/) ------------- -总结的一些android公共库,包含缓存(图片缓存(http://www.trinea.cn/?p=704)、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 +总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 @@ -8,22 +8,26 @@ 使用见:[图片内存缓存的使用](http://www.trinea.cn/?p=704) 适用:应用中获取图片较多且图片不大的应用,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: ![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) + #####2. 图片SD卡缓存 使用见:[图片SD卡缓存的使用](http://www.trinea.cn/?p=757) 适用:应用中获取图片较多且图片较大的情况,在微博、花瓣、美丽说、path这类应用中可以起到很好的效果。效果图如下: ![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) + ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview 使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/滚动到底部加载更多及下拉刷新listview的使用) 实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281)。效果图如下: ![DropDownListView](http://farm8.staticflickr.com/7376/9312162951_74b597ebaa_o.jpg) + #####2. 滑动一页(一个Item)的Gallery 使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery%E6%BB%91%E5%8A%A8%E4%B8%80%E9%A1%B5%E4%B8%80%E4%B8%AAitem%E6%95%88%E6%9E%9C/)。效果图如下: ![ViewPager1](http://farm8.staticflickr.com/7330/9321381014_fb404e2430_o.jpg) ![ViewPager2](http://farm3.staticflickr.com/2827/9321380982_d8619d1601_o.jpg) + #####3. 滑动到底部或顶部响应的ScrollView 使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%BA%95%E9%83%A8%E6%88%96%E9%A1%B6%E9%83%A8%E5%93%8D%E5%BA%94%E7%9A%84scrollview%E4%BD%BF%E7%94%A8/)。效果图如下: @@ -36,8 +40,11 @@ 功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E5%A2%9E%E5%BC%BA%E5%92%8Cbug%E4%BF%AE%E6%94%B9/) 效果图如下: ![downloadManagerDemo](http://www.trinea.cn/wp-content/uploads/2013/05/downloadDemo2.gif) + #####2. Android APK root权限静默安装 使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android%E5%B8%B8%E7%94%A8%E4%BB%A3%E7%A0%81%E4%B9%8Bapk-root%E6%9D%83%E9%99%90%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85/) + #####3. Android root权限 + #####4. 图片工具类 (1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap From abbccae50443bdd797b169396d2e1c7d58650809 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 7 Aug 2013 23:04:40 +0800 Subject: [PATCH 006/241] Update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 1d6df06..6ed2847 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,12 @@ ![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) +#####3. 预取数据缓存 +使用见:[预取数据缓存](http://www.trinea.cn/android/preloaddatacache%e6%94%af%e6%8c%81%e9%a2%84%e5%8f%96%e7%9a%84%e6%95%b0%e6%8d%ae%e7%bc%93%e5%ad%98%ef%bc%8c%e4%bd%bf%e7%94%a8%e7%ae%80%e5%8d%95%ef%bc%8c%e6%94%af%e6%8c%81%e5%a4%9a%e7%a7%8d%e7%bc%93/) +缓存类关系图如下:其中HttpCache为后续计划的http缓存 +![ImageSDCardCache](http://farm4.staticflickr.com/3818/9318670513_1576253fd5_o.jpg) + + ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview 使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/滚动到底部加载更多及下拉刷新listview的使用) @@ -45,6 +51,7 @@ 使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android%E5%B8%B8%E7%94%A8%E4%BB%A3%E7%A0%81%E4%B9%8Bapk-root%E6%9D%83%E9%99%90%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85/) #####3. Android root权限 +直接调用[ShellUtils.execCommand](https://github.com/Trinea/AndroidCommon/blob/master/src/cn/trinea/android/common/util/ShellUtils.java#LC43)方法 #####4. 图片工具类 (1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap From b252b613e5531861d7886cd458fc91fc0d1df741 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 21 Aug 2013 22:16:34 +0800 Subject: [PATCH 007/241] 1 fix install silent fail bug on android 4.2 2 reconstruction of a conditional statement --- AndroidManifest.xml | 4 +- .../common/service/impl/ImageCache.java | 50 ++--- .../common/service/impl/ImageSDCardCache.java | 50 ++--- .../common/service/impl/PreloadDataCache.java | 2 +- .../common/util/DownloadManagerPro.java | 80 ++++--- .../trinea/android/common/util/FileUtils.java | 143 ++++++------ .../android/common/util/ImageUtils.java | 14 +- .../trinea/android/common/util/JSONUtils.java | 3 +- .../trinea/android/common/util/ListUtils.java | 29 ++- .../trinea/android/common/util/MapUtils.java | 29 +-- .../android/common/util/PackageUtils.java | 211 ++++++++++-------- .../android/common/util/ParcelUtils.java | 6 - .../android/common/util/StringUtils.java | 9 +- .../android/common/view/DropDownListView.java | 79 +++---- .../common/view/SlideOnePageGallery.java | 1 - 15 files changed, 368 insertions(+), 342 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index fee4676..44d407a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="17" + android:versionName="3.3.2" > diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index da825bb..4097f32 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -309,38 +309,38 @@ public void handleMessage(Message message) { switch (message.what) { case IMAGE_LOADED_WHAT: MessageObject object = (MessageObject)message.obj; - if (object != null) { - String imageUrl = object.imageUrl; - Drawable drawable = object.drawable; - - if (onImageCallbackListener != null) { - if (isOpenWaitingQueue) { - synchronized (viewSetMap) { - HashSet viewSet = viewSetMap.get(imageUrl); - if (viewSet != null) { - for (View view : viewSet) { - if (view != null) { - onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); - } - } - } - } - } else { - View view = viewMap.get(imageUrl); - if (view != null) { - onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); - } - } - } + if (object == null) { + break; + } + String imageUrl = object.imageUrl; + Drawable drawable = object.drawable; + if (onImageCallbackListener != null) { if (isOpenWaitingQueue) { synchronized (viewSetMap) { - viewSetMap.remove(imageUrl); + HashSet viewSet = viewSetMap.get(imageUrl); + if (viewSet != null) { + for (View view : viewSet) { + if (view != null) { + onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); + } + } + } } } else { - viewMap.remove(imageUrl); + View view = viewMap.get(imageUrl); + if (view != null) { + onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); + } } + } + if (isOpenWaitingQueue) { + synchronized (viewSetMap) { + viewSetMap.remove(imageUrl); + } + } else { + viewMap.remove(imageUrl); } break; } diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index d1d90d2..2e7a95c 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -376,38 +376,38 @@ public void handleMessage(Message message) { case IMAGE_LOADED_WHAT: case IMAGE_RELOADED_WHAT: MessageObject object = (MessageObject)message.obj; - if (object != null) { - String imageUrl = object.imageUrl; - String imagePath = object.imagePath; - - if (onImageSDCallbackListener != null) { - if (isOpenWaitingQueue) { - synchronized (viewSetMap) { - HashSet viewSet = viewSetMap.get(imageUrl); - if (viewSet != null) { - for (View view : viewSet) { - if (view != null) { - onImageSDCallbackListener.onImageLoaded(imageUrl, imagePath, view, - false); - } + if (object == null) { + break; + } + + String imageUrl = object.imageUrl; + String imagePath = object.imagePath; + if (onImageSDCallbackListener != null) { + if (isOpenWaitingQueue) { + synchronized (viewSetMap) { + HashSet viewSet = viewSetMap.get(imageUrl); + if (viewSet != null) { + for (View view : viewSet) { + if (view != null) { + onImageSDCallbackListener.onImageLoaded(imageUrl, imagePath, view, false); } } } - } else { - View view = viewMap.get(imageUrl); - if (view != null) { - onImageSDCallbackListener.onImageLoaded(imageUrl, imagePath, view, false); - } + } + } else { + View view = viewMap.get(imageUrl); + if (view != null) { + onImageSDCallbackListener.onImageLoaded(imageUrl, imagePath, view, false); } } + } - if (isOpenWaitingQueue) { - synchronized (viewSetMap) { - viewSetMap.remove(imageUrl); - } - } else { - viewMap.remove(imageUrl); + if (isOpenWaitingQueue) { + synchronized (viewSetMap) { + viewSetMap.remove(imageUrl); } + } else { + viewMap.remove(imageUrl); } break; } diff --git a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java index bf250a6..c60d409 100644 --- a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java +++ b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java @@ -75,7 +75,7 @@ public class PreloadDataCache extends SimpleCache { private ExecutorService threadPool; private Context context; - private static ConnectivityManager connectivityManager; + private transient ConnectivityManager connectivityManager; /** default count for preload forward **/ public static final int DEFAULT_FORWARD_CACHE_NUMBER = 3; diff --git a/src/cn/trinea/android/common/util/DownloadManagerPro.java b/src/cn/trinea/android/common/util/DownloadManagerPro.java index 85e1726..a388836 100644 --- a/src/cn/trinea/android/common/util/DownloadManagerPro.java +++ b/src/cn/trinea/android/common/util/DownloadManagerPro.java @@ -116,16 +116,18 @@ public int[] getBytesAndStatus(long downloadId) { */ public int pauseDownload(long... ids) { initPauseMethod(); - if (pauseDownload != null) { - try { - return ((Integer)pauseDownload.invoke(downloadManager, ids)).intValue(); - } catch (Exception e) { - /** - * accept all exception, include ClassNotFoundException, NoSuchMethodException, - * InvocationTargetException, NullPointException - */ - e.printStackTrace(); - } + if (pauseDownload == null) { + return -1; + } + + try { + return ((Integer)pauseDownload.invoke(downloadManager, ids)).intValue(); + } catch (Exception e) { + /** + * accept all exception, include ClassNotFoundException, NoSuchMethodException, InvocationTargetException, + * NullPointException + */ + e.printStackTrace(); } return -1; } @@ -138,16 +140,18 @@ public int pauseDownload(long... ids) { */ public int resumeDownload(long... ids) { initResumeMethod(); - if (resumeDownload != null) { - try { - return ((Integer)resumeDownload.invoke(downloadManager, ids)).intValue(); - } catch (Exception e) { - /** - * accept all exception, include ClassNotFoundException, NoSuchMethodException, - * InvocationTargetException, NullPointException - */ - e.printStackTrace(); - } + if (resumeDownload == null) { + return -1; + } + + try { + return ((Integer)resumeDownload.invoke(downloadManager, ids)).intValue(); + } catch (Exception e) { + /** + * accept all exception, include ClassNotFoundException, NoSuchMethodException, InvocationTargetException, + * NullPointException + */ + e.printStackTrace(); } return -1; } @@ -164,26 +168,30 @@ public static boolean isExistPauseAndResumeMethod() { } private static void initPauseMethod() { - if (!isInitPauseDownload) { - isInitPauseDownload = true; - try { - pauseDownload = DownloadManager.class.getMethod(METHOD_NAME_PAUSE_DOWNLOAD, long[].class); - } catch (Exception e) { - // accept all exception - e.printStackTrace(); - } + if (isInitPauseDownload) { + return; + } + + isInitPauseDownload = true; + try { + pauseDownload = DownloadManager.class.getMethod(METHOD_NAME_PAUSE_DOWNLOAD, long[].class); + } catch (Exception e) { + // accept all exception + e.printStackTrace(); } } private static void initResumeMethod() { - if (!isInitResumeDownload) { - isInitResumeDownload = true; - try { - resumeDownload = DownloadManager.class.getMethod(METHOD_NAME_RESUME_DOWNLOAD, long[].class); - } catch (Exception e) { - // accept all exception - e.printStackTrace(); - } + if (isInitResumeDownload) { + return; + } + + isInitResumeDownload = true; + try { + resumeDownload = DownloadManager.class.getMethod(METHOD_NAME_RESUME_DOWNLOAD, long[].class); + } catch (Exception e) { + // accept all exception + e.printStackTrace(); } } diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index ee65bb8..8820efc 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -50,32 +50,33 @@ public class FileUtils { public static StringBuilder readFile(String filePath) { File file = new File(filePath); StringBuilder fileContent = new StringBuilder(""); - if (file != null && file.isFile()) { - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader(file)); - String line = null; - while ((line = reader.readLine()) != null) { - if (!fileContent.toString().equals("")) { - fileContent.append("\r\n"); - } - fileContent.append(line); + if (file == null || !file.isFile()) { + return null; + } + + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(file)); + String line = null; + while ((line = reader.readLine()) != null) { + if (!fileContent.toString().equals("")) { + fileContent.append("\r\n"); } - reader.close(); - return fileContent; - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } + fileContent.append(line); + } + reader.close(); + return fileContent; + } catch (IOException e) { + throw new RuntimeException("IOException occurred. ", e); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + throw new RuntimeException("IOException occurred. ", e); } } } - return null; } /** @@ -152,29 +153,30 @@ public static boolean writeFile(String filePath, InputStream stream) { public static List readFileToList(String filePath) { File file = new File(filePath); List fileContent = new ArrayList(); - if (file != null && file.isFile()) { - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader(file)); - String line = null; - while ((line = reader.readLine()) != null) { - fileContent.add(line); - } - reader.close(); - return fileContent; - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } + if (file == null || !file.isFile()) { + return null; + } + + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(file)); + String line = null; + while ((line = reader.readLine()) != null) { + fileContent.add(line); + } + reader.close(); + return fileContent; + } catch (IOException e) { + throw new RuntimeException("IOException occurred. ", e); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + throw new RuntimeException("IOException occurred. ", e); } } } - return null; } /** @@ -208,14 +210,11 @@ public static String getFileNameWithoutExtension(String filePath) { int filePosi = filePath.lastIndexOf(File.separator); if (filePosi == -1) { return (extenPosi == -1 ? filePath : filePath.substring(0, extenPosi)); - } else { - if (extenPosi == -1) { - return filePath.substring(filePosi + 1); - } else { - return (filePosi < extenPosi ? filePath.substring(filePosi + 1, extenPosi) - : filePath.substring(filePosi + 1)); - } } + if (extenPosi == -1) { + return filePath.substring(filePosi + 1); + } + return (filePosi < extenPosi ? filePath.substring(filePosi + 1, extenPosi) : filePath.substring(filePosi + 1)); } /** @@ -245,10 +244,7 @@ public static String getFileName(String filePath) { } int filePosi = filePath.lastIndexOf(File.separator); - if (filePosi == -1) { - return filePath; - } - return filePath.substring(filePosi + 1); + return (filePosi == -1) ? filePath : filePath.substring(filePosi + 1); } /** @@ -280,10 +276,7 @@ public static String getFolderName(String filePath) { } int filePosi = filePath.lastIndexOf(File.separator); - if (filePosi == -1) { - return ""; - } - return filePath.substring(0, filePosi); + return (filePosi == -1) ? "" : filePath.substring(0, filePosi); } /** @@ -317,12 +310,8 @@ public static String getFileExtension(String filePath) { int filePosi = filePath.lastIndexOf(File.separator); if (extenPosi == -1) { return ""; - } else { - if (filePosi >= extenPosi) { - return ""; - } - return filePath.substring(extenPosi + 1); } + return (filePosi >= extenPosi) ? "" : filePath.substring(extenPosi + 1); } /** @@ -410,22 +399,23 @@ public static boolean deleteFile(String path) { } File file = new File(path); - if (file.exists()) { - if (file.isFile()) { - return file.delete(); - } else if (file.isDirectory()) { - for (File f : file.listFiles()) { - if (f.isFile()) { - f.delete(); - } else if (f.isDirectory()) { - deleteFile(f.getAbsolutePath()); - } - } - return file.delete(); - } + if (!file.exists()) { + return true; + } + if (file.isFile()) { + return file.delete(); + } + if (!file.isDirectory()) { return false; } - return true; + for (File f : file.listFiles()) { + if (f.isFile()) { + f.delete(); + } else if (f.isDirectory()) { + deleteFile(f.getAbsolutePath()); + } + } + return file.delete(); } /** @@ -442,6 +432,7 @@ public static long getFileSize(String path) { if (StringUtils.isBlank(path)) { return -1; } + File file = new File(path); return (file.exists() && file.isFile() ? file.length() : -1); } diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 708d7eb..4afbf84 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -197,12 +197,14 @@ public static Bitmap scaleImage(Bitmap org, float scaleWidth, float scaleHeight) * @param s */ private static void closeInputStream(InputStream s) { - if (s != null) { - try { - s.close(); - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } + if (s == null) { + return; + } + + try { + s.close(); + } catch (IOException e) { + throw new RuntimeException("IOException occurred. ", e); } } } diff --git a/src/cn/trinea/android/common/util/JSONUtils.java b/src/cn/trinea/android/common/util/JSONUtils.java index 0dcd1ba..bc10ce8 100644 --- a/src/cn/trinea/android/common/util/JSONUtils.java +++ b/src/cn/trinea/android/common/util/JSONUtils.java @@ -535,7 +535,8 @@ public static Map getMap(String jsonData, String key) { if (jsonData == null) { return null; - } else if (jsonData.length() == 0) { + } + if (jsonData.length() == 0) { return new HashMap(); } diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index 6ec581b..d87ccd5 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -48,20 +48,20 @@ public static boolean isEmpty(List sourceList) { public static boolean isEquals(ArrayList actual, ArrayList expected) { if (actual == null) { return expected == null; - } else if (expected == null) { + } + if (expected == null) { return false; - } else { - if (actual.size() != expected.size()) { - return false; - } + } + if (actual.size() != expected.size()) { + return false; + } - for (int i = 0; i < actual.size(); i++) { - if (!ObjectUtils.isEquals(actual.get(i), expected.get(i))) { - return false; - } + for (int i = 0; i < actual.size(); i++) { + if (!ObjectUtils.isEquals(actual.get(i), expected.get(i))) { + return false; } - return true; } + return true; } /** @@ -129,7 +129,6 @@ public static String join(List list, String separator) { joinStr.append(separator); } } - return joinStr.toString(); } @@ -159,11 +158,11 @@ public static int addDistinctList(List sourceList, List entryList) { } int sourceCount = sourceList.size(); - for (V entry : entryList) + for (V entry : entryList) { if (!sourceList.contains(entry)) { sourceList.add(entry); } - + } return sourceList.size() - sourceCount; } @@ -181,7 +180,7 @@ public static int distinctList(List sourceList) { int sourceCount = sourceList.size(); int sourceListSize = sourceList.size(); - for (int i = 0; i < sourceListSize; i++) + for (int i = 0; i < sourceListSize; i++) { for (int j = (i + 1); j < sourceListSize; j++) { if (sourceList.get(i).equals(sourceList.get(j))) { sourceList.remove(j); @@ -189,7 +188,7 @@ public static int distinctList(List sourceList) { j--; } } - + } return sourceCount - sourceList.size(); } diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/cn/trinea/android/common/util/MapUtils.java index 84a6ccb..8e47a43 100644 --- a/src/cn/trinea/android/common/util/MapUtils.java +++ b/src/cn/trinea/android/common/util/MapUtils.java @@ -168,7 +168,6 @@ public static K getKeyByValue(Map map, V value) { return entry.getKey(); } } - return null; } @@ -208,19 +207,21 @@ public static Map parseKeyAndValueToMap(String source, String ke } Map keyAndValueMap = new HashMap(); String[] keyAndValueArray = source.split(keyAndValuePairSeparator); - if (keyAndValueArray != null) { - int seperator; - for (String valueEntity : keyAndValueArray) { - if (!StringUtils.isEmpty(valueEntity)) { - seperator = valueEntity.indexOf(keyAndValueSeparator); - if (seperator != -1) { - if (ignoreSpace) { - MapUtils.putMapNotEmptyKey(keyAndValueMap, valueEntity.substring(0, seperator).trim(), - valueEntity.substring(seperator + 1).trim()); - } else { - MapUtils.putMapNotEmptyKey(keyAndValueMap, valueEntity.substring(0, seperator), - valueEntity.substring(seperator + 1)); - } + if (keyAndValueArray == null) { + return null; + } + + int seperator; + for (String valueEntity : keyAndValueArray) { + if (!StringUtils.isEmpty(valueEntity)) { + seperator = valueEntity.indexOf(keyAndValueSeparator); + if (seperator != -1) { + if (ignoreSpace) { + MapUtils.putMapNotEmptyKey(keyAndValueMap, valueEntity.substring(0, seperator).trim(), + valueEntity.substring(seperator + 1).trim()); + } else { + MapUtils.putMapNotEmptyKey(keyAndValueMap, valueEntity.substring(0, seperator), + valueEntity.substring(seperator + 1)); } } } diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 782f770..befd3ab 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -44,14 +44,10 @@ public class PackageUtils { * @return */ public static final int install(Context context, String filePath) { - if (!PackageUtils.isSystemApplication(context)) { - boolean isRoot = ShellUtils.checkRootPermission(); - if (!isRoot) { - return installNormal(context, filePath) ? INSTALL_SUCCEEDED : INSTALL_FAILED_INVALID_URI; - } + if (PackageUtils.isSystemApplication(context) || ShellUtils.checkRootPermission()) { + return installSilent(context, filePath); } - - return installSilent(context, filePath); + return installNormal(context, filePath) ? INSTALL_SUCCEEDED : INSTALL_FAILED_INVALID_URI; } /** @@ -64,20 +60,21 @@ public static final int install(Context context, String filePath) { public static boolean installNormal(Context context, String filePath) { Intent i = new Intent(Intent.ACTION_VIEW); File file = new File(filePath); - if (file != null && file.length() > 0 && file.exists() && file.isFile()) { - i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive"); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(i); - return true; + if (file == null || !file.exists() || !file.isFile() || file.length() <= 0) { + return false; } - return false; + + i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive"); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(i); + return true; } /** * install package silent by root *
      * Attentions: - *
    • Don't call this on the ui thread, it costs some times.
    • + *
    • Don't call this on the ui thread, it may costs some times.
    • *
    • You should add android.permission.INSTALL_PACKAGES in manifest, so no need to request root * permission, if you are system app.
    • *
    @@ -85,7 +82,7 @@ public static boolean installNormal(Context context, String filePath) { * @param context file path of package * @param filePath file path of package * @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see - * {@link PackageUtils#INSTALL_FAILED_*}. same to {@link PackageManager#INSTALL_*} + * {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_* */ public static int installSilent(Context context, String filePath) { if (filePath == null || filePath.length() == 0) { @@ -98,10 +95,11 @@ public static int installSilent(Context context, String filePath) { } /** - * if context is system app, don,t need root permission, but should add in mainfest **/ - StringBuilder command = new StringBuilder().append("pm install -r ").append(filePath.replace(" ", "\\ ")); + StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r ") + .append(filePath.replace(" ", "\\ ")); CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true); if (commandResult.successMsg != null && (commandResult.successMsg.contains("Success") || commandResult.successMsg.contains("success"))) { @@ -110,78 +108,113 @@ public static int installSilent(Context context, String filePath) { Log.e(TAG, new StringBuilder().append("successMsg:").append(commandResult.successMsg).append(", ErrorMsg:") .append(commandResult.errorMsg).toString()); - if (commandResult.errorMsg != null) { - if (commandResult.errorMsg.contains("INSTALL_FAILED_ALREADY_EXISTS")) { - return INSTALL_FAILED_ALREADY_EXISTS; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_APK")) { - return INSTALL_FAILED_INVALID_APK; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_URI")) { - return INSTALL_FAILED_INVALID_URI; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_INSUFFICIENT_STORAGE")) { - return INSTALL_FAILED_INSUFFICIENT_STORAGE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_DUPLICATE_PACKAGE")) { - return INSTALL_FAILED_DUPLICATE_PACKAGE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_NO_SHARED_USER")) { - return INSTALL_FAILED_NO_SHARED_USER; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_UPDATE_INCOMPATIBLE")) { - return INSTALL_FAILED_UPDATE_INCOMPATIBLE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_SHARED_USER_INCOMPATIBLE")) { - return INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_MISSING_SHARED_LIBRARY")) { - return INSTALL_FAILED_MISSING_SHARED_LIBRARY; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_REPLACE_COULDNT_DELETE")) { - return INSTALL_FAILED_REPLACE_COULDNT_DELETE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_DEXOPT")) { - return INSTALL_FAILED_DEXOPT; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_OLDER_SDK")) { - return INSTALL_FAILED_OLDER_SDK; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_CONFLICTING_PROVIDER")) { - return INSTALL_FAILED_CONFLICTING_PROVIDER; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_NEWER_SDK")) { - return INSTALL_FAILED_NEWER_SDK; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_TEST_ONLY")) { - return INSTALL_FAILED_TEST_ONLY; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_CPU_ABI_INCOMPATIBLE")) { - return INSTALL_FAILED_CPU_ABI_INCOMPATIBLE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_MISSING_FEATURE")) { - return INSTALL_FAILED_MISSING_FEATURE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_CONTAINER_ERROR")) { - return INSTALL_FAILED_CONTAINER_ERROR; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_INSTALL_LOCATION")) { - return INSTALL_FAILED_INVALID_INSTALL_LOCATION; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_MEDIA_UNAVAILABLE")) { - return INSTALL_FAILED_MEDIA_UNAVAILABLE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_VERIFICATION_TIMEOUT")) { - return INSTALL_FAILED_VERIFICATION_TIMEOUT; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_VERIFICATION_FAILURE")) { - return INSTALL_FAILED_VERIFICATION_FAILURE; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_PACKAGE_CHANGED")) { - return INSTALL_FAILED_PACKAGE_CHANGED; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_UID_CHANGED")) { - return INSTALL_FAILED_UID_CHANGED; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_NOT_APK")) { - return INSTALL_PARSE_FAILED_NOT_APK; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_MANIFEST")) { - return INSTALL_PARSE_FAILED_BAD_MANIFEST; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION")) { - return INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_NO_CERTIFICATES")) { - return INSTALL_PARSE_FAILED_NO_CERTIFICATES; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES")) { - return INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING")) { - return INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME")) { - return INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID")) { - return INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_MANIFEST_MALFORMED")) { - return INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; - } else if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_MANIFEST_EMPTY")) { - return INSTALL_PARSE_FAILED_MANIFEST_EMPTY; - } else if (commandResult.errorMsg.contains("INSTALL_FAILED_INTERNAL_ERROR")) { - return INSTALL_FAILED_INTERNAL_ERROR; - } + if (commandResult.errorMsg == null) { + return INSTALL_FAILED_OTHER; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_ALREADY_EXISTS")) { + return INSTALL_FAILED_ALREADY_EXISTS; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_APK")) { + return INSTALL_FAILED_INVALID_APK; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_URI")) { + return INSTALL_FAILED_INVALID_URI; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_INSUFFICIENT_STORAGE")) { + return INSTALL_FAILED_INSUFFICIENT_STORAGE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_DUPLICATE_PACKAGE")) { + return INSTALL_FAILED_DUPLICATE_PACKAGE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_NO_SHARED_USER")) { + return INSTALL_FAILED_NO_SHARED_USER; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_UPDATE_INCOMPATIBLE")) { + return INSTALL_FAILED_UPDATE_INCOMPATIBLE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_SHARED_USER_INCOMPATIBLE")) { + return INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_MISSING_SHARED_LIBRARY")) { + return INSTALL_FAILED_MISSING_SHARED_LIBRARY; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_REPLACE_COULDNT_DELETE")) { + return INSTALL_FAILED_REPLACE_COULDNT_DELETE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_DEXOPT")) { + return INSTALL_FAILED_DEXOPT; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_OLDER_SDK")) { + return INSTALL_FAILED_OLDER_SDK; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_CONFLICTING_PROVIDER")) { + return INSTALL_FAILED_CONFLICTING_PROVIDER; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_NEWER_SDK")) { + return INSTALL_FAILED_NEWER_SDK; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_TEST_ONLY")) { + return INSTALL_FAILED_TEST_ONLY; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_CPU_ABI_INCOMPATIBLE")) { + return INSTALL_FAILED_CPU_ABI_INCOMPATIBLE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_MISSING_FEATURE")) { + return INSTALL_FAILED_MISSING_FEATURE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_CONTAINER_ERROR")) { + return INSTALL_FAILED_CONTAINER_ERROR; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_INVALID_INSTALL_LOCATION")) { + return INSTALL_FAILED_INVALID_INSTALL_LOCATION; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_MEDIA_UNAVAILABLE")) { + return INSTALL_FAILED_MEDIA_UNAVAILABLE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_VERIFICATION_TIMEOUT")) { + return INSTALL_FAILED_VERIFICATION_TIMEOUT; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_VERIFICATION_FAILURE")) { + return INSTALL_FAILED_VERIFICATION_FAILURE; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_PACKAGE_CHANGED")) { + return INSTALL_FAILED_PACKAGE_CHANGED; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_UID_CHANGED")) { + return INSTALL_FAILED_UID_CHANGED; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_NOT_APK")) { + return INSTALL_PARSE_FAILED_NOT_APK; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_MANIFEST")) { + return INSTALL_PARSE_FAILED_BAD_MANIFEST; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION")) { + return INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_NO_CERTIFICATES")) { + return INSTALL_PARSE_FAILED_NO_CERTIFICATES; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES")) { + return INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING")) { + return INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME")) { + return INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID")) { + return INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_MANIFEST_MALFORMED")) { + return INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; + } + if (commandResult.errorMsg.contains("INSTALL_PARSE_FAILED_MANIFEST_EMPTY")) { + return INSTALL_PARSE_FAILED_MANIFEST_EMPTY; + } + if (commandResult.errorMsg.contains("INSTALL_FAILED_INTERNAL_ERROR")) { + return INSTALL_FAILED_INTERNAL_ERROR; } return INSTALL_FAILED_OTHER; } diff --git a/src/cn/trinea/android/common/util/ParcelUtils.java b/src/cn/trinea/android/common/util/ParcelUtils.java index 321667c..c7da060 100644 --- a/src/cn/trinea/android/common/util/ParcelUtils.java +++ b/src/cn/trinea/android/common/util/ParcelUtils.java @@ -41,7 +41,6 @@ public static void writeBoolean(boolean b, Parcel out) { * @return */ public static Map readHashMapStringAndString(Parcel in) { - if (in == null) { return null; } @@ -67,7 +66,6 @@ public static Map readHashMapStringAndString(Parcel in) { * @param flags */ public static void writeHashMapStringAndString(Map map, Parcel out, int flags) { - if (map != null) { out.writeInt(map.size()); for (Entry entry : map.entrySet()) { @@ -89,7 +87,6 @@ public static void writeHashMapStringAndString(Map map, Parcel o */ @SuppressWarnings("unchecked") public static Map readHashMapStringKey(Parcel in, ClassLoader loader) { - if (in == null) { return null; } @@ -115,7 +112,6 @@ public static Map readHashMapStringKey(Parcel * @param flags */ public static void writeHashMapStringKey(Map map, Parcel out, int flags) { - if (map != null) { out.writeInt(map.size()); @@ -138,7 +134,6 @@ public static void writeHashMapStringKey(Map m */ @SuppressWarnings("unchecked") public static Map readHashMap(Parcel in, ClassLoader loader) { - if (in == null) { return null; } @@ -163,7 +158,6 @@ public static Map readHashMap * @param flags */ public static void writeHashMap(Map map, Parcel out, int flags) { - if (map != null) { out.writeInt(map.size()); diff --git a/src/cn/trinea/android/common/util/StringUtils.java b/src/cn/trinea/android/common/util/StringUtils.java index ae7b6dc..920cb7f 100644 --- a/src/cn/trinea/android/common/util/StringUtils.java +++ b/src/cn/trinea/android/common/util/StringUtils.java @@ -173,6 +173,7 @@ public static String getHrefInnerHtml(String href) { if (isEmpty(href)) { return ""; } + String hrefReg = ".*<[\\s]*a[\\s]*.*>(.+?)<[\\s]*/a[\\s]*>.*"; Pattern hrefPattern = Pattern.compile(hrefReg, Pattern.CASE_INSENSITIVE); Matcher hrefMatcher = hrefPattern.matcher(href); @@ -200,12 +201,8 @@ public static String getHrefInnerHtml(String href) { * @return */ public static String htmlEscapeCharsToString(String source) { - if (StringUtils.isEmpty(source)) { - return source; - } else { - return source.replaceAll("<", "<").replaceAll(">", ">").replaceAll("&", "&") - .replaceAll(""", "\""); - } + return StringUtils.isEmpty(source) ? source : source.replaceAll("<", "<").replaceAll(">", ">") + .replaceAll("&", "&").replaceAll(""", "\""); } /** diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index 0f4a4cc..67f1546 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -28,7 +28,7 @@ *
  • define isDropDownStyle="true" at layout xml or call {@link #setDropDownStyle(boolean)} to enable drop down style * before
  • *
  • {@link #setOnDropDownListener(OnDropDownListener)} set listener which will be excuted when drop down, but you - * should call {@link #onDropDownComplete()} manual at the end of listener to reinstate status.
  • \ + * should call {@link #onDropDownComplete()} manual at the end of listener to reinstate status. *
  • {@link #setHeaderDefaultText(String)}, {@link #setHeaderLoadingText(String)}, {@link #setHeaderPullText(String)}, * {@link #setHeaderReleaseText(String)}, {@link #setHeaderSecondText(CharSequence)} to set text
  • * @@ -331,45 +331,46 @@ public void setOnBottomListener(OnClickListener onBottomListener) { @Override public boolean onTouchEvent(MotionEvent event) { - if (isDropDownStyle) { - hasReachedTop = false; - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - actionDownPointY = event.getY(); - break; - case MotionEvent.ACTION_MOVE: - adjustHeaderPadding(event); - break; - case MotionEvent.ACTION_UP: - if (!isVerticalScrollBarEnabled()) { - setVerticalScrollBarEnabled(true); - } - /** - * set status when finger leave screen if first item visible and header status is not - * HEADER_STATUS_LOADING - *
      - *
    • if current header status is HEADER_STATUS_RELEASE_TO_LOAD, call onDropDown.
    • - *
    • if current header status is HEADER_STATUS_DROP_DOWN_TO_LOAD, then set header status to - * HEADER_STATUS_CLICK_TO_LOAD and hide header layout.
    • - *
    - */ - if (getFirstVisiblePosition() == 0 && currentHeaderStatus != HEADER_STATUS_LOADING) { - switch (currentHeaderStatus) { - case HEADER_STATUS_RELEASE_TO_LOAD: - onDropDown(); - break; - case HEADER_STATUS_DROP_DOWN_TO_LOAD: - setHeaderStatusClickToLoad(); - setSecondPositionVisible(); - break; - case HEADER_STATUS_CLICK_TO_LOAD: - default: - break; - } + if (!isDropDownStyle) { + return super.onTouchEvent(event); + } + + hasReachedTop = false; + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + actionDownPointY = event.getY(); + break; + case MotionEvent.ACTION_MOVE: + adjustHeaderPadding(event); + break; + case MotionEvent.ACTION_UP: + if (!isVerticalScrollBarEnabled()) { + setVerticalScrollBarEnabled(true); + } + /** + * set status when finger leave screen if first item visible and header status is not + * HEADER_STATUS_LOADING + *
      + *
    • if current header status is HEADER_STATUS_RELEASE_TO_LOAD, call onDropDown.
    • + *
    • if current header status is HEADER_STATUS_DROP_DOWN_TO_LOAD, then set header status to + * HEADER_STATUS_CLICK_TO_LOAD and hide header layout.
    • + *
    + */ + if (getFirstVisiblePosition() == 0 && currentHeaderStatus != HEADER_STATUS_LOADING) { + switch (currentHeaderStatus) { + case HEADER_STATUS_RELEASE_TO_LOAD: + onDropDown(); + break; + case HEADER_STATUS_DROP_DOWN_TO_LOAD: + setHeaderStatusClickToLoad(); + setSecondPositionVisible(); + break; + case HEADER_STATUS_CLICK_TO_LOAD: + default: + break; } - break; - } + } + break; } return super.onTouchEvent(event); } diff --git a/src/cn/trinea/android/common/view/SlideOnePageGallery.java b/src/cn/trinea/android/common/view/SlideOnePageGallery.java index 85725bc..d298215 100644 --- a/src/cn/trinea/android/common/view/SlideOnePageGallery.java +++ b/src/cn/trinea/android/common/view/SlideOnePageGallery.java @@ -31,7 +31,6 @@ private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - int kEvent; if (isScrollingLeft(e1, e2)) { // Check if scrolling left From b33ba0a3a0f3c842adc784bb1c41894fd4b6a161 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 24 Aug 2013 21:37:25 +0800 Subject: [PATCH 008/241] 1 add uninstall silent and normal in PackageUtils.java 2 add TimeUtils.java --- AndroidManifest.xml | 4 +- .../android/common/util/PackageUtils.java | 140 +++++++++++++++++- .../trinea/android/common/util/TimeUtils.java | 63 ++++++++ 3 files changed, 202 insertions(+), 5 deletions(-) create mode 100644 src/cn/trinea/android/common/util/TimeUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 44d407a..c1d27be 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="18" + android:versionName="3.4.2" > diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index befd3ab..63d1a01 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -20,6 +20,12 @@ *
  • {@link PackageUtils#install(Context, String)}
  • * *
      + * Uninstall package + *
    • {@link PackageUtils#uninstallNormal(Context, String)}
    • + *
    • {@link PackageUtils#uninstallSilent(Context, String)}
    • + *
    • {@link PackageUtils#uninstall(Context, String)}
    • + *
    + *
      * Is system application *
    • {@link PackageUtils#isSystemApplication(Context)}
    • *
    • {@link PackageUtils#isSystemApplication(Context, String)}
    • @@ -79,7 +85,7 @@ public static boolean installNormal(Context context, String filePath) { * permission, if you are system app. *
    * - * @param context file path of package + * @param context * @param filePath file path of package * @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see * {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_* @@ -106,8 +112,9 @@ public static int installSilent(Context context, String filePath) { return INSTALL_SUCCEEDED; } - Log.e(TAG, new StringBuilder().append("successMsg:").append(commandResult.successMsg).append(", ErrorMsg:") - .append(commandResult.errorMsg).toString()); + Log.e(TAG, + new StringBuilder().append("installSilent successMsg:").append(commandResult.successMsg) + .append(", ErrorMsg:").append(commandResult.errorMsg).toString()); if (commandResult.errorMsg == null) { return INSTALL_FAILED_OTHER; } @@ -219,6 +226,103 @@ public static int installSilent(Context context, String filePath) { return INSTALL_FAILED_OTHER; } + /** + * uninstall according conditions + *
      + *
    • if system application or rooted, see {@link #uninstallSilent(Context, String)}
    • + *
    • else see {@link #uninstallNormal(Context, String)}
    • + *
    + * + * @param context + * @param packageName package name of app + * @return whether package name is empty + * @return + */ + public static final int uninstall(Context context, String packageName) { + if (PackageUtils.isSystemApplication(context) || ShellUtils.checkRootPermission()) { + return uninstallSilent(context, packageName); + } + return uninstallNormal(context, packageName) ? DELETE_SUCCEEDED : DELETE_FAILED_INVALID_PACKAGE; + } + + /** + * uninstall package normal by system intent + * + * @param context + * @param packageName package name of app + * @return whether package name is empty + */ + public static boolean uninstallNormal(Context context, String packageName) { + if (packageName == null || packageName.length() == 0) { + return false; + } + + Intent i = new Intent(Intent.ACTION_DELETE, Uri.parse(new StringBuilder(32).append("package:") + .append(packageName).toString())); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(i); + return true; + } + + /** + * uninstall package and clear data of app silent by root + * + * @param context + * @param packageName package name of app + * @return + * @see {@link #uninstallSilent(Context, String, boolean)} + */ + public static int uninstallSilent(Context context, String packageName) { + return uninstallSilent(context, packageName, true); + } + + /** + * uninstall package silent by root + *
      + * Attentions: + *
    • Don't call this on the ui thread, it may costs some times.
    • + *
    • You should add android.permission.DELETE_PACKAGES in manifest, so no need to request root + * permission, if you are system app.
    • + *
    + * + * @param context file path of package + * @param packageName package name of app + * @param isKeepData whether keep the data and cache directories around after package removal + * @return
      + *
    • {@link #DELETE_SUCCEEDED} means uninstall success
    • + *
    • {@link #DELETE_FAILED_INTERNAL_ERROR} means internal error
    • + *
    • {@link #DELETE_FAILED_INVALID_PACKAGE} means package name error
    • + *
    • {@link #DELETE_FAILED_PERMISSION_DENIED} means permission denied
    • + */ + public static int uninstallSilent(Context context, String packageName, boolean isKeepData) { + if (packageName == null || packageName.length() == 0) { + return DELETE_FAILED_INVALID_PACKAGE; + } + + /** + * if context is system app, don't need root permission, but should add in mainfest + **/ + StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm uninstall") + .append(isKeepData ? " -k " : " ") + .append(packageName.replace(" ", "\\ ")); + CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true); + if (commandResult.successMsg != null + && (commandResult.successMsg.contains("Success") || commandResult.successMsg.contains("success"))) { + return DELETE_SUCCEEDED; + } + Log.e(TAG, + new StringBuilder().append("uninstallSilent successMsg:").append(commandResult.successMsg) + .append(", ErrorMsg:").append(commandResult.errorMsg).toString()); + if (commandResult.errorMsg == null) { + return DELETE_FAILED_INTERNAL_ERROR; + } + if (commandResult.errorMsg.contains("Permission denied")) { + return DELETE_FAILED_PERMISSION_DENIED; + } + return DELETE_FAILED_INTERNAL_ERROR; + } + /** * whether context is system application * @@ -499,4 +603,34 @@ public static boolean isSystemApplication(PackageManager packageManager, String * other reason */ public static final int INSTALL_FAILED_OTHER = -1000000; + + /** + * Uninstall return code
      + * uninstall success. + */ + public static final int DELETE_SUCCEEDED = 1; + + /** + * Uninstall return code
      + * uninstall fail if the system failed to delete the package for an unspecified reason. + */ + public static final int DELETE_FAILED_INTERNAL_ERROR = -1; + + /** + * Uninstall return code
      + * uninstall fail if the system failed to delete the package because it is the active DevicePolicy manager. + */ + public static final int DELETE_FAILED_DEVICE_POLICY_MANAGER = -2; + + /** + * Uninstall return code
      + * uninstall fail if pcakge name is invalid + */ + public static final int DELETE_FAILED_INVALID_PACKAGE = -3; + + /** + * Uninstall return code
      + * uninstall fail if permission denied + */ + public static final int DELETE_FAILED_PERMISSION_DENIED = -4; } diff --git a/src/cn/trinea/android/common/util/TimeUtils.java b/src/cn/trinea/android/common/util/TimeUtils.java new file mode 100644 index 0000000..bfd8b86 --- /dev/null +++ b/src/cn/trinea/android/common/util/TimeUtils.java @@ -0,0 +1,63 @@ +package cn.trinea.android.common.util; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * TimeUtils + * + * @author Trinea 2013-8-24 + */ +public class TimeUtils { + + public static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public static final SimpleDateFormat DATE_FORMAT_DATE = new SimpleDateFormat("yyyy-MM-dd"); + + /** + * long time to string + * + * @param timeInMillis + * @param dateFormat + * @return + */ + public static String getTime(long timeInMillis, SimpleDateFormat dateFormat) { + return dateFormat.format(new Date(timeInMillis)); + } + + /** + * long time to string, format is {@link #DEFAULT_DATE_FORMAT} + * + * @param timeInMillis + * @return + */ + public static String getTime(long timeInMillis) { + return getTime(timeInMillis, DEFAULT_DATE_FORMAT); + } + + /** + * get current time in milliseconds + * + * @return + */ + public static long getCurrentTimeInLong() { + return System.currentTimeMillis(); + } + + /** + * get current time in milliseconds, format is {@link #DEFAULT_DATE_FORMAT} + * + * @return + */ + public static String getCurrentTimeInString() { + return getTime(getCurrentTimeInLong()); + } + + /** + * get current time in milliseconds + * + * @return + */ + public static String getCurrentTimeInString(SimpleDateFormat dateFormat) { + return getTime(getCurrentTimeInLong(), dateFormat); + } +} From 743983b2fd572f66887fb0457899fce499e63c6e Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 23 Sep 2013 10:56:05 +0800 Subject: [PATCH 009/241] update readme update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6ed2847..cd24bc6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)个人博客 [http://www.trinea.cn/](http://www.trinea.cn/) +![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)个人博客 [http://www.trinea.cn/](http://www.trinea.cn/) 关注Android、Java、性能优化 ------------- 总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: From de0379cfd5ced0cf6282072ec5172f2beca18e8f Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 23 Sep 2013 10:58:40 +0800 Subject: [PATCH 010/241] update readme update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cd24bc6..4d4127a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)个人博客 [http://www.trinea.cn/](http://www.trinea.cn/) 关注Android、Java、性能优化 +![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)个人博客 [www.trinea.cn](http://www.trinea.cn/) 关注Android,Java,性能优化 ------------- 总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: From 93ee2a3d2c8090d8c119b0f70c33317307c03f67 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 23 Sep 2013 10:59:56 +0800 Subject: [PATCH 011/241] update readme update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d4127a..6879c2d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)个人博客 [www.trinea.cn](http://www.trinea.cn/) 关注Android,Java,性能优化 +![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- +个人博客[www.trinea.cn](http://www.trinea.cn/) 关注Android、Java、性能优化 总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: ####一. 缓存类 From 69e511333c1dc3889f5a0ccfc3b534fb09b29c5d Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 23 Sep 2013 11:01:20 +0800 Subject: [PATCH 012/241] update readme update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6879c2d..2b7f73d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -个人博客[www.trinea.cn](http://www.trinea.cn/) 关注Android、Java、性能优化 +####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注Android、Java、性能优化 总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: ####一. 缓存类 From 43cd99c7582294d2e48c75585f63fddc67dc07fe Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 24 Sep 2013 10:29:31 +0800 Subject: [PATCH 013/241] update demo apk url update demo apk url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b7f73d..b5df5cd 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ------------- ####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注Android、Java、性能优化 总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 -具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://code.google.com/p/trinea-android-demo/),主要包括: +具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),主要包括: ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From 8b952382ebed183b3395576c055447249183306d Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 24 Sep 2013 12:22:15 +0800 Subject: [PATCH 014/241] add PreferencesUtils.java TrineaAndroidCommon add PreferencesUtils.java add getHeaderLayout,getFooterLayout for DropDownListView --- AndroidManifest.xml | 4 +- .../android/common/util/PreferencesUtils.java | 244 ++++++++++++++++++ .../android/common/view/DropDownListView.java | 18 ++ 3 files changed, 264 insertions(+), 2 deletions(-) create mode 100644 src/cn/trinea/android/common/util/PreferencesUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c1d27be..e2eb8c2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="19" + android:versionName="3.5.2" > diff --git a/src/cn/trinea/android/common/util/PreferencesUtils.java b/src/cn/trinea/android/common/util/PreferencesUtils.java new file mode 100644 index 0000000..a80474b --- /dev/null +++ b/src/cn/trinea/android/common/util/PreferencesUtils.java @@ -0,0 +1,244 @@ +package cn.trinea.android.common.util; + +import android.content.Context; +import android.content.SharedPreferences; + +/** + * PreferencesUtils, easy to get or put data + *
        + * Preference Name + *
      • you can change preference name by {@link #PREFERENCE_NAME}
      • + *
      + *
        + * Put Value + *
      • put string {@link #putString(Context, String, String)}
      • + *
      • put int {@link #putInt(Context, String, int)}
      • + *
      • put long {@link #putLong(Context, String, long)}
      • + *
      • put float {@link #putFloat(Context, String, float)}
      • + *
      • put boolean {@link #putBoolean(Context, String, boolean)}
      • + *
      + *
        + * Get Value + *
      • get string {@link #getString(Context, String)}, {@link #getString(Context, String, String)}
      • + *
      • get int {@link #getInt(Context, String)}, {@link #getInt(Context, String, int)}
      • + *
      • get long {@link #getLong(Context, String)}, {@link #getLong(Context, String, long)}
      • + *
      • get float {@link #getFloat(Context, String)}, {@link #getFloat(Context, String, float)}
      • + *
      • get boolean {@link #getBoolean(Context, String)}, {@link #getBoolean(Context, String, boolean)}
      • + *
      + * + * @author Trinea 2013-3-6 + */ +public class PreferencesUtils { + + public static final String PREFERENCE_NAME = "TrineaAndroidCommon"; + + /** + * put string preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent storage. + */ + public static boolean putString(Context context, String key, String value) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(key, value); + return editor.commit(); + } + + /** + * get string preferences + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or null. Throws ClassCastException if there is a preference with this + * name that is not a string + * @see {@link #getString(Context, String, String)} + */ + public static String getString(Context context, String key) { + return getString(context, key, null); + } + + /** + * get string preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with + * this name that is not a string + */ + public static String getString(Context context, String key, String defaultValue) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getString(key, defaultValue); + } + + /** + * put int preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent storage. + */ + public static boolean putInt(Context context, String key, int value) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putInt(key, value); + return editor.commit(); + } + + /** + * get int preferences + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this + * name that is not a int + * @see {@link #getInt(Context, String, int)} + */ + public static int getInt(Context context, String key) { + return getInt(context, key, -1); + } + + /** + * get int preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with + * this name that is not a int + */ + public static int getInt(Context context, String key, int defaultValue) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getInt(key, defaultValue); + } + + /** + * put long preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent storage. + */ + public static boolean putLong(Context context, String key, long value) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putLong(key, value); + return editor.commit(); + } + + /** + * get long preferences + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this + * name that is not a long + * @see {@link #getLong(Context, String, long)} + */ + public static long getLong(Context context, String key) { + return getLong(context, key, -1); + } + + /** + * get long preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with + * this name that is not a long + */ + public static long getLong(Context context, String key, long defaultValue) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getLong(key, defaultValue); + } + + /** + * put float preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent storage. + */ + public static boolean putFloat(Context context, String key, float value) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putFloat(key, value); + return editor.commit(); + } + + /** + * get float preferences + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this + * name that is not a float + * @see {@link #getFloat(Context, String, float)} + */ + public static float getFloat(Context context, String key) { + return getFloat(context, key, -1); + } + + /** + * get float preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with + * this name that is not a float + */ + public static float getFloat(Context context, String key, float defaultValue) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getFloat(key, defaultValue); + } + + /** + * put boolean preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent storage. + */ + public static boolean putBoolean(Context context, String key, boolean value) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putBoolean(key, value); + return editor.commit(); + } + + /** + * get boolean preferences, default is false + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this + * name that is not a boolean + * @see {@link #getBoolean(Context, String, boolean)} + */ + public static boolean getBoolean(Context context, String key) { + return getBoolean(context, key, false); + } + + /** + * get boolean preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with + * this name that is not a boolean + */ + public static boolean getBoolean(Context context, String key, boolean defaultValue) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getBoolean(key, defaultValue); + } +} diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index 67f1546..37c204f 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -590,6 +590,24 @@ public boolean isHasMore() { return hasMore; } + /** + * get header layout view + * + * @return + */ + public RelativeLayout getHeaderLayout() { + return headerLayout; + } + + /** + * get footer layout view + * + * @return + */ + public RelativeLayout getFooterLayout() { + return footerLayout; + } + /** * get rate about drop down distance and header padding top when drop down * From 9e63be7bfabd9b562b97090c6b7952674db509e5 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 26 Sep 2013 14:46:27 +0800 Subject: [PATCH 015/241] modify javadoc --- AndroidManifest.xml | 4 ++-- .../trinea/android/common/entity/CacheObject.java | 4 ++-- src/cn/trinea/android/common/service/Cache.java | 2 +- .../common/service/CacheFullRemoveType.java | 2 +- .../android/common/service/FileNameRule.java | 2 +- .../service/impl/FileNameRuleCurrentTime.java | 7 +++---- .../common/service/impl/FileNameRuleImageUrl.java | 2 +- .../android/common/service/impl/ImageCache.java | 8 ++++---- .../common/service/impl/ImageSDCardCache.java | 8 ++++---- .../common/service/impl/PreloadDataCache.java | 10 +++++----- .../common/service/impl/RemoveTypeDataBig.java | 2 +- .../common/service/impl/RemoveTypeDataSmall.java | 2 +- .../service/impl/RemoveTypeDrawableLarge.java | 2 +- .../service/impl/RemoveTypeDrawableSmall.java | 2 +- .../service/impl/RemoveTypeEnterTimeFirst.java | 2 +- .../service/impl/RemoveTypeEnterTimeLast.java | 2 +- .../common/service/impl/RemoveTypeFileLarge.java | 2 +- .../common/service/impl/RemoveTypeFileSmall.java | 2 +- .../service/impl/RemoveTypeLastUsedTimeFirst.java | 2 +- .../service/impl/RemoveTypeLastUsedTimeLast.java | 2 +- .../common/service/impl/RemoveTypeNotRemove.java | 2 +- .../service/impl/RemoveTypePriorityHigh.java | 2 +- .../common/service/impl/RemoveTypePriorityLow.java | 2 +- .../service/impl/RemoveTypeUsedCountBig.java | 2 +- .../service/impl/RemoveTypeUsedCountSmall.java | 2 +- .../android/common/service/impl/SimpleCache.java | 6 +++--- src/cn/trinea/android/common/util/ArrayUtils.java | 2 +- .../android/common/util/DownloadManagerPro.java | 2 +- src/cn/trinea/android/common/util/FileUtils.java | 6 +++--- src/cn/trinea/android/common/util/ImageUtils.java | 2 +- src/cn/trinea/android/common/util/JSONUtils.java | 14 +++++++------- src/cn/trinea/android/common/util/ListUtils.java | 2 +- src/cn/trinea/android/common/util/MapUtils.java | 4 ++-- src/cn/trinea/android/common/util/ObjectUtils.java | 2 +- .../trinea/android/common/util/PackageUtils.java | 8 ++++---- src/cn/trinea/android/common/util/ParcelUtils.java | 2 +- .../android/common/util/PreferencesUtils.java | 12 ++++++------ src/cn/trinea/android/common/util/RandomUtils.java | 12 ++++++------ .../trinea/android/common/util/ResourceUtils.java | 2 +- .../trinea/android/common/util/SerializeUtils.java | 2 +- src/cn/trinea/android/common/util/ShellUtils.java | 4 ++-- src/cn/trinea/android/common/util/SizeUtils.java | 2 +- src/cn/trinea/android/common/util/StringUtils.java | 2 +- src/cn/trinea/android/common/util/SystemUtils.java | 2 +- src/cn/trinea/android/common/util/TimeUtils.java | 2 +- .../android/common/view/BorderScrollView.java | 2 +- .../android/common/view/DropDownListView.java | 4 ++-- .../android/common/view/SlideOnePageGallery.java | 2 +- 48 files changed, 88 insertions(+), 89 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e2eb8c2..1d34e18 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="20" + android:versionName="3.6.1" > diff --git a/src/cn/trinea/android/common/entity/CacheObject.java b/src/cn/trinea/android/common/entity/CacheObject.java index e5903dc..56ee72f 100644 --- a/src/cn/trinea/android/common/entity/CacheObject.java +++ b/src/cn/trinea/android/common/entity/CacheObject.java @@ -7,7 +7,7 @@ /** * Object in cache * - * @author Trinea 2011-12-23 + * @author Trinea 2011-12-23 */ public class CacheObject implements Serializable, Comparable> { @@ -92,7 +92,7 @@ public long getUsedCount() { /** * Set used(got) count * - * @return + * @param usedCount */ public void setUsedCount(long usedCount) { this.usedCount = usedCount; diff --git a/src/cn/trinea/android/common/service/Cache.java b/src/cn/trinea/android/common/service/Cache.java index 97b9539..6e7bb2f 100644 --- a/src/cn/trinea/android/common/service/Cache.java +++ b/src/cn/trinea/android/common/service/Cache.java @@ -9,7 +9,7 @@ /** * Cache interface * - * @author Trinea 2011-12-23 + * @author Trinea 2011-12-23 */ public interface Cache { diff --git a/src/cn/trinea/android/common/service/CacheFullRemoveType.java b/src/cn/trinea/android/common/service/CacheFullRemoveType.java index e38ed34..d084b25 100644 --- a/src/cn/trinea/android/common/service/CacheFullRemoveType.java +++ b/src/cn/trinea/android/common/service/CacheFullRemoveType.java @@ -9,7 +9,7 @@ * when cache is full, compare object is cache with this class, delete the smallest one.
      * you can implements this interface. * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public interface CacheFullRemoveType extends Serializable { diff --git a/src/cn/trinea/android/common/service/FileNameRule.java b/src/cn/trinea/android/common/service/FileNameRule.java index 039eaa3..4f1b1eb 100644 --- a/src/cn/trinea/android/common/service/FileNameRule.java +++ b/src/cn/trinea/android/common/service/FileNameRule.java @@ -7,7 +7,7 @@ /** * File name rule, used when saving images in {@link ImageSDCardCache} * - * @author Trinea 2012-7-6 + * @author Trinea 2012-7-6 */ public interface FileNameRule extends Serializable { diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java b/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java index 20aa017..0cd0d9a 100644 --- a/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java +++ b/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java @@ -13,7 +13,7 @@ *
    • use file suffix in url as target file suffix
    • *
    * - * @author Trinea 2012-7-6 + * @author Trinea 2012-7-6 */ public class FileNameRuleCurrentTime implements FileNameRule { @@ -22,8 +22,7 @@ public class FileNameRuleCurrentTime implements FileNameRule { private TimeRule timeRule; /** - * @param timeRule, see {@link TimeRule} - * @return + * @param timeRule see {@link TimeRule} */ public FileNameRuleCurrentTime(TimeRule timeRule){ super(); @@ -96,7 +95,7 @@ public String getFileName(String imageUrl) { *
  • {@link #TO_SECONDS} current time in seconds, E.g., at 2012-7-6 14:37:58.365 PM result is 1341556678
  • * * - * @author Trinea 2012-7-6 + * @author Trinea 2012-7-6 */ public enum TimeRule { YEAR, DAY_OF_MONTH, MILLISECOND, HOUR_OF_DAY_TO_MILLIS, HOUR_OF_DAY_TO_SECONDS, HOUR_OF_DAY_TO_MINUTES, diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java b/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java index d594d1e..77d5588 100644 --- a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java +++ b/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java @@ -11,7 +11,7 @@ *
  • use file suffix in url as target file suffix
  • * * - * @author Trinea 2012-11-21 + * @author Trinea 2012-11-21 */ public class FileNameRuleImageUrl implements FileNameRule { diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 4097f32..cbe2c86 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -49,7 +49,7 @@ *
  • {@link #ImageCache(int, int)}
  • * * - * @author Trinea 2012-4-5 + * @author Trinea 2012-4-5 */ public class ImageCache extends PreloadDataCache { @@ -267,7 +267,7 @@ public ImageCache(int maxSize, int threadPoolSize){ /** * callback interface after image get success * - * @author Trinea 2012-4-5 + * @author Trinea 2012-4-5 */ public interface OnImageCallbackListener extends Serializable { @@ -301,7 +301,7 @@ public List shutdownNow() { /** * My handler * - * @author Trinea 2012-11-20 + * @author Trinea 2012-11-20 */ private class MyHandler extends Handler { @@ -350,7 +350,7 @@ public void handleMessage(Message message) { /** * message object * - * @author Trinea 2013-1-14 + * @author Trinea 2013-1-14 */ private class MessageObject { diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 2e7a95c..232755f 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -58,7 +58,7 @@ *
  • {@link #ImageSDCardCache(int, int)}
  • * * - * @author Trinea 2012-4-5 + * @author Trinea 2012-4-5 */ public class ImageSDCardCache extends PreloadDataCache { @@ -333,7 +333,7 @@ public ImageSDCardCache(int maxSize, int threadPoolSize){ /** * callback interface after image get success * - * @author Trinea 2012-4-5 + * @author Trinea 2012-4-5 */ public interface OnImageSDCallbackListener extends Serializable { @@ -367,7 +367,7 @@ public List shutdownNow() { /** * My handler * - * @author Trinea 2012-11-20 + * @author Trinea 2012-11-20 */ private class MyHandler extends Handler { @@ -417,7 +417,7 @@ public void handleMessage(Message message) { /** * message object * - * @author Trinea 2013-1-14 + * @author Trinea 2013-1-14 */ private class MessageObject { diff --git a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java index c60d409..7204d6a 100644 --- a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java +++ b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java @@ -48,7 +48,7 @@ *
  • {@link #loadCache(String)} restore cache from file
  • * * - * @author Trinea 2012-3-4 + * @author Trinea 2012-3-4 */ public class PreloadDataCache extends SimpleCache { @@ -102,7 +102,7 @@ public class PreloadDataCache extends SimpleCache { * {@link #preloadDataForward(Object, List, int)}, preload backward by * {@link #preloadDataBackward(Object, List, int)} * @return element if this cache contains the specified key, else get data realtime and wait for it - * @see {@link #get(Object)} + * @see PreloadDataCache#get(Object) */ public CacheObject get(K key, List keyList) { if (key == null) { @@ -176,7 +176,7 @@ CacheObject getFromCache(K key) { * {@link #preloadDataForward(Object, List, int)}, preload backward by * {@link #preloadDataBackward(Object, List, int)} * @return element if this cache contains the specified key, null otherwise. - * @see {@link #getFromCache(Object)} + * @see #getFromCache(Object) */ CacheObject getFromCache(K key, List keyList) { if (key == null) { @@ -508,7 +508,7 @@ public List shutdownNow() { /** * get data interface, implements this to get data * - * @author Trinea 2012-3-4 + * @author Trinea 2012-3-4 */ public interface OnGetDataListener extends Serializable { @@ -524,7 +524,7 @@ public interface OnGetDataListener extends Serializable { /** * the thread to get data * - * @author Trinea 2012-3-4 + * @author Trinea 2012-3-4 */ private class GetDataThread implements Runnable { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java b/src/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java index d225b2c..9d4fbf6 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java @@ -8,7 +8,7 @@ * Remove type when cache is full.
    * when cache is full, compare data of object in cache, if data is bigger remove it first.
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeDataBig implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java b/src/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java index ad1c2a1..e8eb9d6 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java @@ -8,7 +8,7 @@ * Remove type when cache is full.
    * when cache is full, compare data of object in cache, if data is smaller remove it first.
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeDataSmall implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableLarge.java b/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableLarge.java index 2d275f4..b6a8b53 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableLarge.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableLarge.java @@ -14,7 +14,7 @@ *
  • if drawable is equal to each other and used count is equal, remove the one which is first in
  • * * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeDrawableLarge implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableSmall.java b/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableSmall.java index 9238aee..e0c3d8d 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableSmall.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableSmall.java @@ -14,7 +14,7 @@ *
  • if drawable is equal to each other and used count is equal, remove the one which is first in
  • * * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeDrawableSmall implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java b/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java index 87faf9f..d8e950f 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java @@ -7,7 +7,7 @@ * Remove type when cache is full.
    * when cache is full, compare enter time of object in cache, if time is smaller remove it first. also FIFO
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeEnterTimeFirst implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java b/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java index 73fb1b6..d8555ae 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java @@ -7,7 +7,7 @@ * Remove type when cache is full.
    * when cache is full, compare enter time of object in cache, if time is smaller remove it first. also LIFO
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeEnterTimeLast implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java b/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java index 6450909..bb5673c 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java @@ -12,7 +12,7 @@ *
  • if file is equal to each other and used count is equal, remove the one which is first in
  • * * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeFileLarge implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java b/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java index 2ed83db..d26c760 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java @@ -12,7 +12,7 @@ *
  • if file is equal to each other and used count is equal, remove the one which is first in
  • * * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeFileSmall implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java b/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java index 63f1047..f197848 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java @@ -7,7 +7,7 @@ * Remove type when cache is full.
    * when cache is full, compare last used time of object in cache, if time is smaller remove it first.
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeLastUsedTimeFirst implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java b/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java index 0c18023..a888993 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java @@ -7,7 +7,7 @@ * Remove type when cache is full.
    * when cache is full, compare last used time of object in cache, if time is bigger remove it first.
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeLastUsedTimeLast implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java b/src/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java index b53fb52..40a8b23 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java @@ -6,7 +6,7 @@ /** * Remove type when cache is full. not remove any one, it means nothing can be put later
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeNotRemove implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java b/src/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java index 53dafb6..0fb3bc7 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java @@ -7,7 +7,7 @@ * Remove type when cache is full.
    * when cache is full, compare priority of object in cache, if priority is higher remove it first.
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypePriorityHigh implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java b/src/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java index 4c46d8b..f2a2d72 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java @@ -7,7 +7,7 @@ * Remove type when cache is full.
    * when cache is full, compare priority of object in cache, if priority is lower remove it first.
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypePriorityLow implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java b/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java index ace2090..92073dd 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java @@ -7,7 +7,7 @@ * Remove type when cache is full.
    * when cache is full, compare used count of object in cache, if is bigger remove it first.
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeUsedCountBig implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java b/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java index 666b59b..84c4ddd 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java @@ -7,7 +7,7 @@ * Remove type when cache is full.
    * when cache is full, compare used count of object in cache, if is smaller remove it first.
    * - * @author Trinea 2011-12-26 + * @author Trinea 2011-12-26 */ public class RemoveTypeUsedCountSmall implements CacheFullRemoveType { diff --git a/src/cn/trinea/android/common/service/impl/SimpleCache.java b/src/cn/trinea/android/common/service/impl/SimpleCache.java index 7d8607c..5c27485 100644 --- a/src/cn/trinea/android/common/service/impl/SimpleCache.java +++ b/src/cn/trinea/android/common/service/impl/SimpleCache.java @@ -47,7 +47,7 @@ * Other interfaces same to {@link Map} * * - * @author Trinea 2011-12-23 + * @author Trinea 2011-12-23 */ public class SimpleCache implements Cache, Serializable { @@ -200,7 +200,7 @@ protected synchronized void setUsedInfo(CacheObject obj) { * @param key key * @param value data of {@link CacheObject} * @return return null if cache is full and cannot remove one, else return the value be putted - * @see {@link #put(Object, CacheObject)} + * @see SimpleCache#put(Object, CacheObject) */ @Override public CacheObject put(K key, V value) { @@ -264,7 +264,7 @@ public boolean containsKey(K key) { * * @param key * @return - * @see {@link #isExpired(CacheObject)} + * @see SimpleCache#isExpired(CacheObject) */ protected boolean isExpired(K key) { return validTime == -1 ? false : isExpired(cache.get(key)); diff --git a/src/cn/trinea/android/common/util/ArrayUtils.java b/src/cn/trinea/android/common/util/ArrayUtils.java index 23a3071..df652e2 100644 --- a/src/cn/trinea/android/common/util/ArrayUtils.java +++ b/src/cn/trinea/android/common/util/ArrayUtils.java @@ -16,7 +16,7 @@ *
  • {@link #getNext(long[], long, long, boolean)}
  • * * - * @author Trinea 2011-10-24 + * @author Trinea 2011-10-24 */ public class ArrayUtils { diff --git a/src/cn/trinea/android/common/util/DownloadManagerPro.java b/src/cn/trinea/android/common/util/DownloadManagerPro.java index a388836..d555807 100644 --- a/src/cn/trinea/android/common/util/DownloadManagerPro.java +++ b/src/cn/trinea/android/common/util/DownloadManagerPro.java @@ -31,7 +31,7 @@ *
  • {@link RequestPro#setNotiExtras(String)} set noti extras
  • * * - * @author Trinea 2013-5-4 + * @author Trinea 2013-5-4 */ public class DownloadManagerPro { diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index 8820efc..f5f24ef 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -34,7 +34,7 @@ *
  • {@link #makeDirs(String)}
  • * * - * @author Trinea 2012-5-12 + * @author Trinea 2012-5-12 */ public class FileUtils { @@ -319,7 +319,7 @@ public static String getFileExtension(String filePath) { * to create this directory.
    *
    *
      - * Attentions: + * Attentions: *
    • makeDirs("C:\\Users\\Trinea") can only create users folder
    • *
    • makeFolder("C:\\Users\\Trinea\\") can create Trinea folder
    • *
    @@ -346,7 +346,7 @@ public static boolean makeDirs(String filePath) { /** * @param filePath * @return - * @see {@link #makeDirs(String)} + * @see #makeDirs(String) */ public static boolean makeFolders(String filePath) { return makeDirs(filePath); diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 4afbf84..8d0edd1 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -36,7 +36,7 @@ *
  • {@link #scaleImage(Bitmap, float, float)}
  • * * - * @author Trinea 2012-6-27 + * @author Trinea 2012-6-27 */ public class ImageUtils { diff --git a/src/cn/trinea/android/common/util/JSONUtils.java b/src/cn/trinea/android/common/util/JSONUtils.java index bc10ce8..d11d6f1 100644 --- a/src/cn/trinea/android/common/util/JSONUtils.java +++ b/src/cn/trinea/android/common/util/JSONUtils.java @@ -11,7 +11,7 @@ /** * Json Utils * - * @author Trinea 2012-5-12 + * @author Trinea 2012-5-12 */ public class JSONUtils { @@ -72,7 +72,7 @@ public static Long getLong(String jsonData, String key, Long defaultValue) { * @param key * @param defaultValue * @return - * @see {@link JSONUtils#getLong(JSONObject, String, Long)} + * @see JSONUtils#getLong(JSONObject, String, Long) */ public static long getLong(JSONObject jsonObject, String key, long defaultValue) { return getLong(jsonObject, key, (Long)defaultValue); @@ -83,7 +83,7 @@ public static long getLong(JSONObject jsonObject, String key, long defaultValue) * @param key * @param defaultValue * @return - * @see {@link JSONUtils#getLong(String, String, Long)} + * @see JSONUtils#getLong(String, String, Long) */ public static long getLong(String jsonData, String key, long defaultValue) { return getLong(jsonData, key, (Long)defaultValue); @@ -146,7 +146,7 @@ public static Integer getInt(String jsonData, String key, Integer defaultValue) * @param key * @param defaultValue * @return - * @see {@link JSONUtils#getInt(JSONObject, String, Integer)} + * @see JSONUtils#getInt(JSONObject, String, Integer) */ public static int getInt(JSONObject jsonObject, String key, int defaultValue) { return getInt(jsonObject, key, (Integer)defaultValue); @@ -157,7 +157,7 @@ public static int getInt(JSONObject jsonObject, String key, int defaultValue) { * @param key * @param defaultValue * @return - * @see {@link JSONUtils#getInt(String, String, Integer)} + * @see JSONUtils#getInt(String, String, Integer) */ public static int getInt(String jsonData, String key, int defaultValue) { return getInt(jsonData, key, (Integer)defaultValue); @@ -220,7 +220,7 @@ public static Double getDouble(String jsonData, String key, Double defaultValue) * @param key * @param defaultValue * @return - * @see {@link JSONUtils#getDouble(JSONObject, String, Double)} + * @see JSONUtils#getDouble(JSONObject, String, Double) */ public static double getDouble(JSONObject jsonObject, String key, double defaultValue) { return getDouble(jsonObject, key, (Double)defaultValue); @@ -231,7 +231,7 @@ public static double getDouble(JSONObject jsonObject, String key, double default * @param key * @param defaultValue * @return - * @see {@link JSONUtils#getDouble(String, String, Double)} + * @see JSONUtils#getDouble(String, String, Double) */ public static double getDouble(String jsonData, String key, double defaultValue) { return getDouble(jsonData, key, (Double)defaultValue); diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index d87ccd5..cbcd2af 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -6,7 +6,7 @@ /** * List Utils * - * @author Trinea 2011-7-22 + * @author Trinea 2011-7-22 */ public class ListUtils { diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/cn/trinea/android/common/util/MapUtils.java index 8e47a43..a83f554 100644 --- a/src/cn/trinea/android/common/util/MapUtils.java +++ b/src/cn/trinea/android/common/util/MapUtils.java @@ -7,7 +7,7 @@ /** * Map Utils * - * @author Trinea 2011-7-22 + * @author Trinea 2011-7-22 */ public class MapUtils { @@ -145,7 +145,7 @@ public static boolean putMapNotNullKeyAndValue(Map map, K key, V va /** * get key by value, match the first entry front to back *
      - * Attentions: + * Attentions: *
    • for HashMap, the order of entry not same to put order, so you may need to use TreeMap
    • *
    * diff --git a/src/cn/trinea/android/common/util/ObjectUtils.java b/src/cn/trinea/android/common/util/ObjectUtils.java index 20a5641..7d7a9ce 100644 --- a/src/cn/trinea/android/common/util/ObjectUtils.java +++ b/src/cn/trinea/android/common/util/ObjectUtils.java @@ -3,7 +3,7 @@ /** * Object Utils * - * @author Trinea 2011-10-24 + * @author Trinea 2011-10-24 */ public class ObjectUtils { diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 63d1a01..b8d4bf2 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -32,7 +32,7 @@ *
  • {@link PackageUtils#isSystemApplication(PackageManager, String)}
  • * * - * @author Trinea 2013-5-15 + * @author Trinea 2013-5-15 */ public class PackageUtils { @@ -79,7 +79,7 @@ public static boolean installNormal(Context context, String filePath) { /** * install package silent by root *
      - * Attentions: + * Attentions: *
    • Don't call this on the ui thread, it may costs some times.
    • *
    • You should add android.permission.INSTALL_PACKAGES in manifest, so no need to request root * permission, if you are system app.
    • @@ -270,7 +270,7 @@ public static boolean uninstallNormal(Context context, String packageName) { * @param context * @param packageName package name of app * @return - * @see {@link #uninstallSilent(Context, String, boolean)} + * @see #uninstallSilent(Context, String, boolean) */ public static int uninstallSilent(Context context, String packageName) { return uninstallSilent(context, packageName, true); @@ -279,7 +279,7 @@ public static int uninstallSilent(Context context, String packageName) { /** * uninstall package silent by root *
        - * Attentions: + * Attentions: *
      • Don't call this on the ui thread, it may costs some times.
      • *
      • You should add android.permission.DELETE_PACKAGES in manifest, so no need to request root * permission, if you are system app.
      • diff --git a/src/cn/trinea/android/common/util/ParcelUtils.java b/src/cn/trinea/android/common/util/ParcelUtils.java index c7da060..3601c66 100644 --- a/src/cn/trinea/android/common/util/ParcelUtils.java +++ b/src/cn/trinea/android/common/util/ParcelUtils.java @@ -10,7 +10,7 @@ /** * ParcelUtils * - * @author Trinea 2013-5-27 + * @author Trinea 2013-5-27 */ public class ParcelUtils { diff --git a/src/cn/trinea/android/common/util/PreferencesUtils.java b/src/cn/trinea/android/common/util/PreferencesUtils.java index a80474b..9b45e92 100644 --- a/src/cn/trinea/android/common/util/PreferencesUtils.java +++ b/src/cn/trinea/android/common/util/PreferencesUtils.java @@ -26,7 +26,7 @@ *
      • get boolean {@link #getBoolean(Context, String)}, {@link #getBoolean(Context, String, boolean)}
      • *
      * - * @author Trinea 2013-3-6 + * @author Trinea 2013-3-6 */ public class PreferencesUtils { @@ -54,7 +54,7 @@ public static boolean putString(Context context, String key, String value) { * @param key The name of the preference to retrieve * @return The preference value if it exists, or null. Throws ClassCastException if there is a preference with this * name that is not a string - * @see {@link #getString(Context, String, String)} + * @see #getString(Context, String, String) */ public static String getString(Context context, String key) { return getString(context, key, null); @@ -96,7 +96,7 @@ public static boolean putInt(Context context, String key, int value) { * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a int - * @see {@link #getInt(Context, String, int)} + * @see #getInt(Context, String, int) */ public static int getInt(Context context, String key) { return getInt(context, key, -1); @@ -138,7 +138,7 @@ public static boolean putLong(Context context, String key, long value) { * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a long - * @see {@link #getLong(Context, String, long)} + * @see #getLong(Context, String, long) */ public static long getLong(Context context, String key) { return getLong(context, key, -1); @@ -180,7 +180,7 @@ public static boolean putFloat(Context context, String key, float value) { * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this * name that is not a float - * @see {@link #getFloat(Context, String, float)} + * @see #getFloat(Context, String, float) */ public static float getFloat(Context context, String key) { return getFloat(context, key, -1); @@ -222,7 +222,7 @@ public static boolean putBoolean(Context context, String key, boolean value) { * @param key The name of the preference to retrieve * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this * name that is not a boolean - * @see {@link #getBoolean(Context, String, boolean)} + * @see #getBoolean(Context, String, boolean) */ public static boolean getBoolean(Context context, String key) { return getBoolean(context, key, false); diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index a705399..7f75712 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -5,7 +5,7 @@ /** * Random Utils * - * @author Trinea 2012-5-12 + * @author Trinea 2012-5-12 */ public class RandomUtils { @@ -20,7 +20,7 @@ public class RandomUtils { * * @param length * @return - * @see {@link RandomUtils#getRandom(String source, int length)} + * @see RandomUtils#getRandom(String source, int length) */ public static String getRandomNumbersAndLetters(int length) { return getRandom(NUMBERS_AND_LETTERS, length); @@ -31,7 +31,7 @@ public static String getRandomNumbersAndLetters(int length) { * * @param length * @return - * @see {@link RandomUtils#getRandom(String source, int length)} + * @see RandomUtils#getRandom(String source, int length) */ public static String getRandomNumbers(int length) { return getRandom(NUMBERS, length); @@ -42,7 +42,7 @@ public static String getRandomNumbers(int length) { * * @param length * @return - * @see {@link RandomUtils#getRandom(String source, int length)} + * @see RandomUtils#getRandom(String source, int length) */ public static String getRandomLetters(int length) { return getRandom(LETTERS, length); @@ -53,7 +53,7 @@ public static String getRandomLetters(int length) { * * @param length * @return - * @see {@link RandomUtils#getRandom(String source, int length)} + * @see RandomUtils#getRandom(String source, int length) */ public static String getRandomCapitalLetters(int length) { return getRandom(CAPITAL_LETTERS, length); @@ -64,7 +64,7 @@ public static String getRandomCapitalLetters(int length) { * * @param length * @return - * @see {@link RandomUtils#getRandom(String source, int length)} + * @see RandomUtils#getRandom(String source, int length) */ public static String getRandomLowerCaseLetters(int length) { return getRandom(LOWER_CASE_LETTERS, length); diff --git a/src/cn/trinea/android/common/util/ResourceUtils.java b/src/cn/trinea/android/common/util/ResourceUtils.java index 9ab6040..9d2be95 100644 --- a/src/cn/trinea/android/common/util/ResourceUtils.java +++ b/src/cn/trinea/android/common/util/ResourceUtils.java @@ -11,7 +11,7 @@ /** * ResourceUtils * - * @author Trinea 2012-5-26 + * @author Trinea 2012-5-26 */ public class ResourceUtils { diff --git a/src/cn/trinea/android/common/util/SerializeUtils.java b/src/cn/trinea/android/common/util/SerializeUtils.java index f4c33eb..adfa27b 100644 --- a/src/cn/trinea/android/common/util/SerializeUtils.java +++ b/src/cn/trinea/android/common/util/SerializeUtils.java @@ -10,7 +10,7 @@ /** * Serialize Utils * - * @author Trinea 2012-5-14 + * @author Trinea 2012-5-14 */ public class SerializeUtils { diff --git a/src/cn/trinea/android/common/util/ShellUtils.java b/src/cn/trinea/android/common/util/ShellUtils.java index 212d01a..e658692 100644 --- a/src/cn/trinea/android/common/util/ShellUtils.java +++ b/src/cn/trinea/android/common/util/ShellUtils.java @@ -22,7 +22,7 @@ *
    • {@link ShellUtils#execCommand(String[], boolean, boolean)}
    • *
    * - * @author Trinea 2013-5-16 + * @author Trinea 2013-5-16 */ public class ShellUtils { @@ -194,7 +194,7 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, boole *
  • {@link CommandResult#errorMsg} means error message of command result
  • * * - * @author Trinea 2013-5-16 + * @author Trinea 2013-5-16 */ public static class CommandResult { diff --git a/src/cn/trinea/android/common/util/SizeUtils.java b/src/cn/trinea/android/common/util/SizeUtils.java index d8ae212..fcbd74d 100644 --- a/src/cn/trinea/android/common/util/SizeUtils.java +++ b/src/cn/trinea/android/common/util/SizeUtils.java @@ -3,7 +3,7 @@ /** * SizeUtils * - * @author Trinea 2013-5-15 + * @author Trinea 2013-5-15 */ public class SizeUtils { diff --git a/src/cn/trinea/android/common/util/StringUtils.java b/src/cn/trinea/android/common/util/StringUtils.java index 920cb7f..96de3b8 100644 --- a/src/cn/trinea/android/common/util/StringUtils.java +++ b/src/cn/trinea/android/common/util/StringUtils.java @@ -8,7 +8,7 @@ /** * String Utils * - * @author Trinea 2011-7-22 + * @author Trinea 2011-7-22 */ public class StringUtils { diff --git a/src/cn/trinea/android/common/util/SystemUtils.java b/src/cn/trinea/android/common/util/SystemUtils.java index 1d5ef3b..cc1fc04 100644 --- a/src/cn/trinea/android/common/util/SystemUtils.java +++ b/src/cn/trinea/android/common/util/SystemUtils.java @@ -3,7 +3,7 @@ /** * SystemUtils * - * @author Trinea 2013-5-15 + * @author Trinea 2013-5-15 */ public class SystemUtils { diff --git a/src/cn/trinea/android/common/util/TimeUtils.java b/src/cn/trinea/android/common/util/TimeUtils.java index bfd8b86..ffaf263 100644 --- a/src/cn/trinea/android/common/util/TimeUtils.java +++ b/src/cn/trinea/android/common/util/TimeUtils.java @@ -6,7 +6,7 @@ /** * TimeUtils * - * @author Trinea 2013-8-24 + * @author Trinea 2013-8-24 */ public class TimeUtils { diff --git a/src/cn/trinea/android/common/view/BorderScrollView.java b/src/cn/trinea/android/common/view/BorderScrollView.java index 6fdeb45..9e20921 100644 --- a/src/cn/trinea/android/common/view/BorderScrollView.java +++ b/src/cn/trinea/android/common/view/BorderScrollView.java @@ -51,7 +51,7 @@ public void setOnBorderListener(final OnBorderListener onBorderListener) { /** * OnBorderListener, Called when scroll to top or bottom * - * @author Trinea 2013-5-22 + * @author Trinea 2013-5-22 */ public static interface OnBorderListener { diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index 37c204f..3b0f5ec 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -50,7 +50,7 @@ * principle see http://trinea.iteye.com/blog/1562281 * * - * @author Trinea 2012-5-20 + * @author Trinea 2012-5-20 */ public class DropDownListView extends ListView implements OnScrollListener { @@ -553,7 +553,7 @@ public void onBottomComplete() { /** * OnDropDownListener, called when header released * - * @author Trinea 2012-5-31 + * @author Trinea 2012-5-31 */ public interface OnDropDownListener { diff --git a/src/cn/trinea/android/common/view/SlideOnePageGallery.java b/src/cn/trinea/android/common/view/SlideOnePageGallery.java index d298215..3afd197 100644 --- a/src/cn/trinea/android/common/view/SlideOnePageGallery.java +++ b/src/cn/trinea/android/common/view/SlideOnePageGallery.java @@ -9,7 +9,7 @@ /** * SlideOnePageGallery, only slide one page every slide * - * @author Trinea 2013-3-22 + * @author Trinea 2013-3-22 */ public class SlideOnePageGallery extends Gallery { From 6b207eb57072fb3ab6aa7c1b5bfe093859f49f7a Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 26 Sep 2013 14:52:04 +0800 Subject: [PATCH 016/241] fix DropDownListView#setHeaderReleaseMinDistance not work bug --- AndroidManifest.xml | 4 ++-- .../android/common/view/DropDownListView.java | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 1d34e18..7e62b78 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="21" + android:versionName="3.6.2" > diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index 3b0f5ec..e542444 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -86,7 +86,7 @@ public class DropDownListView extends ListView implements OnScrollListener { /** rate about drop down distance and header padding top when drop down **/ private float headerPaddingTopRate = 1.5f; /** min distance which header can release to loading **/ - private int headerReleaseMinDistance = 30; + private int headerReleaseMinDistance = 50; /** whether bottom listener has more **/ private boolean hasMore = true; @@ -384,8 +384,9 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun * and header status is not HEADER_STATUS_LOADING *
      * if header layout is visiable, - *
    • if height of header is higher than a fixed value, then set header status to RELEASE_TO_REFRESH.
    • - *
    • else set header status to DROP_DOWN_TO_REFRESH.
    • + *
    • if height of header is higher than a fixed value, then set header status to + * HEADER_STATUS_RELEASE_TO_LOAD.
    • + *
    • else set header status to HEADER_STATUS_DROP_DOWN_TO_LOAD.
    • *
    *
      * if header layout is not visiable, @@ -394,8 +395,7 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun */ if (firstVisibleItem == 0) { headerImage.setVisibility(View.VISIBLE); - if (headerLayout.getBottom() >= headerOriginalHeight + headerReleaseMinDistance - || headerLayout.getTop() >= 0) { + if (headerLayout.getBottom() >= headerOriginalHeight + headerReleaseMinDistance) { setHeaderStatusReleaseToLoad(); } else if (headerLayout.getBottom() < headerOriginalHeight + headerReleaseMinDistance) { setHeaderStatusDropDownToLoad(); @@ -865,8 +865,12 @@ private void setHeaderStatusLoading() { private void adjustHeaderPadding(MotionEvent ev) { // adjust header padding according to motion event history int pointerCount = ev.getHistorySize(); + if (isVerticalFadingEdgeEnabled()) { + setVerticalScrollBarEnabled(false); + } for (int i = 0; i < pointerCount; i++) { - if (currentHeaderStatus == HEADER_STATUS_RELEASE_TO_LOAD) { + if (currentHeaderStatus == HEADER_STATUS_DROP_DOWN_TO_LOAD + || currentHeaderStatus == HEADER_STATUS_RELEASE_TO_LOAD) { headerLayout.setPadding(headerLayout.getPaddingLeft(), (int)(((ev.getHistoricalY(i) - actionDownPointY) - headerOriginalHeight) / headerPaddingTopRate), headerLayout.getPaddingRight(), headerLayout.getPaddingBottom()); From c81c28c18696f493c8db3f7629da4a8a94a66121 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 26 Sep 2013 19:53:21 +0800 Subject: [PATCH 017/241] fix hard to drop down bug on hdpi --- AndroidManifest.xml | 4 +-- res/values/dimens.xml | 1 + .../android/common/view/DropDownListView.java | 25 +++++++++++-------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7e62b78..e83a214 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="22" + android:versionName="3.6.3" > diff --git a/res/values/dimens.xml b/res/values/dimens.xml index c18263e..cdc7f62 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -2,6 +2,7 @@ 12dp 15dp + 20dp 36dp 36dp diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index e542444..5420f68 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -54,9 +54,9 @@ */ public class DropDownListView extends ListView implements OnScrollListener { - private boolean isDropDownStyle = true; - private boolean isOnBottomStyle = true; - private boolean isAutoLoadOnBottom = false; + private boolean isDropDownStyle = true; + private boolean isOnBottomStyle = true; + private boolean isAutoLoadOnBottom = false; private String headerDefaultText; private String headerPullText; @@ -84,20 +84,20 @@ public class DropDownListView extends ListView implements OnScrollListener { private OnScrollListener onScrollListener; /** rate about drop down distance and header padding top when drop down **/ - private float headerPaddingTopRate = 1.5f; + private float headerPaddingTopRate = 1.5f; /** min distance which header can release to loading **/ - private int headerReleaseMinDistance = 50; + private int headerReleaseMinDistance; /** whether bottom listener has more **/ - private boolean hasMore = true; + private boolean hasMore = true; /** whether show footer loading progress bar when loading **/ - private boolean isShowFooterProgressBar = true; + private boolean isShowFooterProgressBar = true; private int currentScrollState; private int currentHeaderStatus; /** whether reached top, when has reached top, don't show header layout **/ - private boolean hasReachedTop = false; + private boolean hasReachedTop = false; /** image flip animation **/ private RotateAnimation flipAnimation; @@ -112,7 +112,7 @@ public class DropDownListView extends ListView implements OnScrollListener { private float actionDownPointY; /** whether is on bottom loading **/ - private boolean isOnBottomLoading = false; + private boolean isOnBottomLoading = false; public DropDownListView(Context context){ super(context); @@ -156,6 +156,8 @@ private void initDropDownStyle() { return; } + headerReleaseMinDistance = context.getResources() + .getDimensionPixelSize(R.dimen.drop_down_list_header_release_min_distance); flipAnimation = new RotateAnimation(0, 180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); flipAnimation.setInterpolator(new LinearInterpolator()); @@ -395,9 +397,10 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun */ if (firstVisibleItem == 0) { headerImage.setVisibility(View.VISIBLE); - if (headerLayout.getBottom() >= headerOriginalHeight + headerReleaseMinDistance) { + int pointBottom = headerOriginalHeight + headerReleaseMinDistance; + if (headerLayout.getBottom() >= pointBottom) { setHeaderStatusReleaseToLoad(); - } else if (headerLayout.getBottom() < headerOriginalHeight + headerReleaseMinDistance) { + } else if (headerLayout.getBottom() < pointBottom) { setHeaderStatusDropDownToLoad(); } } else { From 8467acf3d78377f120d7cdca4744ac1e933cfb1f Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 27 Sep 2013 16:21:00 +0800 Subject: [PATCH 018/241] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b5df5cd..773e375 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注Android、Java、性能优化 +####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/) 总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 -具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),主要包括: +
      具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),主要包括: ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From 4c5fb744de3b53470bb201de257f2153271e7530 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 27 Sep 2013 16:23:41 +0800 Subject: [PATCH 019/241] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 773e375..1cf56f0 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/) +####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) 总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 -
      具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),主要包括: +具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),主要包括: ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From 5c21660a49a38efbdbd72d7df1c000508dba43a7 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:32:22 +0800 Subject: [PATCH 020/241] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1cf56f0..06fb552 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- ####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) -总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 -具体使用可见[总结的一些android公共库](http://www.trinea.cn/android/android%E5%85%AC%E5%85%B1%E5%BA%93%E7%BC%93%E5%AD%98-%E4%B8%8B%E6%8B%89listview-%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86pro-%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85-root%E8%BF%90%E8%A1%8C-java%E5%85%AC/)。Demo APK地址见[TrineaAndroidDemo](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),主要包括: +总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等),主要包括: +PS: Demo APK地址见[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From 6d322cb18d0eb694e3a25f3a0e400484c0258b70 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:34:22 +0800 Subject: [PATCH 021/241] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 06fb552..a0fbc8b 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- ####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) -总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等),主要包括: -PS: Demo APK地址见[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). +**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等), +**Demo APK地址**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From 9666cecb428b653e3c34bf09dd16953f3786daf1 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:34:53 +0800 Subject: [PATCH 022/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a0fbc8b..4e6843f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ------------- ####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等), -**Demo APK地址**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). +**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From ca7c8ba69a53d15eedcc7a8c36448b4c9f93c1fe Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:35:45 +0800 Subject: [PATCH 023/241] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4e6843f..3d87294 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -####个人博客[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) +**个人博客[www.trinea.cn]**:(http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等), -**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). +**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From 8c4775b6ff270f0c6c01fc2eca202c1dc3441c02 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:36:21 +0800 Subject: [PATCH 024/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d87294..1ff8b2c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**个人博客[www.trinea.cn]**:(http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) +个人博客[www.trinea.cn]:(http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等), **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). ####一. 缓存类 From 69cbbbdde0bb5c62e129be72baf848d61097aad5 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:37:46 +0800 Subject: [PATCH 025/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ff8b2c..b8d1f5f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -个人博客[www.trinea.cn]:(http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) +####个人博客[www.trinea.cn](http://www.trinea.cn/) :关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等), **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). ####一. 缓存类 From 061d80ffcb7faa199bf4f1fcced62c3d883b7258 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:38:49 +0800 Subject: [PATCH 026/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8d1f5f..98f8fd1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -####个人博客[www.trinea.cn](http://www.trinea.cn/) :关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) +**个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等), **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). ####一. 缓存类 From 6437802d06f4022461979cfc6bfefb6f233387d1 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:39:46 +0800 Subject: [PATCH 027/241] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 98f8fd1..a2f4ba1 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/) -**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等), -**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true). +**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 +**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true)。 +**个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 #####1. 图片内存缓存 From 236fc1b2db6b05027dd619cfd84ce913f3a83b19 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:41:51 +0800 Subject: [PATCH 028/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2f4ba1..fb02512 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)、及工具类(下载管理、静默安装、shell工具类等等)。 +**主要包括**:**缓存**(图片缓存、预取缓存)、**公共View**(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及工具类(下载管理、静默安装、shell工具类等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 From 831f1016f173ff28ad351996982204868f2330fe Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 28 Sep 2013 22:42:57 +0800 Subject: [PATCH 029/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fb02512..33fd3b3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:**缓存**(图片缓存、预取缓存)、**公共View**(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及工具类(下载管理、静默安装、shell工具类等等)。 +**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及工具类(下载管理、静默安装、shell工具类等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 From 396a19763f9598f04c501aab3c9359fbde9acdae Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 30 Sep 2013 15:19:15 +0800 Subject: [PATCH 030/241] add http common utils add http common utils HttpUtils.java HttpRequest.java HttpResponse.java HttpConstants.java add toJson in MapUtils.java --- AndroidManifest.xml | 4 +- .../common/constant/HttpConstants.java | 13 + .../android/common/entity/HttpRequest.java | 158 +++++++ .../android/common/entity/HttpResponse.java | 197 +++++++++ .../trinea/android/common/util/HttpUtils.java | 387 ++++++++++++++++++ .../trinea/android/common/util/MapUtils.java | 26 ++ 6 files changed, 783 insertions(+), 2 deletions(-) create mode 100644 src/cn/trinea/android/common/constant/HttpConstants.java create mode 100644 src/cn/trinea/android/common/entity/HttpRequest.java create mode 100644 src/cn/trinea/android/common/entity/HttpResponse.java create mode 100644 src/cn/trinea/android/common/util/HttpUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e83a214..ea4b7e3 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="23" + android:versionName="3.7.3" > diff --git a/src/cn/trinea/android/common/constant/HttpConstants.java b/src/cn/trinea/android/common/constant/HttpConstants.java new file mode 100644 index 0000000..e242c5c --- /dev/null +++ b/src/cn/trinea/android/common/constant/HttpConstants.java @@ -0,0 +1,13 @@ +package cn.trinea.android.common.constant; + +/** + * HttpConstants
      + * All in lower case to put and get easy + * + * @author Trinea 2013-5-12 + */ +public class HttpConstants { + + public static final String EXPIRES = "expires"; + public static final String CACHE_CONTROL = "cache-control"; +} diff --git a/src/cn/trinea/android/common/entity/HttpRequest.java b/src/cn/trinea/android/common/entity/HttpRequest.java new file mode 100644 index 0000000..b35b3b3 --- /dev/null +++ b/src/cn/trinea/android/common/entity/HttpRequest.java @@ -0,0 +1,158 @@ +package cn.trinea.android.common.entity; + +import java.net.URLConnection; +import java.util.HashMap; +import java.util.Map; + +import cn.trinea.android.common.util.HttpUtils; + +/** + * HttpRequest
      + *
        + * Constructor + *
      • {@link HttpRequest#HttpRequest(String)}
      • + *
      • {@link HttpRequest#HttpRequest(String, Map)}
      • + *
      + *
        + * Setting + *
      • {@link #setConnectTimeout(int)}
      • + *
      • {@link #setReadTimeout(int)}
      • + *
      • {@link #setParasMap(Map)}
      • + *
      • {@link #setUserAgent(String)}
      • + *
      • {@link #setRequestProperty(String, String)}
      • + *
      • {@link #setRequestPropertys(Map)}
      • + *
      + * + * @author Trinea 2013-5-12 + */ +public class HttpRequest { + + private String url; + private int connectTimeout; + private int readTimeout; + private Map parasMap; + private Map requestPropertys; + + public HttpRequest(String url){ + this.url = url; + this.connectTimeout = -1; + this.readTimeout = -1; + requestPropertys = new HashMap(); + } + + public HttpRequest(String url, Map parasMap){ + this.url = url; + this.parasMap = parasMap; + this.connectTimeout = -1; + this.readTimeout = -1; + requestPropertys = new HashMap(); + } + + public String getUrl() { + return url; + } + + /** + * @return + * @see URLConnection#getConnectTimeout() + */ + public int getConnectTimeout() { + return connectTimeout; + } + + /** + * @param timeoutMillis + * @see URLConnection#setConnectTimeout(int) + */ + public void setConnectTimeout(int timeoutMillis) { + if (timeoutMillis < 0) { + throw new IllegalArgumentException("timeout can not be negative"); + } + connectTimeout = timeoutMillis; + } + + /** + * @return + * @see URLConnection#getReadTimeout() + */ + public int getReadTimeout() { + return readTimeout; + } + + /** + * @param timeoutMillis + * @see URLConnection#setReadTimeout(int) + */ + public void setReadTimeout(int timeoutMillis) { + if (timeoutMillis < 0) { + throw new IllegalArgumentException("timeout can not be negative"); + } + readTimeout = timeoutMillis; + } + + /** + * get paras map + * + * @return + */ + public Map getParasMap() { + return parasMap; + } + + /** + * set paras map + * + * @param parasMap + */ + public void setParasMap(Map parasMap) { + this.parasMap = parasMap; + } + + /** + * @return paras as string + */ + public String getParas() { + return HttpUtils.joinParas(parasMap); + } + + /** + * @param field + * @param newValue + * @see URLConnection#setRequestProperty(String, String) + */ + public void setRequestProperty(String field, String newValue) { + requestPropertys.put(field, newValue); + } + + /** + * @param field + * @see URLConnection#getRequestProperty(String) + */ + public String getRequestProperty(String field) { + return requestPropertys.get(field); + } + + /** + * same to {@link #setRequestProperty(String, String)} filed is User-Agent + * + * @param value + * @see URLConnection#setRequestProperty(String, String) + */ + public void setUserAgent(String value) { + requestPropertys.put("User-Agent", value); + } + + /** + * @return + */ + public Map getRequestPropertys() { + return requestPropertys; + } + + /** + * @param requestPropertys + */ + public void setRequestPropertys(Map requestPropertys) { + this.requestPropertys = requestPropertys; + } +} diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/cn/trinea/android/common/entity/HttpResponse.java new file mode 100644 index 0000000..8c3b0a0 --- /dev/null +++ b/src/cn/trinea/android/common/entity/HttpResponse.java @@ -0,0 +1,197 @@ +package cn.trinea.android.common.entity; + +import java.util.HashMap; +import java.util.Map; + +import cn.trinea.android.common.constant.HttpConstants; +import cn.trinea.android.common.util.HttpUtils; +import cn.trinea.android.common.util.StringUtils; + +/** + * HttpResponse
      + *
        + * Constructor + *
      • {@link HttpResponse#HttpResponse()}
      • + *
      • {@link HttpResponse#HttpResponse(String)}
      • + *
      + *
        + * Get + *
      • {@link #getResponseBody()}
      • + *
      • {@link #getUrl()}
      • + *
      • {@link #getExpiresInMillis()} expires time
      • + *
      • {@link #getExpiresHeader()}
      • + *
      • {@link #getCacheControlMaxAge()}
      • + *
      + *
        + * Setting + *
      • {@link #setUrl(String)}
      • + *
      • {@link #setResponseBody(String)}
      • + *
      • {@link #setResponseHeader(String, String)}
      • + *
      • {@link #setResponseHeaders(Map)}
      • + *
      + * + * @author Trinea 2013-5-12 + */ +public class HttpResponse { + + private String url; + /** http response content **/ + private String responseBody; + private Map responseHeaders; + + /** + * An int representing the three digit HTTP Status-Code. + *
        + *
      • 1xx: Informational + *
      • 2xx: Success + *
      • 3xx: Redirection + *
      • 4xx: Client Error + *
      • 5xx: Server Error + *
      + */ + private int responseCode = -1; + + public HttpResponse(String url){ + this.url = url; + responseHeaders = new HashMap(); + } + + public HttpResponse(){ + responseHeaders = new HashMap(); + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getResponseBody() { + return responseBody; + } + + public void setResponseBody(String responseBody) { + this.responseBody = responseBody; + } + + /** + * get reponse code + * + * @return An int representing the three digit HTTP Status-Code. + *
        + *
      • 1xx: Informational + *
      • 2xx: Success + *
      • 3xx: Redirection + *
      • 4xx: Client Error + *
      • 5xx: Server Error + *
      • -1: http error + *
      + */ + public int getResponseCode() { + return responseCode; + } + + public void setResponseCode(int responseCode) { + this.responseCode = responseCode; + } + + /** + * not avaliable now + * + * @return + */ + private Map getResponseHeaders() { + return responseHeaders; + } + + public void setResponseHeaders(Map responseHeaders) { + this.responseHeaders = responseHeaders; + } + + /** + * http expires in reponse header + * + * @return null represents http error or no expires in response headers + */ + public String getExpiresHeader() { + try { + return responseHeaders == null ? null : (String)responseHeaders.get(HttpConstants.EXPIRES); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * http cache-control in reponse header + * + * @return -1 represents http error or no cache-control in response headers + */ + public int getCacheControlMaxAge() { + try { + String cacheControl = (String)responseHeaders.get(HttpConstants.CACHE_CONTROL); + if (!StringUtils.isEmpty(cacheControl)) { + int start = cacheControl.indexOf("max-age="); + if (start != -1) { + int end = cacheControl.indexOf(",", start); + String maxAge; + if (end != -1) { + maxAge = cacheControl.substring(start + "max-age=".length(), end); + } else { + maxAge = cacheControl.substring(start + "max-age=".length()); + } + return Integer.parseInt(maxAge); + } + } + return -1; + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + + /** + * get expires + * + * @return
        + *
      • if max-age in cache-control is exists, return current time plus it
      • + *
      • else return expires
      • + *
      • if something error, return -1
      • + *
      + */ + public long getExpiresInMillis() { + int maxAge = getCacheControlMaxAge(); + if (maxAge != -1) { + return System.currentTimeMillis() + maxAge; + } else { + String expire = getExpiresHeader(); + if (!StringUtils.isEmpty(expire)) { + return HttpUtils.parseGmtTime(getExpiresHeader()); + } + } + return -1; + } + + /** + * set response header + * + * @param field + * @param newValue + */ + public void setResponseHeader(String field, String newValue) { + if (responseHeaders != null) { + responseHeaders.put(field, newValue); + } + } + + /** + * get response header, not avaliable now + * + * @param field + */ + private Object getResponseHeader(String field) { + return responseHeaders == null ? null : responseHeaders.get(field); + } +} diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java new file mode 100644 index 0000000..3a55e0f --- /dev/null +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -0,0 +1,387 @@ +package cn.trinea.android.common.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import cn.trinea.android.common.constant.HttpConstants; +import cn.trinea.android.common.entity.HttpRequest; +import cn.trinea.android.common.entity.HttpResponse; + +/** + * HttpUtils + * + * @author Trinea 2013-5-12 + */ +public class HttpUtils { + + /** url and para separator **/ + public static final String URL_AND_PARA_SEPARATOR = "?"; + /** parameters separator **/ + public static final String PARAMETERS_SEPARATOR = "&"; + /** paths separator **/ + public static final String PATHS_SEPARATOR = "/"; + /** equal sign **/ + public static final String EQUAL_SIGN = "="; + + /** + * http get + *
        + *
      • use gzip compression default
      • + *
      • use bufferedReader to improve the reading speed
      • + *
      + * + * @param request + * @return the response of the url, if null represents http error + */ + public static HttpResponse httpGet(HttpRequest request) { + if (request == null) { + return null; + } + + BufferedReader input = null; + HttpURLConnection con = null; + try { + URL url = new URL(request.getUrl()); + try { + HttpResponse response = new HttpResponse(request.getUrl()); + // default gzip encode + con = (HttpURLConnection)url.openConnection(); + setURLConnection(request, con); + input = new BufferedReader(new InputStreamReader(con.getInputStream())); + StringBuilder sb = new StringBuilder(); + String s; + while ((s = input.readLine()) != null) { + sb.append(s).append("\n"); + } + response.setResponseBody(sb.toString()); + setHttpResponse(con, response); + return response; + } catch (IOException e) { + e.printStackTrace(); + } + } catch (MalformedURLException e1) { + e1.printStackTrace(); + } finally { + // close buffered + if (input != null) { + try { + input.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // disconnecting releases the resources held by a connection so they may be closed or reused + if (con != null) { + con.disconnect(); + } + } + + return null; + } + + /** + * http get + * + * @param httpUrl + * @return the response of the url, if null represents http error + * @see HttpUtils#httpGet(HttpRequest) + */ + public static HttpResponse httpGet(String httpUrl) { + return httpGet(new HttpRequest(httpUrl)); + } + + /** + * http get + * + * @param httpUrl + * @return the content of the url, if null represents http error + * @see HttpUtils#httpGet(HttpRequest) + */ + public static String httpGetString(String httpUrl) { + HttpResponse response = httpGet(new HttpRequest(httpUrl)); + return response == null ? null : response.getResponseBody(); + } + + /** + * http post + *
        + *
      • use gzip compression default
      • + *
      • use bufferedReader to improve the reading speed
      • + *
      + * + * @param httpUrl + * @param paras + * @return the response of the url, if null represents http error + */ + public static HttpResponse httpPost(HttpRequest request) { + if (request == null) { + return null; + } + + BufferedReader input = null; + HttpURLConnection con = null; + try { + URL url = new URL(request.getUrl()); + try { + HttpResponse response = new HttpResponse(request.getUrl()); + // default gzip encode + con = (HttpURLConnection)url.openConnection(); + setURLConnection(request, con); + con.setRequestMethod("POST"); + con.setDoOutput(true); + String paras = request.getParas(); + if (!StringUtils.isEmpty(paras)) { + con.getOutputStream().write(paras.getBytes()); + } + input = new BufferedReader(new InputStreamReader(con.getInputStream())); + StringBuilder sb = new StringBuilder(); + String s; + while ((s = input.readLine()) != null) { + sb.append(s).append("\n"); + } + response.setResponseBody(sb.toString()); + setHttpResponse(con, response); + return response; + } catch (IOException e) { + e.printStackTrace(); + } + } catch (MalformedURLException e1) { + e1.printStackTrace(); + } finally { + // close buffered + if (input != null) { + try { + input.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + // disconnecting releases the resources held by a connection so they may be closed or reused + if (con != null) { + con.disconnect(); + } + } + + return null; + } + + /** + * http post + * + * @param httpUrl + * @return the response of the url, if null represents http error + * @see HttpUtils#httpPost(HttpRequest) + */ + public static HttpResponse httpPost(String httpUrl) { + return httpPost(new HttpRequest(httpUrl)); + } + + /** + * http post + * + * @param httpUrl + * @return the content of the url, if null represents http error + * @see HttpUtils#httpPost(HttpRequest) + */ + public static String httpPostString(String httpUrl) { + HttpResponse response = httpPost(new HttpRequest(httpUrl)); + return response == null ? null : response.getResponseBody(); + } + + /** + * http post + * + * @param httpUrl + * @param parasMap paras map, key is para name, value is para value. will be transfrom to String by + * {@link HttpUtils#joinParas(Map)} + * @return the content of the url, if null represents http error + * @see HttpUtils#httpPost(HttpRequest) + */ + public static String httpPostString(String httpUrl, Map parasMap) { + HttpResponse response = httpPost(new HttpRequest(httpUrl, parasMap)); + return response == null ? null : response.getResponseBody(); + } + + /** + * join url and paras + * + *
      +     * getUrlWithParas(null, {(a, b)})                        =   "?a=b";
      +     * getUrlWithParas("baidu.com", {})                       =   "baidu.com";
      +     * getUrlWithParas("baidu.com", {(a, b), (i, j)})         =   "baidu.com?a=b&i=j";
      +     * getUrlWithParas("baidu.com", {(a, b), (i, j), (c, d)}) =   "baidu.com?a=b&i=j&c=d";
      +     * 
      + * + * @param url url + * @param parasMap paras map, key is para name, value is para value + * @return if url is null, process it as empty string + */ + public static String getUrlWithParas(String url, Map parasMap) { + StringBuilder urlWithParas = new StringBuilder(StringUtils.isEmpty(url) ? "" : url); + String paras = joinParas(parasMap); + if (!StringUtils.isEmpty(paras)) { + urlWithParas.append(URL_AND_PARA_SEPARATOR).append(paras); + } + return urlWithParas.toString(); + } + + /** + * join url and encoded paras + * + * @param url + * @param parasMap + * @return + * @see #getUrlWithParas(String, Map) + * @see StringUtils#utf8Encode(String) + */ + public static String getUrlWithValueEncodeParas(String url, Map parasMap) { + StringBuilder urlWithParas = new StringBuilder(StringUtils.isEmpty(url) ? "" : url); + String paras = joinParasWithEncodedValue(parasMap); + if (!StringUtils.isEmpty(paras)) { + urlWithParas.append(URL_AND_PARA_SEPARATOR).append(paras); + } + return urlWithParas.toString(); + } + + /** + * join paras + * + * @param parasMap paras map, key is para name, value is para value + * @return join key and value with {@link #EQUAL_SIGN}, join keys with {@link #PARAMETERS_SEPARATOR} + */ + public static String joinParas(Map parasMap) { + if (parasMap == null || parasMap.size() == 0) { + return null; + } + + StringBuilder paras = new StringBuilder(); + Iterator> ite = parasMap.entrySet().iterator(); + while (ite.hasNext()) { + Map.Entry entry = (Map.Entry)ite.next(); + paras.append(entry.getKey()).append(EQUAL_SIGN).append(entry.getValue()); + if (ite.hasNext()) { + paras.append(PARAMETERS_SEPARATOR); + } + } + return paras.toString(); + } + + /** + * join paras with encoded value + * + * @param parasMap + * @return + * @see #joinParas(Map) + * @see StringUtils#utf8Encode(String) + */ + public static String joinParasWithEncodedValue(Map parasMap) { + StringBuilder paras = new StringBuilder(""); + if (parasMap != null && parasMap.size() > 0) { + Iterator> ite = parasMap.entrySet().iterator(); + try { + while (ite.hasNext()) { + Map.Entry entry = (Map.Entry)ite.next(); + paras.append(entry.getKey()).append(EQUAL_SIGN).append(StringUtils.utf8Encode(entry.getValue())); + if (ite.hasNext()) { + paras.append(PARAMETERS_SEPARATOR); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return paras.toString(); + } + + /** + * append a key and value pair to url + * + * @param url + * @param paraKey + * @param paraValue + * @return + */ + public static String appednParaToUrl(String url, String paraKey, String paraValue) { + if (StringUtils.isEmpty(url)) { + return url; + } + + StringBuilder sb = new StringBuilder(url); + if (!url.contains(URL_AND_PARA_SEPARATOR)) { + sb.append(URL_AND_PARA_SEPARATOR); + } else { + sb.append(PARAMETERS_SEPARATOR); + } + return sb.append(paraKey).append(EQUAL_SIGN).append(paraValue).toString(); + } + + /** + * set HttpRequest to HttpURLConnection + * + * @param request source request + * @param urlConnection destin url connection + */ + private static void setURLConnection(HttpRequest request, HttpURLConnection urlConnection) { + if (request == null || urlConnection == null) { + return; + } + + Set> proSet = request.getRequestPropertys().entrySet(); + for (Map.Entry entry : proSet) { + urlConnection.setRequestProperty(entry.getKey(), entry.getValue()); + } + if (request.getConnectTimeout() >= 0) { + urlConnection.setConnectTimeout(request.getConnectTimeout()); + } + if (request.getReadTimeout() >= 0) { + urlConnection.setReadTimeout(request.getReadTimeout()); + } + } + + /** + * set HttpURLConnection to HttpResponse + * + * @param urlConnection source url connection + * @param response destin response + */ + private static void setHttpResponse(HttpURLConnection urlConnection, HttpResponse response) { + if (response == null || urlConnection == null) { + return; + } + try { + response.setResponseCode(urlConnection.getResponseCode()); + } catch (IOException e) { + response.setResponseCode(-1); + } + response.setResponseHeader(HttpConstants.EXPIRES, urlConnection.getHeaderField("Expires")); + response.setResponseHeader(HttpConstants.CACHE_CONTROL, urlConnection.getHeaderField("Cache-Control")); + } + + private static final SimpleDateFormat GMT_FORMAT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", + Locale.ENGLISH); + + /** + * parse gmt time to long + * + * @param gmtTime likes Thu, 11 Apr 2013 10:20:30 GMT + * @return -1 represents exception + */ + public static long parseGmtTime(String gmtTime) { + try { + return GMT_FORMAT.parse(gmtTime).getTime(); + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + } +} diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/cn/trinea/android/common/util/MapUtils.java index a83f554..57b53e5 100644 --- a/src/cn/trinea/android/common/util/MapUtils.java +++ b/src/cn/trinea/android/common/util/MapUtils.java @@ -1,6 +1,7 @@ package cn.trinea.android.common.util; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -257,4 +258,29 @@ public static Map parseKeyAndValueToMap(String source) { return parseKeyAndValueToMap(source, DEFAULT_KEY_AND_VALUE_SEPARATOR, DEFAULT_KEY_AND_VALUE_PAIR_SEPARATOR, true); } + + /** + * join map + * + * @param map + * @return + */ + public static String toJson(Map map) { + if (map == null || map.size() == 0) { + return null; + } + + StringBuilder paras = new StringBuilder(); + paras.append("{"); + Iterator> ite = map.entrySet().iterator(); + while (ite.hasNext()) { + Map.Entry entry = (Map.Entry)ite.next(); + paras.append("\"").append(entry.getKey()).append("\":").append(entry.getValue()); + if (ite.hasNext()) { + paras.append(","); + } + } + paras.append("}"); + return paras.toString(); + } } From 564347d189e5437e3d09173321cce19642140a22 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 30 Sep 2013 19:29:44 +0800 Subject: [PATCH 031/241] modify java doc --- AndroidManifest.xml | 2 +- .../trinea/android/common/util/HttpUtils.java | 63 +++++++++++++------ .../android/common/util/ResourceUtils.java | 2 +- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ea4b7e3..10efcf2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="3.7.4" > diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index 3a55e0f..18c7d78 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -13,12 +13,37 @@ import java.util.Map.Entry; import java.util.Set; +import android.content.Context; +import android.content.pm.PackageManager; + import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.entity.HttpRequest; import cn.trinea.android.common.entity.HttpResponse; /** * HttpUtils + *
        + * Http get + *
      • {@link #httpGet(HttpRequest)}
      • + *
      • {@link #httpGet(String)}
      • + *
      • {@link #httpGetString(String)}
      • + *
      + *
        + * Http post + *
      • {@link #httpPost(HttpRequest)}
      • + *
      • {@link #httpPost(String)}
      • + *
      • {@link #httpPostString(String)}
      • + *
      • {@link #httpPostString(String, Map)}
      • + *
      + *
        + * Http params + *
      • {@link #getUrlWithParas(String, Map)}
      • + *
      • {@link #getUrlWithValueEncodeParas(String, Map)}
      • + *
      • {@link #joinParas(Map)}
      • + *
      • {@link #joinParasWithEncodedValue(Map)}
      • + *
      • {@link #appendParaToUrl(String, String, String)}
      • + *
      • {@link #parseGmtTime(String)}
      • + *
      * * @author Trinea 2013-5-12 */ @@ -311,7 +336,7 @@ public static String joinParasWithEncodedValue(Map parasMap) { * @param paraValue * @return */ - public static String appednParaToUrl(String url, String paraKey, String paraValue) { + public static String appendParaToUrl(String url, String paraKey, String paraValue) { if (StringUtils.isEmpty(url)) { return url; } @@ -325,6 +350,24 @@ public static String appednParaToUrl(String url, String paraKey, String paraValu return sb.append(paraKey).append(EQUAL_SIGN).append(paraValue).toString(); } + private static final SimpleDateFormat GMT_FORMAT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", + Locale.ENGLISH); + + /** + * parse gmt time to long + * + * @param gmtTime likes Thu, 11 Apr 2013 10:20:30 GMT + * @return -1 represents exception + */ + public static long parseGmtTime(String gmtTime) { + try { + return GMT_FORMAT.parse(gmtTime).getTime(); + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + } + /** * set HttpRequest to HttpURLConnection * @@ -366,22 +409,4 @@ private static void setHttpResponse(HttpURLConnection urlConnection, HttpRespons response.setResponseHeader(HttpConstants.EXPIRES, urlConnection.getHeaderField("Expires")); response.setResponseHeader(HttpConstants.CACHE_CONTROL, urlConnection.getHeaderField("Cache-Control")); } - - private static final SimpleDateFormat GMT_FORMAT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", - Locale.ENGLISH); - - /** - * parse gmt time to long - * - * @param gmtTime likes Thu, 11 Apr 2013 10:20:30 GMT - * @return -1 represents exception - */ - public static long parseGmtTime(String gmtTime) { - try { - return GMT_FORMAT.parse(gmtTime).getTime(); - } catch (Exception e) { - e.printStackTrace(); - } - return -1; - } } diff --git a/src/cn/trinea/android/common/util/ResourceUtils.java b/src/cn/trinea/android/common/util/ResourceUtils.java index 9d2be95..b6dad39 100644 --- a/src/cn/trinea/android/common/util/ResourceUtils.java +++ b/src/cn/trinea/android/common/util/ResourceUtils.java @@ -44,7 +44,7 @@ public static String geFileFromAssets(Context context, String fileName) { } /** - * get a data stream for reading a raw resource. This can only be used with resources whose value is the name of an + * get content from a raw resource. This can only be used with resources whose value is the name of an * asset files -- that is, it can be used to open drawable, sound, and raw resources; it will fail on string and * color resources. * From 006229b23309dea9b31d50912d060c0e38e916e0 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 8 Oct 2013 11:21:45 +0800 Subject: [PATCH 032/241] Update README.md add android common utils --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 33fd3b3..544383f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及工具类(下载管理、静默安装、shell工具类等等)。 +**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、json等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 @@ -42,6 +42,9 @@ ####三. 工具类 +具体介绍可见:[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) +目前包括HttpUtils、DownloadManagerPro、ShellUtils、PackageUtils、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、MapUtils、ObjectUtils、SerializeUtils、SystemUtils、TimeUtils。 +
      #####1. Android系统下载管理DownloadManager使用 使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android%E7%B3%BB%E7%BB%9F%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D%E5%8F%8A%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B/) 功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E5%A2%9E%E5%BC%BA%E5%92%8Cbug%E4%BF%AE%E6%94%B9/) @@ -55,4 +58,5 @@ 直接调用[ShellUtils.execCommand](https://github.com/Trinea/AndroidCommon/blob/master/src/cn/trinea/android/common/util/ShellUtils.java#LC43)方法 #####4. 图片工具类 -(1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap +(1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap +更多工具类介绍见[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) From 1695b827da731fe205c030f52933b423f279f0c3 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 9 Oct 2013 21:33:18 +0800 Subject: [PATCH 033/241] fix max-age should in milliseconds bug --- src/cn/trinea/android/common/entity/HttpResponse.java | 4 ++-- src/cn/trinea/android/common/util/HttpUtils.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/cn/trinea/android/common/entity/HttpResponse.java index 8c3b0a0..33c8841 100644 --- a/src/cn/trinea/android/common/entity/HttpResponse.java +++ b/src/cn/trinea/android/common/entity/HttpResponse.java @@ -127,7 +127,7 @@ public String getExpiresHeader() { /** * http cache-control in reponse header * - * @return -1 represents http error or no cache-control in response headers + * @return -1 represents http error or no cache-control in response headers, or max-age in seconds */ public int getCacheControlMaxAge() { try { @@ -164,7 +164,7 @@ public int getCacheControlMaxAge() { public long getExpiresInMillis() { int maxAge = getCacheControlMaxAge(); if (maxAge != -1) { - return System.currentTimeMillis() + maxAge; + return System.currentTimeMillis() + maxAge * 1000; } else { String expire = getExpiresHeader(); if (!StringUtils.isEmpty(expire)) { diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index 18c7d78..ee02a65 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -357,7 +357,7 @@ public static String appendParaToUrl(String url, String paraKey, String paraValu * parse gmt time to long * * @param gmtTime likes Thu, 11 Apr 2013 10:20:30 GMT - * @return -1 represents exception + * @return -1 represents exception otherwise time in milliseconds */ public static long parseGmtTime(String gmtTime) { try { From 133d2a513ae7cabb93a2435e6994b86335a77393 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 11 Oct 2013 13:37:42 +0800 Subject: [PATCH 034/241] add api guide url in readme add api guide url in readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 544383f..d644eaa 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ ------------- **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、json等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true)。 +**Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 From e566465fa6dcd73078ab10c0e105a30629cd4952 Mon Sep 17 00:00:00 2001 From: hackooo <422642235@qq.com> Date: Sat, 12 Oct 2013 19:29:39 +0800 Subject: [PATCH 035/241] Create ImageCacheManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 图片的内存缓存与本地缓存结合,只是简单的包装,大家试试好不好使,哈哈哈,我是新手,不好使大家一起改。 这个类需要结合 ImageCache和ImageSDCardCache一起使用。 --- .../common/service/impl/ImageCacheManager | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/cn/trinea/android/common/service/impl/ImageCacheManager diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager b/src/cn/trinea/android/common/service/impl/ImageCacheManager new file mode 100644 index 0000000..fb474cf --- /dev/null +++ b/src/cn/trinea/android/common/service/impl/ImageCacheManager @@ -0,0 +1,117 @@ +/** + * 图片缓存管理,有两级缓存,第一级为 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 + */ + public class ImageCacheManager{ + private final ImageCache IMAGE_CACHE = new ImageCache(128); + private Context context; + + private ImageSDCardCacheManager imgSDCardCacheManager; + + public ImageCacheManager(Context ctx){ + context = ctx; + imgSDCardCacheManager = new ImageSDCardCacheManager(); + OnImageCallbackListener imageCallBack = new OnImageCallbackListener() { + private static final long serialVersionUID = 1L; + @Override + public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache) { + if (view != null && imageDrawable != null) { + ImageView imageView = (ImageView)view; + imageView.setImageDrawable(imageDrawable); + if (!isInCache) { + imageView.startAnimation(getInAlphaAnimation(2000)); + } + } + } + }; + IMAGE_CACHE.setOnImageCallbackListener(imageCallBack); + IMAGE_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + IMAGE_CACHE.setHttpReadTimeOut(10000); + IMAGE_CACHE.setOpenWaitingQueue(true); + IMAGE_CACHE.setValidTime(-1); + IMAGE_CACHE.setOnGetDataListener(new OnGetDataListener(){ + private static final long serialVersionUID = -3015419170577770764L; + @Override + public CacheObject onGetData(String key) { + Drawable d = null; + try { + CacheObject cs = imgSDCardCacheManager.getImgCache().getOnGetDataListener().onGetData(key); + String filepath = cs.getData(); + Bitmap bm = BitmapFactory.decodeFile(filepath,null); + d = new BitmapDrawable(context.getResources(),bm); + Log.d("test","file_path:"+filepath); + } catch (Exception e) { + Log.e("test", "get drawable exception, imageUrl is:" + key, e); + } + return (d == null ? null : new CacheObject(d)); + }}); + } + public AlphaAnimation getInAlphaAnimation(long durationMillis) { + AlphaAnimation inAlphaAnimation = new AlphaAnimation(0, 1); + inAlphaAnimation.setDuration(durationMillis); + return inAlphaAnimation; + } + public ImageCache getImgCache(){ + return IMAGE_CACHE; + } + + /** + * 图片缓存管理,这一层只负责网络和本地图片之间的缓存 + * @author maxiaohui + * + */ + private class ImageSDCardCacheManager { + public final ImageSDCardCache IMAGE_SD_CACHE = new ImageSDCardCache(); + public ImageSDCardCacheManager(){ + IMAGE_SD_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + IMAGE_SD_CACHE.setCacheFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "TrineaAndroidCommon"); + //IMAGE_SD_CACHE.setCacheFolder(Environment.getDataDirectory() + File.separator + "TrineaAndroidCommon"); + IMAGE_SD_CACHE.setFileNameRule(new FileNameRuleImageUrl()); + IMAGE_SD_CACHE.setHttpReadTimeOut(10000); + IMAGE_SD_CACHE.setOpenWaitingQueue(true); + IMAGE_SD_CACHE.setValidTime(-1); + IMAGE_SD_CACHE.setOnGetDataListener(new OnGetDataListener(){ + private static final long serialVersionUID = 1L; + @Override + public CacheObject onGetData(String key) { + /** + * local file cache + * @author maxiaohui + */ + String TAG = "test"; + Log.d("test","哈哈哈哈哈!!!"); + String imgPath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); + File img = new File(imgPath); + if(img.exists()){ + return new CacheObject(imgPath); + } + //below is the same as ImageSDCardCache.getDefaultOnGetImageListener() + String savePath = null; + try { + InputStream stream = ImageUtils.getInputStreamFromUrl(key, IMAGE_SD_CACHE.getHttpReadTimeOut()); + if (stream != null) { + savePath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); + try { + FileUtils.writeFile(savePath, stream); + } catch (Exception e) { + if (e.getCause() instanceof FileNotFoundException) { + FileUtils.makeFolders(savePath); + FileUtils.writeFile(savePath, stream); + } else { + Log.e(TAG,new StringBuilder().append("get drawable exception while write to file, imageUrl is: ") + .append(key).append(", savePath is ").append(savePath) + .toString(), e); + savePath = null; + } + } + } + } catch (Exception e) { + Log.e(TAG, new StringBuilder().append("get drawable exception, imageUrl is:").append(key).toString(), e); + } + return (StringUtils.isEmpty(savePath) ? null : new CacheObject(savePath)); + }}); + } + public ImageSDCardCache getImgCache(){ + return IMAGE_SD_CACHE; + } + } + } From 8e9d39ae42e067d1c5a26875bfe33d0b2dee7a28 Mon Sep 17 00:00:00 2001 From: hackooo <422642235@qq.com> Date: Sat, 12 Oct 2013 23:32:33 +0800 Subject: [PATCH 036/241] Update ImageCacheManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改SDCardCache获取那一步,先去SDCardCache的cache队列查询再去执行onGetData() --- .../common/service/impl/ImageCacheManager | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager b/src/cn/trinea/android/common/service/impl/ImageCacheManager index fb474cf..3a90a7e 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCacheManager +++ b/src/cn/trinea/android/common/service/impl/ImageCacheManager @@ -1,5 +1,8 @@ /** * 图片缓存管理,有两级缓存,第一级为 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 + *使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如 + * ImageCacheManager imgCacheManager = new ImageCacheManager(context); + * imgCacheManager.getImgCache().get(String url,View view); */ public class ImageCacheManager{ private final ImageCache IMAGE_CACHE = new ImageCache(128); @@ -32,12 +35,23 @@ private static final long serialVersionUID = -3015419170577770764L; @Override public CacheObject onGetData(String key) { - Drawable d = null; + Drawable d = null; try { - CacheObject cs = imgSDCardCacheManager.getImgCache().getOnGetDataListener().onGetData(key); - String filepath = cs.getData(); - Bitmap bm = BitmapFactory.decodeFile(filepath,null); - d = new BitmapDrawable(context.getResources(),bm); + String filepath; + //1.从SDCardCache的cache队列查询 + CacheObject co = imgSDCardCacheManager.getImgCache().get(key); + if(null != co){ + filepath= co.getData(); + }else{ + //2.调用SDCardCache的onGetData(),该步骤分两步:1.查找本地文件;2网络获取 + imgSDCardCacheManager.getImgCache().remove(key); + CacheObject cs = imgSDCardCacheManager.getImgCache().getOnGetDataListener().onGetData(key); + filepath = cs!=null?cs.getData():""; + } + if(!StringUtils.isEmpty(filepath) && FileUtils.isFileExist(filepath)){ + Bitmap bm = BitmapFactory.decodeFile(filepath,null); + d = new BitmapDrawable(context.getResources(),bm); + } Log.d("test","file_path:"+filepath); } catch (Exception e) { Log.e("test", "get drawable exception, imageUrl is:" + key, e); @@ -78,7 +92,6 @@ * @author maxiaohui */ String TAG = "test"; - Log.d("test","哈哈哈哈哈!!!"); String imgPath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); File img = new File(imgPath); if(img.exists()){ From 200563eec362efcea3a84302e8e0632598a568ef Mon Sep 17 00:00:00 2001 From: hackooo <422642235@qq.com> Date: Sat, 12 Oct 2013 23:56:28 +0800 Subject: [PATCH 037/241] =?UTF-8?q?=E6=9B=B4=E6=96=B0ImageCacheManager(?= =?UTF-8?q?=E5=93=88=E5=93=88=EF=BC=8C=E6=88=91=E4=BC=9A=E7=94=A8git?= =?UTF-8?q?=E4=BA=86=EF=BC=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用桌面的Git客户端进行修改 --- .../service/impl/ImageCacheManager.java | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 src/cn/trinea/android/common/service/impl/ImageCacheManager.java diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java new file mode 100644 index 0000000..9a3a0a2 --- /dev/null +++ b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java @@ -0,0 +1,153 @@ +package cn.trinea.android.common.service.impl; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.InputStream; + +import cn.trinea.android.common.entity.CacheObject; +import cn.trinea.android.common.service.impl.ImageCache.OnImageCallbackListener; +import cn.trinea.android.common.service.impl.PreloadDataCache.OnGetDataListener; +import cn.trinea.android.common.util.FileUtils; +import cn.trinea.android.common.util.ImageUtils; +import cn.trinea.android.common.util.StringUtils; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Environment; +import android.util.Log; +import android.view.View; +import android.view.animation.AlphaAnimation; +import android.widget.ImageView; + +/** + * 图片缓存管理,有两级缓存,第一级为 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 + *使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如 + * ImageCacheManager imgCacheManager = new ImageCacheManager(context); + * imgCacheManager.getImgCache().get(String url,View view); + */ + public class ImageCacheManager{ + private final ImageCache IMAGE_CACHE = new ImageCache(128); + private Context context; + + private ImageSDCardCacheManager imgSDCardCacheManager; + + public ImageCacheManager(Context ctx){ + context = ctx; + imgSDCardCacheManager = new ImageSDCardCacheManager(); + OnImageCallbackListener imageCallBack = new OnImageCallbackListener() { + private static final long serialVersionUID = 1L; + @Override + public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache) { + if (view != null && imageDrawable != null) { + ImageView imageView = (ImageView)view; + imageView.setImageDrawable(imageDrawable); + if (!isInCache) { + imageView.startAnimation(getInAlphaAnimation(2000)); + } + } + } + }; + IMAGE_CACHE.setOnImageCallbackListener(imageCallBack); + IMAGE_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + IMAGE_CACHE.setHttpReadTimeOut(10000); + IMAGE_CACHE.setOpenWaitingQueue(true); + IMAGE_CACHE.setValidTime(-1); + IMAGE_CACHE.setOnGetDataListener(new OnGetDataListener(){ + private static final long serialVersionUID = -3015419170577770764L; + @Override + public CacheObject onGetData(String key) { + Drawable d = null; + try { + String filepath; + //1.从SDCardCache的cache队列查询 + CacheObject co = imgSDCardCacheManager.getImgCache().get(key); + if(null != co){ + filepath= co.getData(); + }else{ + //2.调用SDCardCache的onGetData(),该步骤分两步:1.查找本地文件;2网络获取 + imgSDCardCacheManager.getImgCache().remove(key); + CacheObject cs = imgSDCardCacheManager.getImgCache().getOnGetDataListener().onGetData(key); + filepath = cs!=null?cs.getData():""; + } + if(!StringUtils.isEmpty(filepath) && FileUtils.isFileExist(filepath)){ + Bitmap bm = BitmapFactory.decodeFile(filepath,null); + d = new BitmapDrawable(context.getResources(),bm); + } + Log.d("test","file_path:"+filepath); + } catch (Exception e) { + Log.e("test", "get drawable exception, imageUrl is:" + key, e); + } + return (d == null ? null : new CacheObject(d)); + }}); + } + public AlphaAnimation getInAlphaAnimation(long durationMillis) { + AlphaAnimation inAlphaAnimation = new AlphaAnimation(0, 1); + inAlphaAnimation.setDuration(durationMillis); + return inAlphaAnimation; + } + public ImageCache getImgCache(){ + return IMAGE_CACHE; + } + + /** + * 图片缓存管理,这一层只负责网络和本地图片之间的缓存 + * @author maxiaohui + * + */ + private class ImageSDCardCacheManager { + public final ImageSDCardCache IMAGE_SD_CACHE = new ImageSDCardCache(); + public ImageSDCardCacheManager(){ + IMAGE_SD_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + IMAGE_SD_CACHE.setCacheFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "TrineaAndroidCommon"); + //IMAGE_SD_CACHE.setCacheFolder(Environment.getDataDirectory() + File.separator + "TrineaAndroidCommon"); + IMAGE_SD_CACHE.setFileNameRule(new FileNameRuleImageUrl()); + IMAGE_SD_CACHE.setHttpReadTimeOut(10000); + IMAGE_SD_CACHE.setOpenWaitingQueue(true); + IMAGE_SD_CACHE.setValidTime(-1); + IMAGE_SD_CACHE.setOnGetDataListener(new OnGetDataListener(){ + private static final long serialVersionUID = 1L; + @Override + public CacheObject onGetData(String key) { + /** + * local file cache + * @author maxiaohui + */ + String TAG = "test"; + String imgPath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); + File img = new File(imgPath); + if(img.exists()){ + return new CacheObject(imgPath); + } + //below is the same as ImageSDCardCache.getDefaultOnGetImageListener() + String savePath = null; + try { + InputStream stream = ImageUtils.getInputStreamFromUrl(key, IMAGE_SD_CACHE.getHttpReadTimeOut()); + if (stream != null) { + savePath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); + try { + FileUtils.writeFile(savePath, stream); + } catch (Exception e) { + if (e.getCause() instanceof FileNotFoundException) { + FileUtils.makeFolders(savePath); + FileUtils.writeFile(savePath, stream); + } else { + Log.e(TAG,new StringBuilder().append("get drawable exception while write to file, imageUrl is: ") + .append(key).append(", savePath is ").append(savePath) + .toString(), e); + savePath = null; + } + } + } + } catch (Exception e) { + Log.e(TAG, new StringBuilder().append("get drawable exception, imageUrl is:").append(key).toString(), e); + } + return (StringUtils.isEmpty(savePath) ? null : new CacheObject(savePath)); + }}); + } + public ImageSDCardCache getImgCache(){ + return IMAGE_SD_CACHE; + } + } + } From 86d391c0eed9f2086d3047aa93e9af9b58f9f532 Mon Sep 17 00:00:00 2001 From: hackooo <422642235@qq.com> Date: Sun, 13 Oct 2013 00:14:57 +0800 Subject: [PATCH 038/241] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ImageCacheManager?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=96=B9=E6=B3=95=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ImageCacheManager.java | 60 ++++++++++++------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java index 9a3a0a2..f0a5191 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java +++ b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java @@ -22,21 +22,40 @@ import android.widget.ImageView; /** - * 图片缓存管理,有两级缓存,第一级为 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 - *使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如 - * ImageCacheManager imgCacheManager = new ImageCacheManager(context); - * imgCacheManager.getImgCache().get(String url,View view); - */ + * @author maxiaohui hackooo@sina.cn + * + * 图片缓存管理,有两级缓存,第一级为 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 + * 使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如: + * ImageCacheManager imgCacheManager = new ImageCacheManager(context); + * + * 参数的设置与原来的ImageCache和ImageSDCardCache一致(可以删除代码中的一些默认的设置) + * ImageCache IMAGE_CACHE = imgCacheManager。getImgCache(); + * IMAGE_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + * IMAGE_CACHE.setHttpReadTimeOut(10000); + * IMAGE_CACHE.setOpenWaitingQueue(true); + * 。。。。。。 + * ImageSDCardCache IMAGE_SD_CACHE = imgCacheManager.getImgSDCardCache(); + * IMAGE_SD_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + * IMAGE_SD_CACHE.setCacheFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "TrineaAndroidCommon"); + * 。。。。。。 + * 获取图片的时候 + * IMAGE_CACHE.get(String url,View view); + */ public class ImageCacheManager{ private final ImageCache IMAGE_CACHE = new ImageCache(128); private Context context; + private String TAG="ImageCacheManager"; private ImageSDCardCacheManager imgSDCardCacheManager; public ImageCacheManager(Context ctx){ context = ctx; imgSDCardCacheManager = new ImageSDCardCacheManager(); - OnImageCallbackListener imageCallBack = new OnImageCallbackListener() { + IMAGE_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + IMAGE_CACHE.setHttpReadTimeOut(10000); + IMAGE_CACHE.setOpenWaitingQueue(true); + IMAGE_CACHE.setValidTime(-1); + IMAGE_CACHE.setOnImageCallbackListener(new OnImageCallbackListener() { private static final long serialVersionUID = 1L; @Override public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache) { @@ -48,20 +67,16 @@ public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, bo } } } - }; - IMAGE_CACHE.setOnImageCallbackListener(imageCallBack); - IMAGE_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); - IMAGE_CACHE.setHttpReadTimeOut(10000); - IMAGE_CACHE.setOpenWaitingQueue(true); - IMAGE_CACHE.setValidTime(-1); + }); + IMAGE_CACHE.setOnGetDataListener(new OnGetDataListener(){ private static final long serialVersionUID = -3015419170577770764L; @Override public CacheObject onGetData(String key) { Drawable d = null; try { - String filepath; - //1.从SDCardCache的cache队列查询 + String filepath; + //1.从SDCardCache的cache队列查询 CacheObject co = imgSDCardCacheManager.getImgCache().get(key); if(null != co){ filepath= co.getData(); @@ -75,9 +90,9 @@ public CacheObject onGetData(String key) { Bitmap bm = BitmapFactory.decodeFile(filepath,null); d = new BitmapDrawable(context.getResources(),bm); } - Log.d("test","file_path:"+filepath); + Log.d(TAG,"file_path:"+filepath); } catch (Exception e) { - Log.e("test", "get drawable exception, imageUrl is:" + key, e); + Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); } return (d == null ? null : new CacheObject(d)); }}); @@ -90,10 +105,13 @@ public AlphaAnimation getInAlphaAnimation(long durationMillis) { public ImageCache getImgCache(){ return IMAGE_CACHE; } + public ImageSDCardCache getImgSDCardCache(){ + return imgSDCardCacheManager.getImgCache(); + } /** * 图片缓存管理,这一层只负责网络和本地图片之间的缓存 - * @author maxiaohui + * @author maxiaohui hackooo@sina.cn * */ private class ImageSDCardCacheManager { @@ -110,17 +128,13 @@ public ImageSDCardCacheManager(){ private static final long serialVersionUID = 1L; @Override public CacheObject onGetData(String key) { - /** - * local file cache - * @author maxiaohui - */ - String TAG = "test"; + //1.先从本地文件查找;2.从网络获取 String imgPath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); File img = new File(imgPath); if(img.exists()){ return new CacheObject(imgPath); } - //below is the same as ImageSDCardCache.getDefaultOnGetImageListener() + //下面与 ImageSDCardCache.getDefaultOnGetImageListener()内的实现相同 String savePath = null; try { InputStream stream = ImageUtils.getInputStreamFromUrl(key, IMAGE_SD_CACHE.getHttpReadTimeOut()); From 71d9d350cbdc61a25a338839d8ba73f732090854 Mon Sep 17 00:00:00 2001 From: hackooo <422642235@qq.com> Date: Sun, 13 Oct 2013 00:44:49 +0800 Subject: [PATCH 039/241] =?UTF-8?q?=E8=BF=9B=E4=B8=80=E6=AD=A5=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ImageCacheManager.java | 255 +++++++++--------- 1 file changed, 120 insertions(+), 135 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java index f0a5191..254a190 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java +++ b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java @@ -24,144 +24,129 @@ /** * @author maxiaohui hackooo@sina.cn * - * 图片缓存管理,有两级缓存,第一级为 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 - * 使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如: - * ImageCacheManager imgCacheManager = new ImageCacheManager(context); - * - * 参数的设置与原来的ImageCache和ImageSDCardCache一致(可以删除代码中的一些默认的设置) - * ImageCache IMAGE_CACHE = imgCacheManager。getImgCache(); - * IMAGE_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); - * IMAGE_CACHE.setHttpReadTimeOut(10000); - * IMAGE_CACHE.setOpenWaitingQueue(true); - * 。。。。。。 - * ImageSDCardCache IMAGE_SD_CACHE = imgCacheManager.getImgSDCardCache(); - * IMAGE_SD_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); - * IMAGE_SD_CACHE.setCacheFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "TrineaAndroidCommon"); - * 。。。。。。 - * 获取图片的时候 - * IMAGE_CACHE.get(String url,View view); + * 图片缓存管理,有两级缓存,第一级为 + * 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 + * 使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如: ImageCacheManager + * imgCacheManager = new ImageCacheManager(context); + * + * 参数的设置与原来的ImageCache和ImageSDCardCache一致(可以删除代码中的一些默认的设置) ImageCache + * IMAGE_CACHE = imgCacheManager。getImgCache(); + * + * IMAGE_CACHE.setCacheFullRemoveType(new + * RemoveTypeLastUsedTimeFirst()); + * IMAGE_CACHE.setHttpReadTimeOut(10000); + * IMAGE_CACHE.setOpenWaitingQueue(true); IMAGE_CACHE.setValidTime(-1); + * IMAGE_CACHE.setOnImageCallbackListener(new OnImageCallbackListener(){ + * private static final long serialVersionUID = 1L; + * @Override + * public void onImageLoaded(String imageUrl, Drawable imageDrawable,View view, boolean isInCache) + * { + * if (view != null && imageDrawable!= null) { + * ImageView imageView = (ImageView)view; + * imageView.setImageDrawable(imageDrawable); + * if (!isInCache) { + * imageView.startAnimation(getInAlphaAnimation(2000)); + * } + * } + * } + * }); + * 。。。。。。 + * ImageSDCardCache IMAGE_SD_CACHE = imgCacheManager.getImgSDCardCache(); + * IMAGE_SD_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + * IMAGE_SD_CACHE.setCacheFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "TrineaAndroidCommon"); + * IMAGE_SD_CACHE.setFileNameRule(new FileNameRuleImageUrl()); + * IMAGE_SD_CACHE.setHttpReadTimeOut(10000); + * IMAGE_SD_CACHE.setOpenWaitingQueue(true); + * IMAGE_SD_CACHE.setValidTime(-1); + * 。。。。。。 获取图片的时候 + * IMAGE_CACHE.get(String url,View view); */ - public class ImageCacheManager{ - private final ImageCache IMAGE_CACHE = new ImageCache(128); - private Context context; - private String TAG="ImageCacheManager"; - - private ImageSDCardCacheManager imgSDCardCacheManager; +public class ImageCacheManager { + private final ImageCache IMAGE_CACHE = new ImageCache(128); + private Context context; + private String TAG = "ImageCacheManager"; - public ImageCacheManager(Context ctx){ - context = ctx; - imgSDCardCacheManager = new ImageSDCardCacheManager(); - IMAGE_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); - IMAGE_CACHE.setHttpReadTimeOut(10000); - IMAGE_CACHE.setOpenWaitingQueue(true); - IMAGE_CACHE.setValidTime(-1); - IMAGE_CACHE.setOnImageCallbackListener(new OnImageCallbackListener() { - private static final long serialVersionUID = 1L; - @Override - public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache) { - if (view != null && imageDrawable != null) { - ImageView imageView = (ImageView)view; - imageView.setImageDrawable(imageDrawable); - if (!isInCache) { - imageView.startAnimation(getInAlphaAnimation(2000)); - } - } - } - }); - - IMAGE_CACHE.setOnGetDataListener(new OnGetDataListener(){ - private static final long serialVersionUID = -3015419170577770764L; - @Override - public CacheObject onGetData(String key) { - Drawable d = null; - try { - String filepath; - //1.从SDCardCache的cache队列查询 - CacheObject co = imgSDCardCacheManager.getImgCache().get(key); - if(null != co){ - filepath= co.getData(); - }else{ - //2.调用SDCardCache的onGetData(),该步骤分两步:1.查找本地文件;2网络获取 - imgSDCardCacheManager.getImgCache().remove(key); - CacheObject cs = imgSDCardCacheManager.getImgCache().getOnGetDataListener().onGetData(key); - filepath = cs!=null?cs.getData():""; - } - if(!StringUtils.isEmpty(filepath) && FileUtils.isFileExist(filepath)){ - Bitmap bm = BitmapFactory.decodeFile(filepath,null); - d = new BitmapDrawable(context.getResources(),bm); - } - Log.d(TAG,"file_path:"+filepath); - } catch (Exception e) { - Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); - } - return (d == null ? null : new CacheObject(d)); - }}); - } - public AlphaAnimation getInAlphaAnimation(long durationMillis) { - AlphaAnimation inAlphaAnimation = new AlphaAnimation(0, 1); - inAlphaAnimation.setDuration(durationMillis); - return inAlphaAnimation; - } - public ImageCache getImgCache(){ - return IMAGE_CACHE; - } - public ImageSDCardCache getImgSDCardCache(){ - return imgSDCardCacheManager.getImgCache(); - } - - /** - * 图片缓存管理,这一层只负责网络和本地图片之间的缓存 - * @author maxiaohui hackooo@sina.cn - * - */ - private class ImageSDCardCacheManager { - public final ImageSDCardCache IMAGE_SD_CACHE = new ImageSDCardCache(); - public ImageSDCardCacheManager(){ - IMAGE_SD_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); - IMAGE_SD_CACHE.setCacheFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "TrineaAndroidCommon"); - //IMAGE_SD_CACHE.setCacheFolder(Environment.getDataDirectory() + File.separator + "TrineaAndroidCommon"); - IMAGE_SD_CACHE.setFileNameRule(new FileNameRuleImageUrl()); - IMAGE_SD_CACHE.setHttpReadTimeOut(10000); - IMAGE_SD_CACHE.setOpenWaitingQueue(true); - IMAGE_SD_CACHE.setValidTime(-1); - IMAGE_SD_CACHE.setOnGetDataListener(new OnGetDataListener(){ + private ImageSDCardCacheManager imgSDCardCacheManager; + + public ImageCacheManager(Context ctx) { + context = ctx; + imgSDCardCacheManager = new ImageSDCardCacheManager(); + IMAGE_CACHE.setOnGetDataListener(new OnGetDataListener() { private static final long serialVersionUID = 1L; + @Override - public CacheObject onGetData(String key) { - //1.先从本地文件查找;2.从网络获取 - String imgPath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); - File img = new File(imgPath); - if(img.exists()){ - return new CacheObject(imgPath); - } - //下面与 ImageSDCardCache.getDefaultOnGetImageListener()内的实现相同 - String savePath = null; - try { - InputStream stream = ImageUtils.getInputStreamFromUrl(key, IMAGE_SD_CACHE.getHttpReadTimeOut()); - if (stream != null) { - savePath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); - try { - FileUtils.writeFile(savePath, stream); - } catch (Exception e) { - if (e.getCause() instanceof FileNotFoundException) { - FileUtils.makeFolders(savePath); - FileUtils.writeFile(savePath, stream); - } else { - Log.e(TAG,new StringBuilder().append("get drawable exception while write to file, imageUrl is: ") - .append(key).append(", savePath is ").append(savePath) - .toString(), e); - savePath = null; - } - } - } - } catch (Exception e) { - Log.e(TAG, new StringBuilder().append("get drawable exception, imageUrl is:").append(key).toString(), e); - } - return (StringUtils.isEmpty(savePath) ? null : new CacheObject(savePath)); - }}); - } - public ImageSDCardCache getImgCache(){ - return IMAGE_SD_CACHE; - } + public CacheObject onGetData(String key) { + Drawable d = null; + try { + String filepath; + // 1.从SDCardCache的cache队列查询 + CacheObject co = imgSDCardCacheManager.getImgCache().get(key); + if (null != co) { + filepath = co.getData(); + } else { + // 2.调用SDCardCache的onGetData(),该步骤分两步:1.查找本地文件;2网络获取 + imgSDCardCacheManager.getImgCache().remove(key); + CacheObject cs = imgSDCardCacheManager + .getImgCache().getOnGetDataListener() + .onGetData(key); + filepath = cs != null ? cs.getData() : ""; + } + if (!StringUtils.isEmpty(filepath) && FileUtils.isFileExist(filepath)) { + Bitmap bm = BitmapFactory.decodeFile(filepath,null); + d = new BitmapDrawable(context.getResources(),bm); + } + } catch (Exception e) { + Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); + } + return (d == null ? null : new CacheObject(d)); + } + }); + } + + public AlphaAnimation getInAlphaAnimation(long durationMillis) { + AlphaAnimation inAlphaAnimation = new AlphaAnimation(0, 1); + inAlphaAnimation.setDuration(durationMillis); + return inAlphaAnimation; + } + + public ImageCache getImgCache() { + return IMAGE_CACHE; + } + + public ImageSDCardCache getImgSDCardCache() { + return imgSDCardCacheManager.getImgCache(); + } + + /** + * 图片缓存管理,这一层只负责网络和本地图片之间的缓存 + * + * @author maxiaohui hackooo@sina.cn + * + */ + private class ImageSDCardCacheManager { + public final ImageSDCardCache IMAGE_SD_CACHE = new ImageSDCardCache(); + + public ImageSDCardCacheManager() { + + IMAGE_SD_CACHE.setOnGetDataListener(new OnGetDataListener() { + private static final long serialVersionUID = 1L; + + @Override + public CacheObject onGetData(String key) { + // 1.先从本地文件查找;2.从网络获取 + String imgPath = IMAGE_SD_CACHE.getCacheFolder()+ File.separator+ IMAGE_SD_CACHE.getFileNameRule().getFileName(key); + File img = new File(imgPath); + if (img.exists()) { + return new CacheObject(imgPath); + } else { + return IMAGE_SD_CACHE.getDefaultOnGetImageListener().onGetData(key); + } + } + }); + } + + public ImageSDCardCache getImgCache() { + return IMAGE_SD_CACHE; } } +} From 2e8d85853eee1666603421aecbdba2839ed30a13 Mon Sep 17 00:00:00 2001 From: hackooo <422642235@qq.com> Date: Sun, 13 Oct 2013 00:46:30 +0800 Subject: [PATCH 040/241] change ImageCacheManager.java --- .../trinea/android/common/service/impl/ImageCacheManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java index 254a190..babed2e 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java +++ b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java @@ -26,8 +26,8 @@ * * 图片缓存管理,有两级缓存,第一级为 * 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 - * 使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如: ImageCacheManager - * imgCacheManager = new ImageCacheManager(context); + * 使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如: + * ImageCacheManager imgCacheManager = new ImageCacheManager(context); * * 参数的设置与原来的ImageCache和ImageSDCardCache一致(可以删除代码中的一些默认的设置) ImageCache * IMAGE_CACHE = imgCacheManager。getImgCache(); From 7415b447e6a6dae13dc060da6190d072c5aee71f Mon Sep 17 00:00:00 2001 From: hackooo <422642235@qq.com> Date: Sun, 13 Oct 2013 00:48:01 +0800 Subject: [PATCH 041/241] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BE=8B=E5=AD=90?= =?UTF-8?q?=E7=9A=84=E5=B0=8Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trinea/android/common/service/impl/ImageCacheManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java index babed2e..e4aa526 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java +++ b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java @@ -45,7 +45,7 @@ * ImageView imageView = (ImageView)view; * imageView.setImageDrawable(imageDrawable); * if (!isInCache) { - * imageView.startAnimation(getInAlphaAnimation(2000)); + * imageView.startAnimation(imgCacheManager.getInAlphaAnimation(2000)); * } * } * } From e6ecc1499437015911e90a7689d921068e2097f7 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 16 Oct 2013 20:57:01 +0800 Subject: [PATCH 042/241] fix readFile charset error --- src/cn/trinea/android/common/util/FileUtils.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index f5f24ef..5521e32 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -2,12 +2,13 @@ import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -44,10 +45,11 @@ public class FileUtils { * read file * * @param filePath + * @param charsetName The name of a supported {@link java.nio.charset.Charset charset} * @return if file not exist, return null, else return content of file * @throws IOException if an error occurs while operator BufferedReader */ - public static StringBuilder readFile(String filePath) { + public static StringBuilder readFile(String filePath, String charsetName) { File file = new File(filePath); StringBuilder fileContent = new StringBuilder(""); if (file == null || !file.isFile()) { @@ -56,7 +58,8 @@ public static StringBuilder readFile(String filePath) { BufferedReader reader = null; try { - reader = new BufferedReader(new FileReader(file)); + InputStreamReader is = new InputStreamReader(new FileInputStream(file), charsetName); + reader = new BufferedReader(is); String line = null; while ((line = reader.readLine()) != null) { if (!fileContent.toString().equals("")) { @@ -147,10 +150,11 @@ public static boolean writeFile(String filePath, InputStream stream) { * read file to string list, a element of list is a line * * @param filePath + * @param charsetName The name of a supported {@link java.nio.charset.Charset charset} * @return if file not exist, return null, else return content of file * @throws IOException if an error occurs while operator BufferedReader */ - public static List readFileToList(String filePath) { + public static List readFileToList(String filePath, String charsetName) { File file = new File(filePath); List fileContent = new ArrayList(); if (file == null || !file.isFile()) { @@ -159,7 +163,8 @@ public static List readFileToList(String filePath) { BufferedReader reader = null; try { - reader = new BufferedReader(new FileReader(file)); + InputStreamReader is = new InputStreamReader(new FileInputStream(file), charsetName); + reader = new BufferedReader(is); String line = null; while ((line = reader.readLine()) != null) { fileContent.add(line); From d52df4e8c220360c0b0bbc2c968f1d96e72dce54 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 22 Oct 2013 21:31:12 +0800 Subject: [PATCH 043/241] add isTopActivity in PackageUtils.java --- AndroidManifest.xml | 4 +-- .../android/common/util/PackageUtils.java | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 10efcf2..e89a871 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="24" + android:versionName="3.7.5" > diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index b8d4bf2..c2a1ca9 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -1,7 +1,10 @@ package cn.trinea.android.common.util; import java.io.File; +import java.util.List; +import android.app.ActivityManager; +import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -379,6 +382,35 @@ public static boolean isSystemApplication(PackageManager packageManager, String return false; } + /** + * whether the app whost package's name is packageName is on the top of the stack + *
        + * Attentions: + *
      • You should add android.permission.GET_TASKS in manifest
      • + *
      + * + * @param context + * @param packageName + * @return + */ + public static boolean isTopActivity(Context context, String packageName) { + if (context == null || StringUtils.isEmpty(packageName)) { + return false; + } + + ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); + List tasksInfo = activityManager.getRunningTasks(1); + if (ListUtils.isEmpty(tasksInfo)) { + return false; + } + try { + return packageName.equals(tasksInfo.get(0).topActivity.getPackageName()); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + /** * Installation return code
      * install success. From af27124619fa0f6acba523ec8218099d7e102d8b Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 23 Oct 2013 19:34:30 +0800 Subject: [PATCH 044/241] update utils add hashcode to CacheObject add setFileExtension to FileNameRuleImageUrl add isCheckNetwork to PreloadDataCache --- AndroidManifest.xml | 4 ++-- .../android/common/entity/CacheObject.java | 6 +++++ .../service/impl/FileNameRuleImageUrl.java | 10 +++++++- .../common/service/impl/PreloadDataCache.java | 24 +++++++++++++++++-- .../trinea/android/common/util/HttpUtils.java | 5 +--- .../android/common/util/ObjectUtils.java | 2 +- .../android/common/util/PackageUtils.java | 14 +++++++---- .../android/common/util/PreferencesUtils.java | 2 +- 8 files changed, 52 insertions(+), 15 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e89a871..eb617e6 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="25" + android:versionName="3.7.6" > diff --git a/src/cn/trinea/android/common/entity/CacheObject.java b/src/cn/trinea/android/common/entity/CacheObject.java index 56ee72f..2720c57 100644 --- a/src/cn/trinea/android/common/entity/CacheObject.java +++ b/src/cn/trinea/android/common/entity/CacheObject.java @@ -194,6 +194,7 @@ public int compareTo(CacheObject o) { * if data, enterTime, priority, isExpired, isForever all equals */ @SuppressWarnings("unchecked") + @Override public boolean equals(Object o) { if (o == null) { return false; @@ -203,4 +204,9 @@ public boolean equals(Object o) { return (ObjectUtils.isEquals(this.data, obj.data) && this.enterTime == obj.enterTime && this.priority == obj.priority && this.isExpired == obj.isExpired && this.isForever == obj.isForever); } + + @Override + public int hashCode() { + return data == null ? 0 : data.hashCode(); + } } diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java b/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java index 77d5588..b566ab2 100644 --- a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java +++ b/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java @@ -9,6 +9,7 @@ *
        *
      • use image url as file name, replace char with _ if not letter or number
      • *
      • use file suffix in url as target file suffix
      • + *
      • use {@link #setFileExtension(String)} set file extension
      • *
      * * @author Trinea 2012-11-21 @@ -22,17 +23,24 @@ public class FileNameRuleImageUrl implements FileNameRule { /** max length of file name, not include suffix **/ public static final int MAX_FILE_NAME_LENGTH = 127; + private String fileExtension = null; + @Override public String getFileName(String imageUrl) { if (StringUtils.isEmpty(imageUrl)) { return DEFAULT_FILE_NAME; } - String ext = FileUtils.getFileExtension(imageUrl); + String ext = (fileExtension == null ? FileUtils.getFileExtension(imageUrl) : fileExtension); String fileName = (imageUrl.length() >= MAX_FILE_NAME_LENGTH ? imageUrl.substring(imageUrl.length() - MAX_FILE_NAME_LENGTH, imageUrl.length()) : imageUrl).replaceAll("[\\W]", "_"); return StringUtils.isEmpty(ext) ? fileName : (new StringBuilder().append(fileName).append(".").append(ext).toString()); } + + public FileNameRuleImageUrl setFileExtension(String fileExtension) { + this.fileExtension = fileExtension; + return this; + } } diff --git a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java index 7204d6a..11f6382 100644 --- a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java +++ b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java @@ -59,11 +59,13 @@ public class PreloadDataCache extends SimpleCache { /** count for preload backward, default is {@link #DEFAULT_BACKWARD_CACHE_NUMBER} **/ private int backwardCacheNumber = DEFAULT_BACKWARD_CACHE_NUMBER; + /** whether to check the network at first when get data **/ + private boolean isCheckNetwork = true; /** allowed network type, default to all network types allowed **/ private int allowedNetworkTypes = ~0; /** get data listener **/ - private OnGetDataListener onGetDataListener; + protected OnGetDataListener onGetDataListener; /** * restore threads those getting data, to avoid multi threads get the data for same key so that to save network @@ -282,7 +284,7 @@ protected int preloadDataBackward(K key, List keyList, int cacheCount) { * @return */ private synchronized GetDataThread gettingData(K key) { - if (containsKey(key) || !checkIsNetworkTypeAllowed()) { + if (containsKey(key) || (isCheckNetwork && !checkIsNetworkTypeAllowed())) { return null; } @@ -426,6 +428,24 @@ public void setAllowedNetworkTypes(int allowedNetworkTypes) { this.allowedNetworkTypes = allowedNetworkTypes; } + /** + * get whether to check the network at first when get data, used when {@link #checkIsNetworkTypeAllowed()} + * + * @return + */ + public boolean isCheckNetwork() { + return isCheckNetwork; + } + + /** + * set whether to check the network at first when get data, used when {@link #checkIsNetworkTypeAllowed()} + * + * @param isCheckNetwork + */ + public void setCheckNetwork(boolean isCheckNetwork) { + this.isCheckNetwork = isCheckNetwork; + } + public Context getContext() { return context; } diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index ee02a65..e8e3816 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -13,9 +13,6 @@ import java.util.Map.Entry; import java.util.Set; -import android.content.Context; -import android.content.pm.PackageManager; - import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.entity.HttpRequest; import cn.trinea.android.common.entity.HttpResponse; @@ -357,7 +354,7 @@ public static String appendParaToUrl(String url, String paraKey, String paraValu * parse gmt time to long * * @param gmtTime likes Thu, 11 Apr 2013 10:20:30 GMT - * @return -1 represents exception otherwise time in milliseconds + * @return -1 represents exception otherwise time in milliseconds */ public static long parseGmtTime(String gmtTime) { try { diff --git a/src/cn/trinea/android/common/util/ObjectUtils.java b/src/cn/trinea/android/common/util/ObjectUtils.java index 7d7a9ce..5c87c08 100644 --- a/src/cn/trinea/android/common/util/ObjectUtils.java +++ b/src/cn/trinea/android/common/util/ObjectUtils.java @@ -18,7 +18,7 @@ public class ObjectUtils { *
    */ public static boolean isEquals(Object actual, Object expected) { - return actual == null ? expected == null : actual.equals(expected); + return actual == expected || (actual == null ? expected == null : actual.equals(expected)); } /** diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index c2a1ca9..05b6cbe 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -34,6 +34,11 @@ *
  • {@link PackageUtils#isSystemApplication(Context, String)}
  • *
  • {@link PackageUtils#isSystemApplication(PackageManager, String)}
  • * + *
      + * Others + *
    • {@link PackageUtils#isTopActivity(Context, String)} whether the app whost package's name is packageName is on the + * top of the stack
    • + *
    * * @author Trinea 2013-5-15 */ @@ -391,17 +396,18 @@ public static boolean isSystemApplication(PackageManager packageManager, String * * @param context * @param packageName - * @return + * @return if params error or task stack is null, return null, otherwise retun whether the app is on the top of + * stack */ - public static boolean isTopActivity(Context context, String packageName) { + public static Boolean isTopActivity(Context context, String packageName) { if (context == null || StringUtils.isEmpty(packageName)) { - return false; + return null; } ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List tasksInfo = activityManager.getRunningTasks(1); if (ListUtils.isEmpty(tasksInfo)) { - return false; + return null; } try { return packageName.equals(tasksInfo.get(0).topActivity.getPackageName()); diff --git a/src/cn/trinea/android/common/util/PreferencesUtils.java b/src/cn/trinea/android/common/util/PreferencesUtils.java index 9b45e92..c3b3594 100644 --- a/src/cn/trinea/android/common/util/PreferencesUtils.java +++ b/src/cn/trinea/android/common/util/PreferencesUtils.java @@ -30,7 +30,7 @@ */ public class PreferencesUtils { - public static final String PREFERENCE_NAME = "TrineaAndroidCommon"; + public static String PREFERENCE_NAME = "TrineaAndroidCommon"; /** * put string preferences From 3179835d707e481439fb143892ccb83395cdd148 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Oct 2013 14:56:13 +0800 Subject: [PATCH 045/241] add secondary cahe add secondary cahe add ImageSDCardCache table add http cache table --- AndroidManifest.xml | 4 +- .../android/common/constant/DbConstants.java | 112 ++++ .../common/dao/ImageSDCardCacheDao.java | 40 ++ .../dao/impl/ImageSDCardCacheDaoImpl.java | 111 ++++ .../common/service/impl/ImageCache.java | 536 ++++++++---------- .../common/service/impl/ImageMemoryCache.java | 433 ++++++++++++++ .../common/service/impl/ImageSDCardCache.java | 95 +++- .../trinea/android/common/util/DbHelper.java | 38 ++ .../android/common/util/SqliteUtils.java | 43 ++ 9 files changed, 1113 insertions(+), 299 deletions(-) create mode 100644 src/cn/trinea/android/common/constant/DbConstants.java create mode 100644 src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java create mode 100644 src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java create mode 100644 src/cn/trinea/android/common/service/impl/ImageMemoryCache.java create mode 100644 src/cn/trinea/android/common/util/DbHelper.java create mode 100644 src/cn/trinea/android/common/util/SqliteUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index eb617e6..9eef2b0 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="26" + android:versionName="3.8.6" > diff --git a/src/cn/trinea/android/common/constant/DbConstants.java b/src/cn/trinea/android/common/constant/DbConstants.java new file mode 100644 index 0000000..535dcfd --- /dev/null +++ b/src/cn/trinea/android/common/constant/DbConstants.java @@ -0,0 +1,112 @@ +package cn.trinea.android.common.constant; + +/** + * Some constants about db + * + * @author Trinea 2013-10-21 + */ +public class DbConstants { + + public static final String DB_NAME = "trinea_android_common.db"; + public static final int DB_VERSION = 1; + + private static final String TERMINATOR = ";"; + + /** image sdcard cache table **/ + public static final StringBuffer CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL = new StringBuffer(); + public static final StringBuffer CREATE_IMAGE_SDCARD_CACHE_TABLE_INDEX_SQL = new StringBuffer(); + public static final String IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME = "image_sdcard_cache"; + public static final String IMAGE_SDCARD_CACHE_TABLE_ID = android.provider.BaseColumns._ID; + public static final String IMAGE_SDCARD_CACHE_TABLE_TAG = "tag"; + public static final String IMAGE_SDCARD_CACHE_TABLE_URL = "url"; + public static final String IMAGE_SDCARD_CACHE_TABLE_PATH = "path"; + public static final String IMAGE_SDCARD_CACHE_TABLE_ENTER_TIME = "enter_time"; + public static final String IMAGE_SDCARD_CACHE_TABLE_LAST_USED_TIME = "last_used_time"; + public static final String IMAGE_SDCARD_CACHE_TABLE_USED_COUNT = "used_count"; + public static final String IMAGE_SDCARD_CACHE_TABLE_PRIORITY = "priority"; + public static final String IMAGE_SDCARD_CACHE_TABLE_IS_EXPIRED = "is_expired"; + public static final String IMAGE_SDCARD_CACHE_TABLE_IS_FOREVER = "is_forever"; + + public static final String IMAGE_SDCARD_CACHE_TABLE_INDEX_TAG = "image_sdcard_cache_table_index_tag"; + public static final String IMAGE_SDCARD_CACHE_TABLE_INDEX_URL = "image_sdcard_cache_table_index_url"; + + public static final int IMAGE_SDCARD_CACHE_TABLE_ID_INDEX = 0; + public static final int IMAGE_SDCARD_CACHE_TABLE_TAG_INDEX = 1; + public static final int IMAGE_SDCARD_CACHE_TABLE_URL_INDEX = 2; + public static final int IMAGE_SDCARD_CACHE_TABLE_PATH_INDEX = 3; + public static final int IMAGE_SDCARD_CACHE_TABLE_ENTER_TIME_INDEX = 4; + public static final int IMAGE_SDCARD_CACHE_TABLE_LAST_USED_TIME_INDEX = 5; + public static final int IMAGE_SDCARD_CACHE_TABLE_USED_COUNT_INDEX = 6; + public static final int IMAGE_SDCARD_CACHE_TABLE_PRIORITY_INDEX = 7; + public static final int IMAGE_SDCARD_CACHE_TABLE_IS_EXPIRED_INDEX = 8; + public static final int IMAGE_SDCARD_CACHE_TABLE_IS_FOREVER_INDEX = 9; + + /** http response cache table **/ + public static final StringBuffer CREATE_HTTP_CACHE_TABLE_SQL = new StringBuffer(); + public static final StringBuffer CREATE_HTTP_CACHE_TABLE_INDEX_SQL = new StringBuffer(); + public static final StringBuffer CREATE_HTTP_CACHE_TABLE_UNIQUE_INDEX = new StringBuffer(); + public static final String HTTP_CACHE_TABLE_TABLE_NAME = "http_cache"; + public static final String HTTP_CACHE_TABLE_ID = android.provider.BaseColumns._ID; + public static final String HTTP_CACHE_TABLE_URL = "url"; + public static final String HTTP_CACHE_TABLE_RESPONSE = "response"; + public static final String HTTP_CACHE_TABLE_EXPIRES = "expires"; + public static final String HTTP_CACHE_TABLE_CREATE_TIME = "gmt_create"; + public static final String HTTP_CACHE_TABLE_TYPE = "type"; + + public static final String HTTP_CACHE_TABLE_UNIQUE_INDEX_URL = "http_cache_table_unique_index_url"; + public static final String HTTP_CACHE_TABLE_INDEX_TYPE = "http_cache_table_index_type"; + + public static final int HTTP_CACHE_TABLE_ID_INDEX = 0; + public static final int HTTP_CACHE_TABLE_URL_INDEX = 1; + public static final int HTTP_CACHE_TABLE_RESPONSE_INDEX = 2; + public static final int HTTP_CACHE_TABLE_EXPIRES_INDEX = 3; + public static final int HTTP_CACHE_TABLE_CREATE_TIME_INDEX = 4; + public static final int HTTP_CACHE_TABLE_TYPE_INDEX = 5; + + static { + /** + * sql to image sdcard cache table + **/ + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append("CREATE TABLE ").append(IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(" (").append(IMAGE_SDCARD_CACHE_TABLE_ID) + .append(" integer primary key autoincrement,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_TAG).append(" text,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_URL).append(" text,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_PATH).append(" text,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_ENTER_TIME).append(" integer,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_LAST_USED_TIME).append(" integer,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_USED_COUNT).append(" integer,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_PRIORITY).append(" integer,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_IS_EXPIRED).append(" integer,"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_IS_FOREVER).append(" integer)"); + CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(TERMINATOR); + + CREATE_IMAGE_SDCARD_CACHE_TABLE_INDEX_SQL.append("CREATE INDEX ").append(IMAGE_SDCARD_CACHE_TABLE_INDEX_TAG) + .append(" ON ").append(IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME) + .append("(").append(IMAGE_SDCARD_CACHE_TABLE_TAG).append(")") + .append(TERMINATOR).append("CREATE INDEX ") + .append(IMAGE_SDCARD_CACHE_TABLE_INDEX_URL).append(" ON ") + .append(IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME).append("(") + .append(IMAGE_SDCARD_CACHE_TABLE_URL).append(")").append(TERMINATOR); + + /** + * sql to http response table + **/ + CREATE_HTTP_CACHE_TABLE_SQL.append("CREATE TABLE ").append(HTTP_CACHE_TABLE_TABLE_NAME); + CREATE_HTTP_CACHE_TABLE_SQL.append(" (").append(HTTP_CACHE_TABLE_ID) + .append(" integer primary key autoincrement,"); + CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_URL).append(" text,"); + CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_RESPONSE).append(" text,"); + CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_EXPIRES).append(" integer,"); + CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_CREATE_TIME).append(" integer,"); + CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_TYPE).append(" integer)").append(TERMINATOR); + + CREATE_HTTP_CACHE_TABLE_UNIQUE_INDEX.append("CREATE UNIQUE INDEX ").append(HTTP_CACHE_TABLE_UNIQUE_INDEX_URL) + .append(" ON ").append(HTTP_CACHE_TABLE_TABLE_NAME).append("(") + .append(HTTP_CACHE_TABLE_URL).append(")").append(TERMINATOR); + CREATE_HTTP_CACHE_TABLE_INDEX_SQL.append("CREATE INDEX ").append(HTTP_CACHE_TABLE_INDEX_TYPE).append(" ON ") + .append(HTTP_CACHE_TABLE_TABLE_NAME).append("(").append(HTTP_CACHE_TABLE_TYPE) + .append(")").append(TERMINATOR); + + } +} diff --git a/src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java b/src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java new file mode 100644 index 0000000..e5b6c35 --- /dev/null +++ b/src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java @@ -0,0 +1,40 @@ +package cn.trinea.android.common.dao; + +import cn.trinea.android.common.service.impl.ImageSDCardCache; + +/** + * ImageSDCardCacheDao + * + * @author Trinea 2013-10-21 + */ +public interface ImageSDCardCacheDao { + + /** + * put all rows in db whose tag is same to tag to imageSDCardCache + *
      + * Attentions: + *
    • If imageSDCardCache is null, do nothing
    • + *
    • If tag is null or empty, do nothing
    • + *
    + * + * @param imageSDCardCache + * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or + * empty + * @return + */ + public boolean putIntoImageSDCardCache(ImageSDCardCache imageSDCardCache, String tag); + + /** + * delete all rows in db whose tag is same to tag at first, and insert all data in imageSDCardCache to db + *
      + * Attentions: + *
    • If imageSDCardCache is null, do nothing
    • + *
    • If tag is null or empty, do nothing
    • + *
    • Will delete all rows in db whose tag is same to tag at first
    • + *
    + * + * @param imageSDCardCache + * @return + */ + public boolean deleteAndInsertImageSDCardCache(ImageSDCardCache imageSDCardCache, String tag); +} diff --git a/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java new file mode 100644 index 0000000..1686a67 --- /dev/null +++ b/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java @@ -0,0 +1,111 @@ +package cn.trinea.android.common.dao.impl; + +import java.util.Map.Entry; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import cn.trinea.android.common.constant.DbConstants; +import cn.trinea.android.common.dao.ImageSDCardCacheDao; +import cn.trinea.android.common.entity.CacheObject; +import cn.trinea.android.common.service.impl.ImageSDCardCache; +import cn.trinea.android.common.util.SqliteUtils; +import cn.trinea.android.common.util.StringUtils; + +/** + * ImageSDCardCacheDao + * + * @author Trinea 2013-10-21 + */ +public class ImageSDCardCacheDaoImpl implements ImageSDCardCacheDao { + + private SqliteUtils sqliteUtils; + + public ImageSDCardCacheDaoImpl(SqliteUtils sqliteUtils){ + this.sqliteUtils = sqliteUtils; + } + + @Override + public boolean putIntoImageSDCardCache(ImageSDCardCache imageSDCardCache, String tag) { + if (imageSDCardCache == null || StringUtils.isEmpty(tag)) { + return false; + } + + StringBuilder selection = new StringBuilder(); + selection.append(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TAG).append("=?"); + String[] selectionArgs = { tag }; + Cursor cursor = sqliteUtils.getRDb().query(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME, null, + selection.toString(), selectionArgs, null, null, null); + if (cursor == null) { + return true; + } + + if (cursor != null && cursor.getCount() > 0) { + for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + CacheObject value = new CacheObject(); + String imageUrl = cursor.getString(DbConstants.IMAGE_SDCARD_CACHE_TABLE_URL_INDEX); + value.setData(cursor.getString(DbConstants.IMAGE_SDCARD_CACHE_TABLE_PATH_INDEX)); + value.setUsedCount(cursor.getInt(DbConstants.IMAGE_SDCARD_CACHE_TABLE_USED_COUNT_INDEX)); + value.setPriority(cursor.getInt(DbConstants.IMAGE_SDCARD_CACHE_TABLE_PRIORITY_INDEX)); + value.setExpired(cursor.getInt(DbConstants.IMAGE_SDCARD_CACHE_TABLE_IS_EXPIRED_INDEX) == 1); + value.setForever(cursor.getInt(DbConstants.IMAGE_SDCARD_CACHE_TABLE_IS_FOREVER_INDEX) == 1); + imageSDCardCache.put(imageUrl, value); + } + } + if (cursor != null && !cursor.isClosed()) { + cursor.close(); + } + return true; + } + + @Override + public boolean deleteAndInsertImageSDCardCache(ImageSDCardCache imageSDCardCache, String tag) { + if (imageSDCardCache == null || StringUtils.isEmpty(tag)) { + return false; + } + + SQLiteDatabase db = sqliteUtils.getWDb(); + db.beginTransaction(); + try { + StringBuilder whereClause = new StringBuilder(); + whereClause.append(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TAG).append("=?"); + String[] whereArgs = { tag }; + db.delete(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME, whereClause.toString(), whereArgs); + + String key; + CacheObject value; + for (Entry> entry : imageSDCardCache.entrySet()) { + if (entry != null && (key = entry.getKey()) != null && (value = entry.getValue()) != null) { + db.insert(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME, null, cacheObjectToCV(tag, key, value)); + } + } + + db.setTransactionSuccessful(); + return true; + } catch (Exception e) { + return false; + } finally { + db.endTransaction(); + } + } + + /** + * @param tag + * @param url + * @param value + * @return + */ + private static ContentValues cacheObjectToCV(String tag, String url, CacheObject value) { + ContentValues values = new ContentValues(); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TAG, tag); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_URL, url); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_PATH, value.getData()); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_ENTER_TIME, value.getEnterTime()); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_LAST_USED_TIME, value.getLastUsedTime()); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_USED_COUNT, value.getUsedCount()); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_PRIORITY, value.getPriority()); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_IS_EXPIRED, value.isExpired() ? 1 : 0); + values.put(DbConstants.IMAGE_SDCARD_CACHE_TABLE_IS_FOREVER, value.isForever() ? 1 : 0); + return values; + } +} diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index cbe2c86..b832f64 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -1,430 +1,378 @@ package cn.trinea.android.common.service.impl; -import java.io.Serializable; -import java.util.HashMap; -import java.util.HashSet; +import java.io.File; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import android.content.Context; +import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.util.Log; +import android.os.Environment; import android.view.View; import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; +import cn.trinea.android.common.service.FileNameRule; +import cn.trinea.android.common.service.impl.ImageMemoryCache.OnImageCallbackListener; +import cn.trinea.android.common.util.FileUtils; import cn.trinea.android.common.util.ImageUtils; -import cn.trinea.android.common.util.SizeUtils; -import cn.trinea.android.common.util.StringUtils; -import cn.trinea.android.common.util.SystemUtils; /** - * Image Memory Cache
    + * Image Cache
    *
    - * It applies to images those uesd frequently, like users avatar of twitter or sina weibo. Cache of big image you can - * consider of {@link ImageSDCardCache}.
    + * It's a cache with primary cache and secondary cache. It's a combination of {@link ImageMemoryCache} and + * {@link ImageSDCardCache}. It applies to apps those used much images, like sina weibo, twitter, taobao, huaban, weixin + * and so on.
    *
      * Setting and Usage - *
    • Use one of constructors below to init cache
    • - *
    • {@link #setOnImageCallbackListener(OnImageCallbackListener)} set callback interface after image get success
    • - *
    • {@link #get(String, List, View)} get image asynchronous and preload other images asynchronous according to - * urlList
    • - *
    • {@link #get(String, View)} get image asynchronous
    • + *
    • Use one of constructors in sections II to init cache
    • + *
    • {@link ImageMemoryCache#setOnImageCallbackListener(OnImageCallbackListener)} set callback interface after image + * get success
    • + *
    • {@link ImageMemoryCache#get(String, List, View)} get image asynchronous and preload other images asynchronous + * according to urlList
    • + *
    • {@link ImageMemoryCache#get(String, View)} get image asynchronous
    • *
    • {@link #setHttpReadTimeOut(int)} set http read image time out, if less than 0, not set. default is not set
    • - *
    • {@link #setOpenWaitingQueue(boolean)} set whether open waiting queue, default is true. If true, save all view - * waiting for image loaded, else only save the newest one
    • + *
    • {@link PreloadDataCache#setContext(Context)} and {@link #setAllowedNetworkTypes(int)} restrict the types of + * networks over which this data can get.
    • + *
    • {@link ImageMemoryCache#setOpenWaitingQueue(boolean)} set whether open waiting queue, default is true. If true, + * save all view waiting for image loaded, else only save the newest one
    • *
    • {@link PreloadDataCache#setOnGetDataListener(OnGetDataListener)} set how to get image, this cache will get image * and preload images by it
    • - *
    • {@link SimpleCache#setCacheFullRemoveType(CacheFullRemoveType)} set remove type when cache is full
    • + *
    • {@link SimpleCache#setCacheFullRemoveType(CacheFullRemoveType)} set remove type when primary cache is full
    • + *
    • {@link #setCacheFullRemoveTypeOfSecondaryCache(CacheFullRemoveType)} set remove type when secondary cache is full + *
    • *
    • other see {@link PreloadDataCache} and {@link SimpleCache}
    • *
    *
      * Constructor *
    • {@link #ImageCache()}
    • - *
    • {@link #ImageCache(int)}
    • *
    • {@link #ImageCache(int, int)}
    • + *
    • {@link #ImageCache(int, int, int, int)}
    • *
    * - * @author Trinea 2012-4-5 + * @author Trinea 2013-10-18 */ -public class ImageCache extends PreloadDataCache { +public class ImageCache extends ImageMemoryCache { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; + private ImageSDCardCache secondaryCache; - private static final String TAG = "ImageCache"; + /** cache folder path which be used when saving images **/ + public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory().getAbsolutePath() + + File.separator + "Trinea" + File.separator + "AndroidCommon" + + File.separator + "ImageCache"; - /** callback interface after image get success **/ - private OnImageCallbackListener onImageCallbackListener; - /** http read image time out, if less than 0, not set. default is not set **/ - private int httpReadTimeOut = -1; /** - * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the - * newest one - **/ - private boolean isOpenWaitingQueue = true; - - /** recommend default max cache size according to dalvik max memory **/ - public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); - /** image got success message what **/ - private static final int IMAGE_LOADED_WHAT = 1; - - /** thread pool whose wait for data got, attention, not the get data thread pool **/ - private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); - /** - * key is image url, value is the newest view which waiting for image loaded, used when {@link #isOpenWaitingQueue} - * is false - **/ - private transient Map viewMap; - /** - * key is image url, value is view set those waiting for image loaded, used when {@link #isOpenWaitingQueue} is true - **/ - private transient Map> viewSetMap; - - private transient Handler handler; - - /** - * get image asynchronous. when get image success, it will pass to - * {@link OnImageCallbackListener#onImageLoaded(String, Drawable, View, boolean)} + *
      + *
    • max size of primary cache is {@link ImageMemoryCache#DEFAULT_MAX_SIZE}, max size of secondary cache is + * {@link ImageSDCardCache#DEFAULT_MAX_SIZE}
    • + *
    • thread pool size of primary cache and secondary cache both are + * {@link PreloadDataCache#DEFAULT_THREAD_POOL_SIZE}
    • + *
    * - * @param imageUrl - * @param view - * @return whether image already in cache or not + * @see {@link #ImageCache(int, int, int, int)} */ - public boolean get(String imageUrl, View view) { - return get(imageUrl, null, view); + public ImageCache(){ + this(ImageMemoryCache.DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE, + ImageSDCardCache.DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } /** - * get image asynchronous and preload other images asynchronous according to urlList + *
      + *
    • max size of secondary cache is {@link ImageSDCardCache#DEFAULT_MAX_SIZE}
    • + *
    • thread pool size of primary cache and secondary cache both are + * {@link PreloadDataCache#DEFAULT_THREAD_POOL_SIZE}
    • + *
    * - * @param imageUrl - * @param urlList url list, if is null, not preload, else preload forward by - * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by - * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} - * @param view - * @return whether image already in cache or not + * @param primaryCacheMaxSize + * @param secondaryCacheMaxSize + * @see {@link #ImageCache(int, int, int, int)} */ - public boolean get(final String imageUrl, final List urlList, final View view) { - if (StringUtils.isEmpty(imageUrl)) { - return false; - } - - /** - * if already in cache, call onImageSDCallbackListener, else new thread to wait for it - */ - CacheObject object = getFromCache(imageUrl, urlList); - if (object != null) { - Drawable drawable = object.getData(); - if (drawable != null) { - if (onImageCallbackListener != null) { - onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, true); - } - return true; - } else { - remove(imageUrl); - } - } - - if (isOpenWaitingQueue) { - synchronized (viewSetMap) { - HashSet viewSet = viewSetMap.get(imageUrl); - if (viewSet == null) { - viewSet = new HashSet(); - viewSetMap.put(imageUrl, viewSet); - } - viewSet.add(view); - } - } else { - viewMap.put(imageUrl, view); - } - - if (isExistGettingDataThread(imageUrl)) { - return false; - } - - startGetImageThread(IMAGE_LOADED_WHAT, imageUrl, urlList); - return false; + public ImageCache(int primaryCacheMaxSize){ + this(primaryCacheMaxSize, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE, ImageSDCardCache.DEFAULT_MAX_SIZE, + PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } /** - * get callback interface after image get success + * thread pool size of primary cache and secondary cache both are {@link PreloadDataCache#DEFAULT_THREAD_POOL_SIZE} * - * @return the onImageCallbackListener + * @param primaryCacheMaxSize + * @param secondaryCacheMaxSize + * @see {@link #ImageCache(int, int, int, int)} */ - public OnImageCallbackListener getOnImageCallbackListener() { - return onImageCallbackListener; + public ImageCache(int primaryCacheMaxSize, int secondaryCacheMaxSize){ + this(primaryCacheMaxSize, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE, secondaryCacheMaxSize, + PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } /** - * set callback interface after image get success + *
      + *
    • Callback interface after image get success is null, can set by + * {@link PreloadDataCache#setOnImageCallbackListener(OnImageCallbackListener)}
    • + *
    • Get data listener of primary cache is {@link #getOnGetImageListenerOfPrimaryCache()}, you can set by + * {@link #setOnGetImageListenerOfPrimaryCache(OnGetDataListener)}, but not recommended, you may destory secondary + * cache.
    • + *
    • Get data listener of secondary cache is {@link #getOnGetImageListenerOfSecondaryCache()}, you can set by + * {@link #setOnGetImageListenerOfSecondaryCache(OnGetDataListener)}.
    • + *
    • Elements of the cache will not invalid
    • + *
    • Remove type of primary cache is {@link RemoveTypeUsedCountSmall} when cache is full
    • + *
    * - * @param onImageCallbackListener + * @param primaryCacheMaxSize maximum size of the primary cache + * @param primaryCacheThreadPoolSize getting data thread pool size of the primary cache + * @param secondaryCacheMaxSize maximum size of the secondary cache + * @param secondaryCacheThreadPoolSize getting data thread pool size of the secondary cache */ - public void setOnImageCallbackListener(OnImageCallbackListener onImageCallbackListener) { - this.onImageCallbackListener = onImageCallbackListener; + public ImageCache(int primaryCacheMaxSize, int primaryCacheThreadPoolSize, int secondaryCacheMaxSize, + int secondaryCacheThreadPoolSize){ + super(primaryCacheMaxSize, primaryCacheThreadPoolSize); + + setOnGetDataListener(new OnGetDataListener() { + + private static final long serialVersionUID = 1L; + + @Override + public CacheObject onGetData(String key) { + CacheObject object = secondaryCache.get(key); + String imagePath = (object == null ? null : object.getData()); + if (FileUtils.isFileExist(imagePath)) { + Drawable d = ImageUtils.bitmapToDrawable(BitmapFactory.decodeFile(imagePath)); + return (d == null ? null : new CacheObject(d)); + } else { + secondaryCache.remove(key); + } + return null; + } + }); + super.setCheckNetwork(false); + setCacheFullRemoveType(new RemoveTypeUsedCountSmall()); + + secondaryCache = new ImageSDCardCache(secondaryCacheMaxSize, secondaryCacheThreadPoolSize); + secondaryCache.setCacheFolder(DEFAULT_CACHE_FOLDER); + secondaryCache.setFileNameRule(new FileNameRuleImageUrl().setFileExtension("")); } /** - * get http read image time out, if less than 0, not set. default is not set + * get http read image time out of secondary cache, if less than 0, not set. default is not set * * @return the httpReadTimeOut */ + @Override public int getHttpReadTimeOut() { - return httpReadTimeOut; + return secondaryCache.getHttpReadTimeOut(); } /** - * set http read image time out, if less than 0, not set. default is not set, in mills + * set http read image time out of secondary cache, if less than 0, not set. default is not set, in mills * * @param readTimeOutMillis */ + @Override public void setHttpReadTimeOut(int readTimeOutMillis) { - this.httpReadTimeOut = readTimeOutMillis; + secondaryCache.setHttpReadTimeOut(readTimeOutMillis); + } + + /** + * clear both primary cache and secondary cache + */ + @Override + public void clear() { + super.clear(); + secondaryCache.clear(); + } + + @Override + public void setForwardCacheNumber(int forwardCacheNumber) { + super.setForwardCacheNumber(forwardCacheNumber); + secondaryCache.setForwardCacheNumber(forwardCacheNumber); + } + + @Override + public void setBackwardCacheNumber(int backwardCacheNumber) { + super.setForwardCacheNumber(backwardCacheNumber); + secondaryCache.setForwardCacheNumber(backwardCacheNumber); + } + + @Override + public int getAllowedNetworkTypes() { + return secondaryCache.getAllowedNetworkTypes(); + } + + @Override + public void setAllowedNetworkTypes(int allowedNetworkTypes) { + secondaryCache.setAllowedNetworkTypes(allowedNetworkTypes); + } + + @Override + public boolean isCheckNetwork() { + return secondaryCache.isCheckNetwork(); + } + + @Override + public void setCheckNetwork(boolean isCheckNetwork) { + secondaryCache.setCheckNetwork(isCheckNetwork); + } + + @Override + public boolean checkIsNetworkTypeAllowed() { + return secondaryCache.checkIsNetworkTypeAllowed(); + } + + @Override + public Context getContext() { + return secondaryCache.getContext(); + } + + @Override + public void setContext(Context context) { + secondaryCache.setContext(context); } /** - * get whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save - * the newest one + * get cache folder path which be used when saving images, default is {@link #DEFAULT_CACHE_FOLDER} * - * @return + * @return the cacheFolder + * @see ImageSDCardCache#getCacheFolder() */ - public boolean isOpenWaitingQueue() { - return isOpenWaitingQueue; + public String getCacheFolder() { + return secondaryCache.getCacheFolder(); } /** - * set whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save - * the newest one + * set cache folder path which be used when saving images, default is {@link #DEFAULT_CACHE_FOLDER} * - * @param isOpenWaitingQueue + * @param cacheFolder + * @see ImageSDCardCache#setCacheFolder(String) */ - public void setOpenWaitingQueue(boolean isOpenWaitingQueue) { - this.isOpenWaitingQueue = isOpenWaitingQueue; + public void setCacheFolder(String cacheFolder) { + secondaryCache.setCacheFolder(cacheFolder); } /** - *
      - *
    • Get data listener is {@link #getDefaultOnGetImageListener()}
    • - *
    • Callback interface after image get success is null, can set by - * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
    • - *
    • Maximum size of the cache is {@link #DEFAULT_MAX_SIZE}
    • - *
    • Elements of the cache will not invalid
    • - *
    • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
    • - *
    + * get file name rule which be used when saving images, default is {@link FileNameRuleImageUrl} * - * @see PreloadDataCache#PreloadDataCache() + * @return the fileNameRule + * @see ImageSDCardCache#getFileNameRule() */ - public ImageCache(){ - this(DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); + public FileNameRule getFileNameRule() { + return secondaryCache.getFileNameRule(); } /** - *
      - *
    • Get data listener is {@link #getDefaultOnGetImageListener()}
    • - *
    • Callback interface after image get success is null, can set by - * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
    • - *
    • Elements of the cache will not invalid
    • - *
    • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
    • - *
    + * set file name rule which be used when saving images, default is {@link FileNameRuleImageUrl} * - * @param maxSize maximum size of the cache - * @see PreloadDataCache#PreloadDataCache(int) + * @param fileNameRule + * @see ImageSDCardCache#setFileNameRule(FileNameRule) */ - public ImageCache(int maxSize){ - this(maxSize, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); + public void setFileNameRule(FileNameRule fileNameRule) { + secondaryCache.setFileNameRule(fileNameRule); } /** + * load all data in db whose tag is same to tag to this cache. just put, do not affect the original data *
      - *
    • Get data listener is {@link #getDefaultOnGetImageListener()}
    • - *
    • Callback interface after image get success is null, can set by - * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
    • - *
    • Elements of the cache will not invalid
    • - *
    • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
    • + * Attentions: + *
    • If tag is null or empty, throws exception
    • *
    * - * @param maxSize maximum size of the cache - * @param threadPoolSize getting data thread pool size - * @see PreloadDataCache#PreloadDataCache(int, int) + * @param context + * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or + * empty + * @return + * @see ImageSDCardCache#loadDataFromDb(Context, ImageSDCardCache, String) */ - public ImageCache(int maxSize, int threadPoolSize){ - super(maxSize, threadPoolSize); - - super.setOnGetDataListener(getDefaultOnGetImageListener()); - super.setCacheFullRemoveType(new RemoveTypeUsedCountSmall()); - this.viewMap = new ConcurrentHashMap(); - this.viewSetMap = new HashMap>(); - this.handler = new MyHandler(); - if (Looper.myLooper() == null) { - Looper.prepare(); - } + public boolean loadDataFromDb(Context context, String tag) { + return ImageSDCardCache.loadDataFromDb(context, secondaryCache, tag); } /** - * callback interface after image get success + * delete all rows in db whose tag is same to tag at first, and insert all data in this cache to db + *
      + * Attentions: + *
    • If tag is null or empty, throws exception
    • + *
    • Will delete all rows in db whose tag is same to tag at first
    • + *
    * - * @author Trinea 2012-4-5 + * @param context + * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or + * empty + * @return + * @see ImageSDCardCache#saveDataToDb(Context, ImageSDCardCache, String) */ - public interface OnImageCallbackListener extends Serializable { - - /** - * callback function after image get success, run on ui thread - * - * @param imageUrl imageUrl - * @param imageDrawable drawable - * @param view view need the image - * @param isInCache whether already in cache or got realtime - */ - public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache); + public boolean saveDataToDb(Context context, String tag) { + return ImageSDCardCache.saveDataToDb(context, secondaryCache, tag); } /** * @see ExecutorService#shutdown() */ + @Override public void shutdown() { - threadPool.shutdown(); + secondaryCache.shutdown(); super.shutdown(); } /** * @see ExecutorService#shutdownNow() */ + @Override public List shutdownNow() { - threadPool.shutdownNow(); + secondaryCache.shutdownNow(); return super.shutdownNow(); } /** - * My handler + * get get image listener of primary cache * - * @author Trinea 2012-11-20 + * @return + * @see {@link PreloadDataCache#getOnGetDataListener()} */ - private class MyHandler extends Handler { - - public void handleMessage(Message message) { - switch (message.what) { - case IMAGE_LOADED_WHAT: - MessageObject object = (MessageObject)message.obj; - if (object == null) { - break; - } - - String imageUrl = object.imageUrl; - Drawable drawable = object.drawable; - if (onImageCallbackListener != null) { - if (isOpenWaitingQueue) { - synchronized (viewSetMap) { - HashSet viewSet = viewSetMap.get(imageUrl); - if (viewSet != null) { - for (View view : viewSet) { - if (view != null) { - onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); - } - } - } - } - } else { - View view = viewMap.get(imageUrl); - if (view != null) { - onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); - } - } - } - - if (isOpenWaitingQueue) { - synchronized (viewSetMap) { - viewSetMap.remove(imageUrl); - } - } else { - viewMap.remove(imageUrl); - } - break; - } - } - }; + public OnGetDataListener getOnGetImageListenerOfPrimaryCache() { + return getOnGetDataListener(); + } /** - * message object + * set get data listener of primary cache, primary cache will get data and preload data by it * - * @author Trinea 2013-1-14 + * @param onGetImageListener + * @see {@link PreloadDataCache#setOnGetDataListener(OnGetDataListener)} */ - private class MessageObject { - - String imageUrl; - Drawable drawable; - - public MessageObject(String imageUrl, Drawable drawable){ - this.imageUrl = imageUrl; - this.drawable = drawable; - } + public void setOnGetImageListenerOfPrimaryCache(OnGetDataListener onGetImageListener) { + this.onGetDataListener = onGetImageListener; } /** - * start thread to wait for image get + * get get image listener of secondary cache * - * @param messsageWhat - * @param imageUrl - * @param urlList url list, if is null, not preload, else preload forward by - * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by - * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} + * @return */ - private void startGetImageThread(final int messsageWhat, final String imageUrl, final List urlList) { - // wait for image be got success and send message - threadPool.execute(new Runnable() { + public OnGetDataListener getOnGetImageListenerOfSecondaryCache() { + return secondaryCache.getOnGetDataListener(); + } - @Override - public void run() { - CacheObject object = get(imageUrl, urlList); - Drawable drawable = (object == null ? null : object.getData()); - // if drawable is null, remove it - if (drawable == null) { - remove(imageUrl); - } else { - handler.sendMessage(handler.obtainMessage(IMAGE_LOADED_WHAT, new MessageObject(imageUrl, drawable))); - } - } - }); + /** + * set get data listener of secondary cache, secondary cache will get data and preload data by it + * + * @param onGetImageListener + */ + public void setOnGetImageListenerOfSecondaryCache(OnGetDataListener onGetImageListener) { + secondaryCache.setOnGetDataListener(onGetImageListener); } /** - * default get image listener + * get remove type when secondary cache is full * * @return */ - public OnGetDataListener getDefaultOnGetImageListener() { - return new OnGetDataListener() { - - private static final long serialVersionUID = 1L; - - @Override - public CacheObject onGetData(String key) { - Drawable d = null; - try { - d = ImageUtils.getDrawableFromUrl(key, httpReadTimeOut); - } catch (Exception e) { - Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); - } - return (d == null ? null : new CacheObject(d)); - } - }; + public CacheFullRemoveType getCacheFullRemoveTypeOfSecondaryCache() { + return secondaryCache.getCacheFullRemoveType(); } /** - * get recommend default max cache size according to dalvik max memory + * set remove type when secondary cache is full * - * @return + * @param cacheFullRemoveType the cacheFullRemoveType to set */ - static int getDefaultMaxSize() { - long maxMemory = Runtime.getRuntime().maxMemory(); - if (maxMemory > SizeUtils.GB_2_BYTE) { - return 512; - } - - int mb = (int)(maxMemory / SizeUtils.MB_2_BYTE); - return mb > 16 ? mb * 2 : 16; + public void setCacheFullRemoveTypeOfSecondaryCache(CacheFullRemoveType cacheFullRemoveType) { + secondaryCache.setCacheFullRemoveType(cacheFullRemoveType); } } diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java new file mode 100644 index 0000000..2dd4f69 --- /dev/null +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -0,0 +1,433 @@ +package cn.trinea.android.common.service.impl; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.Log; +import android.view.View; +import cn.trinea.android.common.entity.CacheObject; +import cn.trinea.android.common.service.CacheFullRemoveType; +import cn.trinea.android.common.util.ImageUtils; +import cn.trinea.android.common.util.SizeUtils; +import cn.trinea.android.common.util.StringUtils; +import cn.trinea.android.common.util.SystemUtils; + +/** + * Image Memory Cache
    + *
    + * It applies to images those uesd frequently, like users avatar of twitter or sina weibo. Cache of big image you can + * consider of {@link ImageSDCardCache}.
    + *
      + * Setting and Usage + *
    • Use one of constructors in sections II to init cache
    • + *
    • {@link #setOnImageCallbackListener(OnImageCallbackListener)} set callback interface after image get success
    • + *
    • {@link #get(String, List, View)} get image asynchronous and preload other images asynchronous according to + * urlList
    • + *
    • {@link #get(String, View)} get image asynchronous
    • + *
    • {@link #setHttpReadTimeOut(int)} set http read image time out, if less than 0, not set. default is not set
    • + *
    • {@link PreloadDataCache#setContext(Context)} and {@link PreloadDataCache#setAllowedNetworkTypes(int)} restrict + * the types of networks over which this data can get.
    • + *
    • {@link #setOpenWaitingQueue(boolean)} set whether open waiting queue, default is true. If true, save all view + * waiting for image loaded, else only save the newest one
    • + *
    • {@link PreloadDataCache#setOnGetDataListener(OnGetDataListener)} set how to get image, this cache will get image + * and preload images by it
    • + *
    • {@link SimpleCache#setCacheFullRemoveType(CacheFullRemoveType)} set remove type when cache is full
    • + *
    • other see {@link PreloadDataCache} and {@link SimpleCache}
    • + *
    + *
      + * Constructor + *
    • {@link #ImageCache()}
    • + *
    • {@link #ImageCache(int)}
    • + *
    • {@link #ImageCache(int, int)}
    • + *
    + * + * @author Trinea 2012-4-5 + */ +public class ImageMemoryCache extends PreloadDataCache { + + private static final long serialVersionUID = 1L; + + private static final String TAG = "ImageCache"; + + /** callback interface after image get success **/ + private OnImageCallbackListener onImageCallbackListener; + /** http read image time out, if less than 0, not set. default is not set **/ + private int httpReadTimeOut = -1; + /** + * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the + * newest one + **/ + private boolean isOpenWaitingQueue = true; + + /** recommend default max cache size according to dalvik max memory **/ + public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); + /** image got success message what **/ + private static final int IMAGE_LOADED_WHAT = 1; + + /** thread pool whose wait for data got, attention, not the get data thread pool **/ + private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); + /** + * key is image url, value is the newest view which waiting for image loaded, used when {@link #isOpenWaitingQueue} + * is false + **/ + private transient Map viewMap; + /** + * key is image url, value is view set those waiting for image loaded, used when {@link #isOpenWaitingQueue} is true + **/ + private transient Map> viewSetMap; + + private transient Handler handler; + + /** + * get image asynchronous. when get image success, it will pass to + * {@link OnImageCallbackListener#onImageLoaded(String, Drawable, View, boolean)} + * + * @param imageUrl + * @param view + * @return whether image already in cache or not + */ + public boolean get(String imageUrl, View view) { + return get(imageUrl, null, view); + } + + /** + * get image asynchronous and preload other images asynchronous according to urlList + * + * @param imageUrl + * @param urlList url list, if is null, not preload, else preload forward by + * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by + * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} + * @param view + * @return whether image already in cache or not + */ + public boolean get(final String imageUrl, final List urlList, final View view) { + if (StringUtils.isEmpty(imageUrl)) { + return false; + } + + /** + * if already in cache, call onImageSDCallbackListener, else new thread to wait for it + */ + CacheObject object = getFromCache(imageUrl, urlList); + if (object != null) { + Drawable drawable = object.getData(); + if (drawable != null) { + if (onImageCallbackListener != null) { + onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, true); + } + return true; + } else { + remove(imageUrl); + } + } + + if (isOpenWaitingQueue) { + synchronized (viewSetMap) { + HashSet viewSet = viewSetMap.get(imageUrl); + if (viewSet == null) { + viewSet = new HashSet(); + viewSetMap.put(imageUrl, viewSet); + } + viewSet.add(view); + } + } else { + viewMap.put(imageUrl, view); + } + + if (isExistGettingDataThread(imageUrl)) { + return false; + } + + startGetImageThread(IMAGE_LOADED_WHAT, imageUrl, urlList); + return false; + } + + /** + * get callback interface after image get success + * + * @return the onImageCallbackListener + */ + public OnImageCallbackListener getOnImageCallbackListener() { + return onImageCallbackListener; + } + + /** + * set callback interface after image get success + * + * @param onImageCallbackListener + */ + public void setOnImageCallbackListener(OnImageCallbackListener onImageCallbackListener) { + this.onImageCallbackListener = onImageCallbackListener; + } + + /** + * get http read image time out, if less than 0, not set. default is not set + * + * @return the httpReadTimeOut + */ + public int getHttpReadTimeOut() { + return httpReadTimeOut; + } + + /** + * set http read image time out, if less than 0, not set. default is not set, in mills + * + * @param readTimeOutMillis + */ + public void setHttpReadTimeOut(int readTimeOutMillis) { + this.httpReadTimeOut = readTimeOutMillis; + } + + /** + * get whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save + * the newest one + * + * @return + */ + public boolean isOpenWaitingQueue() { + return isOpenWaitingQueue; + } + + /** + * set whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save + * the newest one + * + * @param isOpenWaitingQueue + */ + public void setOpenWaitingQueue(boolean isOpenWaitingQueue) { + this.isOpenWaitingQueue = isOpenWaitingQueue; + } + + /** + *
      + *
    • Get data listener is {@link #getDefaultOnGetImageListener()}
    • + *
    • Callback interface after image get success is null, can set by + * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
    • + *
    • Maximum size of the cache is {@link #DEFAULT_MAX_SIZE}
    • + *
    • Elements of the cache will not invalid
    • + *
    • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
    • + *
    + * + * @see PreloadDataCache#PreloadDataCache() + */ + public ImageMemoryCache(){ + this(DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); + } + + /** + *
      + *
    • Get data listener is {@link #getDefaultOnGetImageListener()}
    • + *
    • Callback interface after image get success is null, can set by + * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
    • + *
    • Elements of the cache will not invalid
    • + *
    • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
    • + *
    + * + * @param maxSize maximum size of the cache + * @see PreloadDataCache#PreloadDataCache(int) + */ + public ImageMemoryCache(int maxSize){ + this(maxSize, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); + } + + /** + *
      + *
    • Get data listener is {@link #getDefaultOnGetImageListener()}
    • + *
    • Callback interface after image get success is null, can set by + * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
    • + *
    • Elements of the cache will not invalid
    • + *
    • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
    • + *
    + * + * @param maxSize maximum size of the cache + * @param threadPoolSize getting data thread pool size + * @see PreloadDataCache#PreloadDataCache(int, int) + */ + public ImageMemoryCache(int maxSize, int threadPoolSize){ + super(maxSize, threadPoolSize); + + super.setOnGetDataListener(getDefaultOnGetImageListener()); + super.setCacheFullRemoveType(new RemoveTypeUsedCountSmall()); + this.viewMap = new ConcurrentHashMap(); + this.viewSetMap = new HashMap>(); + this.handler = new MyHandler(); + if (Looper.myLooper() == null) { + Looper.prepare(); + } + } + + /** + * callback interface after image get success + * + * @author Trinea 2012-4-5 + */ + public interface OnImageCallbackListener extends Serializable { + + /** + * callback function after image get success, run on ui thread + * + * @param imageUrl imageUrl + * @param imageDrawable drawable + * @param view view need the image + * @param isInCache whether already in cache or got realtime + */ + public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache); + } + + /** + * @see ExecutorService#shutdown() + */ + public void shutdown() { + threadPool.shutdown(); + super.shutdown(); + } + + /** + * @see ExecutorService#shutdownNow() + */ + public List shutdownNow() { + threadPool.shutdownNow(); + return super.shutdownNow(); + } + + /** + * My handler + * + * @author Trinea 2012-11-20 + */ + private class MyHandler extends Handler { + + public void handleMessage(Message message) { + switch (message.what) { + case IMAGE_LOADED_WHAT: + MessageObject object = (MessageObject)message.obj; + if (object == null) { + break; + } + + String imageUrl = object.imageUrl; + Drawable drawable = object.drawable; + if (onImageCallbackListener != null) { + if (isOpenWaitingQueue) { + synchronized (viewSetMap) { + HashSet viewSet = viewSetMap.get(imageUrl); + if (viewSet != null) { + for (View view : viewSet) { + if (view != null) { + onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); + } + } + } + } + } else { + View view = viewMap.get(imageUrl); + if (view != null) { + onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); + } + } + } + + if (isOpenWaitingQueue) { + synchronized (viewSetMap) { + viewSetMap.remove(imageUrl); + } + } else { + viewMap.remove(imageUrl); + } + break; + } + } + }; + + /** + * message object + * + * @author Trinea 2013-1-14 + */ + private class MessageObject { + + String imageUrl; + Drawable drawable; + + public MessageObject(String imageUrl, Drawable drawable){ + this.imageUrl = imageUrl; + this.drawable = drawable; + } + } + + /** + * start thread to wait for image get + * + * @param messsageWhat + * @param imageUrl + * @param urlList url list, if is null, not preload, else preload forward by + * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by + * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} + */ + private void startGetImageThread(final int messsageWhat, final String imageUrl, final List urlList) { + // wait for image be got success and send message + threadPool.execute(new Runnable() { + + @Override + public void run() { + CacheObject object = get(imageUrl, urlList); + Drawable drawable = (object == null ? null : object.getData()); + // if drawable is null, remove it + if (drawable == null) { + remove(imageUrl); + } else { + handler.sendMessage(handler.obtainMessage(IMAGE_LOADED_WHAT, new MessageObject(imageUrl, drawable))); + } + } + }); + } + + /** + * default get image listener + * + * @return + */ + public OnGetDataListener getDefaultOnGetImageListener() { + return new OnGetDataListener() { + + private static final long serialVersionUID = 1L; + + @Override + public CacheObject onGetData(String key) { + Drawable d = null; + try { + d = ImageUtils.getDrawableFromUrl(key, httpReadTimeOut); + } catch (Exception e) { + Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); + } + return (d == null ? null : new CacheObject(d)); + } + }; + } + + /** + * get recommend default max cache size according to dalvik max memory + * + * @return + */ + static int getDefaultMaxSize() { + long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory > SizeUtils.GB_2_BYTE) { + return 512; + } + + int mb = (int)(maxMemory / SizeUtils.MB_2_BYTE); + return mb > 16 ? mb * 2 : 16; + } +} diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 232755f..bb26141 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -12,18 +12,21 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import android.content.Context; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; +import cn.trinea.android.common.dao.impl.ImageSDCardCacheDaoImpl; import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.service.FileNameRule; import cn.trinea.android.common.util.FileUtils; import cn.trinea.android.common.util.ImageUtils; import cn.trinea.android.common.util.SizeUtils; +import cn.trinea.android.common.util.SqliteUtils; import cn.trinea.android.common.util.StringUtils; import cn.trinea.android.common.util.SystemUtils; @@ -31,10 +34,10 @@ * Image SDCard Cache
    *
    * It applies to images those uesd frequently and their size is big that we cannot store too much in memory, like - * pictures of twitter or sina weibo. Cache of small images you can consider of {@link ImageCache}.
    + * pictures of twitter or sina weibo. Cache of small images you can consider of {@link ImageMemoryCache}.
    *
      * Setting and Usage - *
    • Use one of constructors below to init cache
    • + *
    • Use one of constructors in sections II to init cache
    • *
    • {@link #setOnImageSDCallbackListener(OnImageSDCallbackListener)} set callback interface after image get success
    • *
    • {@link #get(String, List, View)} get image asynchronous and preload other images asynchronous according to * urlList
    • @@ -89,7 +92,7 @@ public class ImageSDCardCache extends PreloadDataCache { + "Trinea" + File.separator + "AndroidCommon" - + File.separator + "ImageCache"; + + File.separator + "ImageSDCardCache"; /** image got success message what **/ private static final int IMAGE_LOADED_WHAT = 1; @@ -498,6 +501,92 @@ public void clear() { super.clear(); } + /** + * load all data in db whose tag is same to tag to imageSDCardCache. just put, do not affect the original data + *
        + * Attentions: + *
      • If tag is null or empty, throws exception
      • + *
      + * + * @param context + * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or + * empty + * @return + * @see #loadDataFromDb(Context, ImageSDCardCache, String) + */ + public boolean loadDataFromDb(Context context, String tag) { + return ImageSDCardCache.loadDataFromDb(context, this, tag); + } + + /** + * delete all rows in db whose tag is same to tag at first, and insert all data in imageSDCardCache to db + *
        + * Attentions: + *
      • If tag is null or empty, throws exception
      • + *
      • Will delete all rows in db whose tag is same to tag at first
      • + *
      + * + * @param context + * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or + * empty + * @return + * @see #saveDataToDb(Context, ImageSDCardCache, String) + */ + public boolean saveDataToDb(Context context, String tag) { + return ImageSDCardCache.saveDataToDb(context, this, tag); + } + + /** + * load all data in db whose tag is same to tag to imageSDCardCache. just put, do not affect the original data + *
        + * Attentions: + *
      • If imageSDCardCache is null, throws exception
      • + *
      • If tag is null or empty, throws exception
      • + *
      + * + * @param context + * @param imageSDCardCache + * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or + * empty + * @return + */ + public static boolean loadDataFromDb(Context context, ImageSDCardCache imageSDCardCache, String tag) { + if (context == null || imageSDCardCache == null) { + throw new IllegalArgumentException("The context and cache both can not be null."); + } + if (StringUtils.isEmpty(tag)) { + throw new IllegalArgumentException("The tag can not be null or empty."); + } + return new ImageSDCardCacheDaoImpl(SqliteUtils.getInstance(context)).putIntoImageSDCardCache(imageSDCardCache, + tag); + } + + /** + * delete all rows in db whose tag is same to tag at first, and insert all data in imageSDCardCache to db + *
        + * Attentions: + *
      • If imageSDCardCache is null, throws exception
      • + *
      • If tag is null or empty, throws exception
      • + *
      • Will delete all rows in db whose tag is same to tag at first
      • + *
      + * + * @param context + * @param imageSDCardCache + * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or + * empty + * @return + */ + public static boolean saveDataToDb(Context context, ImageSDCardCache imageSDCardCache, String tag) { + if (context == null || imageSDCardCache == null) { + throw new IllegalArgumentException("The context and cache both can not be null."); + } + if (StringUtils.isEmpty(tag)) { + throw new IllegalArgumentException("The tag can not be null or empty."); + } + return new ImageSDCardCacheDaoImpl(SqliteUtils.getInstance(context)).deleteAndInsertImageSDCardCache(imageSDCardCache, + tag); + } + /** * delete file * diff --git a/src/cn/trinea/android/common/util/DbHelper.java b/src/cn/trinea/android/common/util/DbHelper.java new file mode 100644 index 0000000..bcd23a9 --- /dev/null +++ b/src/cn/trinea/android/common/util/DbHelper.java @@ -0,0 +1,38 @@ +package cn.trinea.android.common.util; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import cn.trinea.android.common.constant.DbConstants; + +/** + * db helper + * + * @author Trinea 2013-10-21 + */ +public class DbHelper extends SQLiteOpenHelper { + + public DbHelper(Context context){ + super(context, DbConstants.DB_NAME, null, DbConstants.DB_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.beginTransaction(); + try { + db.execSQL(DbConstants.CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.toString()); + db.execSQL(DbConstants.CREATE_IMAGE_SDCARD_CACHE_TABLE_INDEX_SQL.toString()); + + db.execSQL(DbConstants.CREATE_HTTP_CACHE_TABLE_SQL.toString()); + db.execSQL(DbConstants.CREATE_HTTP_CACHE_TABLE_INDEX_SQL.toString()); + db.execSQL(DbConstants.CREATE_HTTP_CACHE_TABLE_UNIQUE_INDEX.toString()); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + } +} diff --git a/src/cn/trinea/android/common/util/SqliteUtils.java b/src/cn/trinea/android/common/util/SqliteUtils.java new file mode 100644 index 0000000..ff41018 --- /dev/null +++ b/src/cn/trinea/android/common/util/SqliteUtils.java @@ -0,0 +1,43 @@ +package cn.trinea.android.common.util; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; + +/** + * SqliteUtils + * + * @author Trinea 2013-10-21 + */ +public class SqliteUtils { + + private static volatile SqliteUtils instance; + + private DbHelper dbHelper; + private SQLiteDatabase wDb; + private SQLiteDatabase rDb; + + private SqliteUtils(Context context){ + dbHelper = new DbHelper(context); + wDb = dbHelper.getWritableDatabase(); + rDb = dbHelper.getReadableDatabase(); + } + + public static SqliteUtils getInstance(Context context) { + if (instance == null) { + synchronized (SqliteUtils.class) { + if (instance == null) { + instance = new SqliteUtils(context); + } + } + } + return instance; + } + + public SQLiteDatabase getWDb() { + return wDb; + } + + public SQLiteDatabase getRDb() { + return rDb; + } +} From 618e39d0f2d0eac13fa53b855acd6a390dfd7660 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Oct 2013 16:05:42 +0800 Subject: [PATCH 046/241] add deleteUnusedFiles and initData function in ImageCache.java and ImageSDCardCache.java --- AndroidManifest.xml | 4 +- .../common/service/impl/ImageCache.java | 30 ++++++++++ .../common/service/impl/ImageSDCardCache.java | 58 +++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9eef2b0..b4c70b0 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="27" + android:versionName="3.8.7" > diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index b832f64..b0cd333 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -267,11 +267,39 @@ public void setFileNameRule(FileNameRule fileNameRule) { secondaryCache.setFileNameRule(fileNameRule); } + /** + * load all data from db and delete unused file in {@link #getCacheFolder()} + *
        + *
      • It's a combination of {@link #loadDataFromDb(Context, String)} and {@link #deleteUnusedFiles()}
      • + *
      • You should use {@link #saveDataToDb(Context, String)} to save data when app exit
      • + *
      + * + * @param context + * @param tag + * @see #loadDataFromDb(Context, String) + * @see #deleteUnusedFiles() + */ + public void initData(Context context, String tag) { + loadDataFromDb(context, tag); + deleteUnusedFiles(); + } + + /** + * delete unused file in {@link #getCacheFolder()}, you can use it after {@link #loadDataFromDb(Context, String)} at + * first time + * + * @see {@link ImageSDCardCache#deleteUnusedFiles()} + */ + public void deleteUnusedFiles() { + secondaryCache.deleteUnusedFiles(); + } + /** * load all data in db whose tag is same to tag to this cache. just put, do not affect the original data *
        * Attentions: *
      • If tag is null or empty, throws exception
      • + *
      • You should use {@link #saveDataToDb(Context, String)} to save data when app exit
      • *
      * * @param context @@ -290,6 +318,8 @@ public boolean loadDataFromDb(Context context, String tag) { * Attentions: *
    • If tag is null or empty, throws exception
    • *
    • Will delete all rows in db whose tag is same to tag at first
    • + *
    • You can use {@link #initData(Context, String)} or {@link #loadDataFromDb(Context, String)} to init data when + * app start
    • *
    * * @param context diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index bb26141..a151310 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -501,11 +501,64 @@ public void clear() { super.clear(); } + /** + * delete unused file in {@link #getCacheFolder()}, you can use it after {@link #loadDataFromDb(Context, String)} at + * first time + */ + public void deleteUnusedFiles() { + int size = getSize(); + final HashSet filePathSet = new HashSet(size > 16 ? size : 16); + for (CacheObject value : values()) { + if (value != null) { + filePathSet.add(value.getData()); + } + } + + threadPool.execute(new Runnable() { + + @Override + public void run() { + + try { + File file = new File(getCacheFolder()); + if (file != null && file.exists() && file.isDirectory()) { + for (File f : file.listFiles()) { + if (f.isFile() && !filePathSet.contains(f.getPath())) { + f.delete(); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "delete unused files fail."); + } + } + }); + } + + /** + * load all data from db and delete unused file in {@link #getCacheFolder()} + *
      + *
    • It's a combination of {@link #loadDataFromDb(Context, String)} and {@link #deleteUnusedFiles()}
    • + *
    • You should use {@link #saveDataToDb(Context, String)} to save data when app exit
    • + *
    + * + * @param context + * @param tag + * @see #loadDataFromDb(Context, String) + * @see #deleteUnusedFiles() + */ + public void initData(Context context, String tag) { + ImageSDCardCache.loadDataFromDb(context, this, tag); + deleteUnusedFiles(); + } + /** * load all data in db whose tag is same to tag to imageSDCardCache. just put, do not affect the original data *
      * Attentions: *
    • If tag is null or empty, throws exception
    • + *
    • You should use {@link #saveDataToDb(Context, String)} to save data when app exit
    • *
    * * @param context @@ -524,6 +577,8 @@ public boolean loadDataFromDb(Context context, String tag) { * Attentions: *
  • If tag is null or empty, throws exception
  • *
  • Will delete all rows in db whose tag is same to tag at first
  • + *
  • You can use {@link #initData(Context, String)} or {@link #loadDataFromDb(Context, String)} to init data when + * app start
  • * * * @param context @@ -542,6 +597,7 @@ public boolean saveDataToDb(Context context, String tag) { * Attentions: *
  • If imageSDCardCache is null, throws exception
  • *
  • If tag is null or empty, throws exception
  • + *
  • You should use {@link #saveDataToDb(Context, ImageSDCardCache, String)} to save data when app exit
  • * * * @param context @@ -568,6 +624,8 @@ public static boolean loadDataFromDb(Context context, ImageSDCardCache imageSDCa *
  • If imageSDCardCache is null, throws exception
  • *
  • If tag is null or empty, throws exception
  • *
  • Will delete all rows in db whose tag is same to tag at first
  • + *
  • You can use {@link #initData(Context, String)} or {@link #loadDataFromDb(Context, ImageSDCardCache, String)} + * to init data when app start
  • * * * @param context From 78ad86719359a64ddc0e6c03c9152a9d6fb6f961 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Oct 2013 16:26:22 +0800 Subject: [PATCH 047/241] modify javadoc --- src/cn/trinea/android/common/service/impl/ImageCache.java | 3 ++- .../trinea/android/common/service/impl/ImageSDCardCache.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index b0cd333..4d60588 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -30,6 +30,8 @@ *
  • {@link ImageMemoryCache#get(String, List, View)} get image asynchronous and preload other images asynchronous * according to urlList
  • *
  • {@link ImageMemoryCache#get(String, View)} get image asynchronous
  • + *
  • {@link #initData(Context, String)} or {@link #loadDataFromDb(Context, String)} to init data when app start, + * {@link #saveDataToDb(Context, String)} to save data when app exit
  • *
  • {@link #setHttpReadTimeOut(int)} set http read image time out, if less than 0, not set. default is not set
  • *
  • {@link PreloadDataCache#setContext(Context)} and {@link #setAllowedNetworkTypes(int)} restrict the types of * networks over which this data can get.
  • @@ -40,7 +42,6 @@ *
  • {@link SimpleCache#setCacheFullRemoveType(CacheFullRemoveType)} set remove type when primary cache is full
  • *
  • {@link #setCacheFullRemoveTypeOfSecondaryCache(CacheFullRemoveType)} set remove type when secondary cache is full *
  • - *
  • other see {@link PreloadDataCache} and {@link SimpleCache}
  • * *
      * Constructor diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index a151310..1668fce 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -42,6 +42,8 @@ *
    • {@link #get(String, List, View)} get image asynchronous and preload other images asynchronous according to * urlList
    • *
    • {@link #get(String, View)} get image asynchronous
    • + *
    • {@link #initData(Context, String)} or {@link #loadDataFromDb(Context, String)} to init data when app start, + * {@link #saveDataToDb(Context, String)} to save data when app exit
    • *
    • {@link #setFileNameRule(FileNameRule)} set file name rule which be used when saving images, default is * {@link FileNameRuleImageUrl}
    • *
    • {@link #setCacheFolder(String)} set cache folder path which be used when saving images, default is From 24299798f48b9542ddce0e311a1adfc6e97693c2 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 27 Oct 2013 11:11:40 +0800 Subject: [PATCH 048/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d644eaa..772294b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 -主要特性:(1).使用简单 (2). 轻松获取及预取取新图片(3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理(6).可根据系统配置初始化缓存(7).扩展性强 (8).支持队列(9). 缓存可序列化到本地缓存 可从文件中恢复(10)包含map的大多数接口。 +主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片内存缓存 使用见:[图片内存缓存的使用](http://www.trinea.cn/?p=704) 适用:应用中获取图片较多且图片不大的应用,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: From 2fff5fd6870b4c55f504df6c196c0e3326172113 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 27 Oct 2013 11:14:28 +0800 Subject: [PATCH 049/241] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 772294b..945e492 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 -#####1. 图片内存缓存 -使用见:[图片内存缓存的使用](http://www.trinea.cn/?p=704) -适用:应用中获取图片较多且图片不大的应用,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: +#####1. 图片缓存 +使用见:[图片缓存的使用](http://www.trinea.cn/?p=704) +适用:获取图片较多的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: ![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) From 8947d5342c8f3f514244f1d2f2d19658f61f8600 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 28 Oct 2013 14:39:50 +0800 Subject: [PATCH 050/241] modify javadoc --- src/cn/trinea/android/common/service/impl/ImageCache.java | 1 + .../android/common/service/impl/ImageMemoryCache.java | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 4d60588..5bae6dc 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -46,6 +46,7 @@ *
        * Constructor *
      • {@link #ImageCache()}
      • + *
      • {@link #ImageCache(int)}
      • *
      • {@link #ImageCache(int, int)}
      • *
      • {@link #ImageCache(int, int, int, int)}
      • *
      diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index 2dd4f69..e0f9d55 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -47,9 +47,9 @@ *
    *
      * Constructor - *
    • {@link #ImageCache()}
    • - *
    • {@link #ImageCache(int)}
    • - *
    • {@link #ImageCache(int, int)}
    • + *
    • {@link #ImageMemoryCache()}
    • + *
    • {@link #ImageMemoryCache(int)}
    • + *
    • {@link #ImageMemoryCache(int, int)}
    • *
    * * @author Trinea 2012-4-5 From 3c9ea67d9a83f0d213dbed16b0be0c598eaddd5c Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 29 Oct 2013 17:29:42 +0800 Subject: [PATCH 051/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 945e492..a6cf181 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、json等等)。 +**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true)。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 From 0232c18377a6ffe55c7408e67bd2aadd37a8d7b4 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 31 Oct 2013 10:10:52 +0800 Subject: [PATCH 052/241] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a6cf181..9ec7aec 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,13 @@ 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 使用见:[图片缓存的使用](http://www.trinea.cn/?p=704) -适用:获取图片较多的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: +适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: ![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) #####2. 图片SD卡缓存 使用见:[图片SD卡缓存的使用](http://www.trinea.cn/?p=757) -适用:应用中获取图片较多且图片较大的情况,在微博、花瓣、美丽说、path这类应用中可以起到很好的效果。效果图如下: +适用:应用中获取图片较多且图片较大的情况,需要二级缓存及ListView或GridView图片加载推荐使用上面的[ImageCache](http://www.trinea.cn/?p=704)。效果图如下: ![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) From ac5b65ac9c13dd5fd062ee08e6d780ae3e9110b6 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 31 Oct 2013 14:56:30 +0800 Subject: [PATCH 053/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9ec7aec..88d0d9b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 -**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true)。 +**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 From 495aff68e61a040f4455cafb6c0ef418a7922b6d Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 1 Nov 2013 14:12:01 +0800 Subject: [PATCH 054/241] begin HttpCache.java --- src/cn/trinea/android/common/service/HttpCache.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/cn/trinea/android/common/service/HttpCache.java diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java new file mode 100644 index 0000000..3271bb0 --- /dev/null +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -0,0 +1,10 @@ +package cn.trinea.android.common.service; + +/** + * HttpCache + * + * @author Trinea 2013-11-1 + */ +public class HttpCache { + +} From 100edd487ae32c20870a5fe9cd69b0e7c00b8a15 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 2 Nov 2013 12:32:35 +0800 Subject: [PATCH 055/241] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 88d0d9b..872c239 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ 缓存类关系图如下:其中HttpCache为后续计划的http缓存 ![ImageSDCardCache](http://farm4.staticflickr.com/3818/9318670513_1576253fd5_o.jpg) +####4. 网络缓存 +deving… ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview From 556503541f55bf6e4207cccec449d406a28451ea Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 4 Nov 2013 21:34:06 +0800 Subject: [PATCH 056/241] add public static String httpGetString(HttpRequest request) --- src/cn/trinea/android/common/util/HttpUtils.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index e8e3816..3c1377a 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -122,6 +122,18 @@ public static HttpResponse httpGet(String httpUrl) { return httpGet(new HttpRequest(httpUrl)); } + /** + * http get + * + * @param request + * @return the content of the url, if null represents http error + * @see HttpUtils#httpGet(HttpRequest) + */ + public static String httpGetString(HttpRequest request) { + HttpResponse response = httpGet(request); + return response == null ? null : response.getResponseBody(); + } + /** * http get * From 04a83b4c0566af49455e9d7c6abbb0426d9ecb71 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 5 Nov 2013 17:47:25 +0800 Subject: [PATCH 057/241] add HttpCacheDao --- .../android/common/dao/HttpCacheDao.java | 37 +++++ .../common/dao/impl/HttpCacheDaoImpl.java | 139 ++++++++++++++++++ .../android/common/entity/HttpResponse.java | 57 +++++++ .../android/common/service/HttpCache.java | 14 ++ 4 files changed, 247 insertions(+) create mode 100644 src/cn/trinea/android/common/dao/HttpCacheDao.java create mode 100644 src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java diff --git a/src/cn/trinea/android/common/dao/HttpCacheDao.java b/src/cn/trinea/android/common/dao/HttpCacheDao.java new file mode 100644 index 0000000..8ff4d55 --- /dev/null +++ b/src/cn/trinea/android/common/dao/HttpCacheDao.java @@ -0,0 +1,37 @@ +package cn.trinea.android.common.dao; + +import java.util.Map; + +import cn.trinea.android.common.entity.HttpResponse; + +/** + * HttpCacheDao + * + * @author Trinea 2013-11-04 + */ +public interface HttpCacheDao { + + /** + * insert HttpResponse + * + * @param httpResponse + * @return + */ + public long insertHttpResponse(HttpResponse httpResponse); + + /** + * get HttpResponse by url + * + * @param url + * @return + */ + public HttpResponse getHttpResponse(String url); + + /** + * get HttpResponses by type + * + * @param type + * @return + */ + public Map getHttpResponsesByType(int type); +} diff --git a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java new file mode 100644 index 0000000..627b816 --- /dev/null +++ b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java @@ -0,0 +1,139 @@ +package cn.trinea.android.common.dao.impl; + +import java.util.HashMap; +import java.util.Map; + +import android.content.ContentValues; +import android.database.Cursor; +import cn.trinea.android.common.constant.DbConstants; +import cn.trinea.android.common.dao.HttpCacheDao; +import cn.trinea.android.common.entity.HttpResponse; +import cn.trinea.android.common.util.SqliteUtils; +import cn.trinea.android.common.util.StringUtils; +import cn.trinea.android.common.util.TimeUtils; + +/** + * HttpCacheDaoImpl + * + * @author Trinea 2013-11-5 + */ +public class HttpCacheDaoImpl implements HttpCacheDao { + + private SqliteUtils sqliteUtils; + + public HttpCacheDaoImpl(SqliteUtils sqliteUtils){ + this.sqliteUtils = sqliteUtils; + } + + @Override + public long insertHttpResponse(HttpResponse httpResponse) { + ContentValues contentValues = httpResponseToCV(httpResponse); + if (contentValues == null) { + return -1; + } + return sqliteUtils.getWDb().replace(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, contentValues); + } + + @Override + public HttpResponse getHttpResponse(String url) { + if (StringUtils.isEmpty(url)) { + return null; + } + + StringBuilder appWhere = new StringBuilder(); + appWhere.append(DbConstants.HTTP_CACHE_TABLE_URL).append("=?"); + String[] appWhereArgs = { url }; + Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, appWhere.toString(), + appWhereArgs, null, null, null); + if (cursor == null) { + return null; + } + + HttpResponse httpResponse = null; + if (cursor.moveToFirst()) { + httpResponse = cursorToHttpResponse(cursor, url); + } + if (!cursor.isClosed()) { + cursor.close(); + } + + return httpResponse; + } + + @Override + public Map getHttpResponsesByType(int type) { + StringBuilder whereClause = new StringBuilder(); + whereClause.append(DbConstants.HTTP_CACHE_TABLE_TYPE).append("=?"); + String[] whereClauseArgs = { Integer.toString(type) }; + Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, + whereClause.toString(), whereClauseArgs, null, null, null); + + if (cursor == null) { + return null; + } + + Map httpResponseMap = new HashMap(); + if (cursor.getCount() > 0) { + for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + String url = cursor.getString(DbConstants.HTTP_CACHE_TABLE_URL_INDEX); + if (StringUtils.isEmpty(url)) { + continue; + } + + HttpResponse httpResponse = cursorToHttpResponse(cursor, url); + if (httpResponse != null) { + httpResponseMap.put(url, httpResponse); + } + } + } + if (!cursor.isClosed()) { + cursor.close(); + } + return httpResponseMap; + } + + /** + * convert cursor to HttpResponse + * + * @param cursor + * @param url + * @return + */ + private HttpResponse cursorToHttpResponse(Cursor cursor, String url) { + if (cursor == null) { + return null; + } + if (url == null) { + url = cursor.getString(DbConstants.HTTP_CACHE_TABLE_URL_INDEX); + } + if (StringUtils.isEmpty(url)) { + return null; + } + + HttpResponse httpResponse = new HttpResponse(url); + httpResponse.setResponseBody(cursor.getString(DbConstants.HTTP_CACHE_TABLE_RESPONSE_INDEX)); + httpResponse.setExpiredTime(cursor.getLong(DbConstants.HTTP_CACHE_TABLE_EXPIRES_INDEX)); + httpResponse.setType(cursor.getInt(DbConstants.HTTP_CACHE_TABLE_TYPE_INDEX)); + return httpResponse; + } + + /** + * convert HttpResponse to ContentValues + * + * @param httpResponse + * @return + */ + private static ContentValues httpResponseToCV(HttpResponse httpResponse) { + if (httpResponse == null) { + return null; + } + + ContentValues values = new ContentValues(); + values.put(DbConstants.HTTP_CACHE_TABLE_URL, httpResponse.getUrl()); + values.put(DbConstants.HTTP_CACHE_TABLE_RESPONSE, httpResponse.getResponseBody()); + values.put(DbConstants.HTTP_CACHE_TABLE_EXPIRES, httpResponse.getExpiredTime()); + values.put(DbConstants.HTTP_CACHE_TABLE_CREATE_TIME, TimeUtils.getCurrentTimeInString()); + values.put(DbConstants.HTTP_CACHE_TABLE_TYPE, httpResponse.getType()); + return values; + } +} diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/cn/trinea/android/common/entity/HttpResponse.java index 33c8841..f7ee26b 100644 --- a/src/cn/trinea/android/common/entity/HttpResponse.java +++ b/src/cn/trinea/android/common/entity/HttpResponse.java @@ -6,6 +6,7 @@ import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.util.HttpUtils; import cn.trinea.android.common.util.StringUtils; +import cn.trinea.android.common.util.TimeUtils; /** * HttpResponse
    @@ -38,6 +39,10 @@ public class HttpResponse { /** http response content **/ private String responseBody; private Map responseHeaders; + /** type to mark this response **/ + private int type; + /** expired time in milliseconds **/ + private long expiredTime; /** * An int representing the three digit HTTP Status-Code. @@ -110,6 +115,58 @@ public void setResponseHeaders(Map responseHeaders) { this.responseHeaders = responseHeaders; } + /** + * get type + * + * @return the type + */ + public int getType() { + return type; + } + + /** + * set type + * + * @param type the type to set + */ + public void setType(int type) { + this.type = type; + } + + /** + * set expired time in millis + * + * @param expiredTime + */ + public void setExpiredTime(long expiredTime) { + this.expiredTime = expiredTime; + } + + /** + * get expired time in millis + *
      + *
    • if current time is bigger than expired time, it means this response is dirty
    • + *
    + * + * @return
      + *
    • if max-age in cache-control is exists, return current time plus it
    • + *
    • else return expires
    • + *
    • if something error, return -1
    • + *
    + */ + public long getExpiredTime() { + return expiredTime; + } + + /** + * whether this response has expired + * + * @return + */ + public boolean isExpired() { + return TimeUtils.getCurrentTimeInLong() > expiredTime; + } + /** * http expires in reponse header * diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 3271bb0..37d87c3 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -1,5 +1,8 @@ package cn.trinea.android.common.service; +import cn.trinea.android.common.entity.HttpRequest; +import cn.trinea.android.common.entity.HttpResponse; + /** * HttpCache * @@ -7,4 +10,15 @@ */ public class HttpCache { + public static HttpResponse httpGet(HttpRequest request) { + return null; + } + + public static HttpResponse httpGet(String httpUrl) { + return null; + } + + public static String httpGetString(String httpUrl) { + return null; + } } From 2268546c607559007ff404fe11e3d8e65a47652a Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 6 Nov 2013 21:36:49 +0800 Subject: [PATCH 058/241] deving HttpCache --- .../android/common/service/HttpCache.java | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 37d87c3..6ad3b22 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -1,7 +1,15 @@ package cn.trinea.android.common.service; +import java.util.HashMap; +import java.util.Map; + +import android.content.Context; +import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; import cn.trinea.android.common.entity.HttpRequest; import cn.trinea.android.common.entity.HttpResponse; +import cn.trinea.android.common.util.HttpUtils; +import cn.trinea.android.common.util.SqliteUtils; +import cn.trinea.android.common.util.StringUtils; /** * HttpCache @@ -10,15 +18,54 @@ */ public class HttpCache { - public static HttpResponse httpGet(HttpRequest request) { - return null; + /** http memory cache **/ + private Map cache; + + public HttpCache(){ + cache = new HashMap(); + } + + /** + * get httpResponse whose type is type into memory as primary cache to improve performanceo + * + * @param context + * @param type + */ + public void initData(Context context, int type) { + if (context == null) { + throw new IllegalArgumentException("The context can not be null."); + } + this.cache = new HttpCacheDaoImpl(SqliteUtils.getInstance(context)).getHttpResponsesByType(type); + if (cache == null) { + cache = new HashMap(); + } + } + + public HttpResponse httpGet(HttpRequest request) { + String url; + if (request == null || StringUtils.isEmpty(url = request.getUrl())) { + return null; + } + + HttpResponse cacheResponse = getFromCache(url); + return cacheResponse == null ? HttpUtils.httpGet(request) : cacheResponse; + } + + public HttpResponse httpGet(String httpUrl) { + HttpResponse cacheResponse = getFromCache(httpUrl); + return cacheResponse == null ? HttpUtils.httpGet(httpUrl) : cacheResponse; } - public static HttpResponse httpGet(String httpUrl) { - return null; + public String httpGetString(String httpUrl) { + HttpResponse cacheResponse = getFromCache(httpUrl); + return cacheResponse == null ? HttpUtils.httpGetString(httpUrl) : cacheResponse.getResponseBody(); } - public static String httpGetString(String httpUrl) { - return null; + private HttpResponse getFromCache(String httpUrl) { + HttpResponse cacheResponse = cache.get(httpUrl); + if (cacheResponse == null) { + // get from db + } + return (cacheResponse == null || cacheResponse.isExpired()) ? null : cacheResponse; } } From 576d48087fe98157fa1c27a8fd8dc209dc9e3700 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 09:35:01 +0800 Subject: [PATCH 059/241] HttpCache extends SimpleCache --- src/cn/trinea/android/common/service/HttpCache.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 6ad3b22..ba100bc 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -7,6 +7,7 @@ import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; import cn.trinea.android.common.entity.HttpRequest; import cn.trinea.android.common.entity.HttpResponse; +import cn.trinea.android.common.service.impl.SimpleCache; import cn.trinea.android.common.util.HttpUtils; import cn.trinea.android.common.util.SqliteUtils; import cn.trinea.android.common.util.StringUtils; @@ -16,7 +17,7 @@ * * @author Trinea 2013-11-1 */ -public class HttpCache { +public class HttpCache extends SimpleCache { /** http memory cache **/ private Map cache; From 7a9fa91e98b3d13b0443dd3a2469a946e73415a0 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 09:44:02 +0800 Subject: [PATCH 060/241] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 872c239..1f3d243 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ ------------- **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 +**使用**:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 From 760a44cd0eb2f06d9148bc940b1827ccf3f6a867 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 09:44:44 +0800 Subject: [PATCH 061/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f3d243..5d70241 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ------------- **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 -**使用**:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 +**使 用**:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 From 400c47ce1f3e6eaed2176ddadea55843d7fb89da Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 09:45:04 +0800 Subject: [PATCH 062/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d70241..6baa0df 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ------------- **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 -**使 用**:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 +**使 用**:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 From 6e9a76cd1d424ca3f8447bc1dd14ec0b78e90eae Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 09:47:43 +0800 Subject: [PATCH 063/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6baa0df..05fc015 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ------------- **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 -**使 用**:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 +使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 From 424067162fbcb033584e7015969e5e9fa146fc99 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 09:48:37 +0800 Subject: [PATCH 064/241] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 05fc015..9faf03d 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ ------------- **主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 -使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 -**Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 +使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 +**Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 From d8aeef6104b20c5e69d9ed992f7361f74f17caae Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 09:49:31 +0800 Subject: [PATCH 065/241] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9faf03d..011aaf2 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 -**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 -使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 -**Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 -**个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 +**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 +**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 +使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 +**Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 +**个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 From 004e857aba2e5636e644e99c75d448d6702bc720 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 09:50:15 +0800 Subject: [PATCH 066/241] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 011aaf2..980db5f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 -**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 -使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon即可。 -**Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 -**个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 +**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 +**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 +使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 +**Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 +**个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 From d067b1865f0260527395d1b20a79bd7e337a54da Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Nov 2013 21:44:39 +0800 Subject: [PATCH 067/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 980db5f..754908f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:缓存(图片缓存、预取缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 +**主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 From 2a9104300eda0552357b0e3b6cb9e9121fdbebdc Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 12 Nov 2013 16:47:20 +0800 Subject: [PATCH 068/241] shutdown() change public to protected --- src/cn/trinea/android/common/service/impl/ImageCache.java | 2 +- src/cn/trinea/android/common/service/impl/ImageMemoryCache.java | 2 +- src/cn/trinea/android/common/service/impl/ImageSDCardCache.java | 2 +- src/cn/trinea/android/common/service/impl/PreloadDataCache.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 5bae6dc..d8ea2eb 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -338,7 +338,7 @@ public boolean saveDataToDb(Context context, String tag) { * @see ExecutorService#shutdown() */ @Override - public void shutdown() { + protected void shutdown() { secondaryCache.shutdown(); super.shutdown(); } diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index e0f9d55..5a612cc 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -288,7 +288,7 @@ public interface OnImageCallbackListener extends Serializable { /** * @see ExecutorService#shutdown() */ - public void shutdown() { + protected void shutdown() { threadPool.shutdown(); super.shutdown(); } diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 1668fce..abcb2ab 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -356,7 +356,7 @@ public interface OnImageSDCallbackListener extends Serializable { /** * @see ExecutorService#shutdown() */ - public void shutdown() { + protected void shutdown() { threadPool.shutdown(); super.shutdown(); } diff --git a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java index 11f6382..78f7648 100644 --- a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java +++ b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java @@ -514,7 +514,7 @@ public static PreloadDataCache loadCache(String filePath) { /** * @see ExecutorService#shutdown() */ - public void shutdown() { + protected void shutdown() { threadPool.shutdown(); } From d207658a006c751ac09b1f3a741f95e4b90e6968 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 15 Nov 2013 19:10:22 +0800 Subject: [PATCH 069/241] modify HttpCache.java --- .../common/dao/impl/HttpCacheDaoImpl.java | 72 ++++++++++--------- .../android/common/service/HttpCache.java | 49 ++++++++++--- 2 files changed, 78 insertions(+), 43 deletions(-) diff --git a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java index 627b816..aeb7fca 100644 --- a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java +++ b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java @@ -31,7 +31,9 @@ public long insertHttpResponse(HttpResponse httpResponse) { if (contentValues == null) { return -1; } - return sqliteUtils.getWDb().replace(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, contentValues); + synchronized (HttpCacheDaoImpl.class) { + return sqliteUtils.getWDb().replace(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, contentValues); + } } @Override @@ -43,21 +45,22 @@ public HttpResponse getHttpResponse(String url) { StringBuilder appWhere = new StringBuilder(); appWhere.append(DbConstants.HTTP_CACHE_TABLE_URL).append("=?"); String[] appWhereArgs = { url }; - Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, appWhere.toString(), - appWhereArgs, null, null, null); - if (cursor == null) { - return null; - } + synchronized (HttpCacheDaoImpl.class) { + Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, + appWhere.toString(), appWhereArgs, null, null, null); + if (cursor == null) { + return null; + } - HttpResponse httpResponse = null; - if (cursor.moveToFirst()) { - httpResponse = cursorToHttpResponse(cursor, url); - } - if (!cursor.isClosed()) { - cursor.close(); + HttpResponse httpResponse = null; + if (cursor.moveToFirst()) { + httpResponse = cursorToHttpResponse(cursor, url); + } + if (!cursor.isClosed()) { + cursor.close(); + } + return httpResponse; } - - return httpResponse; } @Override @@ -65,31 +68,34 @@ public Map getHttpResponsesByType(int type) { StringBuilder whereClause = new StringBuilder(); whereClause.append(DbConstants.HTTP_CACHE_TABLE_TYPE).append("=?"); String[] whereClauseArgs = { Integer.toString(type) }; - Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, - whereClause.toString(), whereClauseArgs, null, null, null); - if (cursor == null) { - return null; - } + synchronized (HttpCacheDaoImpl.class) { + Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, + whereClause.toString(), whereClauseArgs, null, null, null); - Map httpResponseMap = new HashMap(); - if (cursor.getCount() > 0) { - for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - String url = cursor.getString(DbConstants.HTTP_CACHE_TABLE_URL_INDEX); - if (StringUtils.isEmpty(url)) { - continue; - } + if (cursor == null) { + return null; + } - HttpResponse httpResponse = cursorToHttpResponse(cursor, url); - if (httpResponse != null) { - httpResponseMap.put(url, httpResponse); + Map httpResponseMap = new HashMap(); + if (cursor.getCount() > 0) { + for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + String url = cursor.getString(DbConstants.HTTP_CACHE_TABLE_URL_INDEX); + if (StringUtils.isEmpty(url)) { + continue; + } + + HttpResponse httpResponse = cursorToHttpResponse(cursor, url); + if (httpResponse != null) { + httpResponseMap.put(url, httpResponse); + } } } + if (!cursor.isClosed()) { + cursor.close(); + } + return httpResponseMap; } - if (!cursor.isClosed()) { - cursor.close(); - } - return httpResponseMap; } /** diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index ba100bc..2a2b689 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -2,8 +2,10 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import android.content.Context; +import cn.trinea.android.common.dao.HttpCacheDao; import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; import cn.trinea.android.common.entity.HttpRequest; import cn.trinea.android.common.entity.HttpResponse; @@ -19,24 +21,38 @@ */ public class HttpCache extends SimpleCache { + private Context context; + /** http memory cache **/ private Map cache; + /** dao to get data from http db cache **/ + private HttpCacheDao httpCacheDaoImpl; - public HttpCache(){ - cache = new HashMap(); + public HttpCache(Context context){ + if (context == null) { + throw new IllegalArgumentException("The context can not be null."); + } + this.context = context; + cache = new ConcurrentHashMap(); + httpCacheDaoImpl = new HttpCacheDaoImpl(SqliteUtils.getInstance(context)); } /** - * get httpResponse whose type is type into memory as primary cache to improve performanceo - * * @param context + * @param type get httpResponse whose type is type into memory as primary cache to improve performance + */ + public HttpCache(Context context, int type){ + this(context); + initData(type); + } + + /** + * get httpResponse whose type is type into memory as primary cache to improve performance + * * @param type */ - public void initData(Context context, int type) { - if (context == null) { - throw new IllegalArgumentException("The context can not be null."); - } - this.cache = new HttpCacheDaoImpl(SqliteUtils.getInstance(context)).getHttpResponsesByType(type); + private void initData(int type) { + this.cache = httpCacheDaoImpl.getHttpResponsesByType(type); if (cache == null) { cache = new HashMap(); } @@ -62,10 +78,23 @@ public String httpGetString(String httpUrl) { return cacheResponse == null ? HttpUtils.httpGetString(httpUrl) : cacheResponse.getResponseBody(); } + /** + * get from memory cache first, if not exist in memory cache, get from db + * + * @param httpUrl + * @return
      + *
    • if neither exit in memory cache nor db, return null
    • + *
    • if is expired, return null, otherwise return cache response
    • + *
    + */ private HttpResponse getFromCache(String httpUrl) { + if (StringUtils.isEmpty(httpUrl)) { + return null; + } + HttpResponse cacheResponse = cache.get(httpUrl); if (cacheResponse == null) { - // get from db + cacheResponse = httpCacheDaoImpl.getHttpResponse(httpUrl); } return (cacheResponse == null || cacheResponse.isExpired()) ? null : cacheResponse; } From 5aa4a399c1abb896a4bb921597db6de1eb2edcb4 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 15 Nov 2013 20:04:33 +0800 Subject: [PATCH 070/241] modify HttpCache.java --- .../android/common/service/HttpCache.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 2a2b689..c7a9369 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -5,11 +5,13 @@ import java.util.concurrent.ConcurrentHashMap; import android.content.Context; +import android.os.AsyncTask; import cn.trinea.android.common.dao.HttpCacheDao; import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; import cn.trinea.android.common.entity.HttpRequest; import cn.trinea.android.common.entity.HttpResponse; import cn.trinea.android.common.service.impl.SimpleCache; +import cn.trinea.android.common.util.ArrayUtils; import cn.trinea.android.common.util.HttpUtils; import cn.trinea.android.common.util.SqliteUtils; import cn.trinea.android.common.util.StringUtils; @@ -68,6 +70,14 @@ public HttpResponse httpGet(HttpRequest request) { return cacheResponse == null ? HttpUtils.httpGet(request) : cacheResponse; } + public void httpGet(String httpUrl, HttpCacheListener listener) { + new HttpCacheStringAsyncTask(listener).execute(httpUrl); + } + + public void httpGet(HttpRequest request, HttpCacheListener listener) { + new HttpCacheRequestAsyncTask(listener).execute(request); + } + public HttpResponse httpGet(String httpUrl) { HttpResponse cacheResponse = getFromCache(httpUrl); return cacheResponse == null ? HttpUtils.httpGet(httpUrl) : cacheResponse; @@ -78,6 +88,16 @@ public String httpGetString(String httpUrl) { return cacheResponse == null ? HttpUtils.httpGetString(httpUrl) : cacheResponse.getResponseBody(); } + public abstract class HttpCacheListener { + + protected void onPreExecute() { + } + + protected void onPostExecute(HttpResponse httpResponse) { + } + + } + /** * get from memory cache first, if not exist in memory cache, get from db * @@ -98,4 +118,70 @@ private HttpResponse getFromCache(String httpUrl) { } return (cacheResponse == null || cacheResponse.isExpired()) ? null : cacheResponse; } + + /** + * AsyncTask to get data by String url + * + * @author gxwu@lewatek.com 2013-11-15 + */ + private class HttpCacheStringAsyncTask extends AsyncTask { + + private HttpCacheListener listener; + + public HttpCacheStringAsyncTask(HttpCacheListener listener){ + this.listener = listener; + } + + protected HttpResponse doInBackground(String... url) { + if (ArrayUtils.isEmpty(url)) { + return null; + } + return httpGet(url[0]); + } + + protected void onPreExecute() { + if (listener != null) { + listener.onPreExecute(); + } + } + + protected void onPostExecute(HttpResponse httpResponse) { + if (listener != null) { + listener.onPostExecute(httpResponse); + } + } + } + + /** + * AsyncTask to get data by HttpRequest + * + * @author gxwu@lewatek.com 2013-11-15 + */ + private class HttpCacheRequestAsyncTask extends AsyncTask { + + private HttpCacheListener listener; + + public HttpCacheRequestAsyncTask(HttpCacheListener listener){ + this.listener = listener; + } + + protected HttpResponse doInBackground(HttpRequest... httpRequest) { + if (ArrayUtils.isEmpty(httpRequest)) { + return null; + } + return httpGet(httpRequest[0]); + } + + protected void onPreExecute() { + if (listener != null) { + listener.onPreExecute(); + } + } + + protected void onPostExecute(HttpResponse httpResponse) { + if (listener != null) { + listener.onPostExecute(httpResponse); + } + } + } } From 96f210d8f1487633fe19f474bb67529d4ded0163 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 15 Nov 2013 20:42:53 +0800 Subject: [PATCH 071/241] modify HttpCache.java --- .../android/common/dao/HttpCacheDao.java | 2 +- .../common/dao/impl/HttpCacheDaoImpl.java | 2 +- .../android/common/service/HttpCache.java | 126 +++++++++++++++++- 3 files changed, 123 insertions(+), 7 deletions(-) diff --git a/src/cn/trinea/android/common/dao/HttpCacheDao.java b/src/cn/trinea/android/common/dao/HttpCacheDao.java index 8ff4d55..5b03434 100644 --- a/src/cn/trinea/android/common/dao/HttpCacheDao.java +++ b/src/cn/trinea/android/common/dao/HttpCacheDao.java @@ -15,7 +15,7 @@ public interface HttpCacheDao { * insert HttpResponse * * @param httpResponse - * @return + * @return the row ID of the newly inserted row, or -1 if an error occurred */ public long insertHttpResponse(HttpResponse httpResponse); diff --git a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java index aeb7fca..8940c9c 100644 --- a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java +++ b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java @@ -130,7 +130,7 @@ private HttpResponse cursorToHttpResponse(Cursor cursor, String url) { * @return */ private static ContentValues httpResponseToCV(HttpResponse httpResponse) { - if (httpResponse == null) { + if (httpResponse == null || StringUtils.isEmpty(httpResponse.getUrl())) { return null; } diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index c7a9369..d2f3121 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -30,6 +30,8 @@ public class HttpCache extends SimpleCache { /** dao to get data from http db cache **/ private HttpCacheDao httpCacheDaoImpl; + private int type = -1; + public HttpCache(Context context){ if (context == null) { throw new IllegalArgumentException("The context can not be null."); @@ -45,6 +47,7 @@ public HttpCache(Context context){ */ public HttpCache(Context context, int type){ this(context); + this.type = type; initData(type); } @@ -60,6 +63,18 @@ private void initData(int type) { } } + /** + * http get + *
      + * Attentions: + *
    • Don't call this on the ui thread, it may costs some times. Becaust if not in cache, it get from network + * synchronous.
    • + *
    • If you want get data asynchronous, use {@link HttpCache#httpGet(HttpRequest, HttpCacheListener)}
    • + *
    + * + * @param httpRequest + * @return the response of the url, if null represents http error + */ public HttpResponse httpGet(HttpRequest request) { String url; if (request == null || StringUtils.isEmpty(url = request.getUrl())) { @@ -67,25 +82,86 @@ public HttpResponse httpGet(HttpRequest request) { } HttpResponse cacheResponse = getFromCache(url); - return cacheResponse == null ? HttpUtils.httpGet(request) : cacheResponse; + return cacheResponse == null ? putIntoCache(HttpUtils.httpGet(url)) : cacheResponse; } + /** + * http get + *
      + *
    • It gets data from cache or network asynchronous.
    • + *
    • If you want get data synchronous, use {@link HttpCache#httpGet(HttpRequest)} or + * {@link HttpCache#httpGetString(HttpRequest)}
    • + *
    + * + * @param httpUrl + * @param listener + */ public void httpGet(String httpUrl, HttpCacheListener listener) { new HttpCacheStringAsyncTask(listener).execute(httpUrl); } + /** + * http get + *
      + *
    • It gets data from cache or network asynchronous.
    • + *
    • If you want get data synchronous, use {@link HttpCache#httpGet(HttpRequest)} or + * {@link HttpCache#httpGetString(HttpRequest)}
    • + *
    + * + * @param request + * @param listener + */ public void httpGet(HttpRequest request, HttpCacheListener listener) { new HttpCacheRequestAsyncTask(listener).execute(request); } + /** + * http get + *
      + * Attentions: + *
    • Don't call this on the ui thread, it may costs some times. Becaust if not in cache, it get from network + * synchronous.
    • + *
    • If you want get data asynchronous, use {@link HttpCache#httpGet(HttpRequest, HttpCacheListener)}
    • + *
    + * + * @param httpUrl + * @return the response of the url, if null represents http error + */ public HttpResponse httpGet(String httpUrl) { - HttpResponse cacheResponse = getFromCache(httpUrl); - return cacheResponse == null ? HttpUtils.httpGet(httpUrl) : cacheResponse; + return httpGet(new HttpRequest(httpUrl)); } + /** + * http get + *
      + * Attentions: + *
    • Don't call this on the ui thread, it may costs some times. Becaust if not in cache, it get from network + * synchronous.
    • + *
    • If you want get data asynchronous, use {@link HttpCache#httpGet(String, HttpCacheListener)}
    • + *
    + * + * @param httpUrl + * @return the response body of the url, if null represents http error + */ public String httpGetString(String httpUrl) { - HttpResponse cacheResponse = getFromCache(httpUrl); - return cacheResponse == null ? HttpUtils.httpGetString(httpUrl) : cacheResponse.getResponseBody(); + HttpResponse cacheResponse = httpGet(new HttpRequest(httpUrl)); + return cacheResponse == null ? null : cacheResponse.getResponseBody(); + } + + /** + * http get + *
      + * Attentions: + *
    • Don't call this on the ui thread, it may costs some times. Becaust if not in cache, it get from network + * synchronous.
    • + *
    • If you want get data asynchronous, use {@link HttpCache#httpGet(HttpRequest, HttpCacheListener)}
    • + *
    + * + * @param httpRequest + * @return the response body of the url, if null represents http error + */ + public HttpResponse httpGetString(HttpRequest httpRequest) { + return httpGet(httpRequest); } public abstract class HttpCacheListener { @@ -98,6 +174,46 @@ protected void onPostExecute(HttpResponse httpResponse) { } + /** + * get type + * + * @return the type + */ + public int getType() { + return type; + } + + /** + * set type + * + * @param type the type to set + */ + public void setType(int type) { + this.type = type; + } + + /** + * put response into cache + *
      + *
    • put response to db, if {@link HttpResponse#getType()} == {@link HttpCache#getType()}, also put into memory + * cache
    • + *
    + * + * @param httpResponse + * @return if insert into db error, return null, otherwise return HttpResponse + */ + private HttpResponse putIntoCache(HttpResponse httpResponse) { + String url; + if (httpResponse == null || (url = httpResponse.getUrl()) == null) { + return null; + } + + if (type != -1 && type == httpResponse.getType()) { + cache.put(url, httpResponse); + } + return (httpCacheDaoImpl.insertHttpResponse(httpResponse) == -1) ? null : httpResponse; + } + /** * get from memory cache first, if not exist in memory cache, get from db * From 5dc361f33622ba343257fb594c3890e8078c3694 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 15 Nov 2013 21:19:57 +0800 Subject: [PATCH 072/241] modify HttpCache.java --- .../android/common/service/HttpCache.java | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index d2f3121..7387c21 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -10,18 +10,37 @@ import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; import cn.trinea.android.common.entity.HttpRequest; import cn.trinea.android.common.entity.HttpResponse; -import cn.trinea.android.common.service.impl.SimpleCache; +import cn.trinea.android.common.service.impl.ImageCache; import cn.trinea.android.common.util.ArrayUtils; import cn.trinea.android.common.util.HttpUtils; import cn.trinea.android.common.util.SqliteUtils; import cn.trinea.android.common.util.StringUtils; /** - * HttpCache + * Http Cache
    + *
    + * It applies to get and cache api data from server, like json or xml and so on. It applies to apps like weixin, weibo, + * twitter, taobao and so on. If want to cache image, please use {@link ImageCache}
    + *
      + * Constructor + *
    • {@link #HttpCache(Context)} to init cache
    • + *
    + *
      + * Get data asynchronous + *
    • {@link #httpGet(HttpRequest, HttpCacheListener)}
    • + *
    • {@link #httpGet(String, HttpCacheListener)}
    • + *
    + *
      + * Get data synchronous + *
    • {@link #httpGet(HttpRequest)}
    • + *
    • {@link #httpGet(String)}
    • + *
    • {@link #httpGetString(HttpRequest)}
    • + *
    • {@link #httpGetString(String)}
    • + *
    * * @author Trinea 2013-11-1 */ -public class HttpCache extends SimpleCache { +public class HttpCache { private Context context; @@ -29,7 +48,6 @@ public class HttpCache extends SimpleCache { private Map cache; /** dao to get data from http db cache **/ private HttpCacheDao httpCacheDaoImpl; - private int type = -1; public HttpCache(Context context){ @@ -42,10 +60,12 @@ public HttpCache(Context context){ } /** + * waiting to be perfect^_^ + * * @param context * @param type get httpResponse whose type is type into memory as primary cache to improve performance */ - public HttpCache(Context context, int type){ + private HttpCache(Context context, int type){ this(context); this.type = type; initData(type); @@ -166,32 +186,32 @@ public HttpResponse httpGetString(HttpRequest httpRequest) { public abstract class HttpCacheListener { + /** + * Runs on the UI thread before httpGet. + */ protected void onPreExecute() { } - protected void onPostExecute(HttpResponse httpResponse) { + /** + * Runs on the UI thread after httpGet. The httpResponse is returned by httpGet. + * + * @param httpResponse get by the url + * @param isInCache the data responsed to the url whether is in cache + */ + protected void onPostExecute(HttpResponse httpResponse, boolean isInCache) { } } /** - * get type + * get type, waiting to be perfect^_^ * * @return the type */ - public int getType() { + private int getType() { return type; } - /** - * set type - * - * @param type the type to set - */ - public void setType(int type) { - this.type = type; - } - /** * put response into cache *
      @@ -232,7 +252,7 @@ private HttpResponse getFromCache(String httpUrl) { if (cacheResponse == null) { cacheResponse = httpCacheDaoImpl.getHttpResponse(httpUrl); } - return (cacheResponse == null || cacheResponse.isExpired()) ? null : cacheResponse; + return (cacheResponse == null || cacheResponse.isExpired()) ? null : cacheResponse.setInCache(true); } /** @@ -263,7 +283,7 @@ protected void onPreExecute() { protected void onPostExecute(HttpResponse httpResponse) { if (listener != null) { - listener.onPostExecute(httpResponse); + listener.onPostExecute(httpResponse, httpResponse == null ? false : httpResponse.isInCache()); } } } @@ -296,7 +316,7 @@ protected void onPreExecute() { protected void onPostExecute(HttpResponse httpResponse) { if (listener != null) { - listener.onPostExecute(httpResponse); + listener.onPostExecute(httpResponse, httpResponse == null ? false : httpResponse.isInCache()); } } } From ec0b029030157e41427bd9eb5c59ce44a6405a03 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 15 Nov 2013 21:25:03 +0800 Subject: [PATCH 073/241] modify javadoc --- .../android/common/service/HttpCache.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 7387c21..48eb07c 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -114,7 +114,8 @@ public HttpResponse httpGet(HttpRequest request) { *
    * * @param httpUrl - * @param listener + * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do + * something */ public void httpGet(String httpUrl, HttpCacheListener listener) { new HttpCacheStringAsyncTask(listener).execute(httpUrl); @@ -129,7 +130,8 @@ public void httpGet(String httpUrl, HttpCacheListener listener) { * * * @param request - * @param listener + * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do + * something */ public void httpGet(HttpRequest request, HttpCacheListener listener) { new HttpCacheRequestAsyncTask(listener).execute(request); @@ -184,16 +186,27 @@ public HttpResponse httpGetString(HttpRequest httpRequest) { return httpGet(httpRequest); } + /** + * HttpCacheListener, can do something before or after HttpGet + * + * @author Trinea 2013-11-15 + */ public abstract class HttpCacheListener { /** - * Runs on the UI thread before httpGet. + * Runs on the UI thread before httpGet.
    + *
      + *
    • this can be null if you not want to do something
    • + *
    */ protected void onPreExecute() { } /** * Runs on the UI thread after httpGet. The httpResponse is returned by httpGet. + *
      + *
    • this can be null if you not want to do something
    • + *
    * * @param httpResponse get by the url * @param isInCache the data responsed to the url whether is in cache @@ -258,7 +271,7 @@ private HttpResponse getFromCache(String httpUrl) { /** * AsyncTask to get data by String url * - * @author gxwu@lewatek.com 2013-11-15 + * @author Trinea 2013-11-15 */ private class HttpCacheStringAsyncTask extends AsyncTask { @@ -291,7 +304,7 @@ protected void onPostExecute(HttpResponse httpResponse) { /** * AsyncTask to get data by HttpRequest * - * @author gxwu@lewatek.com 2013-11-15 + * @author Trinea 2013-11-15 */ private class HttpCacheRequestAsyncTask extends AsyncTask { From a55f692db49dbbf7a66ee413bf8b75981f423f8f Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 17 Nov 2013 00:11:18 +0800 Subject: [PATCH 074/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 754908f..034a3b6 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ ![ImageSDCardCache](http://farm4.staticflickr.com/3818/9318670513_1576253fd5_o.jpg) ####4. 网络缓存 -deving… +一期功能完成,帮助文档准备中^v^… ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview From f5fc6618107a2665fd6961bcf76502767305c507 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 18 Nov 2013 09:19:46 +0800 Subject: [PATCH 075/241] modify HttpCacheListener --- .../android/common/entity/HttpResponse.java | 36 +++++++++++++++++++ .../android/common/service/HttpCache.java | 12 +++---- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/cn/trinea/android/common/entity/HttpResponse.java index f7ee26b..a9c65d7 100644 --- a/src/cn/trinea/android/common/entity/HttpResponse.java +++ b/src/cn/trinea/android/common/entity/HttpResponse.java @@ -4,6 +4,7 @@ import java.util.Map; import cn.trinea.android.common.constant.HttpConstants; +import cn.trinea.android.common.service.HttpCache; import cn.trinea.android.common.util.HttpUtils; import cn.trinea.android.common.util.StringUtils; import cn.trinea.android.common.util.TimeUtils; @@ -43,6 +44,8 @@ public class HttpResponse { private int type; /** expired time in milliseconds **/ private long expiredTime; + /** this is a client mark, whether this response is in client cache **/ + private boolean isInCache; /** * An int representing the three digit HTTP Status-Code. @@ -58,6 +61,8 @@ public class HttpResponse { public HttpResponse(String url){ this.url = url; + type = 0; + isInCache = false; responseHeaders = new HashMap(); } @@ -117,6 +122,10 @@ public void setResponseHeaders(Map responseHeaders) { /** * get type + *
      + *
    • type to mark this response, default is 0
    • + *
    • it will be used in {@link HttpCache#HttpCache(android.content.Context, int)}
    • + *
    * * @return the type */ @@ -126,10 +135,17 @@ public int getType() { /** * set type + *
      + *
    • type to mark this response, default is 0, cannot be smaller than 0.
    • + *
    • it will be used in {@link HttpCache#HttpCache(android.content.Context, int)}
    • + *
    * * @param type the type to set */ public void setType(int type) { + if (type < 0) { + throw new IllegalArgumentException("The type of HttpResponse cannot be smaller than 0."); + } this.type = type; } @@ -167,6 +183,26 @@ public boolean isExpired() { return TimeUtils.getCurrentTimeInLong() > expiredTime; } + /** + * get isInCache, this is a client mark, whethero is in client cache + * + * @return the isInCache + */ + public boolean isInCache() { + return isInCache; + } + + /** + * set isInCache, this is a client mark, whethero is in client cache + * + * @param isInCache the isInCache to set + * @return + */ + public HttpResponse setInCache(boolean isInCache) { + this.isInCache = isInCache; + return this; + } + /** * http expires in reponse header * diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 48eb07c..443a444 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -199,7 +199,7 @@ public abstract class HttpCacheListener { *
  • this can be null if you not want to do something
  • * */ - protected void onPreExecute() { + protected void onPreGet() { } /** @@ -211,7 +211,7 @@ protected void onPreExecute() { * @param httpResponse get by the url * @param isInCache the data responsed to the url whether is in cache */ - protected void onPostExecute(HttpResponse httpResponse, boolean isInCache) { + protected void onPostGet(HttpResponse httpResponse, boolean isInCache) { } } @@ -290,13 +290,13 @@ protected HttpResponse doInBackground(String... url) { protected void onPreExecute() { if (listener != null) { - listener.onPreExecute(); + listener.onPreGet(); } } protected void onPostExecute(HttpResponse httpResponse) { if (listener != null) { - listener.onPostExecute(httpResponse, httpResponse == null ? false : httpResponse.isInCache()); + listener.onPostGet(httpResponse, httpResponse == null ? false : httpResponse.isInCache()); } } } @@ -323,13 +323,13 @@ protected HttpResponse doInBackground(HttpRequest... httpRequest) { protected void onPreExecute() { if (listener != null) { - listener.onPreExecute(); + listener.onPreGet(); } } protected void onPostExecute(HttpResponse httpResponse) { if (listener != null) { - listener.onPostExecute(httpResponse, httpResponse == null ? false : httpResponse.isInCache()); + listener.onPostGet(httpResponse, httpResponse == null ? false : httpResponse.isInCache()); } } } From 0fa916132c222d83b7609fbeb1a0f66dee44ee22 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 18 Nov 2013 09:58:01 +0800 Subject: [PATCH 076/241] add containsKey and clear function --- .../android/common/dao/HttpCacheDao.java | 7 +++ .../common/dao/impl/HttpCacheDaoImpl.java | 5 ++ .../android/common/service/HttpCache.java | 46 +++++++++++++------ 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/cn/trinea/android/common/dao/HttpCacheDao.java b/src/cn/trinea/android/common/dao/HttpCacheDao.java index 5b03434..d022349 100644 --- a/src/cn/trinea/android/common/dao/HttpCacheDao.java +++ b/src/cn/trinea/android/common/dao/HttpCacheDao.java @@ -34,4 +34,11 @@ public interface HttpCacheDao { * @return */ public Map getHttpResponsesByType(int type); + + /** + * delete all http response + * + * @return + */ + public int deleteAllHttpResponse(); } diff --git a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java index 8940c9c..3c79832 100644 --- a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java +++ b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java @@ -98,6 +98,11 @@ public Map getHttpResponsesByType(int type) { } } + @Override + public int deleteAllHttpResponse() { + return sqliteUtils.getWDb().delete(DbConstants.HTTP_CACHE_TABLE_TYPE, null, null); + } + /** * convert cursor to HttpResponse * diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 443a444..e233e1f 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -113,12 +113,12 @@ public HttpResponse httpGet(HttpRequest request) { * {@link HttpCache#httpGetString(HttpRequest)} * * - * @param httpUrl + * @param url * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do * something */ - public void httpGet(String httpUrl, HttpCacheListener listener) { - new HttpCacheStringAsyncTask(listener).execute(httpUrl); + public void httpGet(String url, HttpCacheListener listener) { + new HttpCacheStringAsyncTask(listener).execute(url); } /** @@ -146,11 +146,11 @@ public void httpGet(HttpRequest request, HttpCacheListener listener) { *
  • If you want get data asynchronous, use {@link HttpCache#httpGet(HttpRequest, HttpCacheListener)}
  • * * - * @param httpUrl + * @param url * @return the response of the url, if null represents http error */ - public HttpResponse httpGet(String httpUrl) { - return httpGet(new HttpRequest(httpUrl)); + public HttpResponse httpGet(String url) { + return httpGet(new HttpRequest(url)); } /** @@ -162,11 +162,11 @@ public HttpResponse httpGet(String httpUrl) { *
  • If you want get data asynchronous, use {@link HttpCache#httpGet(String, HttpCacheListener)}
  • * * - * @param httpUrl + * @param url * @return the response body of the url, if null represents http error */ - public String httpGetString(String httpUrl) { - HttpResponse cacheResponse = httpGet(new HttpRequest(httpUrl)); + public String httpGetString(String url) { + HttpResponse cacheResponse = httpGet(new HttpRequest(url)); return cacheResponse == null ? null : cacheResponse.getResponseBody(); } @@ -186,6 +186,24 @@ public HttpResponse httpGetString(HttpRequest httpRequest) { return httpGet(httpRequest); } + /** + * whether this cache contains the specified url. + * + * @param url + * @return true if this cache contains the specified url and the element is valid, false otherwise. + */ + public boolean containsKey(String url) { + return getFromCache(url) != null; + } + + /** + * Removes all elements from this cache, leaving it empty. + */ + public void clear() { + cache.clear(); + httpCacheDaoImpl.deleteAllHttpResponse(); + } + /** * HttpCacheListener, can do something before or after HttpGet * @@ -250,20 +268,20 @@ private HttpResponse putIntoCache(HttpResponse httpResponse) { /** * get from memory cache first, if not exist in memory cache, get from db * - * @param httpUrl + * @param url * @return
      *
    • if neither exit in memory cache nor db, return null
    • *
    • if is expired, return null, otherwise return cache response
    • *
    */ - private HttpResponse getFromCache(String httpUrl) { - if (StringUtils.isEmpty(httpUrl)) { + private HttpResponse getFromCache(String url) { + if (StringUtils.isEmpty(url)) { return null; } - HttpResponse cacheResponse = cache.get(httpUrl); + HttpResponse cacheResponse = cache.get(url); if (cacheResponse == null) { - cacheResponse = httpCacheDaoImpl.getHttpResponse(httpUrl); + cacheResponse = httpCacheDaoImpl.getHttpResponse(url); } return (cacheResponse == null || cacheResponse.isExpired()) ? null : cacheResponse.setInCache(true); } From cf9eaa06b9a08b83079276a18cfc905fa948cda8 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 18 Nov 2013 12:01:16 +0800 Subject: [PATCH 077/241] modify HttpCache --- src/cn/trinea/android/common/service/HttpCache.java | 2 +- src/cn/trinea/android/common/util/HttpUtils.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index e233e1f..6c65476 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -209,7 +209,7 @@ public void clear() { * * @author Trinea 2013-11-15 */ - public abstract class HttpCacheListener { + public static abstract class HttpCacheListener { /** * Runs on the UI thread before httpGet.
    diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index 3c1377a..6e265c6 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -417,5 +417,6 @@ private static void setHttpResponse(HttpURLConnection urlConnection, HttpRespons } response.setResponseHeader(HttpConstants.EXPIRES, urlConnection.getHeaderField("Expires")); response.setResponseHeader(HttpConstants.CACHE_CONTROL, urlConnection.getHeaderField("Cache-Control")); + response.setExpiredTime(response.getExpiresInMillis()); } } From 9a1b77b164438b4e71f57a3d350fed42c55f6032 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 19 Nov 2013 21:48:02 +0800 Subject: [PATCH 078/241] add isExpired to HttpCache --- src/cn/trinea/android/common/service/HttpCache.java | 10 ++++++++++ src/cn/trinea/android/common/util/MapUtils.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 6c65476..17f63c7 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -196,6 +196,16 @@ public boolean containsKey(String url) { return getFromCache(url) != null; } + /** + * whether the element of the specified url has invalided + * + * @param url + * @return true if the element of the specified url has invalided, false otherwise. + */ + protected boolean isExpired(String url) { + return getFromCache(url) == null; + } + /** * Removes all elements from this cache, leaving it empty. */ diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/cn/trinea/android/common/util/MapUtils.java index 57b53e5..e6c050b 100644 --- a/src/cn/trinea/android/common/util/MapUtils.java +++ b/src/cn/trinea/android/common/util/MapUtils.java @@ -26,7 +26,7 @@ public class MapUtils { * isEmpty({1, 2}) = false; * * - * @param str + * @param sourceMap * @return if map is null or its size is 0, return true, else return false. */ public static boolean isEmpty(Map sourceMap) { From b76b0f909928f8efb591572dfc30d882dd2fbab5 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 22 Nov 2013 19:33:51 +0800 Subject: [PATCH 079/241] add isConnecionKeepAlive to set whether http connecion is keep alive when get images from network --- .../common/service/impl/ImageCache.java | 10 ++++ .../common/service/impl/ImageMemoryCache.java | 41 +++++++++++--- .../common/service/impl/ImageSDCardCache.java | 27 +++++++++- .../android/common/util/ImageUtils.java | 54 +++++++++++++++++-- 4 files changed, 118 insertions(+), 14 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index d8ea2eb..6693d7d 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -229,6 +229,16 @@ public void setContext(Context context) { secondaryCache.setContext(context); } + @Override + public boolean isConnecionKeepAlive() { + return secondaryCache.isConnecionKeepAlive(); + } + + @Override + public void setConnecionKeepAlive(boolean isConnecionKeepAlive) { + secondaryCache.setConnecionKeepAlive(isConnecionKeepAlive); + } + /** * get cache folder path which be used when saving images, default is {@link #DEFAULT_CACHE_FOLDER} * diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index 5a612cc..3e95167 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -56,27 +56,29 @@ */ public class ImageMemoryCache extends PreloadDataCache { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private static final String TAG = "ImageCache"; + private static final String TAG = "ImageCache"; /** callback interface after image get success **/ private OnImageCallbackListener onImageCallbackListener; /** http read image time out, if less than 0, not set. default is not set **/ - private int httpReadTimeOut = -1; + private int httpReadTimeOut = -1; /** * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the * newest one **/ - private boolean isOpenWaitingQueue = true; + private boolean isOpenWaitingQueue = true; + /** whether http connecion is keep alive **/ + private boolean isConnecionKeepAlive = true; /** recommend default max cache size according to dalvik max memory **/ - public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); + public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); /** image got success message what **/ - private static final int IMAGE_LOADED_WHAT = 1; + private static final int IMAGE_LOADED_WHAT = 1; /** thread pool whose wait for data got, attention, not the get data thread pool **/ - private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); + private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); /** * key is image url, value is the newest view which waiting for image loaded, used when {@link #isOpenWaitingQueue} * is false @@ -209,6 +211,29 @@ public void setOpenWaitingQueue(boolean isOpenWaitingQueue) { this.isOpenWaitingQueue = isOpenWaitingQueue; } + /** + * get whether http connecion is keep alive + * + * @return the isConnecionKeepAlive + */ + public boolean isConnecionKeepAlive() { + return isConnecionKeepAlive; + } + + /** + * set whether http connecion is keep alive + *
      + *
    • if image is from the same server, isConnecionKeepAlive is set to true recommended, and this is the default + * value
    • + *
    • else if image is from the different server, isConnecionKeepAlive is set to false recommended
    • + *
    + * + * @param isConnecionKeepAlive the isConnecionKeepAlive to set + */ + public void setConnecionKeepAlive(boolean isConnecionKeepAlive) { + this.isConnecionKeepAlive = isConnecionKeepAlive; + } + /** *
      *
    • Get data listener is {@link #getDefaultOnGetImageListener()}
    • @@ -407,7 +432,7 @@ public OnGetDataListener getDefaultOnGetImageListener() { public CacheObject onGetData(String key) { Drawable d = null; try { - d = ImageUtils.getDrawableFromUrl(key, httpReadTimeOut); + d = ImageUtils.getDrawableFromUrl(key, httpReadTimeOut, isConnecionKeepAlive); } catch (Exception e) { Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); } diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index abcb2ab..c9fc4da 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -84,6 +84,8 @@ public class ImageSDCardCache extends PreloadDataCache { * newest one **/ private boolean isOpenWaitingQueue = true; + /** whether http connecion is keep alive **/ + private boolean isConnecionKeepAlive = true; /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); @@ -277,6 +279,29 @@ public void setOpenWaitingQueue(boolean isOpenWaitingQueue) { this.isOpenWaitingQueue = isOpenWaitingQueue; } + /** + * get whether http connecion is keep alive + * + * @return the isConnecionKeepAlive + */ + public boolean isConnecionKeepAlive() { + return isConnecionKeepAlive; + } + + /** + * set whether http connecion is keep alive + *
        + *
      • if image is from the same server, isConnecionKeepAlive is set to true recommended, and this is the default + * value
      • + *
      • else if image is from the different server, isConnecionKeepAlive is set to false recommended
      • + *
      + * + * @param isConnecionKeepAlive the isConnecionKeepAlive to set + */ + public void setConnecionKeepAlive(boolean isConnecionKeepAlive) { + this.isConnecionKeepAlive = isConnecionKeepAlive; + } + /** *
        *
      • Get data listener is {@link #getDefaultOnGetImageListener()}
      • @@ -678,7 +703,7 @@ public CacheObject onGetData(String key) { String savePath = null; try { - InputStream stream = ImageUtils.getInputStreamFromUrl(key, httpReadTimeOut); + InputStream stream = ImageUtils.getInputStreamFromUrl(key, httpReadTimeOut, isConnecionKeepAlive); if (stream != null) { savePath = cacheFolder + File.separator + fileNameRule.getFileName(key); try { diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 8d0edd1..3a76003 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -106,20 +106,38 @@ public static Drawable byteToDrawable(byte[] b) { return bitmapToDrawable(byteToBitmap(b)); } + /** + * get input stream from network by imageurl, and http conection is keep alive, you need to close inputStream + * yourself + * + * @param imageUrl + * @param readTimeOutMillis + * @return + * @see ImageUtils#getInputStreamFromUrl(String, int, boolean) + */ + public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis) { + return getInputStreamFromUrl(imageUrl, readTimeOutMillis, true); + } + /** * get input stream from network by imageurl, you need to close inputStream yourself * * @param imageUrl * @param readTimeOutMillis read time out, if less than 0, not set, in mills + * @param isConnecionKeepAlive whether connection keep alive * @return * @throws MalformedURLException * @throws IOException */ - public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis) { + public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis, boolean isConnecionKeepAlive) { InputStream stream = null; try { URL url = new URL(imageUrl); HttpURLConnection con = (HttpURLConnection)url.openConnection(); + // default is keep alive + if (!isConnecionKeepAlive) { + con.addRequestProperty("Connection", "false"); + } if (readTimeOutMillis > 0) { con.setReadTimeout(readTimeOutMillis); } @@ -134,28 +152,54 @@ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut return stream; } + /** + * get drawable by imageUrl , and http conection is keep alive + * + * @param imageUrl + * @param readTimeOutMillis + * @return + * @see ImageUtils#getDrawableFromUrl(String, int, boolean) + */ + public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis) { + return getDrawableFromUrl(imageUrl, readTimeOutMillis, true); + } + /** * get drawable by imageUrl * * @param imageUrl * @param readTimeOutMillis read time out, if less than 0, not set, in mills + * @param isConnecionKeepAlive whether connection keep alive * @return */ - public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis) { - InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOutMillis); + public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis, boolean isConnecionKeepAlive) { + InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOutMillis, isConnecionKeepAlive); Drawable d = Drawable.createFromStream(stream, "src"); closeInputStream(stream); return d; } /** - * get Bitmap by imageUrl + * get Bitmap by imageUrl, and http conection is keep alive * * @param imageUrl + * @param readTimeOut * @return + * @see ImageUtils#getBitmapFromUrl(String, int, boolean) */ public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut) { - InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOut); + return getBitmapFromUrl(imageUrl, readTimeOut, true); + } + + /** + * get Bitmap by imageUrl + * + * @param imageUrl + * @param isConnecionKeepAlive whether connection keep alive + * @return + */ + public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut, boolean isConnecionKeepAlive) { + InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOut, isConnecionKeepAlive); Bitmap b = BitmapFactory.decodeStream(stream); closeInputStream(stream); return b; From 36a0329dd60c253c22f7d7a1bfcc5bb1d4fb9bca Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 25 Nov 2013 17:43:37 +0800 Subject: [PATCH 080/241] OnImageSDCallbackListener add onPreGet onGetSuccess onGetFailed --- AndroidManifest.xml | 2 +- .../common/entity/FailedException.java | 22 +++ .../android/common/entity/FailedReason.java | 48 ++++++ .../common/service/impl/ImageCache.java | 1 - .../common/service/impl/ImageMemoryCache.java | 115 ++++++++++---- .../common/service/impl/ImageSDCardCache.java | 146 ++++++++++++------ 6 files changed, 251 insertions(+), 83 deletions(-) create mode 100644 src/cn/trinea/android/common/entity/FailedException.java create mode 100644 src/cn/trinea/android/common/entity/FailedReason.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b4c70b0..72c444b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="4.1.7" > diff --git a/src/cn/trinea/android/common/entity/FailedException.java b/src/cn/trinea/android/common/entity/FailedException.java new file mode 100644 index 0000000..216dedf --- /dev/null +++ b/src/cn/trinea/android/common/entity/FailedException.java @@ -0,0 +1,22 @@ +package cn.trinea.android.common.entity; + +/** + * get data failed exception + * + * @author Trinea 2013-11-25 + */ +public class FailedException extends Throwable { + + private static final long serialVersionUID = 1L; + + /** + * Constructs a new exception with the specified detail message. The cause is not initialized, and may subsequently + * be initialized by a call to {@link #initCause}. + * + * @param message the detail message. The detail message is saved for later retrieval by the {@link #getMessage()} + * method. + */ + public FailedException(String message){ + super(message); + } +} diff --git a/src/cn/trinea/android/common/entity/FailedReason.java b/src/cn/trinea/android/common/entity/FailedReason.java new file mode 100644 index 0000000..de3bd1e --- /dev/null +++ b/src/cn/trinea/android/common/entity/FailedReason.java @@ -0,0 +1,48 @@ +package cn.trinea.android.common.entity; + +/** + * get data failed reason + * + * @author Trinea 2013-11-25 + */ +public class FailedReason { + + private FailedType failedType; + /** reserved field, it's no use now, waiting to be perfect^_^ **/ + private FailedException cause; + + public FailedReason(FailedType failedType, FailedException cause){ + this.failedType = failedType; + this.cause = cause; + } + + /** + * get failedType + * + * @return the failedType + */ + public FailedType getFailedType() { + return failedType; + } + + /** + * get cause + * + * @return the cause + * @deprecated Reserved field, it's no use now, waiting to be perfect^_^ + */ + public FailedException getCause() { + return cause; + } + + public static enum FailedType { + /** get image error from network **/ + ERROR_NETWORK, + /** save image to sdcard error **/ + ERROR_IO, + /** reserved field, it's no use now, waiting to be perfect^_^ **/ + ERROR_OUT_OF_MEMORY, + /** reserved field, it's no use now, waiting to be perfect^_^ **/ + ERROR_UNKNOWN, + } +} diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 6693d7d..66fbe7f 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -12,7 +12,6 @@ import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.service.FileNameRule; -import cn.trinea.android.common.service.impl.ImageMemoryCache.OnImageCallbackListener; import cn.trinea.android.common.util.FileUtils; import cn.trinea.android.common.util.ImageUtils; diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index 3e95167..b34949d 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -1,6 +1,5 @@ package cn.trinea.android.common.service.impl; -import java.io.Serializable; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -16,6 +15,9 @@ import android.os.Message; import android.util.Log; import android.view.View; +import cn.trinea.android.common.entity.FailedException; +import cn.trinea.android.common.entity.FailedReason; +import cn.trinea.android.common.entity.FailedReason.FailedType; import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.util.ImageUtils; @@ -31,7 +33,7 @@ *
          * Setting and Usage *
        • Use one of constructors in sections II to init cache
        • - *
        • {@link #setOnImageCallbackListener(OnImageCallbackListener)} set callback interface after image get success
        • + *
        • {@link #setOnImageCallbackListener(OnImageCallbackListener)} set callback interface when getting image
        • *
        • {@link #get(String, List, View)} get image asynchronous and preload other images asynchronous according to * urlList
        • *
        • {@link #get(String, View)} get image asynchronous
        • @@ -56,29 +58,31 @@ */ public class ImageMemoryCache extends PreloadDataCache { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private static final String TAG = "ImageCache"; + private static final String TAG = "ImageCache"; - /** callback interface after image get success **/ + /** callback interface when getting image **/ private OnImageCallbackListener onImageCallbackListener; /** http read image time out, if less than 0, not set. default is not set **/ - private int httpReadTimeOut = -1; + private int httpReadTimeOut = -1; /** * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the * newest one **/ - private boolean isOpenWaitingQueue = true; + private boolean isOpenWaitingQueue = true; /** whether http connecion is keep alive **/ private boolean isConnecionKeepAlive = true; /** recommend default max cache size according to dalvik max memory **/ - public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); - /** image got success message what **/ - private static final int IMAGE_LOADED_WHAT = 1; + public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); + /** message what for get image successfully **/ + private static final int WHAT_GET_IMAGE_SUCCESS = 1; + /** message what for get image failed **/ + private static final int WHAT_GET_IMAGE_FAILED = 2; /** thread pool whose wait for data got, attention, not the get data thread pool **/ - private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); + private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); /** * key is image url, value is the newest view which waiting for image loaded, used when {@link #isOpenWaitingQueue} * is false @@ -93,7 +97,7 @@ public class ImageMemoryCache extends PreloadDataCache { /** * get image asynchronous. when get image success, it will pass to - * {@link OnImageCallbackListener#onImageLoaded(String, Drawable, View, boolean)} + * {@link OnImageCallbackListener#onGetSuccess(String, Drawable, View, boolean)} * * @param imageUrl * @param view @@ -118,6 +122,9 @@ public boolean get(final String imageUrl, final List urlList, final View return false; } + if (onImageCallbackListener != null) { + onImageCallbackListener.onPreGet(imageUrl, view); + } /** * if already in cache, call onImageSDCallbackListener, else new thread to wait for it */ @@ -126,7 +133,7 @@ public boolean get(final String imageUrl, final List urlList, final View Drawable drawable = object.getData(); if (drawable != null) { if (onImageCallbackListener != null) { - onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, true); + onImageCallbackListener.onGetSuccess(imageUrl, drawable, view, true); } return true; } else { @@ -151,12 +158,12 @@ public boolean get(final String imageUrl, final List urlList, final View return false; } - startGetImageThread(IMAGE_LOADED_WHAT, imageUrl, urlList); + startGetImageThread(imageUrl, urlList); return false; } /** - * get callback interface after image get success + * get callback interface when getting image * * @return the onImageCallbackListener */ @@ -165,7 +172,7 @@ public OnImageCallbackListener getOnImageCallbackListener() { } /** - * set callback interface after image get success + * set callback interface when getting image * * @param onImageCallbackListener */ @@ -237,7 +244,7 @@ public void setConnecionKeepAlive(boolean isConnecionKeepAlive) { /** *
            *
          • Get data listener is {@link #getDefaultOnGetImageListener()}
          • - *
          • Callback interface after image get success is null, can set by + *
          • callback interface when getting image is null, can set by * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
          • *
          • Maximum size of the cache is {@link #DEFAULT_MAX_SIZE}
          • *
          • Elements of the cache will not invalid
          • @@ -253,7 +260,7 @@ public ImageMemoryCache(){ /** *
              *
            • Get data listener is {@link #getDefaultOnGetImageListener()}
            • - *
            • Callback interface after image get success is null, can set by + *
            • callback interface when getting image is null, can set by * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
            • *
            • Elements of the cache will not invalid
            • *
            • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
            • @@ -269,7 +276,7 @@ public ImageMemoryCache(int maxSize){ /** *
                *
              • Get data listener is {@link #getDefaultOnGetImageListener()}
              • - *
              • Callback interface after image get success is null, can set by + *
              • callback interface when getting image is null, can set by * {@link #setOnImageCallbackListener(OnImageCallbackListener)}
              • *
              • Elements of the cache will not invalid
              • *
              • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
              • @@ -293,21 +300,39 @@ public ImageMemoryCache(int maxSize, int threadPoolSize){ } /** - * callback interface after image get success + * callback interface when getting image * * @author Trinea 2012-4-5 */ - public interface OnImageCallbackListener extends Serializable { + public interface OnImageCallbackListener { /** - * callback function after image get success, run on ui thread + * callback function before get image, run on ui thread + * + * @param imageUrl imageUrl + * @param view view need the image + */ + public void onPreGet(String imageUrl, View view); + + /** + * callback function after get image successfully, run on ui thread * * @param imageUrl imageUrl * @param imageDrawable drawable * @param view view need the image * @param isInCache whether already in cache or got realtime */ - public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache); + public void onGetSuccess(String imageUrl, Drawable imageDrawable, View view, boolean isInCache); + + /** + * callback function after get image failed, run on ui thread + * + * @param imageUrl imageUrl + * @param imageDrawable drawable + * @param view view need the image + * @param failedReason failed reason for get image + */ + public void onGetFailed(String imageUrl, Drawable imageDrawable, View view, FailedReason failedReason); } /** @@ -335,7 +360,8 @@ private class MyHandler extends Handler { public void handleMessage(Message message) { switch (message.what) { - case IMAGE_LOADED_WHAT: + case WHAT_GET_IMAGE_SUCCESS: + case WHAT_GET_IMAGE_FAILED: MessageObject object = (MessageObject)message.obj; if (object == null) { break; @@ -350,7 +376,13 @@ public void handleMessage(Message message) { if (viewSet != null) { for (View view : viewSet) { if (view != null) { - onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); + onImageCallbackListener.onGetSuccess(imageUrl, drawable, view, false); + } + if (WHAT_GET_IMAGE_SUCCESS == message.what) { + onImageCallbackListener.onGetSuccess(imageUrl, drawable, view, false); + } else { + onImageCallbackListener.onGetFailed(imageUrl, drawable, view, + object.failedReason); } } } @@ -358,7 +390,11 @@ public void handleMessage(Message message) { } else { View view = viewMap.get(imageUrl); if (view != null) { - onImageCallbackListener.onImageLoaded(imageUrl, drawable, view, false); + if (WHAT_GET_IMAGE_SUCCESS == message.what) { + onImageCallbackListener.onGetSuccess(imageUrl, drawable, view, false); + } else { + onImageCallbackListener.onGetFailed(imageUrl, drawable, view, object.failedReason); + } } } } @@ -382,25 +418,32 @@ public void handleMessage(Message message) { */ private class MessageObject { - String imageUrl; - Drawable drawable; + String imageUrl; + Drawable drawable; + FailedReason failedReason; public MessageObject(String imageUrl, Drawable drawable){ this.imageUrl = imageUrl; this.drawable = drawable; } + + public MessageObject(String imageUrl, Drawable drawable, FailedReason failedReason){ + this.imageUrl = imageUrl; + this.drawable = drawable; + this.failedReason = failedReason; + } + } /** * start thread to wait for image get * - * @param messsageWhat * @param imageUrl * @param urlList url list, if is null, not preload, else preload forward by * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} */ - private void startGetImageThread(final int messsageWhat, final String imageUrl, final List urlList) { + private void startGetImageThread(final String imageUrl, final List urlList) { // wait for image be got success and send message threadPool.execute(new Runnable() { @@ -408,11 +451,19 @@ private void startGetImageThread(final int messsageWhat, final String imageUrl, public void run() { CacheObject object = get(imageUrl, urlList); Drawable drawable = (object == null ? null : object.getData()); - // if drawable is null, remove it if (drawable == null) { + // if drawable is null, remove it remove(imageUrl); + FailedReason failedReason = new FailedReason( + FailedType.ERROR_NETWORK, + new FailedException( + "get image from network error")); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, + drawable, + failedReason))); } else { - handler.sendMessage(handler.obtainMessage(IMAGE_LOADED_WHAT, new MessageObject(imageUrl, drawable))); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, + drawable))); } } }); diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index c9fc4da..dcc8162 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -3,7 +3,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; -import java.io.Serializable; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -20,7 +19,10 @@ import android.util.Log; import android.view.View; import cn.trinea.android.common.dao.impl.ImageSDCardCacheDaoImpl; +import cn.trinea.android.common.entity.FailedException; import cn.trinea.android.common.entity.CacheObject; +import cn.trinea.android.common.entity.FailedReason; +import cn.trinea.android.common.entity.FailedReason.FailedType; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.service.FileNameRule; import cn.trinea.android.common.util.FileUtils; @@ -38,7 +40,7 @@ *
                  * Setting and Usage *
                • Use one of constructors in sections II to init cache
                • - *
                • {@link #setOnImageSDCallbackListener(OnImageSDCallbackListener)} set callback interface after image get success
                • + *
                • {@link #setOnImageSDCallbackListener(OnImageSDCallbackListener)} set callback interface when getting image
                • *
                • {@link #get(String, List, View)} get image asynchronous and preload other images asynchronous according to * urlList
                • *
                • {@link #get(String, View)} get image asynchronous
                • @@ -67,44 +69,45 @@ */ public class ImageSDCardCache extends PreloadDataCache { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private static final String TAG = "ImageSDCardCache"; + private static final String TAG = "ImageSDCardCache"; - /** callback interface after image get success **/ + /** callback interface when getting image **/ private OnImageSDCallbackListener onImageSDCallbackListener; /** cache folder path which be used when saving images, default is {@link #DEFAULT_CACHE_FOLDER} **/ - private String cacheFolder = DEFAULT_CACHE_FOLDER; + private String cacheFolder = DEFAULT_CACHE_FOLDER; /** file name rule which be used when saving images, default is {@link FileNameRuleImageUrl} **/ - private FileNameRule fileNameRule = new FileNameRuleImageUrl(); + private FileNameRule fileNameRule = new FileNameRuleImageUrl(); /** http read image time out, if less than 0, not set. default is not set **/ - private int httpReadTimeOut = -1; + private int httpReadTimeOut = -1; /** * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the * newest one **/ - private boolean isOpenWaitingQueue = true; + private boolean isOpenWaitingQueue = true; /** whether http connecion is keep alive **/ private boolean isConnecionKeepAlive = true; /** recommend default max cache size according to dalvik max memory **/ - public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); + public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory() - .getAbsolutePath() - + File.separator - + "Trinea" - + File.separator - + "AndroidCommon" - + File.separator + "ImageSDCardCache"; - - /** image got success message what **/ - private static final int IMAGE_LOADED_WHAT = 1; - /** image reloaded success message what **/ - private static final int IMAGE_RELOADED_WHAT = 2; + public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory() + .getAbsolutePath() + + File.separator + + "Trinea" + + File.separator + + "AndroidCommon" + + File.separator + + "ImageSDCardCache"; + + /** message what for get image successfully **/ + private static final int WHAT_GET_IMAGE_SUCCESS = 1; + /** message what for get image failed **/ + private static final int WHAT_GET_IMAGE_FAILED = 2; /** thread pool whose wait for data got, attention, not the get data thread pool **/ - private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); + private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); /** * key is image url, value is the newest view which waiting for image loaded, used when {@link #isOpenWaitingQueue} * is false @@ -118,7 +121,7 @@ public class ImageSDCardCache extends PreloadDataCache { /** * get image asynchronous. when get image success, it will pass to - * {@link OnImageSDCallbackListener#onImageLoaded(String, String, View, boolean)} + * {@link OnImageSDCallbackListener#onGetSuccess(String, String, View, boolean)} * * @param imageUrl * @param view @@ -143,6 +146,9 @@ public boolean get(final String imageUrl, final List urlList, final View return false; } + if (onImageSDCallbackListener != null) { + onImageSDCallbackListener.onPreGet(imageUrl, view); + } /** * if already in cache, call onImageSDCallbackListener, else new thread to wait for it */ @@ -151,7 +157,7 @@ public boolean get(final String imageUrl, final List urlList, final View String imagePath = object.getData(); if (!StringUtils.isEmpty(imagePath) && FileUtils.isFileExist(imagePath)) { if (onImageSDCallbackListener != null) { - onImageSDCallbackListener.onImageLoaded(imageUrl, imagePath, view, true); + onImageSDCallbackListener.onGetSuccess(imageUrl, imagePath, view, true); } return true; } else { @@ -176,7 +182,7 @@ public boolean get(final String imageUrl, final List urlList, final View return false; } - startGetImageThread(IMAGE_LOADED_WHAT, imageUrl, urlList); + startGetImageThread(imageUrl, urlList); return false; } @@ -224,7 +230,7 @@ public void setFileNameRule(FileNameRule fileNameRule) { } /** - * get callback interface after image get success + * get callback interface when getting image * * @return the onImageSDCallbackListener */ @@ -233,7 +239,7 @@ public OnImageSDCallbackListener getOnImageSDCallbackListener() { } /** - * set callback interface after image get success + * set callback interface when getting image * * @param onImageSDCallbackListener the onImageSDCallbackListener to set */ @@ -305,7 +311,7 @@ public void setConnecionKeepAlive(boolean isConnecionKeepAlive) { /** *
                    *
                  • Get data listener is {@link #getDefaultOnGetImageListener()}
                  • - *
                  • Callback interface after image get success is null, can set by + *
                  • callback interface when getting image is null, can set by * {@link #setOnImageSDCallbackListener(OnImageSDCallbackListener)}
                  • *
                  • Maximum size of the cache is {@link #DEFAULT_MAX_SIZE}
                  • *
                  • Elements of the cache will not invalid
                  • @@ -321,7 +327,7 @@ public ImageSDCardCache(){ /** *
                      *
                    • Get data listener is {@link #getDefaultOnGetImageListener()}
                    • - *
                    • Callback interface after image get success is null, can set by + *
                    • callback interface when getting image is null, can set by * {@link #setOnImageSDCallbackListener(OnImageSDCallbackListener)}
                    • *
                    • Elements of the cache will not invalid
                    • *
                    • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
                    • @@ -337,7 +343,7 @@ public ImageSDCardCache(int maxSize){ /** *
                        *
                      • Get data listener is {@link #getDefaultOnGetImageListener()}
                      • - *
                      • Callback interface after image get success is null, can set by + *
                      • callback interface when getting image is null, can set by * {@link #setOnImageSDCallbackListener(OnImageSDCallbackListener)}
                      • *
                      • Elements of the cache will not invalid
                      • *
                      • Remove type is {@link RemoveTypeUsedCountSmall} when cache is full
                      • @@ -361,21 +367,39 @@ public ImageSDCardCache(int maxSize, int threadPoolSize){ } /** - * callback interface after image get success + * callback interface when getting image * * @author Trinea 2012-4-5 */ - public interface OnImageSDCallbackListener extends Serializable { + public interface OnImageSDCallbackListener { /** - * callback function after image get success, run on ui thread + * callback function before get image, run on ui thread + * + * @param imageUrl imageUrl + * @param view view need the image + */ + public void onPreGet(String imageUrl, View view); + + /** + * callback function after get image successfully, run on ui thread * * @param imageUrl imageUrl * @param imagePath image path * @param view view need the image * @param isInCache whether already in cache or got realtime */ - public void onImageLoaded(String imageUrl, String imagePath, View view, boolean isInCache); + public void onGetSuccess(String imageUrl, String imagePath, View view, boolean isInCache); + + /** + * callback function after get image failed, run on ui thread + * + * @param imageUrl imageUrl + * @param imagePath image path + * @param view view need the image + * @param failedReason failed reason for get image + */ + public void onGetFailed(String imageUrl, String imagePath, View view, FailedReason failedReason); } /** @@ -403,8 +427,8 @@ private class MyHandler extends Handler { public void handleMessage(Message message) { switch (message.what) { - case IMAGE_LOADED_WHAT: - case IMAGE_RELOADED_WHAT: + case WHAT_GET_IMAGE_SUCCESS: + case WHAT_GET_IMAGE_FAILED: MessageObject object = (MessageObject)message.obj; if (object == null) { break; @@ -419,7 +443,12 @@ public void handleMessage(Message message) { if (viewSet != null) { for (View view : viewSet) { if (view != null) { - onImageSDCallbackListener.onImageLoaded(imageUrl, imagePath, view, false); + if (WHAT_GET_IMAGE_SUCCESS == message.what) { + onImageSDCallbackListener.onGetSuccess(imageUrl, imagePath, view, false); + } else { + onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, + object.failedReason); + } } } } @@ -427,7 +456,12 @@ public void handleMessage(Message message) { } else { View view = viewMap.get(imageUrl); if (view != null) { - onImageSDCallbackListener.onImageLoaded(imageUrl, imagePath, view, false); + if (WHAT_GET_IMAGE_SUCCESS == message.what) { + onImageSDCallbackListener.onGetSuccess(imageUrl, imagePath, view, false); + } else { + onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, + object.failedReason); + } } } } @@ -451,25 +485,31 @@ public void handleMessage(Message message) { */ private class MessageObject { - String imageUrl; - String imagePath; + String imageUrl; + String imagePath; + FailedReason failedReason; + + public MessageObject(String imageUrl, String imagePath){ + this.imageUrl = imageUrl; + this.imagePath = imagePath; + } - public MessageObject(String imageUrl, String imagePath, List urlList){ + public MessageObject(String imageUrl, String imagePath, FailedReason failedReason){ this.imageUrl = imageUrl; this.imagePath = imagePath; + this.failedReason = failedReason; } } /** * start thread to wait for image get * - * @param messsageWhat * @param imageUrl * @param urlList url list, if is null, not preload, else preload forward by * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} */ - private void startGetImageThread(final int messsageWhat, final String imageUrl, final List urlList) { + private void startGetImageThread(final String imageUrl, final List urlList) { // wait for image be got success and send message threadPool.execute(new Runnable() { @@ -477,15 +517,23 @@ private void startGetImageThread(final int messsageWhat, final String imageUrl, public void run() { CacheObject object = get(imageUrl, urlList); String imagePath = (object == null ? null : object.getData()); - // if image file not exist, remove it from cache and reload it if (StringUtils.isEmpty(imagePath) || !FileUtils.isFileExist(imagePath)) { + // if image get fail, remove it remove(imageUrl); - if (messsageWhat == IMAGE_LOADED_WHAT) { - startGetImageThread(IMAGE_RELOADED_WHAT, imageUrl, urlList); + FailedReason failedReason; + if (object == null) { + failedReason = new FailedReason(FailedType.ERROR_NETWORK, + new FailedException("get image from network error")); + } else { + failedReason = new FailedReason(FailedType.ERROR_IO, + new FailedException("save image error")); } + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, + imagePath, + failedReason))); } else { - handler.sendMessage(handler.obtainMessage(messsageWhat, new MessageObject(imageUrl, imagePath, - urlList))); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, + imagePath))); } } }); From 0a977ef4b9909d7c9c50e0fb389c797cdb86c89f Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 25 Nov 2013 18:13:10 +0800 Subject: [PATCH 081/241] add setRequestProperties for imagecache --- .../android/common/entity/HttpRequest.java | 24 ++++----- .../common/service/impl/ImageCache.java | 36 ++++++++++--- .../common/service/impl/ImageMemoryCache.java | 51 ++++++++++++------- .../common/service/impl/ImageSDCardCache.java | 51 ++++++++++++------- .../trinea/android/common/util/HttpUtils.java | 25 ++++++--- .../android/common/util/ImageUtils.java | 37 +++++++------- 6 files changed, 147 insertions(+), 77 deletions(-) diff --git a/src/cn/trinea/android/common/entity/HttpRequest.java b/src/cn/trinea/android/common/entity/HttpRequest.java index b35b3b3..0d238b5 100644 --- a/src/cn/trinea/android/common/entity/HttpRequest.java +++ b/src/cn/trinea/android/common/entity/HttpRequest.java @@ -20,7 +20,7 @@ *
                      • {@link #setParasMap(Map)}
                      • *
                      • {@link #setUserAgent(String)}
                      • *
                      • {@link #setRequestProperty(String, String)}
                      • - *
                      • {@link #setRequestPropertys(Map)}
                      • + *
                      • {@link #setRequestProperties(Map)}
                      • *
                      * * @author Trinea 2013-5-12 @@ -31,13 +31,13 @@ public class HttpRequest { private int connectTimeout; private int readTimeout; private Map parasMap; - private Map requestPropertys; + private Map requestProperties; public HttpRequest(String url){ this.url = url; this.connectTimeout = -1; this.readTimeout = -1; - requestPropertys = new HashMap(); + requestProperties = new HashMap(); } public HttpRequest(String url, Map parasMap){ @@ -45,7 +45,7 @@ public HttpRequest(String url, Map parasMap){ this.parasMap = parasMap; this.connectTimeout = -1; this.readTimeout = -1; - requestPropertys = new HashMap(); + requestProperties = new HashMap(); } public String getUrl() { @@ -121,7 +121,7 @@ public String getParas() { * @see URLConnection#setRequestProperty(String, String) */ public void setRequestProperty(String field, String newValue) { - requestPropertys.put(field, newValue); + requestProperties.put(field, newValue); } /** @@ -129,7 +129,7 @@ public void setRequestProperty(String field, String newValue) { * @see URLConnection#getRequestProperty(String) */ public String getRequestProperty(String field) { - return requestPropertys.get(field); + return requestProperties.get(field); } /** @@ -139,20 +139,20 @@ public String getRequestProperty(String field) { * @see URLConnection#setRequestProperty(String, String) */ public void setUserAgent(String value) { - requestPropertys.put("User-Agent", value); + requestProperties.put("User-Agent", value); } /** * @return */ - public Map getRequestPropertys() { - return requestPropertys; + public Map getRequestProperties() { + return requestProperties; } /** - * @param requestPropertys + * @param requestProperties */ - public void setRequestPropertys(Map requestPropertys) { - this.requestPropertys = requestPropertys; + public void setRequestProperties(Map requestProperties) { + this.requestProperties = requestProperties; } } diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 66fbe7f..5b32345 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -2,6 +2,7 @@ import java.io.File; import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutorService; import android.content.Context; @@ -228,14 +229,37 @@ public void setContext(Context context) { secondaryCache.setContext(context); } - @Override - public boolean isConnecionKeepAlive() { - return secondaryCache.isConnecionKeepAlive(); + /** + * set http request properties + *
                        + *
                      • If image is from the different server, setRequestProperty("Connection", "false") is recommended. If image is + * from the same server, true is recommended, and this is the default value
                      • + *
                      + * + * @param requestProperties + */ + public void setRequestProperties(Map requestProperties) { + secondaryCache.setRequestProperties(requestProperties); } - @Override - public void setConnecionKeepAlive(boolean isConnecionKeepAlive) { - secondaryCache.setConnecionKeepAlive(isConnecionKeepAlive); + /** + * get http request properties + * + * @return + */ + public Map getRequestProperties() { + return secondaryCache.getRequestProperties(); + } + + /** + * Sets the value of the http request header field + * + * @param field the request header field to be set + * @param newValue the new value of the specified property + * @see {@link #setRequestProperties(Map)} + */ + public void setRequestProperty(String field, String newValue) { + secondaryCache.setRequestProperty(field, newValue); } /** diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index b34949d..b51ba13 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -70,9 +70,9 @@ public class ImageMemoryCache extends PreloadDataCache { * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the * newest one **/ - private boolean isOpenWaitingQueue = true; - /** whether http connecion is keep alive **/ - private boolean isConnecionKeepAlive = true; + private boolean isOpenWaitingQueue = true; + /** http request properties **/ + private Map requestProperties = null; /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); @@ -219,26 +219,43 @@ public void setOpenWaitingQueue(boolean isOpenWaitingQueue) { } /** - * get whether http connecion is keep alive + * set http request properties + *
                        + *
                      • If image is from the different server, setRequestProperty("Connection", "false") is recommended. If image is + * from the same server, true is recommended, and this is the default value
                      • + *
                      * - * @return the isConnecionKeepAlive + * @param requestProperties */ - public boolean isConnecionKeepAlive() { - return isConnecionKeepAlive; + public void setRequestProperties(Map requestProperties) { + this.requestProperties = requestProperties; } /** - * set whether http connecion is keep alive - *
                        - *
                      • if image is from the same server, isConnecionKeepAlive is set to true recommended, and this is the default - * value
                      • - *
                      • else if image is from the different server, isConnecionKeepAlive is set to false recommended
                      • - *
                      + * get http request properties * - * @param isConnecionKeepAlive the isConnecionKeepAlive to set + * @return */ - public void setConnecionKeepAlive(boolean isConnecionKeepAlive) { - this.isConnecionKeepAlive = isConnecionKeepAlive; + public Map getRequestProperties() { + return requestProperties; + } + + /** + * Sets the value of the http request header field + * + * @param field the request header field to be set + * @param newValue the new value of the specified property + * @see {@link #setRequestProperties(Map)} + */ + public void setRequestProperty(String field, String newValue) { + if (StringUtils.isEmpty(field)) { + return; + } + + if (requestProperties == null) { + requestProperties = new HashMap(); + } + requestProperties.put(field, newValue); } /** @@ -483,7 +500,7 @@ public OnGetDataListener getDefaultOnGetImageListener() { public CacheObject onGetData(String key) { Drawable d = null; try { - d = ImageUtils.getDrawableFromUrl(key, httpReadTimeOut, isConnecionKeepAlive); + d = ImageUtils.getDrawableFromUrl(key, httpReadTimeOut, requestProperties); } catch (Exception e) { Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); } diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index dcc8162..d74e8a4 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -85,9 +85,9 @@ public class ImageSDCardCache extends PreloadDataCache { * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the * newest one **/ - private boolean isOpenWaitingQueue = true; - /** whether http connecion is keep alive **/ - private boolean isConnecionKeepAlive = true; + private boolean isOpenWaitingQueue = true; + /** http request properties **/ + private Map requestProperties = null; /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); @@ -286,26 +286,43 @@ public void setOpenWaitingQueue(boolean isOpenWaitingQueue) { } /** - * get whether http connecion is keep alive + * set http request properties + *
                        + *
                      • If image is from the different server, setRequestProperty("Connection", "false") is recommended. If image is + * from the same server, true is recommended, and this is the default value
                      • + *
                      * - * @return the isConnecionKeepAlive + * @param requestProperties */ - public boolean isConnecionKeepAlive() { - return isConnecionKeepAlive; + public void setRequestProperties(Map requestProperties) { + this.requestProperties = requestProperties; } /** - * set whether http connecion is keep alive - *
                        - *
                      • if image is from the same server, isConnecionKeepAlive is set to true recommended, and this is the default - * value
                      • - *
                      • else if image is from the different server, isConnecionKeepAlive is set to false recommended
                      • - *
                      + * get http request properties * - * @param isConnecionKeepAlive the isConnecionKeepAlive to set + * @return */ - public void setConnecionKeepAlive(boolean isConnecionKeepAlive) { - this.isConnecionKeepAlive = isConnecionKeepAlive; + public Map getRequestProperties() { + return requestProperties; + } + + /** + * Sets the value of the http request header field + * + * @param field the request header field to be set + * @param newValue the new value of the specified property + * @see {@link #setRequestProperties(Map)} + */ + public void setRequestProperty(String field, String newValue) { + if (StringUtils.isEmpty(field)) { + return; + } + + if (requestProperties == null) { + requestProperties = new HashMap(); + } + requestProperties.put(field, newValue); } /** @@ -751,7 +768,7 @@ public CacheObject onGetData(String key) { String savePath = null; try { - InputStream stream = ImageUtils.getInputStreamFromUrl(key, httpReadTimeOut, isConnecionKeepAlive); + InputStream stream = ImageUtils.getInputStreamFromUrl(key, httpReadTimeOut, requestProperties); if (stream != null) { savePath = cacheFolder + File.separator + fileNameRule.getFileName(key); try { diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index 6e265c6..d02a651 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -10,8 +10,6 @@ import java.util.Iterator; import java.util.Locale; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.entity.HttpRequest; @@ -388,10 +386,7 @@ private static void setURLConnection(HttpRequest request, HttpURLConnection urlC return; } - Set> proSet = request.getRequestPropertys().entrySet(); - for (Map.Entry entry : proSet) { - urlConnection.setRequestProperty(entry.getKey(), entry.getValue()); - } + setURLConnection(request.getRequestProperties(), urlConnection); if (request.getConnectTimeout() >= 0) { urlConnection.setConnectTimeout(request.getConnectTimeout()); } @@ -400,6 +395,24 @@ private static void setURLConnection(HttpRequest request, HttpURLConnection urlC } } + /** + * set HttpURLConnection property + * + * @param requestProperties + * @param urlConnection + */ + public static void setURLConnection(Map requestProperties, HttpURLConnection urlConnection) { + if (MapUtils.isEmpty(requestProperties) || urlConnection == null) { + return; + } + + for (Map.Entry entry : requestProperties.entrySet()) { + if (!StringUtils.isEmpty(entry.getKey())) { + urlConnection.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + } + /** * set HttpURLConnection to HttpResponse * diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 3a76003..989900e 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -6,6 +6,7 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.util.Map; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -107,8 +108,7 @@ public static Drawable byteToDrawable(byte[] b) { } /** - * get input stream from network by imageurl, and http conection is keep alive, you need to close inputStream - * yourself + * get input stream from network by imageurl, you need to close inputStream yourself * * @param imageUrl * @param readTimeOutMillis @@ -116,7 +116,7 @@ public static Drawable byteToDrawable(byte[] b) { * @see ImageUtils#getInputStreamFromUrl(String, int, boolean) */ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis) { - return getInputStreamFromUrl(imageUrl, readTimeOutMillis, true); + return getInputStreamFromUrl(imageUrl, readTimeOutMillis, null); } /** @@ -124,20 +124,18 @@ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut * * @param imageUrl * @param readTimeOutMillis read time out, if less than 0, not set, in mills - * @param isConnecionKeepAlive whether connection keep alive + * @param requestProperties http request properties * @return * @throws MalformedURLException * @throws IOException */ - public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis, boolean isConnecionKeepAlive) { + public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis, + Map requestProperties) { InputStream stream = null; try { URL url = new URL(imageUrl); HttpURLConnection con = (HttpURLConnection)url.openConnection(); - // default is keep alive - if (!isConnecionKeepAlive) { - con.addRequestProperty("Connection", "false"); - } + HttpUtils.setURLConnection(requestProperties, con); if (readTimeOutMillis > 0) { con.setReadTimeout(readTimeOutMillis); } @@ -153,7 +151,7 @@ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut } /** - * get drawable by imageUrl , and http conection is keep alive + * get drawable by imageUrl * * @param imageUrl * @param readTimeOutMillis @@ -161,7 +159,7 @@ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut * @see ImageUtils#getDrawableFromUrl(String, int, boolean) */ public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis) { - return getDrawableFromUrl(imageUrl, readTimeOutMillis, true); + return getDrawableFromUrl(imageUrl, readTimeOutMillis, null); } /** @@ -169,18 +167,19 @@ public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis * * @param imageUrl * @param readTimeOutMillis read time out, if less than 0, not set, in mills - * @param isConnecionKeepAlive whether connection keep alive + * @param requestProperties http request properties * @return */ - public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis, boolean isConnecionKeepAlive) { - InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOutMillis, isConnecionKeepAlive); + public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis, + Map requestProperties) { + InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOutMillis, requestProperties); Drawable d = Drawable.createFromStream(stream, "src"); closeInputStream(stream); return d; } /** - * get Bitmap by imageUrl, and http conection is keep alive + * get Bitmap by imageUrl * * @param imageUrl * @param readTimeOut @@ -188,18 +187,18 @@ public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis * @see ImageUtils#getBitmapFromUrl(String, int, boolean) */ public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut) { - return getBitmapFromUrl(imageUrl, readTimeOut, true); + return getBitmapFromUrl(imageUrl, readTimeOut, null); } /** * get Bitmap by imageUrl * * @param imageUrl - * @param isConnecionKeepAlive whether connection keep alive + * @param requestProperties http request properties * @return */ - public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut, boolean isConnecionKeepAlive) { - InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOut, isConnecionKeepAlive); + public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut, Map requestProperties) { + InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOut, requestProperties); Bitmap b = BitmapFactory.decodeStream(stream); closeInputStream(stream); return b; From db377d43df70a5a5c5dc3681c9ec7f54d43e398e Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 25 Nov 2013 23:05:06 +0800 Subject: [PATCH 082/241] add project.properties --- project.properties | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 project.properties diff --git a/project.properties b/project.properties new file mode 100644 index 0000000..b3b1d5a --- /dev/null +++ b/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-9 +android.library=true From 1f7ef4b656bc83bac15bdd0fa4f8072928a7e5a8 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 25 Nov 2013 23:10:03 +0800 Subject: [PATCH 083/241] code format --- .../android/common/service/impl/ImageMemoryCache.java | 9 ++++----- .../android/common/service/impl/ImageSDCardCache.java | 7 +++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index b51ba13..e18ced8 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -70,9 +70,9 @@ public class ImageMemoryCache extends PreloadDataCache { * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the * newest one **/ - private boolean isOpenWaitingQueue = true; + private boolean isOpenWaitingQueue = true; /** http request properties **/ - private Map requestProperties = null; + private Map requestProperties = null; /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); @@ -435,8 +435,8 @@ public void handleMessage(Message message) { */ private class MessageObject { - String imageUrl; - Drawable drawable; + String imageUrl; + Drawable drawable; FailedReason failedReason; public MessageObject(String imageUrl, Drawable drawable){ @@ -449,7 +449,6 @@ public MessageObject(String imageUrl, Drawable drawable, FailedReason failedReas this.drawable = drawable; this.failedReason = failedReason; } - } /** diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index d74e8a4..45b50c3 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -85,15 +85,14 @@ public class ImageSDCardCache extends PreloadDataCache { * whether open waiting queue, default is true. If true, save all view waiting for image loaded, else only save the * newest one **/ - private boolean isOpenWaitingQueue = true; + private boolean isOpenWaitingQueue = true; /** http request properties **/ - private Map requestProperties = null; + private Map requestProperties = null; /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory() - .getAbsolutePath() + public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Trinea" + File.separator From ed57a3f68152ee628ee8b0ba2a3380289408ecf6 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 26 Nov 2013 11:22:57 +0800 Subject: [PATCH 084/241] code format --- .../android/common/service/impl/ImageMemoryCache.java | 7 +++---- .../android/common/service/impl/ImageSDCardCache.java | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index e18ced8..f65dff3 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -449,6 +449,7 @@ public MessageObject(String imageUrl, Drawable drawable, FailedReason failedReas this.drawable = drawable; this.failedReason = failedReason; } + } /** @@ -470,10 +471,8 @@ public void run() { if (drawable == null) { // if drawable is null, remove it remove(imageUrl); - FailedReason failedReason = new FailedReason( - FailedType.ERROR_NETWORK, - new FailedException( - "get image from network error")); + FailedReason failedReason = new FailedReason(FailedType.ERROR_NETWORK, + new FailedException("get image from network error")); handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, drawable, failedReason))); diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 45b50c3..2f1c8c4 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -92,7 +92,8 @@ public class ImageSDCardCache extends PreloadDataCache { /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory().getAbsolutePath() + public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory() + .getAbsolutePath() + File.separator + "Trinea" + File.separator @@ -541,8 +542,7 @@ public void run() { failedReason = new FailedReason(FailedType.ERROR_NETWORK, new FailedException("get image from network error")); } else { - failedReason = new FailedReason(FailedType.ERROR_IO, - new FailedException("save image error")); + failedReason = new FailedReason(FailedType.ERROR_IO, new FailedException("save image error")); } handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, imagePath, From edd2ee5d4833f41a90aaffca284934c85d5e8f53 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 26 Nov 2013 16:35:37 +0800 Subject: [PATCH 085/241] support cache-control is no-cache in http request --- src/cn/trinea/android/common/service/HttpCache.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 17f63c7..9a6db29 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -6,6 +6,7 @@ import android.content.Context; import android.os.AsyncTask; +import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.dao.HttpCacheDao; import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; import cn.trinea.android.common.entity.HttpRequest; @@ -101,7 +102,10 @@ public HttpResponse httpGet(HttpRequest request) { return null; } - HttpResponse cacheResponse = getFromCache(url); + HttpResponse cacheResponse = null; + if (!"no-cache".equals(request.getRequestProperty(HttpConstants.CACHE_CONTROL))) { + cacheResponse = getFromCache(url); + } return cacheResponse == null ? putIntoCache(HttpUtils.httpGet(url)) : cacheResponse; } From 018fd8125793e1b95ff80dbc37c91602de9d7caa Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 26 Nov 2013 17:08:12 +0800 Subject: [PATCH 086/241] remove footer view when do not has more --- src/cn/trinea/android/common/service/HttpCache.java | 12 ++++++------ .../trinea/android/common/view/DropDownListView.java | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 9a6db29..8557c41 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -48,7 +48,7 @@ public class HttpCache { /** http memory cache **/ private Map cache; /** dao to get data from http db cache **/ - private HttpCacheDao httpCacheDaoImpl; + private HttpCacheDao httpCacheDao; private int type = -1; public HttpCache(Context context){ @@ -57,7 +57,7 @@ public HttpCache(Context context){ } this.context = context; cache = new ConcurrentHashMap(); - httpCacheDaoImpl = new HttpCacheDaoImpl(SqliteUtils.getInstance(context)); + httpCacheDao = new HttpCacheDaoImpl(SqliteUtils.getInstance(context)); } /** @@ -78,7 +78,7 @@ private HttpCache(Context context, int type){ * @param type */ private void initData(int type) { - this.cache = httpCacheDaoImpl.getHttpResponsesByType(type); + this.cache = httpCacheDao.getHttpResponsesByType(type); if (cache == null) { cache = new HashMap(); } @@ -215,7 +215,7 @@ protected boolean isExpired(String url) { */ public void clear() { cache.clear(); - httpCacheDaoImpl.deleteAllHttpResponse(); + httpCacheDao.deleteAllHttpResponse(); } /** @@ -276,7 +276,7 @@ private HttpResponse putIntoCache(HttpResponse httpResponse) { if (type != -1 && type == httpResponse.getType()) { cache.put(url, httpResponse); } - return (httpCacheDaoImpl.insertHttpResponse(httpResponse) == -1) ? null : httpResponse; + return (httpCacheDao.insertHttpResponse(httpResponse) == -1) ? null : httpResponse; } /** @@ -295,7 +295,7 @@ private HttpResponse getFromCache(String url) { HttpResponse cacheResponse = cache.get(url); if (cacheResponse == null) { - cacheResponse = httpCacheDaoImpl.getHttpResponse(url); + cacheResponse = httpCacheDao.getHttpResponse(url); } return (cacheResponse == null || cacheResponse.isExpired()) ? null : cacheResponse.setInCache(true); } diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index 5420f68..4c8b0c0 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -546,6 +546,7 @@ public void onBottomComplete() { footerButton.setEnabled(true); if (!hasMore) { footerButton.setText(footerNoMoreText); + removeFooterView(footerLayout); } else { footerButton.setText(footerDefaultText); } From 6ac76d93261b912795db5ceb394549863fbd55f0 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 26 Nov 2013 18:02:46 +0800 Subject: [PATCH 087/241] support cache-control is no-store in http request --- .../android/common/service/HttpCache.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 8557c41..c67c5fb 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -1,6 +1,8 @@ package cn.trinea.android.common.service; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -103,10 +105,31 @@ public HttpResponse httpGet(HttpRequest request) { } HttpResponse cacheResponse = null; - if (!"no-cache".equals(request.getRequestProperty(HttpConstants.CACHE_CONTROL))) { + boolean isNoCache = false, isNoStore = false; + String requestCacheControl = request.getRequestProperty(HttpConstants.CACHE_CONTROL); + if (!StringUtils.isEmpty(requestCacheControl)) { + String[] requestCacheControls = requestCacheControl.split(","); + if (!ArrayUtils.isEmpty(requestCacheControls)) { + List requestCacheControlList = new ArrayList(); + for (String s : requestCacheControls) { + if (s == null) { + continue; + } + requestCacheControlList.add(s.trim()); + } + if (requestCacheControlList.contains("no-cache")) { + isNoCache = true; + } + if (requestCacheControlList.contains("no-store")) { + isNoStore = true; + } + } + } + if (!isNoCache) { cacheResponse = getFromCache(url); } - return cacheResponse == null ? putIntoCache(HttpUtils.httpGet(url)) : cacheResponse; + return cacheResponse == null ? (isNoStore ? HttpUtils.httpGet(url) : putIntoCache(HttpUtils.httpGet(url))) + : cacheResponse; } /** From bea51bf2f2ccac1e86f669785a120bf3b6b8db7b Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 27 Nov 2013 10:55:43 +0800 Subject: [PATCH 088/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 034a3b6..8823200 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 -主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 +主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 使用见:[图片缓存的使用](http://www.trinea.cn/?p=704) 适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: From 02c0f080da6c9d462388468c3e4818beeaef4fa3 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 27 Nov 2013 10:56:21 +0800 Subject: [PATCH 089/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8823200..7d40201 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 ####一. 缓存类 -主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 +主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 使用见:[图片缓存的使用](http://www.trinea.cn/?p=704) 适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: From eb79e22067dd7231ba3c622512b20bcb72ef07ea Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 5 Dec 2013 22:25:02 +0800 Subject: [PATCH 090/241] modify drop_down_list_footer_button --- res/layout/drop_down_list_footer.xml | 3 ++- res/values/dimens.xml | 2 ++ src/cn/trinea/android/common/util/ListUtils.java | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/res/layout/drop_down_list_footer.xml b/res/layout/drop_down_list_footer.xml index e46d3bc..94df385 100644 --- a/res/layout/drop_down_list_footer.xml +++ b/res/layout/drop_down_list_footer.xml @@ -17,8 +17,9 @@ android:id="@+id/drop_down_list_footer_button" style="@style/drop_down_list_footer_font_style" android:layout_width="wrap_content" - android:layout_height="match_parent" + android:layout_height="@dimen/drop_down_list_footer_button_height" android:layout_centerInParent="true" + android:layout_marginLeft="@dimen/drop_down_list_footer_button_margin_left" android:background="@android:color/transparent" android:gravity="center" android:text="@string/drop_down_list_footer_default_text" /> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index cdc7f62..3e2a2de 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -5,5 +5,7 @@ 20dp 36dp 36dp + 8dp + 48dp \ No newline at end of file diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index cbcd2af..467d4cd 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -13,6 +13,10 @@ public class ListUtils { /** default join separator **/ public static final String DEFAULT_JOIN_SEPARATOR = ","; + public static int getSize(List sourceList) { + return ListUtils.isEmpty(sourceList) ? 0 : sourceList.size(); + } + /** * is null or its size is 0 * From 6f7833c18d47a9db11eaae7e68c848f1cb4d1c4c Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 5 Dec 2013 22:28:14 +0800 Subject: [PATCH 091/241] add getRandom(int max) --- .../android/common/util/RandomUtils.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index 7f75712..67ab99b 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -106,4 +106,40 @@ public static String getRandom(char[] sourceChar, int length) { } return str.toString(); } + + /** + * get random int between 0 and max + * + * @param max + * @return
                        + *
                      • if max <= 0, return 0
                      • + *
                      • else return random int between 0 and max
                      • + *
                      + */ + public static int getRandom(int max) { + return getRandom(0, max); + } + + /** + * get random int between min and max + * + * @param min + * @param max + * @return
                        + *
                      • if min > max, return 0
                      • + *
                      • if min = max, return min
                      • + *
                      • else return random int between min and max
                      • + *
                      + */ + public static int getRandom(int min, int max) { + if (min > max) { + return 0; + } + if (min == max) { + return min; + } + + Random random = new Random(); + return min + random.nextInt(max - min); + } } From 42037e9cd6c5efb9fa1fd07f8602ad07fe68251f Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 5 Dec 2013 22:33:56 +0800 Subject: [PATCH 092/241] add Shuffling algorithm --- .../android/common/util/RandomUtils.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index 67ab99b..5b97319 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -142,4 +142,48 @@ public static int getRandom(int min, int max) { Random random = new Random(); return min + random.nextInt(max - min); } + + /** + * Shuffling algorithm + * + * @param objArray + * @param shuffleCount + * @return + */ + public static boolean shuffle(Object[] objArray, int shuffleCount) { + int length; + if (objArray == null || shuffleCount < 0 || (length = objArray.length) < shuffleCount) { + return false; + } + + for (int i = 1; i <= shuffleCount; i++) { + int random = getRandom(length - i); + Object temp = objArray[length - i]; + objArray[length - i] = objArray[random]; + objArray[random] = temp; + } + return true; + } + + /** + * Shuffling algorithm + * + * @param intArray + * @param shuffleCount + * @return + */ + public static boolean shuffle(int[] intArray, int shuffleCount) { + int length; + if (intArray == null || shuffleCount < 0 || (length = intArray.length) < shuffleCount) { + return false; + } + + for (int i = 1; i <= shuffleCount; i++) { + int random = getRandom(length - i); + int temp = intArray[length - i]; + intArray[length - i] = intArray[random]; + intArray[random] = temp; + } + return true; + } } From ab755ff112fe717402ca51daca89552afcd2e32c Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 5 Dec 2013 22:47:00 +0800 Subject: [PATCH 093/241] modify shuffle int[] --- src/cn/trinea/android/common/util/RandomUtils.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index 5b97319..098abd8 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -172,18 +172,20 @@ public static boolean shuffle(Object[] objArray, int shuffleCount) { * @param shuffleCount * @return */ - public static boolean shuffle(int[] intArray, int shuffleCount) { + public static int[] shuffle(int[] intArray, int shuffleCount) { int length; if (intArray == null || shuffleCount < 0 || (length = intArray.length) < shuffleCount) { - return false; + return null; } + int[] out = new int[shuffleCount]; for (int i = 1; i <= shuffleCount; i++) { int random = getRandom(length - i); + out[i - 1] = intArray[random]; int temp = intArray[length - i]; intArray[length - i] = intArray[random]; intArray[random] = temp; } - return true; + return out; } } From 08609d761b46eb9bbccd4897a0a684c0504e0eef Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 6 Dec 2013 11:39:27 +0800 Subject: [PATCH 094/241] delete unuse variable name --- src/cn/trinea/android/common/util/RandomUtils.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index 098abd8..740c214 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -127,7 +127,7 @@ public static int getRandom(int max) { * @param max * @return
                        *
                      • if min > max, return 0
                      • - *
                      • if min = max, return min
                      • + *
                      • if min == max, return min
                      • *
                      • else return random int between min and max
                      • *
                      */ @@ -138,9 +138,7 @@ public static int getRandom(int min, int max) { if (min == max) { return min; } - - Random random = new Random(); - return min + random.nextInt(max - min); + return min + new Random().nextInt(max - min); } /** From 6d2dc8efc93bfed7b1837fe8541da71d2235e1d1 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 6 Dec 2013 11:42:11 +0800 Subject: [PATCH 095/241] fix file name extesion error some times --- .../android/common/service/impl/FileNameRuleImageUrl.java | 4 ++-- src/cn/trinea/android/common/util/ListUtils.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java b/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java index b566ab2..c0e75b7 100644 --- a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java +++ b/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java @@ -32,11 +32,11 @@ public String getFileName(String imageUrl) { } String ext = (fileExtension == null ? FileUtils.getFileExtension(imageUrl) : fileExtension); - String fileName = (imageUrl.length() >= MAX_FILE_NAME_LENGTH + String fileName = (imageUrl.length() > MAX_FILE_NAME_LENGTH ? imageUrl.substring(imageUrl.length() - MAX_FILE_NAME_LENGTH, imageUrl.length()) : imageUrl).replaceAll("[\\W]", "_"); return StringUtils.isEmpty(ext) ? fileName - : (new StringBuilder().append(fileName).append(".").append(ext).toString()); + : (new StringBuilder().append(fileName).append(".").append(ext.replaceAll("[\\W]", "_")).toString()); } public FileNameRuleImageUrl setFileExtension(String fileExtension) { diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index 467d4cd..c1cd141 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -14,7 +14,7 @@ public class ListUtils { public static final String DEFAULT_JOIN_SEPARATOR = ","; public static int getSize(List sourceList) { - return ListUtils.isEmpty(sourceList) ? 0 : sourceList.size(); + return sourceList == null ? 0 : sourceList.size(); } /** From bf0a6cc8cea1285b836d376754af7df5d23aa7ca Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 10:13:22 +0800 Subject: [PATCH 096/241] add AssetDatabaseOpenHelper can auto copy databse form assets to /data/data/package_name/databases and read or write it --- .../common/util/AssetDatabaseOpenHelper.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java diff --git a/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java b/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java new file mode 100644 index 0000000..b6b420a --- /dev/null +++ b/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java @@ -0,0 +1,95 @@ +package cn.trinea.android.common.util; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; + +/** + * AssetDatabaseOpenHelper + *
                        + *
                      • Auto copy databse form assets to /data/data/package_name/databases
                      • + *
                      • You can use it like {@link SQLiteDatabase}, use {@link #getWritableDatabase()} to create and/or open a database + * that will be used for reading and writing. use {@link #getReadableDatabase()} to create and/or open a database that + * will be used for reading only.
                      • + *
                      + * + * @author Trinea 2013-12-5 + */ +public class AssetDatabaseOpenHelper { + + private Context context; + private String databaseName; + + public AssetDatabaseOpenHelper(Context context, String databaseName){ + this.context = context; + this.databaseName = databaseName; + } + + /** + * Create and/or open a database that will be used for reading and writing. + * + * @return + * @throws RuntimeException if cannot copy database from assets + * @throws SQLiteException if the database cannot be opened + */ + public synchronized SQLiteDatabase getWritableDatabase() { + File dbFile = context.getDatabasePath(databaseName); + if (!dbFile.exists()) { + try { + copyDatabase(dbFile); + } catch (IOException e) { + throw new RuntimeException("Error creating source database", e); + } + } + + return SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READWRITE); + } + + /** + * Create and/or open a database that will be used for reading only. + * + * @return + * @throws RuntimeException if cannot copy database from assets + * @throws SQLiteException if the database cannot be opened + */ + public synchronized SQLiteDatabase getReadableDatabase() { + File dbFile = context.getDatabasePath(databaseName); + if (!dbFile.exists()) { + try { + copyDatabase(dbFile); + } catch (IOException e) { + throw new RuntimeException("Error creating source database", e); + } + } + + return SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READONLY); + } + + /** + * @return the database name + */ + public String getDatabaseName() { + return databaseName; + } + + private void copyDatabase(File dbFile) throws IOException { + InputStream is = context.getAssets().open(databaseName); + FileUtils.makeDirs(dbFile.getAbsolutePath()); + OutputStream os = new FileOutputStream(dbFile); + + byte[] buffer = new byte[1024]; + while (is.read(buffer) > 0) { + os.write(buffer); + } + + os.flush(); + os.close(); + is.close(); + } +} From 68acd42813b1b5c6249f3331b0e45a5808b32597 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 10:16:30 +0800 Subject: [PATCH 097/241] add HorizontalListView --- .../common/view/HorizontalListView.java | 389 ++++++++++++++++++ 1 file changed, 389 insertions(+) create mode 100644 src/cn/trinea/android/common/view/HorizontalListView.java diff --git a/src/cn/trinea/android/common/view/HorizontalListView.java b/src/cn/trinea/android/common/view/HorizontalListView.java new file mode 100644 index 0000000..d5f46b9 --- /dev/null +++ b/src/cn/trinea/android/common/view/HorizontalListView.java @@ -0,0 +1,389 @@ +/* + * HorizontalListView.java v1.5 + * + * + * The MIT License + * Copyright (c) 2011 Paul Soucy (paul@dev-smart.com) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.trinea.android.common.view; + +import java.util.LinkedList; +import java.util.Queue; + +import android.content.Context; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.GestureDetector.OnGestureListener; +import android.view.MotionEvent; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListAdapter; +import android.widget.Scroller; + +public class HorizontalListView extends AdapterView { + + public boolean mAlwaysOverrideTouch = true; + protected ListAdapter mAdapter; + private int mLeftViewIndex = -1; + private int mRightViewIndex = 0; + protected int mCurrentX; + protected int mNextX; + private int mMaxX = Integer.MAX_VALUE; + private int mDisplayOffset = 0; + protected Scroller mScroller; + private GestureDetector mGesture; + private Queue mRemovedViewQueue = new LinkedList(); + private OnItemSelectedListener mOnItemSelected; + private OnItemClickListener mOnItemClicked; + private OnItemLongClickListener mOnItemLongClicked; + private boolean mDataChanged = false; + + + public HorizontalListView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(); + } + + private synchronized void initView() { + mLeftViewIndex = -1; + mRightViewIndex = 0; + mDisplayOffset = 0; + mCurrentX = 0; + mNextX = 0; + mMaxX = Integer.MAX_VALUE; + mScroller = new Scroller(getContext()); + mGesture = new GestureDetector(getContext(), mOnGesture); + } + + @Override + public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { + mOnItemSelected = listener; + } + + @Override + public void setOnItemClickListener(AdapterView.OnItemClickListener listener){ + mOnItemClicked = listener; + } + + @Override + public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { + mOnItemLongClicked = listener; + } + + private DataSetObserver mDataObserver = new DataSetObserver() { + + @Override + public void onChanged() { + synchronized(HorizontalListView.this){ + mDataChanged = true; + } + invalidate(); + requestLayout(); + } + + @Override + public void onInvalidated() { + reset(); + invalidate(); + requestLayout(); + } + + }; + + @Override + public ListAdapter getAdapter() { + return mAdapter; + } + + @Override + public View getSelectedView() { + //TODO: implement + return null; + } + + @Override + public void setAdapter(ListAdapter adapter) { + if(mAdapter != null) { + mAdapter.unregisterDataSetObserver(mDataObserver); + } + mAdapter = adapter; + mAdapter.registerDataSetObserver(mDataObserver); + reset(); + } + + private synchronized void reset(){ + initView(); + removeAllViewsInLayout(); + requestLayout(); + } + + @Override + public void setSelection(int position) { + //TODO: implement + } + + private void addAndMeasureChild(final View child, int viewPos) { + LayoutParams params = child.getLayoutParams(); + if(params == null) { + params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); + } + + addViewInLayout(child, viewPos, params, true); + child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); + } + + + + @Override + protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + if(mAdapter == null){ + return; + } + + if(mDataChanged){ + int oldCurrentX = mCurrentX; + initView(); + removeAllViewsInLayout(); + mNextX = oldCurrentX; + mDataChanged = false; + } + + if(mScroller.computeScrollOffset()){ + int scrollx = mScroller.getCurrX(); + mNextX = scrollx; + } + + if(mNextX <= 0){ + mNextX = 0; + mScroller.forceFinished(true); + } + if(mNextX >= mMaxX) { + mNextX = mMaxX; + mScroller.forceFinished(true); + } + + int dx = mCurrentX - mNextX; + + removeNonVisibleItems(dx); + fillList(dx); + positionItems(dx); + + mCurrentX = mNextX; + + if(!mScroller.isFinished()){ + post(new Runnable(){ + @Override + public void run() { + requestLayout(); + } + }); + + } + } + + private void fillList(final int dx) { + int edge = 0; + View child = getChildAt(getChildCount()-1); + if(child != null) { + edge = child.getRight(); + } + fillListRight(edge, dx); + + edge = 0; + child = getChildAt(0); + if(child != null) { + edge = child.getLeft(); + } + fillListLeft(edge, dx); + + + } + + private void fillListRight(int rightEdge, final int dx) { + while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { + + View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this); + addAndMeasureChild(child, -1); + rightEdge += child.getMeasuredWidth(); + + if(mRightViewIndex == mAdapter.getCount()-1) { + mMaxX = mCurrentX + rightEdge - getWidth(); + } + + if (mMaxX < 0) { + mMaxX = 0; + } + mRightViewIndex++; + } + + } + + private void fillListLeft(int leftEdge, final int dx) { + while(leftEdge + dx > 0 && mLeftViewIndex >= 0) { + View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this); + addAndMeasureChild(child, 0); + leftEdge -= child.getMeasuredWidth(); + mLeftViewIndex--; + mDisplayOffset -= child.getMeasuredWidth(); + } + } + + private void removeNonVisibleItems(final int dx) { + View child = getChildAt(0); + while(child != null && child.getRight() + dx <= 0) { + mDisplayOffset += child.getMeasuredWidth(); + mRemovedViewQueue.offer(child); + removeViewInLayout(child); + mLeftViewIndex++; + child = getChildAt(0); + + } + + child = getChildAt(getChildCount()-1); + while(child != null && child.getLeft() + dx >= getWidth()) { + mRemovedViewQueue.offer(child); + removeViewInLayout(child); + mRightViewIndex--; + child = getChildAt(getChildCount()-1); + } + } + + private void positionItems(final int dx) { + if(getChildCount() > 0){ + mDisplayOffset += dx; + int left = mDisplayOffset; + for(int i=0;i Date: Sat, 7 Dec 2013 10:33:17 +0800 Subject: [PATCH 098/241] modify writeFile in FileUtils.java --- .../trinea/android/common/util/FileUtils.java | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index 5521e32..355a302 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -116,13 +116,51 @@ public static boolean writeFile(String filePath, String content, boolean append) * * @param filePath * @param stream + * @return + * @see {@link #writeFile(String, InputStream, boolean)} + */ + public static boolean writeFile(String filePath, InputStream stream) { + return writeFile(filePath, stream, false); + } + + /** + * write file + * + * @param file the file to be opened for writing. + * @param stream the input stream + * @param append if true, then bytes will be written to the end of the file rather than the beginning * @return return true * @throws IOException if an error occurs while operator FileWriter */ - public static boolean writeFile(String filePath, InputStream stream) { + public static boolean writeFile(String filePath, InputStream stream, boolean append) { + return writeFile(filePath != null ? new File(filePath) : null, stream, append); + } + + /** + * write file + * + * @param file + * @param stream + * @return + * @see {@link #writeFile(File, InputStream, boolean)} + */ + public static boolean writeFile(File file, InputStream stream) { + return writeFile(file, stream, false); + } + + /** + * write file + * + * @param file the file to be opened for writing. + * @param stream the input stream + * @param append if true, then bytes will be written to the end of the file rather than the beginning + * @return return true + * @throws IOException if an error occurs while operator FileWriter + */ + public static boolean writeFile(File file, InputStream stream, boolean append) { OutputStream o = null; try { - o = new FileOutputStream(filePath); + o = new FileOutputStream(file, append); byte data[] = new byte[1024]; int length = -1; while ((length = stream.read(data)) != -1) { From 5e0f5de5ba3a1ff766979c8c65dca1edad89187c Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 10:33:36 +0800 Subject: [PATCH 099/241] add file not null --- src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java b/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java index b6b420a..fe08fe0 100644 --- a/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java +++ b/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java @@ -40,7 +40,7 @@ public AssetDatabaseOpenHelper(Context context, String databaseName){ */ public synchronized SQLiteDatabase getWritableDatabase() { File dbFile = context.getDatabasePath(databaseName); - if (!dbFile.exists()) { + if (dbFile != null && !dbFile.exists()) { try { copyDatabase(dbFile); } catch (IOException e) { From c9c15efb1e8d982086e57b9008f45a6162f9a24c Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 10:36:19 +0800 Subject: [PATCH 100/241] add auto makeDirs when writeFile --- src/cn/trinea/android/common/util/FileUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index 355a302..beeb6e4 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -94,6 +94,7 @@ public static StringBuilder readFile(String filePath, String charsetName) { public static boolean writeFile(String filePath, String content, boolean append) { FileWriter fileWriter = null; try { + makeDirs(filePath); fileWriter = new FileWriter(filePath, append); fileWriter.write(content); fileWriter.close(); @@ -160,6 +161,7 @@ public static boolean writeFile(File file, InputStream stream) { public static boolean writeFile(File file, InputStream stream, boolean append) { OutputStream o = null; try { + makeDirs(file.getAbsolutePath()); o = new FileOutputStream(file, append); byte data[] = new byte[1024]; int length = -1; From 54dba4f461b21d11436ccf3410316f2b3f237592 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 10:40:20 +0800 Subject: [PATCH 101/241] modify copyFile --- .../common/util/AssetDatabaseOpenHelper.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java b/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java index fe08fe0..2b36616 100644 --- a/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java +++ b/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java @@ -1,10 +1,8 @@ package cn.trinea.android.common.util; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import android.content.Context; import android.database.sqlite.SQLiteDatabase; @@ -60,7 +58,7 @@ public synchronized SQLiteDatabase getWritableDatabase() { */ public synchronized SQLiteDatabase getReadableDatabase() { File dbFile = context.getDatabasePath(databaseName); - if (!dbFile.exists()) { + if (dbFile != null && !dbFile.exists()) { try { copyDatabase(dbFile); } catch (IOException e) { @@ -79,17 +77,8 @@ public String getDatabaseName() { } private void copyDatabase(File dbFile) throws IOException { - InputStream is = context.getAssets().open(databaseName); - FileUtils.makeDirs(dbFile.getAbsolutePath()); - OutputStream os = new FileOutputStream(dbFile); - - byte[] buffer = new byte[1024]; - while (is.read(buffer) > 0) { - os.write(buffer); - } - - os.flush(); - os.close(); - is.close(); + InputStream stream = context.getAssets().open(databaseName); + FileUtils.writeFile(dbFile, stream); + stream.close(); } } From 8126d786a5b6aafabcd6ed3ceab22a36e5e2c8d8 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 10:43:48 +0800 Subject: [PATCH 102/241] modify javadoc --- src/cn/trinea/android/common/util/FileUtils.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index beeb6e4..b3a0842 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -21,6 +21,9 @@ *
                    • {@link #readFileToList(String)} read file to string list
                    • *
                    • {@link #writeFile(String, String, boolean)} write file
                    • *
                    • {@link #writeFile(String, InputStream)} write file
                    • + *
                    • {@link #writeFile(String, InputStream, boolean)} write file
                    • + *
                    • {@link #writeFile(File, InputStream)} write file
                    • + *
                    • {@link #writeFile(File, InputStream, boolean)} write file
                    • *
                    *
                      * Operate file @@ -47,7 +50,7 @@ public class FileUtils { * @param filePath * @param charsetName The name of a supported {@link java.nio.charset.Charset charset} * @return if file not exist, return null, else return content of file - * @throws IOException if an error occurs while operator BufferedReader + * @throws RuntimeException if an error occurs while operator BufferedReader */ public static StringBuilder readFile(String filePath, String charsetName) { File file = new File(filePath); @@ -89,7 +92,7 @@ public static StringBuilder readFile(String filePath, String charsetName) { * @param content * @param append is append, if true, write to the end of file, else clear content of file and write into it * @return return true - * @throws IOException if an error occurs while operator FileWriter + * @throws RuntimeException if an error occurs while operator FileWriter */ public static boolean writeFile(String filePath, String content, boolean append) { FileWriter fileWriter = null; @@ -131,7 +134,7 @@ public static boolean writeFile(String filePath, InputStream stream) { * @param stream the input stream * @param append if true, then bytes will be written to the end of the file rather than the beginning * @return return true - * @throws IOException if an error occurs while operator FileWriter + * @throws RuntimeException if an error occurs while operator FileOutputStream */ public static boolean writeFile(String filePath, InputStream stream, boolean append) { return writeFile(filePath != null ? new File(filePath) : null, stream, append); @@ -156,7 +159,7 @@ public static boolean writeFile(File file, InputStream stream) { * @param stream the input stream * @param append if true, then bytes will be written to the end of the file rather than the beginning * @return return true - * @throws IOException if an error occurs while operator FileWriter + * @throws RuntimeException if an error occurs while operator FileOutputStream */ public static boolean writeFile(File file, InputStream stream, boolean append) { OutputStream o = null; @@ -192,7 +195,7 @@ public static boolean writeFile(File file, InputStream stream, boolean append) { * @param filePath * @param charsetName The name of a supported {@link java.nio.charset.Charset charset} * @return if file not exist, return null, else return content of file - * @throws IOException if an error occurs while operator BufferedReader + * @throws RuntimeException if an error occurs while operator BufferedReader */ public static List readFileToList(String filePath, String charsetName) { File file = new File(filePath); From 219143b2b2f47f807259327c9dc181302ff9a05f Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 10:56:02 +0800 Subject: [PATCH 103/241] add javadoc --- .../android/common/util/RandomUtils.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index 740c214..cca05e8 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -4,6 +4,23 @@ /** * Random Utils + *
                        + * get random int + *
                      • {@link #getRandom(int)} get random int between 0 and max
                      • + *
                      • {@link #getRandom(int, int)} get random int between min and max
                      • + *
                      + *
                        + * get random numbers or letters + *
                      • {@link #getRandomCapitalLetters(int)} get a fixed-length random string, its a mixture of uppercase letters
                      • + *
                      • {@link #getRandomLetters(int)} get a fixed-length random string, its a mixture of uppercase and lowercase letters + *
                      • + *
                      • {@link #getRandomLowerCaseLetters(int)} get a fixed-length random string, its a mixture of lowercase letters
                      • + *
                      • {@link #getRandomNumbers(int)} get a fixed-length random string, its a mixture of numbers
                      • + *
                      • {@link #getRandomNumbersAndLetters(int)} get a fixed-length random string, its a mixture of uppercase, lowercase + * letters and numbers
                      • + *
                      • {@link #getRandom(String, int)} get a fixed-length random string, its a mixture of chars in source
                      • + *
                      • {@link #getRandom(char[], int)} get a fixed-length random string, its a mixture of chars in sourceChar
                      • + *
                      * * @author Trinea 2012-5-12 */ @@ -176,7 +193,7 @@ public static int[] shuffle(int[] intArray, int shuffleCount) { return null; } - int[] out = new int[shuffleCount]; + int[] out = new int[shuffleCount]; for (int i = 1; i <= shuffleCount; i++) { int random = getRandom(length - i); out[i - 1] = intArray[random]; From f42baa197599a550515f53c6968b54b4276f38f7 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 11:05:22 +0800 Subject: [PATCH 104/241] add random shuffle --- .../android/common/util/RandomUtils.java | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index cca05e8..cea49b3 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -5,6 +5,15 @@ /** * Random Utils *
                        + * Shuffling algorithm + *
                      • {@link #shuffle(Object[])} Shuffling algorithm, Randomly permutes the specified array using a default source of + * randomness
                      • + *
                      • {@link #shuffle(Object[], int)} Shuffling algorithm, Randomly permutes the specified array
                      • + *
                      • {@link #shuffle(int[])} Shuffling algorithm, Randomly permutes the specified int array using a default source of + * randomness
                      • + *
                      • {@link #shuffle(int[], int)} Shuffling algorithm, Randomly permutes the specified int array
                      • + *
                      + *
                        * get random int *
                      • {@link #getRandom(int)} get random int between 0 and max
                      • *
                      • {@link #getRandom(int, int)} get random int between min and max
                      • @@ -159,7 +168,21 @@ public static int getRandom(int min, int max) { } /** - * Shuffling algorithm + * Shuffling algorithm, Randomly permutes the specified array using a default source of randomness + * + * @param objArray + * @return + */ + public static boolean shuffle(Object[] objArray) { + if (objArray == null) { + return false; + } + + return shuffle(objArray, getRandom(objArray.length)); + } + + /** + * Shuffling algorithm, Randomly permutes the specified array * * @param objArray * @param shuffleCount @@ -181,7 +204,21 @@ public static boolean shuffle(Object[] objArray, int shuffleCount) { } /** - * Shuffling algorithm + * Shuffling algorithm, Randomly permutes the specified int array using a default source of randomness + * + * @param intArray + * @return + */ + public static int[] shuffle(int[] intArray) { + if (intArray == null) { + return null; + } + + return shuffle(intArray, getRandom(intArray.length)); + } + + /** + * Shuffling algorithm, Randomly permutes the specified int array * * @param intArray * @param shuffleCount From 13d3a56af08ea7b56ceef05046cc2e6530e6213e Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 11:13:42 +0800 Subject: [PATCH 105/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d40201..13ed444 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、Collection等等)。 +**主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、随机数、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 From 41118429ea2510b9672944a6a13e063e64584e85 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 11:15:13 +0800 Subject: [PATCH 106/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 13ed444..5890799 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- -**主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、shell、文件、Json、随机数、Collection等等)。 +**主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 From eb88d114a1255bf3767cf4cbc2291654d1a2b3f2 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 7 Dec 2013 11:33:43 +0800 Subject: [PATCH 107/241] add http get asynchronous in HttpUtils, same to HttpCache --- .../android/common/service/HttpCache.java | 4 +- .../trinea/android/common/util/HttpUtils.java | 145 +++++++++++++++++- 2 files changed, 138 insertions(+), 11 deletions(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index c67c5fb..e0659c3 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -128,8 +128,7 @@ public HttpResponse httpGet(HttpRequest request) { if (!isNoCache) { cacheResponse = getFromCache(url); } - return cacheResponse == null ? (isNoStore ? HttpUtils.httpGet(url) : putIntoCache(HttpUtils.httpGet(url))) - : cacheResponse; + return cacheResponse == null ? (isNoStore ? HttpUtils.httpGet(url) : putIntoCache(HttpUtils.httpGet(url))) : cacheResponse; } /** @@ -268,7 +267,6 @@ protected void onPreGet() { */ protected void onPostGet(HttpResponse httpResponse, boolean isInCache) { } - } /** diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index d02a651..d53a705 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -11,17 +11,21 @@ import java.util.Locale; import java.util.Map; +import android.os.AsyncTask; import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.entity.HttpRequest; import cn.trinea.android.common.entity.HttpResponse; +import cn.trinea.android.common.service.HttpCache; /** * HttpUtils *
                          - * Http get - *
                        • {@link #httpGet(HttpRequest)}
                        • - *
                        • {@link #httpGet(String)}
                        • - *
                        • {@link #httpGetString(String)}
                        • + * Http get, you can also use {@link HttpCache} + *
                        • {@link #httpGet(HttpRequest)} http get synchronous
                        • + *
                        • {@link #httpGet(String)} http get synchronous
                        • + *
                        • {@link #httpGetString(String)} http get synchronous, response is String
                        • + *
                        • {@link #httpGet(HttpRequest, HttpListener)} http get asynchronous
                        • + *
                        • {@link #httpGet(String, HttpListener)} http get asynchronous
                        • *
                        *
                          * Http post @@ -54,7 +58,7 @@ public class HttpUtils { public static final String EQUAL_SIGN = "="; /** - * http get + * http get synchronous *
                            *
                          • use gzip compression default
                          • *
                          • use bufferedReader to improve the reading speed
                          • @@ -110,7 +114,7 @@ public static HttpResponse httpGet(HttpRequest request) { } /** - * http get + * http get synchronous * * @param httpUrl * @return the response of the url, if null represents http error @@ -121,7 +125,7 @@ public static HttpResponse httpGet(String httpUrl) { } /** - * http get + * http get synchronous * * @param request * @return the content of the url, if null represents http error @@ -133,7 +137,7 @@ public static String httpGetString(HttpRequest request) { } /** - * http get + * http get synchronous * * @param httpUrl * @return the content of the url, if null represents http error @@ -144,6 +148,37 @@ public static String httpGetString(String httpUrl) { return response == null ? null : response.getResponseBody(); } + /** + * http get asynchronous + *
                              + *
                            • It gets data from network asynchronous.
                            • + *
                            • If you want get data synchronous, use {@link #httpGet(HttpRequest)} or {@link #httpGetString(HttpRequest)}
                            • + *
                            + * + * @param url + * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do + * something + */ + public static void httpGet(String url, HttpListener listener) { + new HttpStringAsyncTask(listener).execute(url); + } + + /** + * http get asynchronous + *
                              + *
                            • It gets data or network asynchronous.
                            • + *
                            • If you want get data synchronous, use {@link HttpCache#httpGet(HttpRequest)} or + * {@link HttpCache#httpGetString(HttpRequest)}
                            • + *
                            + * + * @param request + * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do + * something + */ + public static void httpGet(HttpRequest request, HttpListener listener) { + new HttpRequestAsyncTask(listener).execute(request); + } + /** * http post *
                              @@ -432,4 +467,98 @@ private static void setHttpResponse(HttpURLConnection urlConnection, HttpRespons response.setResponseHeader(HttpConstants.CACHE_CONTROL, urlConnection.getHeaderField("Cache-Control")); response.setExpiredTime(response.getExpiresInMillis()); } + + /** + * AsyncTask to get data by String url + * + * @author Trinea 2013-11-15 + */ + private static class HttpStringAsyncTask extends AsyncTask { + + private HttpListener listener; + + public HttpStringAsyncTask(HttpListener listener){ + this.listener = listener; + } + + protected HttpResponse doInBackground(String... url) { + if (ArrayUtils.isEmpty(url)) { + return null; + } + return httpGet(url[0]); + } + + protected void onPreExecute() { + if (listener != null) { + listener.onPreGet(); + } + } + + protected void onPostExecute(HttpResponse httpResponse) { + if (listener != null) { + listener.onPostGet(httpResponse); + } + } + } + + /** + * AsyncTask to get data by HttpRequest + * + * @author Trinea 2013-11-15 + */ + private static class HttpRequestAsyncTask extends AsyncTask { + + private HttpListener listener; + + public HttpRequestAsyncTask(HttpListener listener){ + this.listener = listener; + } + + protected HttpResponse doInBackground(HttpRequest... httpRequest) { + if (ArrayUtils.isEmpty(httpRequest)) { + return null; + } + return httpGet(httpRequest[0]); + } + + protected void onPreExecute() { + if (listener != null) { + listener.onPreGet(); + } + } + + protected void onPostExecute(HttpResponse httpResponse) { + if (listener != null) { + listener.onPostGet(httpResponse); + } + } + } + + /** + * HttpListener, can do something before or after HttpGet + * + * @author Trinea 2013-11-15 + */ + public static abstract class HttpListener { + + /** + * Runs on the UI thread before httpGet.
                              + *
                                + *
                              • this can be null if you not want to do something
                              • + *
                              + */ + protected void onPreGet() { + } + + /** + * Runs on the UI thread after httpGet. The httpResponse is returned by httpGet. + *
                                + *
                              • this can be null if you not want to do something
                              • + *
                              + * + * @param httpResponse get by the url + */ + protected void onPostGet(HttpResponse httpResponse) { + } + } } From 3f8a2c78cfcf77e03415bc454ecc5a7e1cc37965 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 9 Dec 2013 05:37:29 +0800 Subject: [PATCH 108/241] add ToastUtils.java --- AndroidManifest.xml | 2 +- .../android/common/util/ToastUtils.java | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/cn/trinea/android/common/util/ToastUtils.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 72c444b..96eb157 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="4.1.8" > diff --git a/src/cn/trinea/android/common/util/ToastUtils.java b/src/cn/trinea/android/common/util/ToastUtils.java new file mode 100644 index 0000000..0673cdd --- /dev/null +++ b/src/cn/trinea/android/common/util/ToastUtils.java @@ -0,0 +1,44 @@ +package cn.trinea.android.common.util; + +import android.content.Context; +import android.widget.Toast; + +/** + * ToastUtils + * + * @author Trinea 2013-12-9 + */ +public class ToastUtils { + + public static void show(Context context, int resId) { + show(context, context.getResources().getText(resId), Toast.LENGTH_SHORT); + } + + public static void show(Context context, int resId, int duration) { + show(context, context.getResources().getText(resId), duration); + } + + public static void show(Context context, CharSequence text) { + show(context, text, Toast.LENGTH_SHORT); + } + + public static void show(Context context, CharSequence text, int duration) { + Toast.makeText(context, text, duration).show(); + } + + public static void show(Context context, int resId, Object... args) { + show(context, String.format(context.getResources().getString(resId), args), Toast.LENGTH_SHORT); + } + + public static void show(Context context, String format, Object... args) { + show(context, String.format(format, args), Toast.LENGTH_SHORT); + } + + public static void show(Context context, int resId, int duration, Object... args) { + show(context, String.format(context.getResources().getString(resId), args), duration); + } + + public static void show(Context context, String format, int duration, Object... args) { + show(context, String.format(format, args), duration); + } +} From 4b95f778a726da3b49e0eb0f8d69b67b60dc8424 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 12 Dec 2013 09:37:34 +0800 Subject: [PATCH 109/241] add getAppVersionCode --- .../android/common/util/PackageUtils.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 05b6cbe..740afe3 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -417,6 +417,30 @@ public static Boolean isTopActivity(Context context, String packageName) { } } + /** + * get app version code + * + * @param context + * @return + */ + public static int getAppVersionCode(Context context) { + if (context != null) { + PackageManager pm = context.getPackageManager(); + if (pm != null) { + PackageInfo pi; + try { + pi = pm.getPackageInfo(context.getPackageName(), 0); + if (pi != null) { + return pi.versionCode; + } + } catch (NameNotFoundException e) { + e.printStackTrace(); + } + } + } + return -1; + } + /** * Installation return code
                              * install success. From 423299ad0094559fafaeda9e5cb65138fe9e130a Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 12 Dec 2013 09:38:41 +0800 Subject: [PATCH 110/241] add copyFile --- .../trinea/android/common/util/FileUtils.java | 19 +++++++++++++++++++ .../trinea/android/common/util/ListUtils.java | 13 +++++++++++++ .../android/common/util/PackageUtils.java | 2 ++ 3 files changed, 34 insertions(+) diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index b3a0842..ef364af 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -27,6 +27,7 @@ *
                            *
                              * Operate file + *
                            • {@link #copyFile(String, String)}
                            • *
                            • {@link #getFileExtension(String)}
                            • *
                            • {@link #getFileName(String)}
                            • *
                            • {@link #getFileNameWithoutExtension(String)}
                            • @@ -189,6 +190,24 @@ public static boolean writeFile(File file, InputStream stream, boolean append) { } } + /** + * copy file + * + * @param sourceFilePath + * @param destFilePath + * @return + * @throws RuntimeException if an error occurs while operator FileOutputStream + */ + public static boolean copyFile(String sourceFilePath, String destFilePath) { + InputStream inputStream = null; + try { + inputStream = new FileInputStream(sourceFilePath); + } catch (FileNotFoundException e) { + throw new RuntimeException("FileNotFoundException occurred. ", e); + } + return writeFile(destFilePath, inputStream); + } + /** * read file to string list, a element of list is a line * diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index c1cd141..b704519 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -13,6 +13,19 @@ public class ListUtils { /** default join separator **/ public static final String DEFAULT_JOIN_SEPARATOR = ","; + /** + * get size of list + * + *
                              +     * getSize(null)   =   0;
                              +     * getSize({})     =   0;
                              +     * getSize({1})    =   1;
                              +     * 
                              + * + * @param + * @param sourceList + * @return if list is null or empty, return 0, else return {@link List#size()}. + */ public static int getSize(List sourceList) { return sourceList == null ? 0 : sourceList.size(); } diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 740afe3..2880df2 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -4,10 +4,12 @@ import java.util.List; import android.app.ActivityManager; +import android.app.DownloadManager; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; From e315a7c1aeed2353e9678ce06cb77c0c30c1e368 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 12 Dec 2013 09:39:25 +0800 Subject: [PATCH 111/241] add app patch update --- .../android/common/entity/PatchResult.java | 53 +++++++++++++++++++ .../android/common/util/PatchUtils.java | 21 ++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/cn/trinea/android/common/entity/PatchResult.java create mode 100644 src/cn/trinea/android/common/util/PatchUtils.java diff --git a/src/cn/trinea/android/common/entity/PatchResult.java b/src/cn/trinea/android/common/entity/PatchResult.java new file mode 100644 index 0000000..6aed141 --- /dev/null +++ b/src/cn/trinea/android/common/entity/PatchResult.java @@ -0,0 +1,53 @@ +package cn.trinea.android.common.entity; + +/** + * PatchResult + * + * @author Trinea 2013-12-10 + */ +public class PatchResult { + + private int status; + private String message; + + public PatchResult(int status, String message){ + this.status = status; + this.message = message; + } + + /** + * get status + * + * @return the status + */ + public int getStatus() { + return status; + } + + /** + * set status + * + * @param status the status to set + */ + public void setStatus(int status) { + this.status = status; + } + + /** + * get message + * + * @return the message + */ + public String getMessage() { + return message; + } + + /** + * set message + * + * @param message the message to set + */ + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/cn/trinea/android/common/util/PatchUtils.java b/src/cn/trinea/android/common/util/PatchUtils.java new file mode 100644 index 0000000..5cce745 --- /dev/null +++ b/src/cn/trinea/android/common/util/PatchUtils.java @@ -0,0 +1,21 @@ +package cn.trinea.android.common.util; + +import cn.trinea.android.common.entity.PatchResult; + +/** + * PatchUtils + * + * @author Trinea 2013-12-10 + */ +public class PatchUtils { + + /** + * patch old apk and patch file to new apk + * + * @param oldApkPath + * @param patchPath + * @param newApkPath + * @return + */ + public static native PatchResult patch(String oldApkPath, String patchPath, String newApkPath); +} From 541c1f0c710b363a6ccb2e553bf65b10905fe92b Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 12 Dec 2013 21:10:33 +0800 Subject: [PATCH 112/241] add installSilent pm install params --- .../android/common/util/PackageUtils.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 2880df2..8ad6f7f 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -93,14 +93,35 @@ public static boolean installNormal(Context context, String filePath) { *
                            • Don't call this on the ui thread, it may costs some times.
                            • *
                            • You should add android.permission.INSTALL_PACKAGES in manifest, so no need to request root * permission, if you are system app.
                            • + *
                            • Default pm install params is "-r".
                            • *
                            * * @param context * @param filePath file path of package * @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see * {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_* + * @see #installSilent(Context, String, String) */ public static int installSilent(Context context, String filePath) { + return installSilent(context, filePath, "-r"); + } + + /** + * install package silent by root + *
                              + * Attentions: + *
                            • Don't call this on the ui thread, it may costs some times.
                            • + *
                            • You should add android.permission.INSTALL_PACKAGES in manifest, so no need to request root + * permission, if you are system app.
                            • + *
                            + * + * @param context + * @param filePath file path of package + * @param pmParams pm install params + * @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see + * {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_* + */ + public static int installSilent(Context context, String filePath, String pmParams) { if (filePath == null || filePath.length() == 0) { return INSTALL_FAILED_INVALID_URI; } @@ -114,7 +135,8 @@ public static int installSilent(Context context, String filePath) { * if context is system app, don't need root permission, but should add in mainfest **/ - StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r ") + StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install ") + .append(pmParams == null ? "" : pmParams).append(" ") .append(filePath.replace(" ", "\\ ")); CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true); if (commandResult.successMsg != null From 51bb6c1ce1db023c3f409703ebde9cdebc8d5b4e Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 17 Dec 2013 14:29:35 +0800 Subject: [PATCH 113/241] encode http params --- src/cn/trinea/android/common/entity/HttpRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/entity/HttpRequest.java b/src/cn/trinea/android/common/entity/HttpRequest.java index 0d238b5..a83a355 100644 --- a/src/cn/trinea/android/common/entity/HttpRequest.java +++ b/src/cn/trinea/android/common/entity/HttpRequest.java @@ -112,7 +112,7 @@ public void setParasMap(Map parasMap) { * @return paras as string */ public String getParas() { - return HttpUtils.joinParas(parasMap); + return HttpUtils.joinParasWithEncodedValue(parasMap); } /** From 3e87ae14c22a0cbccdabcfabbff3708b49547d31 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 20 Dec 2013 19:45:04 +0800 Subject: [PATCH 114/241] add start InstalledAppDetails Activity --- .../android/common/util/PackageUtils.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 8ad6f7f..b12e4e6 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -4,7 +4,6 @@ import java.util.List; import android.app.ActivityManager; -import android.app.DownloadManager; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.content.Intent; @@ -13,6 +12,8 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; +import android.os.Build; +import android.provider.Settings; import android.util.Log; import cn.trinea.android.common.util.ShellUtils.CommandResult; @@ -40,6 +41,7 @@ * Others *
                          • {@link PackageUtils#isTopActivity(Context, String)} whether the app whost package's name is packageName is on the * top of the stack
                          • + *
                          • {@link PackageUtils#startInstalledAppDetails(Context, String)} start InstalledAppDetails Activity
                          • *
                          * * @author Trinea 2013-5-15 @@ -465,6 +467,27 @@ public static int getAppVersionCode(Context context) { return -1; } + /** + * start InstalledAppDetails Activity + * + * @param context + * @param packageName + */ + public static void startInstalledAppDetails(Context context, String packageName) { + Intent intent = new Intent(); + int sdkVersion = Build.VERSION.SDK_INT; + if (sdkVersion >= 9) { + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.fromParts("package", packageName, null)); + } else { + intent.setAction(Intent.ACTION_VIEW); + intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); + intent.putExtra((sdkVersion == 8 ? "pkg" : "com.android.settings.ApplicationPkgName"), packageName); + } + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + /** * Installation return code
                          * install success. From d7b029c61d03c8d66e484da9be9635d00f735448 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 27 Dec 2013 20:38:54 +0800 Subject: [PATCH 115/241] add whether print exception when Json format --- .../trinea/android/common/util/JSONUtils.java | 74 ++++++++++++++----- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/src/cn/trinea/android/common/util/JSONUtils.java b/src/cn/trinea/android/common/util/JSONUtils.java index d11d6f1..a5ba05e 100644 --- a/src/cn/trinea/android/common/util/JSONUtils.java +++ b/src/cn/trinea/android/common/util/JSONUtils.java @@ -15,6 +15,8 @@ */ public class JSONUtils { + public static boolean isPrintException = true; + /** * get Long from jsonObject * @@ -36,7 +38,9 @@ public static Long getLong(JSONObject jsonObject, String key, Long defaultValue) try { return jsonObject.getLong(key); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -62,7 +66,9 @@ public static Long getLong(String jsonData, String key, Long defaultValue) { JSONObject jsonObject = new JSONObject(jsonData); return getLong(jsonObject, key, defaultValue); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -110,7 +116,9 @@ public static Integer getInt(JSONObject jsonObject, String key, Integer defaultV try { return jsonObject.getInt(key); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -136,7 +144,9 @@ public static Integer getInt(String jsonData, String key, Integer defaultValue) JSONObject jsonObject = new JSONObject(jsonData); return getInt(jsonObject, key, defaultValue); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -184,7 +194,9 @@ public static Double getDouble(JSONObject jsonObject, String key, Double default try { return jsonObject.getDouble(key); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -210,7 +222,9 @@ public static Double getDouble(String jsonData, String key, Double defaultValue) JSONObject jsonObject = new JSONObject(jsonData); return getDouble(jsonObject, key, defaultValue); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -258,7 +272,9 @@ public static String getString(JSONObject jsonObject, String key, String default try { return jsonObject.getString(key); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -284,7 +300,9 @@ public static String getString(String jsonData, String key, String defaultValue) JSONObject jsonObject = new JSONObject(jsonData); return getString(jsonObject, key, defaultValue); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -318,7 +336,9 @@ public static String[] getStringArray(JSONObject jsonObject, String key, String[ return value; } } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } return defaultValue; @@ -345,7 +365,9 @@ public static String[] getStringArray(String jsonData, String key, String[] defa JSONObject jsonObject = new JSONObject(jsonData); return getStringArray(jsonObject, key, defaultValue); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -371,7 +393,9 @@ public static JSONObject getJSONObject(JSONObject jsonObject, String key, JSONOb try { return jsonObject.getJSONObject(key); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -397,7 +421,9 @@ public static JSONObject getJSONObject(String jsonData, String key, JSONObject d JSONObject jsonObject = new JSONObject(jsonData); return getJSONObject(jsonObject, key, defaultValue); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -423,7 +449,9 @@ public static JSONArray getJSONArray(JSONObject jsonObject, String key, JSONArra try { return jsonObject.getJSONArray(key); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -449,7 +477,9 @@ public static JSONArray getJSONArray(String jsonData, String key, JSONArray defa JSONObject jsonObject = new JSONObject(jsonData); return getJSONArray(jsonObject, key, defaultValue); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -474,7 +504,9 @@ public static boolean getBoolean(JSONObject jsonObject, String key, Boolean defa try { return jsonObject.getBoolean(key); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -500,7 +532,9 @@ public static boolean getBoolean(String jsonData, String key, Boolean defaultVal JSONObject jsonObject = new JSONObject(jsonData); return getBoolean(jsonObject, key, defaultValue); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return defaultValue; } } @@ -544,7 +578,9 @@ public static Map getMap(String jsonData, String key) { JSONObject jsonObject = new JSONObject(jsonData); return getMap(jsonObject, key); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return null; } } @@ -592,7 +628,9 @@ public static Map parseKeyAndValueToMap(String source) { JSONObject jsonObject = new JSONObject(source); return parseKeyAndValueToMap(jsonObject); } catch (JSONException e) { - e.printStackTrace(); + if (isPrintException) { + e.printStackTrace(); + } return null; } } From ddb12e39d3f2b31e48080c526d2b3215d7fe03fb Mon Sep 17 00:00:00 2001 From: Bitdeli Chef Date: Sun, 29 Dec 2013 07:41:48 +0000 Subject: [PATCH 116/241] Add a Bitdeli badge to README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 5890799..b75b980 100644 --- a/README.md +++ b/README.md @@ -64,3 +64,7 @@ #####4. 图片工具类 (1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap 更多工具类介绍见[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) + + +[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/Trinea/androidcommon/trend.png)](https://bitdeli.com/free "Bitdeli Badge") + From d5766bf7f3f1d400f1133281cbd86dfe53459151 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 31 Dec 2013 14:09:04 +0800 Subject: [PATCH 117/241] add setCompressSize when image load --- .../common/service/impl/ImageCache.java | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 5b32345..a35d086 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -6,6 +6,7 @@ import java.util.concurrent.ExecutorService; import android.content.Context; +import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.os.Environment; @@ -13,6 +14,7 @@ import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.service.FileNameRule; +import cn.trinea.android.common.service.impl.ImageMemoryCache.OnImageCallbackListener; import cn.trinea.android.common.util.FileUtils; import cn.trinea.android.common.util.ImageUtils; @@ -57,6 +59,7 @@ public class ImageCache extends ImageMemoryCache { private static final long serialVersionUID = 1L; private ImageSDCardCache secondaryCache; + private int compressSize = 1; /** cache folder path which be used when saving images **/ public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory().getAbsolutePath() @@ -137,7 +140,17 @@ public CacheObject onGetData(String key) { CacheObject object = secondaryCache.get(key); String imagePath = (object == null ? null : object.getData()); if (FileUtils.isFileExist(imagePath)) { - Drawable d = ImageUtils.bitmapToDrawable(BitmapFactory.decodeFile(imagePath)); + compressSize = setCompressSize(imagePath); + Drawable d; + if (compressSize > 1) { + BitmapFactory.Options option = new BitmapFactory.Options(); + option.inSampleSize = compressSize; + Bitmap bm = BitmapFactory.decodeFile(imagePath, option); + bm = Bitmap.createBitmap(bm, 0, 0, option.outWidth, option.outHeight); + d = ImageUtils.bitmapToDrawable(bm); + } else { + d = ImageUtils.bitmapToDrawable(BitmapFactory.decodeFile(imagePath)); + } return (d == null ? null : new CacheObject(d)); } else { secondaryCache.remove(key); @@ -153,6 +166,48 @@ public CacheObject onGetData(String key) { secondaryCache.setFileNameRule(new FileNameRuleImageUrl().setFileExtension("")); } + /** + * set image compress scale + *
                            + * Attentions: + *
                          • if this function is set, the function {@link #setCompressSize(String)} is not work
                          • + *
                          + * + * @param imagePath + * @return return compressSize, If > 1, requests the decoder to subsample the original image, returning a smaller + * image to save memory. The sample size is the number of pixels in either dimension that correspond to a single + * pixel in the decoded bitmap. For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the + * original, and 1/16 the number of pixels. Any value <= 1 is treated the same as 1. Note: the decoder will try to + * fulfill this request, but the resulting bitmap may have different dimensions that precisely what has been + * requested. Also, powers of 2 are often faster/easier for the decoder to honor. + */ + public int setCompressSize(String imagePath) { + return compressSize; + } + + /** + * get compressSize + * + * @return the compressSize + */ + public int getCompressSize() { + return compressSize; + } + + /** + * set image compress scale + *
                            + * Attentions: + *
                          • if {@link #setCompressSize(String)} is set, this function is not work
                          • + *
                          + * + * @param compressSize the compressSize to set + * @see {@link #setCompressSize(String)} + */ + public void setCompressSize(int compressSize) { + this.compressSize = compressSize; + } + /** * get http read image time out of secondary cache, if less than 0, not set. default is not set * From 2f1c278a215d208b9018f09bf6364f7cc1872720 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 31 Dec 2013 14:34:22 +0800 Subject: [PATCH 118/241] add CompressListener in ImageCache.java --- .../common/service/impl/ImageCache.java | 73 +++++++++++++------ 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index a35d086..d10fa48 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -59,7 +59,10 @@ public class ImageCache extends ImageMemoryCache { private static final long serialVersionUID = 1L; private ImageSDCardCache secondaryCache; + /** image compress size **/ private int compressSize = 1; + /** compress listener, advanced image compress, will override compressSize **/ + private CompressListener compressListener; /** cache folder path which be used when saving images **/ public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory().getAbsolutePath() @@ -140,7 +143,9 @@ public CacheObject onGetData(String key) { CacheObject object = secondaryCache.get(key); String imagePath = (object == null ? null : object.getData()); if (FileUtils.isFileExist(imagePath)) { - compressSize = setCompressSize(imagePath); + if (compressListener != null) { + compressSize = compressListener.getCompressSize(imagePath); + } Drawable d; if (compressSize > 1) { BitmapFactory.Options option = new BitmapFactory.Options(); @@ -166,25 +171,6 @@ public CacheObject onGetData(String key) { secondaryCache.setFileNameRule(new FileNameRuleImageUrl().setFileExtension("")); } - /** - * set image compress scale - *
                            - * Attentions: - *
                          • if this function is set, the function {@link #setCompressSize(String)} is not work
                          • - *
                          - * - * @param imagePath - * @return return compressSize, If > 1, requests the decoder to subsample the original image, returning a smaller - * image to save memory. The sample size is the number of pixels in either dimension that correspond to a single - * pixel in the decoded bitmap. For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the - * original, and 1/16 the number of pixels. Any value <= 1 is treated the same as 1. Note: the decoder will try to - * fulfill this request, but the resulting bitmap may have different dimensions that precisely what has been - * requested. Also, powers of 2 are often faster/easier for the decoder to honor. - */ - public int setCompressSize(String imagePath) { - return compressSize; - } - /** * get compressSize * @@ -198,7 +184,7 @@ public int getCompressSize() { * set image compress scale *
                            * Attentions: - *
                          • if {@link #setCompressSize(String)} is set, this function is not work
                          • + *
                          • if {@link #setCompressListener(CompressListener)} is set, this function is not work
                          • *
                          * * @param compressSize the compressSize to set @@ -208,6 +194,51 @@ public void setCompressSize(int compressSize) { this.compressSize = compressSize; } + /** + * set compressListener + *
                            + * Attentions: + *
                          • if this function is set, the function {@link #setCompressSize(String)} is not work
                          • + *
                          + * + * @param compressListener + */ + public void setCompressListener(CompressListener compressListener) { + this.compressListener = compressListener; + } + + /** + * get compressListener + * + * @return compressListener + */ + public CompressListener getCompressListener() { + return compressListener; + } + + /** + * set image compress scale + */ + public interface CompressListener { + + /** + * get image compress scale + *
                            + * Attentions: + *
                          • if this function is set, the function {@link #setCompressSize(String)} is not work
                          • + *
                          + * + * @param imagePath + * @return return compressSize, If > 1, requests the decoder to subsample the original image, returning a + * smaller image to save memory. The sample size is the number of pixels in either dimension that correspond to + * a single pixel in the decoded bitmap. For example, inSampleSize == 4 returns an image that is 1/4 the + * width/height of the original, and 1/16 the number of pixels. Any value <= 1 is treated the same as 1. Note: + * the decoder will try to fulfill this request, but the resulting bitmap may have different dimensions that + * precisely what has been requested. Also, powers of 2 are often faster/easier for the decoder to honor. + */ + public int getCompressSize(String imagePath); + } + /** * get http read image time out of secondary cache, if less than 0, not set. default is not set * From 91dd4a2b8c87ffd17d84134f963dc016939858a6 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 31 Dec 2013 14:34:41 +0800 Subject: [PATCH 119/241] modify javadoc --- src/cn/trinea/android/common/util/FileUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index ef364af..420d924 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -493,7 +493,7 @@ public static boolean deleteFile(String path) { *
                            * * @param path - * @return + * @return returns the length of this file in bytes. returns -1 if the file does not exist. */ public static long getFileSize(String path) { if (StringUtils.isBlank(path)) { From db8ffbe97168360d183f93b894ff72a10e2635e4 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 31 Dec 2013 18:37:57 +0800 Subject: [PATCH 120/241] delete unuse code --- src/cn/trinea/android/common/service/impl/ImageCache.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index d10fa48..499af2d 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -151,7 +151,6 @@ public CacheObject onGetData(String key) { BitmapFactory.Options option = new BitmapFactory.Options(); option.inSampleSize = compressSize; Bitmap bm = BitmapFactory.decodeFile(imagePath, option); - bm = Bitmap.createBitmap(bm, 0, 0, option.outWidth, option.outHeight); d = ImageUtils.bitmapToDrawable(bm); } else { d = ImageUtils.bitmapToDrawable(BitmapFactory.decodeFile(imagePath)); From c64fd1afea3a9407dffa70862e1a1473c0bf335e Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 3 Jan 2014 20:09:08 +0800 Subject: [PATCH 121/241] add githalytics add githalytics --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b75b980..6de8c5e 100644 --- a/README.md +++ b/README.md @@ -68,3 +68,5 @@ [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/Trinea/androidcommon/trend.png)](https://bitdeli.com/free "Bitdeli Badge") +[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/0e64e2f00112f86af822e39ce45bca31 "githalytics.com")](http://githalytics.com/Trinea/AndroidCommon) + From 709bc3a6ff4ea17444ca282e0a7d6e141acf7270 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 3 Jan 2014 21:52:27 +0800 Subject: [PATCH 122/241] add onGetNotInCache in OnImageCallbackListener --- .../common/service/impl/ImageMemoryCache.java | 24 ++++++++++++++++--- .../common/service/impl/ImageSDCardCache.java | 24 ++++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index f65dff3..09b3202 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -118,13 +118,17 @@ public boolean get(String imageUrl, View view) { * @return whether image already in cache or not */ public boolean get(final String imageUrl, final List urlList, final View view) { + if (onImageCallbackListener != null) { + onImageCallbackListener.onPreGet(imageUrl, view); + } + if (StringUtils.isEmpty(imageUrl)) { + if (onImageCallbackListener != null) { + onImageCallbackListener.onGetNotInCache(imageUrl, view); + } return false; } - if (onImageCallbackListener != null) { - onImageCallbackListener.onPreGet(imageUrl, view); - } /** * if already in cache, call onImageSDCallbackListener, else new thread to wait for it */ @@ -154,6 +158,9 @@ public boolean get(final String imageUrl, final List urlList, final View viewMap.put(imageUrl, view); } + if (onImageCallbackListener != null) { + onImageCallbackListener.onGetNotInCache(imageUrl, view); + } if (isExistGettingDataThread(imageUrl)) { return false; } @@ -331,6 +338,17 @@ public interface OnImageCallbackListener { */ public void onPreGet(String imageUrl, View view); + /** + * callback function when get image but image not in cache, run on ui thread.
                            + * Will be called after {@link #onPreGet(String, View)}, before + * {@link #onGetSuccess(String, String, View, boolean)} and + * {@link #onGetFailed(String, String, View, FailedReason)} + * + * @param imageUrl imageUrl + * @param view view need the image + */ + public void onGetNotInCache(String imageUrl, View view); + /** * callback function after get image successfully, run on ui thread * diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 2f1c8c4..ecf9a70 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -142,13 +142,17 @@ public boolean get(String imageUrl, View view) { * @return whether image already in cache or not */ public boolean get(final String imageUrl, final List urlList, final View view) { + if (onImageSDCallbackListener != null) { + onImageSDCallbackListener.onPreGet(imageUrl, view); + } + if (StringUtils.isEmpty(imageUrl)) { + if (onImageSDCallbackListener != null) { + onImageSDCallbackListener.onGetNotInCache(imageUrl, view); + } return false; } - if (onImageSDCallbackListener != null) { - onImageSDCallbackListener.onPreGet(imageUrl, view); - } /** * if already in cache, call onImageSDCallbackListener, else new thread to wait for it */ @@ -178,6 +182,9 @@ public boolean get(final String imageUrl, final List urlList, final View viewMap.put(imageUrl, view); } + if (onImageSDCallbackListener != null) { + onImageSDCallbackListener.onGetNotInCache(imageUrl, view); + } if (isExistGettingDataThread(imageUrl)) { return false; } @@ -398,6 +405,17 @@ public interface OnImageSDCallbackListener { */ public void onPreGet(String imageUrl, View view); + /** + * callback function when get image but image not in cache, run on ui thread.
                            + * Will be called after {@link #onPreGet(String, View)}, before + * {@link #onGetSuccess(String, String, View, boolean)} and + * {@link #onGetFailed(String, String, View, FailedReason)} + * + * @param imageUrl imageUrl + * @param view view need the image + */ + public void onGetNotInCache(String imageUrl, View view); + /** * callback function after get image successfully, run on ui thread * From 8f2efef38f418a8aab4ef0a8c06d7e004800d49f Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 4 Jan 2014 14:35:38 +0800 Subject: [PATCH 123/241] add zh-rTW --- res/values-zh-rTW/strings.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 res/values-zh-rTW/strings.xml diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000..8d5db02 --- /dev/null +++ b/res/values-zh-rTW/strings.xml @@ -0,0 +1,13 @@ + + + + 點擊可以刷新 + 下拉可以刷新 + 松開可以刷新 + 加載中… + 更多 + 加載中… + 沒有更多了 + + Image + \ No newline at end of file From 9c10b6b65a93741edec67b60c53be877ff6cf2c9 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 4 Jan 2014 14:36:19 +0800 Subject: [PATCH 124/241] delete unuse string --- res/values-zh-rCN/strings.xml | 1 - res/values-zh-rTW/strings.xml | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 56bcae0..8c4a8cc 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -9,5 +9,4 @@ 加载中… 没有更多了 - Image \ No newline at end of file diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 8d5db02..1df3775 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -8,6 +8,5 @@ 更多 加載中… 沒有更多了 - - Image + \ No newline at end of file From 429fd95f490e7071a02aca61b3bdd171321a8ee1 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 4 Jan 2014 21:06:51 +0800 Subject: [PATCH 125/241] modify string to stringbuilder --- .../android/common/service/impl/ImageCache.java | 9 +++++---- .../common/service/impl/ImageSDCardCache.java | 13 +++++-------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 499af2d..66bf8a8 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -65,10 +65,11 @@ public class ImageCache extends ImageMemoryCache { private CompressListener compressListener; /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory().getAbsolutePath() - + File.separator + "Trinea" + File.separator + "AndroidCommon" - + File.separator + "ImageCache"; - + public static final String DEFAULT_CACHE_FOLDER = new StringBuilder() + .append(Environment.getExternalStorageDirectory().getAbsolutePath()) + .append(File.separator).append("Trinea").append(File.separator) + .append("AndroidCommon").append(File.separator) + .append("ImageCache").toString(); /** *
                              *
                            • max size of primary cache is {@link ImageMemoryCache#DEFAULT_MAX_SIZE}, max size of secondary cache is diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index ecf9a70..d415f44 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -92,14 +92,11 @@ public class ImageSDCardCache extends PreloadDataCache { /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = Environment.getExternalStorageDirectory() - .getAbsolutePath() - + File.separator - + "Trinea" - + File.separator - + "AndroidCommon" - + File.separator - + "ImageSDCardCache"; + public static final String DEFAULT_CACHE_FOLDER = new StringBuilder() + .append(Environment.getExternalStorageDirectory().getAbsolutePath()) + .append(File.separator).append("Trinea").append(File.separator) + .append("AndroidCommon").append(File.separator) + .append("ImageSDCardCache").toString(); /** message what for get image successfully **/ private static final int WHAT_GET_IMAGE_SUCCESS = 1; From 035ea6e6347707d0510db51acf5741088017f407 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 5 Jan 2014 10:36:01 +0800 Subject: [PATCH 126/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6de8c5e..3bd9fff 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 ------------- **主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 -**示例APK**:[TrineaAndroidDemo.apk](https://github.com/Trinea/TrineaDownload/blob/master/TrineaAndroidDemo.apk?raw=true),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 +**示例APK**:[TrineaAndroidDemo.apk](https://play.google.com/store/apps/details?id=cn.trinea.android.demo),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 From 02bdd5f581ed8ad7d0981c70eaa9386ded8f359c Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 5 Jan 2014 14:38:34 +0800 Subject: [PATCH 127/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3bd9fff..80ad0e0 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ 更多工具类介绍见[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) -[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/Trinea/androidcommon/trend.png)](https://bitdeli.com/free "Bitdeli Badge") +[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/Trinea/androidcommon/trend.png)](https://bitdeli.com/free "Bitdeli Badge") [![githalytics.com alpha](https://cruel-carlota.pagodabox.com/0e64e2f00112f86af822e39ce45bca31 "githalytics.com")](http://githalytics.com/Trinea/AndroidCommon) From a33058c55bf46e61203ba6370068196358e2583f Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 5 Jan 2014 14:45:56 +0800 Subject: [PATCH 128/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 80ad0e0..e41ae8a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)Android公共库 +![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)android-common-lib ------------- **主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 **示例APK**:[TrineaAndroidDemo.apk](https://play.google.com/store/apps/details?id=cn.trinea.android.demo),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 From e2d67e29700bc4c9528bab37ba6cf53895869f88 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 6 Jan 2014 00:26:24 +0800 Subject: [PATCH 129/241] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e41ae8a..23bc21b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 +**更多Android开源项目见:https://github.com/Trinea/android-open-project** ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 From 73374e90d5229b761da1acfadb03845b343071ff Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 13 Jan 2014 21:14:46 +0800 Subject: [PATCH 130/241] add baidu download url --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 23bc21b..e0042e8 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)android-common-lib ------------- **主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 -**示例APK**:[TrineaAndroidDemo.apk](https://play.google.com/store/apps/details?id=cn.trinea.android.demo),示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 +**示例源码**:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 **更多Android开源项目见:https://github.com/Trinea/android-open-project** +####示例APK下载(Demo Download): + ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 From d8d4640eb3193a2558dbe10cf92591a03b48ce52 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 13 Jan 2014 21:16:28 +0800 Subject: [PATCH 131/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0042e8..f29a4ee 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 **更多Android开源项目见:https://github.com/Trinea/android-open-project** ####示例APK下载(Demo Download): - + ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 From b2b6a56db7445e9fb281b4a5df350710c83651e1 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 17 Jan 2014 14:21:56 +0800 Subject: [PATCH 132/241] add 360 and xiaomi --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f29a4ee..1a0f864 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,10 @@ **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 **更多Android开源项目见:https://github.com/Trinea/android-open-project** ####示例APK下载(Demo Download): - + + + + ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 From ae9c6a5254a80faaf111fc09749e135d35a83869 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 20 Jan 2014 14:23:40 +0800 Subject: [PATCH 133/241] fix map to json bug --- src/cn/trinea/android/common/util/MapUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/cn/trinea/android/common/util/MapUtils.java index e6c050b..a7d2deb 100644 --- a/src/cn/trinea/android/common/util/MapUtils.java +++ b/src/cn/trinea/android/common/util/MapUtils.java @@ -275,7 +275,7 @@ public static String toJson(Map map) { Iterator> ite = map.entrySet().iterator(); while (ite.hasNext()) { Map.Entry entry = (Map.Entry)ite.next(); - paras.append("\"").append(entry.getKey()).append("\":").append(entry.getValue()); + paras.append("\"").append(entry.getKey()).append("\":\"").append(entry.getValue()).append("\""); if (ite.hasNext()) { paras.append(","); } From 2d6ec13d032df34ffd639a4929432695cb51636c Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 20 Jan 2014 17:39:53 +0800 Subject: [PATCH 134/241] add License --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 1a0f864..3b4e0ac 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,22 @@ 更多工具类介绍见[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) +## License + + Copyright 2014 trinea.cn + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/Trinea/androidcommon/trend.png)](https://bitdeli.com/free "Bitdeli Badge") [![githalytics.com alpha](https://cruel-carlota.pagodabox.com/0e64e2f00112f86af822e39ce45bca31 "githalytics.com")](http://githalytics.com/Trinea/AndroidCommon) From c75ee323b0fa136093375637f2df989f6694db1d Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 21 Jan 2014 21:37:01 +0800 Subject: [PATCH 135/241] add ViewUtils.java --- .../trinea/android/common/util/ViewUtils.java | 231 ++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 src/cn/trinea/android/common/util/ViewUtils.java diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/cn/trinea/android/common/util/ViewUtils.java new file mode 100644 index 0000000..bcf11b1 --- /dev/null +++ b/src/cn/trinea/android/common/util/ViewUtils.java @@ -0,0 +1,231 @@ +package cn.trinea.android.common.util; + +import java.lang.reflect.Field; + +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.GridView; +import android.widget.LinearLayout; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.RelativeLayout.LayoutParams; +import android.widget.TextView; + +/** + * ViewUtils + *
                                + * get view height + *
                              • {@link ViewUtils#getListViewHeightBasedOnChildren(ListView)}
                              • + *
                              • {@link ViewUtils#getAbsListViewHeightBasedOnChildren(AbsListView)}
                              • + *
                              + *
                                + * set view height + *
                              • {@link ViewUtils#setViewHeight(View, int)} set view height
                              • + *
                              • {@link ViewUtils#setListViewHeightBasedOnChildren(ListView)}
                              • + *
                              • {@link ViewUtils#setAbsListViewHeightBasedOnChildren(AbsListView)}
                              • + *
                              + *
                                + * get other info + *
                              • {@link ViewUtils#getGridViewVerticalSpacing(GridView)} get GridView vertical spacing
                              • + *
                              + *
                                + * set other info + *
                              • {@link ViewUtils#setSearchViewOnClickListener(View, OnClickListener)}
                              • + *
                              + * + * @author Trinea 2013-12-24 + */ +public class ViewUtils { + + /** + * get ListView height according to every children + * + * @param view + * @return + */ + public static int getListViewHeightBasedOnChildren(ListView view) { + int height = getAbsListViewHeightBasedOnChildren(view); + ListAdapter adapter; + int adapterCount; + if (view != null && (adapter = view.getAdapter()) != null && (adapterCount = adapter.getCount()) > 0) { + height += view.getDividerHeight() * (adapterCount - 1); + } + return height; + } + + // /** + // * get GridView height according to every children + // * + // * @param view + // * @return + // */ + // public static int getGridViewHeightBasedOnChildren(GridView view) { + // int height = getAbsListViewHeightBasedOnChildren(view); + // ListAdapter adapter; + // int adapterCount, numColumns = getGridViewNumColumns(view); + // if (view != null && (adapter = view.getAdapter()) != null && (adapterCount = adapter.getCount()) > 0 + // && numColumns > 0) { + // int rowCount = (int)Math.ceil(adapterCount / (double)numColumns); + // height = rowCount * (height / adapterCount + getGridViewVerticalSpacing(view)); + // } + // return height; + // } + // + // /** + // * get GridView columns number + // * + // * @param view + // * @return + // */ + // public static int getGridViewNumColumns(GridView view) { + // if (view == null || view.getChildCount() <= 0) { + // return 0; + // } + // if (Build.VERSION.SDK_INT >= 11) { + // return getNumColumnsCompat11(view); + // + // } else { + // int columns = 0; + // int children = view.getChildCount(); + // if (children > 0) { + // int width = view.getChildAt(0).getMeasuredWidth(); + // if (width > 0) { + // columns = view.getWidth() / width; + // } + // } + // return columns; + // } + // } + // + // @TargetApi(11) + // private static int getNumColumnsCompat11(GridView view) { + // return view.getNumColumns(); + // } + + private static final String CLASS_NAME_GRID_VIEW = "android.widget.GridView"; + private static final String FIELD_NAME_VERTICAL_SPACING = "mVerticalSpacing"; + + /** + * get GridView vertical spacing + * + * @param view + * @return + */ + public static int getGridViewVerticalSpacing(GridView view) { + // get mVerticalSpacing by android.widget.GridView + Class demo = null; + int verticalSpacing = 0; + try { + demo = Class.forName(CLASS_NAME_GRID_VIEW); + Field field = demo.getDeclaredField(FIELD_NAME_VERTICAL_SPACING); + field.setAccessible(true); + verticalSpacing = (Integer)field.get(view); + return verticalSpacing; + } catch (Exception e) { + /** + * accept all exception, include ClassNotFoundException, NoSuchFieldException, InstantiationException, + * IllegalArgumentException, IllegalAccessException, NullPointException + */ + e.printStackTrace(); + } + return verticalSpacing; + } + + /** + * get AbsListView height according to every children + * + * @param view + * @return + */ + public static int getAbsListViewHeightBasedOnChildren(AbsListView view) { + ListAdapter adapter; + if (view == null || (adapter = view.getAdapter()) == null) { + return 0; + } + + int height = 0; + for (int i = 0; i < adapter.getCount(); i++) { + View item = adapter.getView(i, null, view); + if (item instanceof ViewGroup) { + item.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + } + item.measure(0, 0); + height += item.getMeasuredHeight(); + } + height += view.getPaddingTop() + view.getPaddingBottom(); + return height; + } + + /** + * set view height + * + * @param view + * @param height + */ + public static void setViewHeight(View view, int height) { + if (view == null) { + return; + } + + ViewGroup.LayoutParams params = view.getLayoutParams(); + params.height = height; + } + + // /** + // * set GistView height which is calculated by {@link # getGridViewHeightBasedOnChildren(GridView)} + // * + // * @param view + // * @return + // */ + // public static void setGridViewHeightBasedOnChildren(GridView view) { + // setViewHeight(view, getGridViewHeightBasedOnChildren(view)); + // } + + /** + * set ListView height which is calculated by {@link # getListViewHeightBasedOnChildren(ListView)} + * + * @param view + * @return + */ + public static void setListViewHeightBasedOnChildren(ListView view) { + setViewHeight(view, getListViewHeightBasedOnChildren(view)); + } + + /** + * set AbsListView height which is calculated by {@link # getAbsListViewHeightBasedOnChildren(AbsListView)} + * + * @param view + * @return + */ + public static void setAbsListViewHeightBasedOnChildren(AbsListView view) { + setViewHeight(view, getAbsListViewHeightBasedOnChildren(view)); + } + + /** + * set SearchView OnClickListener + * + * @param v + * @param listener + */ + public static void setSearchViewOnClickListener(View v, OnClickListener listener) { + if (v instanceof ViewGroup) { + ViewGroup group = (ViewGroup)v; + int count = group.getChildCount(); + for (int i = 0; i < count; i++) { + View child = group.getChildAt(i); + if (child instanceof LinearLayout || child instanceof RelativeLayout) { + setSearchViewOnClickListener(child, listener); + } + + if (child instanceof TextView) { + TextView text = (TextView)child; + text.setFocusable(false); + } + child.setOnClickListener(listener); + } + } + } +} From 9be9dd25c1730bf54b4e1c508abaa4af36cd4f73 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 21 Jan 2014 21:39:33 +0800 Subject: [PATCH 136/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b4e0ac..3dafbdf 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ ## License - Copyright 2014 trinea.cn + Copyright 2013 trinea.cn Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From cb072850bde70499ffa0eb89b1e315e9fee27811 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 26 Jan 2014 10:47:42 +0800 Subject: [PATCH 137/241] fix getFileName error below api 11 --- src/cn/trinea/android/common/util/DownloadManagerPro.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/DownloadManagerPro.java b/src/cn/trinea/android/common/util/DownloadManagerPro.java index d555807..b7fd75c 100644 --- a/src/cn/trinea/android/common/util/DownloadManagerPro.java +++ b/src/cn/trinea/android/common/util/DownloadManagerPro.java @@ -6,6 +6,7 @@ import android.app.DownloadManager.Request; import android.database.Cursor; import android.net.Uri; +import android.os.Build; /** * DownloadManagerPro @@ -36,7 +37,10 @@ public class DownloadManagerPro { public static final Uri CONTENT_URI = Uri.parse("content://downloads/my_downloads"); + /** represents downloaded file above api 11 **/ public static final String COLUMN_LOCAL_FILENAME = "local_filename"; + /** represents downloaded file below api 11 **/ + public static final String COLUMN_LOCAL_URI = "local_uri"; public static final String METHOD_NAME_PAUSE_DOWNLOAD = "pauseDownload"; public static final String METHOD_NAME_RESUME_DOWNLOAD = "resumeDownload"; @@ -202,7 +206,7 @@ private static void initResumeMethod() { * @return */ public String getFileName(long downloadId) { - return getString(downloadId, COLUMN_LOCAL_FILENAME); + return getString(downloadId, (Build.VERSION.SDK_INT < 11 ? COLUMN_LOCAL_URI : COLUMN_LOCAL_FILENAME)); } /** From 7547b14fb99444e1f38ae7e165756410ef9fe964 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 13 Feb 2014 09:38:30 +0800 Subject: [PATCH 138/241] add whether show footer when no more data in DropDownListView fix footer also can click when no more data --- .../android/common/view/DropDownListView.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index 4c8b0c0..4fb2f30 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -92,6 +92,8 @@ public class DropDownListView extends ListView implements OnScrollListener { private boolean hasMore = true; /** whether show footer loading progress bar when loading **/ private boolean isShowFooterProgressBar = true; + /** whether show footer when no more data **/ + private boolean isShowFooterWhenNoMore = false; private int currentScrollState; private int currentHeaderStatus; @@ -295,6 +297,24 @@ public void setShowFooterProgressBar(boolean isShowFooterProgressBar) { this.isShowFooterProgressBar = isShowFooterProgressBar; } + /** + * get isShowFooterWhenNoMore + * + * @return the isShowFooterWhenNoMore + */ + public boolean isShowFooterWhenNoMore() { + return isShowFooterWhenNoMore; + } + + /** + * set isShowFooterWhenNoMore + * + * @param isShowFooterWhenNoMore the isShowFooterWhenNoMore to set + */ + public void setShowFooterWhenNoMore(boolean isShowFooterWhenNoMore) { + this.isShowFooterWhenNoMore = isShowFooterWhenNoMore; + } + /** * get footer button * @@ -543,12 +563,15 @@ public void onBottomComplete() { if (isShowFooterProgressBar) { footerProgressBar.setVisibility(View.GONE); } - footerButton.setEnabled(true); if (!hasMore) { footerButton.setText(footerNoMoreText); - removeFooterView(footerLayout); + footerButton.setEnabled(false); + if (!isShowFooterWhenNoMore) { + removeFooterView(footerLayout); + } } else { footerButton.setText(footerDefaultText); + footerButton.setEnabled(true); } isOnBottomLoading = false; } From 1ad0fdbf98c8531b3540ba4a8bb8d7ef23d25b50 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 13 Feb 2014 09:40:35 +0800 Subject: [PATCH 139/241] add CacheManager you can use CacheManager.getHttpCache to get the singleton instance of HttpCache --- .../android/common/util/CacheManager.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/cn/trinea/android/common/util/CacheManager.java diff --git a/src/cn/trinea/android/common/util/CacheManager.java b/src/cn/trinea/android/common/util/CacheManager.java new file mode 100644 index 0000000..3abc654 --- /dev/null +++ b/src/cn/trinea/android/common/util/CacheManager.java @@ -0,0 +1,36 @@ +package cn.trinea.android.common.util; + +import android.app.Activity; +import android.content.Context; +import cn.trinea.android.common.service.HttpCache; + +/** + * CacheManager + * + * @author Trinea 2014-2-11 + */ +public class CacheManager { + + private static HttpCache httpCache = null; + + private CacheManager(){ + + } + + /** + * get the singleton instance of HttpCache + * + * @param context {@link Activity#getApplicationContext()} + * @return + */ + public static HttpCache getHttpCache(Context context) { + if (httpCache == null) { + synchronized (CacheManager.class) { + if (httpCache == null) { + httpCache = new HttpCache(context); + } + } + } + return httpCache; + } +} From 9afd7f199d70378ea3937a98f6db09c7a7799fc7 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 13 Feb 2014 10:43:47 +0800 Subject: [PATCH 140/241] modify javadoc --- src/cn/trinea/android/common/util/DownloadManagerPro.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cn/trinea/android/common/util/DownloadManagerPro.java b/src/cn/trinea/android/common/util/DownloadManagerPro.java index b7fd75c..4d1b88f 100644 --- a/src/cn/trinea/android/common/util/DownloadManagerPro.java +++ b/src/cn/trinea/android/common/util/DownloadManagerPro.java @@ -23,6 +23,8 @@ *
                            *
                              * Operate download + *
                            • {@link #isExistPauseAndResumeMethod()} whether exist pauseDownload and resumeDownload method in + * {@link DownloadManager}
                            • *
                            • {@link #pauseDownload(long...)} pause download. need pauseDownload(long...) method in {@link DownloadManager}
                            • *
                            • {@link #resumeDownload(long...)} resume download. need resumeDownload(long...) method in {@link DownloadManager}
                            • *
                            From 09e0eeea011209b3608a7983f1acc38a6381918a Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 14 Feb 2014 00:00:59 +0800 Subject: [PATCH 141/241] fix drawable be used common leading to imageView scaleType error bug --- .../android/common/service/impl/ImageMemoryCache.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index 09b3202..ff32876 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -137,7 +137,8 @@ public boolean get(final String imageUrl, final List urlList, final View Drawable drawable = object.getData(); if (drawable != null) { if (onImageCallbackListener != null) { - onImageCallbackListener.onGetSuccess(imageUrl, drawable, view, true); + onImageCallbackListener.onGetSuccess(imageUrl, drawable.getConstantState().newDrawable(), view, + true); } return true; } else { @@ -404,6 +405,10 @@ public void handleMessage(Message message) { String imageUrl = object.imageUrl; Drawable drawable = object.drawable; + // to avoid drawable dirty + if (drawable != null) { + drawable = drawable.getConstantState().newDrawable(); + } if (onImageCallbackListener != null) { if (isOpenWaitingQueue) { synchronized (viewSetMap) { From 2b4113b49628efc73597841cb0fecaeea896dcf3 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 14 Feb 2014 00:34:22 +0800 Subject: [PATCH 142/241] add tips to add permissions in manifest for ImageCache --- src/cn/trinea/android/common/service/impl/ImageCache.java | 7 ++++++- .../android/common/service/impl/ImageMemoryCache.java | 5 +++++ .../android/common/service/impl/ImageSDCardCache.java | 6 ++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 66bf8a8..7df1837 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -52,7 +52,12 @@ *
                          • {@link #ImageCache(int, int)}
                          • *
                          • {@link #ImageCache(int, int, int, int)}
                          • *
                          - * + *
                            + * Attentions + *
                          • You should add android.permission.WRITE_EXTERNAL_STORAGE in manifest, to store image to sdcard.
                          • + *
                          • You should add android.permission.ACCESS_NETWORK_STATE in manifest if you get image from + * network.
                          • + *
                          * @author Trinea 2013-10-18 */ public class ImageCache extends ImageMemoryCache { diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index ff32876..ff48f81 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -53,6 +53,11 @@ *
                        • {@link #ImageMemoryCache(int)}
                        • *
                        • {@link #ImageMemoryCache(int, int)}
                        • *
                        + *
                          + * Attentions + *
                        • You should add android.permission.ACCESS_NETWORK_STATE in manifest if you get image from + * network.
                        • + *
                        * * @author Trinea 2012-4-5 */ diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index d415f44..8244f24 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -64,6 +64,12 @@ *
                      • {@link #ImageSDCardCache(int)}
                      • *
                      • {@link #ImageSDCardCache(int, int)}
                      • *
                      + *
                        + * Attentions + *
                      • You should add android.permission.WRITE_EXTERNAL_STORAGE in manifest, to store image to sdcard.
                      • + *
                      • You should add android.permission.ACCESS_NETWORK_STATE in manifest if you get image from + * network.
                      • + *
                      * * @author Trinea 2012-4-5 */ From d4ebb19870b58d34f3b77ffcedcfda631de6ff62 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 14 Feb 2014 01:04:14 +0800 Subject: [PATCH 143/241] modify ImageCacheManager --- .../common/service/impl/ImageCache.java | 1 - .../common/service/impl/ImageCacheManager | 130 -------------- .../service/impl/ImageCacheManager.java | 152 ----------------- .../common/util/ImageCacheManager.java | 159 ++++++++++++++++++ 4 files changed, 159 insertions(+), 283 deletions(-) delete mode 100644 src/cn/trinea/android/common/service/impl/ImageCacheManager delete mode 100644 src/cn/trinea/android/common/service/impl/ImageCacheManager.java create mode 100644 src/cn/trinea/android/common/util/ImageCacheManager.java diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 7df1837..e987052 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -14,7 +14,6 @@ import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.service.FileNameRule; -import cn.trinea.android.common.service.impl.ImageMemoryCache.OnImageCallbackListener; import cn.trinea.android.common.util.FileUtils; import cn.trinea.android.common.util.ImageUtils; diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager b/src/cn/trinea/android/common/service/impl/ImageCacheManager deleted file mode 100644 index 3a90a7e..0000000 --- a/src/cn/trinea/android/common/service/impl/ImageCacheManager +++ /dev/null @@ -1,130 +0,0 @@ -/** - * 图片缓存管理,有两级缓存,第一级为 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 - *使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如 - * ImageCacheManager imgCacheManager = new ImageCacheManager(context); - * imgCacheManager.getImgCache().get(String url,View view); - */ - public class ImageCacheManager{ - private final ImageCache IMAGE_CACHE = new ImageCache(128); - private Context context; - - private ImageSDCardCacheManager imgSDCardCacheManager; - - public ImageCacheManager(Context ctx){ - context = ctx; - imgSDCardCacheManager = new ImageSDCardCacheManager(); - OnImageCallbackListener imageCallBack = new OnImageCallbackListener() { - private static final long serialVersionUID = 1L; - @Override - public void onImageLoaded(String imageUrl, Drawable imageDrawable, View view, boolean isInCache) { - if (view != null && imageDrawable != null) { - ImageView imageView = (ImageView)view; - imageView.setImageDrawable(imageDrawable); - if (!isInCache) { - imageView.startAnimation(getInAlphaAnimation(2000)); - } - } - } - }; - IMAGE_CACHE.setOnImageCallbackListener(imageCallBack); - IMAGE_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); - IMAGE_CACHE.setHttpReadTimeOut(10000); - IMAGE_CACHE.setOpenWaitingQueue(true); - IMAGE_CACHE.setValidTime(-1); - IMAGE_CACHE.setOnGetDataListener(new OnGetDataListener(){ - private static final long serialVersionUID = -3015419170577770764L; - @Override - public CacheObject onGetData(String key) { - Drawable d = null; - try { - String filepath; - //1.从SDCardCache的cache队列查询 - CacheObject co = imgSDCardCacheManager.getImgCache().get(key); - if(null != co){ - filepath= co.getData(); - }else{ - //2.调用SDCardCache的onGetData(),该步骤分两步:1.查找本地文件;2网络获取 - imgSDCardCacheManager.getImgCache().remove(key); - CacheObject cs = imgSDCardCacheManager.getImgCache().getOnGetDataListener().onGetData(key); - filepath = cs!=null?cs.getData():""; - } - if(!StringUtils.isEmpty(filepath) && FileUtils.isFileExist(filepath)){ - Bitmap bm = BitmapFactory.decodeFile(filepath,null); - d = new BitmapDrawable(context.getResources(),bm); - } - Log.d("test","file_path:"+filepath); - } catch (Exception e) { - Log.e("test", "get drawable exception, imageUrl is:" + key, e); - } - return (d == null ? null : new CacheObject(d)); - }}); - } - public AlphaAnimation getInAlphaAnimation(long durationMillis) { - AlphaAnimation inAlphaAnimation = new AlphaAnimation(0, 1); - inAlphaAnimation.setDuration(durationMillis); - return inAlphaAnimation; - } - public ImageCache getImgCache(){ - return IMAGE_CACHE; - } - - /** - * 图片缓存管理,这一层只负责网络和本地图片之间的缓存 - * @author maxiaohui - * - */ - private class ImageSDCardCacheManager { - public final ImageSDCardCache IMAGE_SD_CACHE = new ImageSDCardCache(); - public ImageSDCardCacheManager(){ - IMAGE_SD_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); - IMAGE_SD_CACHE.setCacheFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "TrineaAndroidCommon"); - //IMAGE_SD_CACHE.setCacheFolder(Environment.getDataDirectory() + File.separator + "TrineaAndroidCommon"); - IMAGE_SD_CACHE.setFileNameRule(new FileNameRuleImageUrl()); - IMAGE_SD_CACHE.setHttpReadTimeOut(10000); - IMAGE_SD_CACHE.setOpenWaitingQueue(true); - IMAGE_SD_CACHE.setValidTime(-1); - IMAGE_SD_CACHE.setOnGetDataListener(new OnGetDataListener(){ - private static final long serialVersionUID = 1L; - @Override - public CacheObject onGetData(String key) { - /** - * local file cache - * @author maxiaohui - */ - String TAG = "test"; - String imgPath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); - File img = new File(imgPath); - if(img.exists()){ - return new CacheObject(imgPath); - } - //below is the same as ImageSDCardCache.getDefaultOnGetImageListener() - String savePath = null; - try { - InputStream stream = ImageUtils.getInputStreamFromUrl(key, IMAGE_SD_CACHE.getHttpReadTimeOut()); - if (stream != null) { - savePath = IMAGE_SD_CACHE.getCacheFolder() + File.separator + IMAGE_SD_CACHE.getFileNameRule().getFileName(key); - try { - FileUtils.writeFile(savePath, stream); - } catch (Exception e) { - if (e.getCause() instanceof FileNotFoundException) { - FileUtils.makeFolders(savePath); - FileUtils.writeFile(savePath, stream); - } else { - Log.e(TAG,new StringBuilder().append("get drawable exception while write to file, imageUrl is: ") - .append(key).append(", savePath is ").append(savePath) - .toString(), e); - savePath = null; - } - } - } - } catch (Exception e) { - Log.e(TAG, new StringBuilder().append("get drawable exception, imageUrl is:").append(key).toString(), e); - } - return (StringUtils.isEmpty(savePath) ? null : new CacheObject(savePath)); - }}); - } - public ImageSDCardCache getImgCache(){ - return IMAGE_SD_CACHE; - } - } - } diff --git a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java b/src/cn/trinea/android/common/service/impl/ImageCacheManager.java deleted file mode 100644 index e4aa526..0000000 --- a/src/cn/trinea/android/common/service/impl/ImageCacheManager.java +++ /dev/null @@ -1,152 +0,0 @@ -package cn.trinea.android.common.service.impl; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.InputStream; - -import cn.trinea.android.common.entity.CacheObject; -import cn.trinea.android.common.service.impl.ImageCache.OnImageCallbackListener; -import cn.trinea.android.common.service.impl.PreloadDataCache.OnGetDataListener; -import cn.trinea.android.common.util.FileUtils; -import cn.trinea.android.common.util.ImageUtils; -import cn.trinea.android.common.util.StringUtils; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.os.Environment; -import android.util.Log; -import android.view.View; -import android.view.animation.AlphaAnimation; -import android.widget.ImageView; - -/** - * @author maxiaohui hackooo@sina.cn - * - * 图片缓存管理,有两级缓存,第一级为 - * 本地图片文件与内存的缓存,第二层结合ImageSDCardCacheManager,为网络与本地文件之间的缓存。 - * 使用方法:导入这个类,或者直接作为内部类,获取图片的时候跟使用ImageCache一样,例如: - * ImageCacheManager imgCacheManager = new ImageCacheManager(context); - * - * 参数的设置与原来的ImageCache和ImageSDCardCache一致(可以删除代码中的一些默认的设置) ImageCache - * IMAGE_CACHE = imgCacheManager。getImgCache(); - * - * IMAGE_CACHE.setCacheFullRemoveType(new - * RemoveTypeLastUsedTimeFirst()); - * IMAGE_CACHE.setHttpReadTimeOut(10000); - * IMAGE_CACHE.setOpenWaitingQueue(true); IMAGE_CACHE.setValidTime(-1); - * IMAGE_CACHE.setOnImageCallbackListener(new OnImageCallbackListener(){ - * private static final long serialVersionUID = 1L; - * @Override - * public void onImageLoaded(String imageUrl, Drawable imageDrawable,View view, boolean isInCache) - * { - * if (view != null && imageDrawable!= null) { - * ImageView imageView = (ImageView)view; - * imageView.setImageDrawable(imageDrawable); - * if (!isInCache) { - * imageView.startAnimation(imgCacheManager.getInAlphaAnimation(2000)); - * } - * } - * } - * }); - * 。。。。。。 - * ImageSDCardCache IMAGE_SD_CACHE = imgCacheManager.getImgSDCardCache(); - * IMAGE_SD_CACHE.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); - * IMAGE_SD_CACHE.setCacheFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "TrineaAndroidCommon"); - * IMAGE_SD_CACHE.setFileNameRule(new FileNameRuleImageUrl()); - * IMAGE_SD_CACHE.setHttpReadTimeOut(10000); - * IMAGE_SD_CACHE.setOpenWaitingQueue(true); - * IMAGE_SD_CACHE.setValidTime(-1); - * 。。。。。。 获取图片的时候 - * IMAGE_CACHE.get(String url,View view); - */ -public class ImageCacheManager { - private final ImageCache IMAGE_CACHE = new ImageCache(128); - private Context context; - private String TAG = "ImageCacheManager"; - - private ImageSDCardCacheManager imgSDCardCacheManager; - - public ImageCacheManager(Context ctx) { - context = ctx; - imgSDCardCacheManager = new ImageSDCardCacheManager(); - IMAGE_CACHE.setOnGetDataListener(new OnGetDataListener() { - private static final long serialVersionUID = 1L; - - @Override - public CacheObject onGetData(String key) { - Drawable d = null; - try { - String filepath; - // 1.从SDCardCache的cache队列查询 - CacheObject co = imgSDCardCacheManager.getImgCache().get(key); - if (null != co) { - filepath = co.getData(); - } else { - // 2.调用SDCardCache的onGetData(),该步骤分两步:1.查找本地文件;2网络获取 - imgSDCardCacheManager.getImgCache().remove(key); - CacheObject cs = imgSDCardCacheManager - .getImgCache().getOnGetDataListener() - .onGetData(key); - filepath = cs != null ? cs.getData() : ""; - } - if (!StringUtils.isEmpty(filepath) && FileUtils.isFileExist(filepath)) { - Bitmap bm = BitmapFactory.decodeFile(filepath,null); - d = new BitmapDrawable(context.getResources(),bm); - } - } catch (Exception e) { - Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); - } - return (d == null ? null : new CacheObject(d)); - } - }); - } - - public AlphaAnimation getInAlphaAnimation(long durationMillis) { - AlphaAnimation inAlphaAnimation = new AlphaAnimation(0, 1); - inAlphaAnimation.setDuration(durationMillis); - return inAlphaAnimation; - } - - public ImageCache getImgCache() { - return IMAGE_CACHE; - } - - public ImageSDCardCache getImgSDCardCache() { - return imgSDCardCacheManager.getImgCache(); - } - - /** - * 图片缓存管理,这一层只负责网络和本地图片之间的缓存 - * - * @author maxiaohui hackooo@sina.cn - * - */ - private class ImageSDCardCacheManager { - public final ImageSDCardCache IMAGE_SD_CACHE = new ImageSDCardCache(); - - public ImageSDCardCacheManager() { - - IMAGE_SD_CACHE.setOnGetDataListener(new OnGetDataListener() { - private static final long serialVersionUID = 1L; - - @Override - public CacheObject onGetData(String key) { - // 1.先从本地文件查找;2.从网络获取 - String imgPath = IMAGE_SD_CACHE.getCacheFolder()+ File.separator+ IMAGE_SD_CACHE.getFileNameRule().getFileName(key); - File img = new File(imgPath); - if (img.exists()) { - return new CacheObject(imgPath); - } else { - return IMAGE_SD_CACHE.getDefaultOnGetImageListener().onGetData(key); - } - } - }); - } - - public ImageSDCardCache getImgCache() { - return IMAGE_SD_CACHE; - } - } -} diff --git a/src/cn/trinea/android/common/util/ImageCacheManager.java b/src/cn/trinea/android/common/util/ImageCacheManager.java new file mode 100644 index 0000000..6457f29 --- /dev/null +++ b/src/cn/trinea/android/common/util/ImageCacheManager.java @@ -0,0 +1,159 @@ +package cn.trinea.android.common.util; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.view.animation.AlphaAnimation; +import android.widget.ImageView; +import cn.trinea.android.common.entity.FailedReason; +import cn.trinea.android.common.service.impl.FileNameRuleImageUrl; +import cn.trinea.android.common.service.impl.ImageCache; +import cn.trinea.android.common.service.impl.ImageMemoryCache.OnImageCallbackListener; +import cn.trinea.android.common.service.impl.ImageSDCardCache; +import cn.trinea.android.common.service.impl.ImageSDCardCache.OnImageSDCallbackListener; +import cn.trinea.android.common.service.impl.RemoveTypeLastUsedTimeFirst; + +/** + * ImageCacheManager + * + * @author maxiaohui hackooo@sina.cn 2014-2-14 + */ +public class ImageCacheManager { + + private static ImageCache imageCache = null; + private static ImageSDCardCache imageSDCardCache = null; + + /** + * get the singleton instance of ImageCache + * + * @return + */ + public static ImageCache getImageCache() { + if (imageCache == null) { + synchronized (CacheManager.class) { + if (imageCache == null) { + imageCache = new ImageCache(128, 512); + setImageCache(); + } + } + } + return imageCache; + } + + /** + * get the singleton instance of ImageSDCardCache + * + * @return + */ + public static ImageSDCardCache getImageSDCardCache() { + if (imageSDCardCache == null) { + synchronized (CacheManager.class) { + if (imageSDCardCache == null) { + imageSDCardCache = new ImageSDCardCache(); + setImageSDCardCache(); + } + } + } + return imageSDCardCache; + } + + /** + * set ImageCache properties + */ + private static void setImageCache() { + if (imageCache == null) { + return; + } + + OnImageCallbackListener imageCallBack = new OnImageCallbackListener() { + + @Override + public void onGetSuccess(String imageUrl, Drawable imageDrawable, View view, boolean isInCache) { + if (view != null && imageDrawable != null) { + ImageView imageView = (ImageView)view; + imageView.setImageDrawable(imageDrawable); + // first time show with animation + if (!isInCache) { + imageView.startAnimation(getInAlphaAnimation(2000)); + } + } + } + + @Override + public void onPreGet(String imageUrl, View view) { + } + + @Override + public void onGetFailed(String imageUrl, Drawable imageDrawable, View view, FailedReason failedReason) { + } + + @Override + public void onGetNotInCache(String imageUrl, View view) { + } + }; + imageCache.setOnImageCallbackListener(imageCallBack); + imageCache.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + + imageCache.setHttpReadTimeOut(10000); + imageCache.setValidTime(-1); + } + + /** + * set ImageSDCardCache properties + */ + private static void setImageSDCardCache() { + if (imageSDCardCache == null) { + return; + } + + OnImageSDCallbackListener imageCallBack = new OnImageSDCallbackListener() { + + private static final long serialVersionUID = 1L; + + @Override + public void onGetSuccess(String imageUrl, String imagePath, View view, boolean isInCache) { + ImageView imageView = (ImageView)view; + + // if oom please use BitmapFactory.decodeFile(imagePath, option) + Bitmap bm = BitmapFactory.decodeFile(imagePath); + if (bm != null) { + imageView.setImageBitmap(bm); + + // first time show with animation + if (!isInCache) { + imageView.startAnimation(getInAlphaAnimation(2000)); + } + } + } + + @Override + public void onPreGet(String imageUrl, View view) { + } + + @Override + public void onGetNotInCache(String imageUrl, View view) { + } + + @Override + public void onGetFailed(String imageUrl, String imagePath, View view, FailedReason failedReason) { + } + }; + imageSDCardCache.setOnImageSDCallbackListener(imageCallBack); + imageSDCardCache.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + imageSDCardCache.setFileNameRule(new FileNameRuleImageUrl()); + + imageSDCardCache.setHttpReadTimeOut(10000); + imageSDCardCache.setValidTime(-1); + } + + public static AlphaAnimation getInAlphaAnimation(long durationMillis) { + AlphaAnimation inAlphaAnimation = new AlphaAnimation(0, 1); + inAlphaAnimation.setDuration(durationMillis); + return inAlphaAnimation; + } + + private ImageCacheManager(){ + + } +} From bcb6d0cccf633d967ce808153705eb79ca66e571 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 14 Feb 2014 01:07:26 +0800 Subject: [PATCH 144/241] add getImageCache and getImageSDCardCache to CacheManager.java --- .../android/common/util/CacheManager.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/cn/trinea/android/common/util/CacheManager.java b/src/cn/trinea/android/common/util/CacheManager.java index 3abc654..d588540 100644 --- a/src/cn/trinea/android/common/util/CacheManager.java +++ b/src/cn/trinea/android/common/util/CacheManager.java @@ -3,6 +3,8 @@ import android.app.Activity; import android.content.Context; import cn.trinea.android.common.service.HttpCache; +import cn.trinea.android.common.service.impl.ImageCache; +import cn.trinea.android.common.service.impl.ImageSDCardCache; /** * CacheManager @@ -33,4 +35,24 @@ public static HttpCache getHttpCache(Context context) { } return httpCache; } + + /** + * get the singleton instance of ImageCache + * + * @return + * @see ImageCacheManager#getImageCache() + */ + public static ImageCache getImageCache() { + return ImageCacheManager.getImageCache(); + } + + /** + * get the singleton instance of ImageSDCardCache + * + * @return + * @see ImageCacheManager#getImageSDCardCache() + */ + public static ImageSDCardCache getImageSDCardCache() { + return ImageCacheManager.getImageSDCardCache(); + } } From bea0b82f9716744a59173ed349e47921a34aa23a Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 14 Feb 2014 10:18:41 +0800 Subject: [PATCH 145/241] modify version --- AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 96eb157..d58ead9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="28" + android:versionName="4.2.8" > From 66a04e81006b006d17f265e471f267184ae4d435 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 14 Feb 2014 16:39:49 +0800 Subject: [PATCH 146/241] add ScreenUtils.java --- .../android/common/util/ScreenUtils.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/cn/trinea/android/common/util/ScreenUtils.java diff --git a/src/cn/trinea/android/common/util/ScreenUtils.java b/src/cn/trinea/android/common/util/ScreenUtils.java new file mode 100644 index 0000000..e453f61 --- /dev/null +++ b/src/cn/trinea/android/common/util/ScreenUtils.java @@ -0,0 +1,30 @@ +package cn.trinea.android.common.util; + +import android.content.Context; + +/** + * ScreenUtils + *
                        + * Convert between dp and sp + *
                      • {@link ScreenUtils#dpToPx(Context, float)}
                      • + *
                      • {@link ScreenUtils#pxToDp(Context, float)}
                      • + *
                      + * + * @author Trinea 2014-2-14 + */ +public class ScreenUtils { + + public static float dpToPx(Context context, float dp) { + if (context == null) { + return -1; + } + return dp * context.getResources().getDisplayMetrics().density; + } + + public static float pxToDp(Context context, float px) { + if (context == null) { + return -1; + } + return px / context.getResources().getDisplayMetrics().density; + } +} From 78c360401fea757514dba3a5a15c1b5cda10e373 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 17 Feb 2014 00:37:00 +0800 Subject: [PATCH 147/241] update http cache info --- README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3dafbdf..e79b617 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 **Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 **个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 -**更多Android开源项目见:https://github.com/Trinea/android-open-project** ####示例APK下载(Demo Download): @@ -15,7 +14,7 @@ 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 使用见:[图片缓存的使用](http://www.trinea.cn/?p=704) -适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。。效果图如下: +适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。效果图如下: ![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) @@ -24,14 +23,17 @@ 适用:应用中获取图片较多且图片较大的情况,需要二级缓存及ListView或GridView图片加载推荐使用上面的[ImageCache](http://www.trinea.cn/?p=704)。效果图如下: ![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) + +#####3. 网络缓存 +使用见:[Android网络缓存](http://www.trinea.cn/android/android-http-cache) +适用:网络获取内容不大的应用,尤其是api接口数据,如新浪微博、twitter的timeline、微信公众账号发送的内容等等。效果图如下: +![HttpCache](http://farm3.staticflickr.com/2843/12566457534_2cfa4297a1_o.jpg) + -#####3. 预取数据缓存 -使用见:[预取数据缓存](http://www.trinea.cn/android/preloaddatacache%e6%94%af%e6%8c%81%e9%a2%84%e5%8f%96%e7%9a%84%e6%95%b0%e6%8d%ae%e7%bc%93%e5%ad%98%ef%bc%8c%e4%bd%bf%e7%94%a8%e7%ae%80%e5%8d%95%ef%bc%8c%e6%94%af%e6%8c%81%e5%a4%9a%e7%a7%8d%e7%bc%93/) +#####4. 预取数据缓存 +使用见:[预取数据缓存](http://www.trinea.cn/android/preloaddatacache/) 缓存类关系图如下:其中HttpCache为后续计划的http缓存 ![ImageSDCardCache](http://farm4.staticflickr.com/3818/9318670513_1576253fd5_o.jpg) - -####4. 网络缓存 -一期功能完成,帮助文档准备中^v^… ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview From e2918f33363c38d8907567d54a6ca257e65781f6 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 19 Feb 2014 17:04:33 +0800 Subject: [PATCH 148/241] add getInstallLocation for PackageUtils.java --- .../android/common/util/PackageUtils.java | 52 ++++++++++++++++++- .../android/common/util/ScreenUtils.java | 8 +++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index b12e4e6..191a115 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -39,6 +39,7 @@ *
                    *
                      * Others + *
                    • {@link PackageUtils#getInstallLocation()} get system install location
                    • *
                    • {@link PackageUtils#isTopActivity(Context, String)} whether the app whost package's name is packageName is on the * top of the stack
                    • *
                    • {@link PackageUtils#startInstalledAppDetails(Context, String)} start InstalledAppDetails Activity
                    • @@ -48,7 +49,13 @@ */ public class PackageUtils { - public static final String TAG = "PackageUtils"; + public static final String TAG = "PackageUtils"; + /** + * App installation location settings values, same to {@link #PackageHelper} + */ + public static final int APP_INSTALL_AUTO = 0; + public static final int APP_INSTALL_INTERNAL = 1; + public static final int APP_INSTALL_EXTERNAL = 2; /** * install according conditions @@ -467,6 +474,49 @@ public static int getAppVersionCode(Context context) { return -1; } + /** + * get system install location
                      + * can be set by System Menu Setting->Storage->Prefered install location + * + * @return + * @see {@link IPackageManager#getInstallLocation()} + */ + public static int getInstallLocation() { + CommandResult commandResult = ShellUtils.execCommand("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm get-install-location", + false, true); + if (commandResult.result == 0 && commandResult.successMsg != null && commandResult.successMsg.length() > 0) { + try { + int location = Integer.parseInt(commandResult.successMsg.substring(0, 1)); + switch (location) { + case APP_INSTALL_INTERNAL: + return APP_INSTALL_INTERNAL; + case APP_INSTALL_EXTERNAL: + return APP_INSTALL_EXTERNAL; + } + } catch (NumberFormatException e) { + e.printStackTrace(); + Log.e(TAG, "pm get-install-location error"); + } + } + return APP_INSTALL_AUTO; + } + + /** + * get params for pm install location + * + * @return + */ + private static String getInstallLocationParams() { + int location = getInstallLocation(); + switch (location) { + case APP_INSTALL_INTERNAL: + return "-f"; + case APP_INSTALL_EXTERNAL: + return "-s"; + } + return ""; + } + /** * start InstalledAppDetails Activity * diff --git a/src/cn/trinea/android/common/util/ScreenUtils.java b/src/cn/trinea/android/common/util/ScreenUtils.java index e453f61..786cd64 100644 --- a/src/cn/trinea/android/common/util/ScreenUtils.java +++ b/src/cn/trinea/android/common/util/ScreenUtils.java @@ -27,4 +27,12 @@ public static float pxToDp(Context context, float px) { } return px / context.getResources().getDisplayMetrics().density; } + + public static float dpToPxInt(Context context, float dp) { + return (int)(dpToPx(context, dp) + 0.5f); + } + + public static float pxToDpCeilInt(Context context, float px) { + return (int)(pxToDp(context, px) + 0.5f); + } } From e41a44794bc1951c126818b2e27d6cfb897d82ef Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 19 Feb 2014 18:32:42 +0800 Subject: [PATCH 149/241] add getImagePath for ImageCache --- .../common/service/impl/ImageCache.java | 24 +++++++++++++---- .../common/service/impl/ImageSDCardCache.java | 27 ++++++++++++++----- .../android/common/util/PackageUtils.java | 4 +-- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index e987052..54e3201 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -57,6 +57,7 @@ *
                    • You should add android.permission.ACCESS_NETWORK_STATE in manifest if you get image from * network.
                    • *
                    + * * @author Trinea 2013-10-18 */ public class ImageCache extends ImageMemoryCache { @@ -69,11 +70,14 @@ public class ImageCache extends ImageMemoryCache { private CompressListener compressListener; /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = new StringBuilder() - .append(Environment.getExternalStorageDirectory().getAbsolutePath()) - .append(File.separator).append("Trinea").append(File.separator) - .append("AndroidCommon").append(File.separator) - .append("ImageCache").toString(); + public static final String DEFAULT_CACHE_FOLDER = new StringBuilder().append(Environment.getExternalStorageDirectory() + .getAbsolutePath()) + .append(File.separator).append("Trinea") + .append(File.separator) + .append("AndroidCommon") + .append(File.separator).append("ImageCache") + .toString(); + /** *
                      *
                    • max size of primary cache is {@link ImageMemoryCache#DEFAULT_MAX_SIZE}, max size of secondary cache is @@ -457,6 +461,16 @@ public boolean saveDataToDb(Context context, String tag) { return ImageSDCardCache.saveDataToDb(context, secondaryCache, tag); } + /** + * get image file path + * + * @param imageUrl + * @return + */ + public String getImagePath(String imageUrl) { + return secondaryCache.getImagePath(imageUrl); + } + /** * @see ExecutorService#shutdown() */ diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 8244f24..dc22341 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -19,8 +19,8 @@ import android.util.Log; import android.view.View; import cn.trinea.android.common.dao.impl.ImageSDCardCacheDaoImpl; -import cn.trinea.android.common.entity.FailedException; import cn.trinea.android.common.entity.CacheObject; +import cn.trinea.android.common.entity.FailedException; import cn.trinea.android.common.entity.FailedReason; import cn.trinea.android.common.entity.FailedReason.FailedType; import cn.trinea.android.common.service.CacheFullRemoveType; @@ -98,11 +98,15 @@ public class ImageSDCardCache extends PreloadDataCache { /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = new StringBuilder() - .append(Environment.getExternalStorageDirectory().getAbsolutePath()) - .append(File.separator).append("Trinea").append(File.separator) - .append("AndroidCommon").append(File.separator) - .append("ImageSDCardCache").toString(); + public static final String DEFAULT_CACHE_FOLDER = new StringBuilder().append(Environment.getExternalStorageDirectory() + .getAbsolutePath()) + .append(File.separator) + .append("Trinea") + .append(File.separator) + .append("AndroidCommon") + .append(File.separator) + .append("ImageSDCardCache") + .toString(); /** message what for get image successfully **/ private static final int WHAT_GET_IMAGE_SUCCESS = 1; @@ -757,6 +761,17 @@ public static boolean saveDataToDb(Context context, ImageSDCardCache imageSDCard tag); } + /** + * get image file path + * + * @param imageUrl + * @return + */ + public String getImagePath(String imageUrl) { + return new StringBuilder(cacheFolder).append(File.separator).append(fileNameRule.getFileName(imageUrl)) + .toString(); + } + /** * delete file * diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 191a115..4f1fe09 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -112,7 +112,7 @@ public static boolean installNormal(Context context, String filePath) { * @see #installSilent(Context, String, String) */ public static int installSilent(Context context, String filePath) { - return installSilent(context, filePath, "-r"); + return installSilent(context, filePath, " -r " + getInstallLocationParams()); } /** @@ -482,7 +482,7 @@ public static int getAppVersionCode(Context context) { * @see {@link IPackageManager#getInstallLocation()} */ public static int getInstallLocation() { - CommandResult commandResult = ShellUtils.execCommand("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm get-install-location", + CommandResult commandResult = ShellUtils.execCommand("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm get-install-location", false, true); if (commandResult.result == 0 && commandResult.successMsg != null && commandResult.successMsg.length() > 0) { try { From ae8dd810a97699f3123072251cd6e50b246f58d6 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 20 Feb 2014 11:41:57 +0800 Subject: [PATCH 150/241] fix getImagePath bug --- src/cn/trinea/android/common/service/impl/ImageCache.java | 2 +- .../android/common/service/impl/ImageSDCardCache.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 54e3201..05fd1ad 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -465,7 +465,7 @@ public boolean saveDataToDb(Context context, String tag) { * get image file path * * @param imageUrl - * @return + * @return if not in cache return null, else return full path. */ public String getImagePath(String imageUrl) { return secondaryCache.getImagePath(imageUrl); diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index dc22341..9a26c06 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -765,11 +765,12 @@ public static boolean saveDataToDb(Context context, ImageSDCardCache imageSDCard * get image file path * * @param imageUrl - * @return + * @return if not in cache return null, else return full path. */ public String getImagePath(String imageUrl) { - return new StringBuilder(cacheFolder).append(File.separator).append(fileNameRule.getFileName(imageUrl)) - .toString(); + return (this.containsKey(imageUrl)) ? new StringBuilder(cacheFolder).append(File.separator) + .append(fileNameRule.getFileName(imageUrl)) + .toString() : null; } /** From f51cadf754658c0258ef14f611a2ce645a31e81f Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 20 Feb 2014 14:34:56 +0800 Subject: [PATCH 151/241] modify Drawable to Bitmap in ImageMemoryCache --- .../common/service/impl/ImageCache.java | 21 +++-- .../common/service/impl/ImageMemoryCache.java | 79 +++++++++---------- .../common/service/impl/ImageSDCardCache.java | 6 +- ...eLarge.java => RemoveTypeBitmapLarge.java} | 21 +++-- ...eSmall.java => RemoveTypeBitmapSmall.java} | 21 +++-- .../common/util/ImageCacheManager.java | 11 ++- 6 files changed, 74 insertions(+), 85 deletions(-) rename src/cn/trinea/android/common/service/impl/{RemoveTypeDrawableLarge.java => RemoveTypeBitmapLarge.java} (62%) rename src/cn/trinea/android/common/service/impl/{RemoveTypeDrawableSmall.java => RemoveTypeBitmapSmall.java} (62%) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 05fd1ad..5fd0a3e 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -8,14 +8,12 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.Drawable; import android.os.Environment; import android.view.View; import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.service.FileNameRule; import cn.trinea.android.common.util.FileUtils; -import cn.trinea.android.common.util.ImageUtils; /** * Image Cache
                      @@ -143,28 +141,27 @@ public ImageCache(int primaryCacheMaxSize, int primaryCacheThreadPoolSize, int s int secondaryCacheThreadPoolSize){ super(primaryCacheMaxSize, primaryCacheThreadPoolSize); - setOnGetDataListener(new OnGetDataListener() { + setOnGetDataListener(new OnGetDataListener() { private static final long serialVersionUID = 1L; @Override - public CacheObject onGetData(String key) { + public CacheObject onGetData(String key) { CacheObject object = secondaryCache.get(key); String imagePath = (object == null ? null : object.getData()); if (FileUtils.isFileExist(imagePath)) { if (compressListener != null) { compressSize = compressListener.getCompressSize(imagePath); } - Drawable d; + Bitmap bm; if (compressSize > 1) { BitmapFactory.Options option = new BitmapFactory.Options(); option.inSampleSize = compressSize; - Bitmap bm = BitmapFactory.decodeFile(imagePath, option); - d = ImageUtils.bitmapToDrawable(bm); + bm = BitmapFactory.decodeFile(imagePath, option); } else { - d = ImageUtils.bitmapToDrawable(BitmapFactory.decodeFile(imagePath)); + bm = BitmapFactory.decodeFile(imagePath); } - return (d == null ? null : new CacheObject(d)); + return (bm == null ? null : new CacheObject(bm)); } else { secondaryCache.remove(key); } @@ -172,7 +169,7 @@ public CacheObject onGetData(String key) { } }); super.setCheckNetwork(false); - setCacheFullRemoveType(new RemoveTypeUsedCountSmall()); + setCacheFullRemoveType(new RemoveTypeUsedCountSmall()); secondaryCache = new ImageSDCardCache(secondaryCacheMaxSize, secondaryCacheThreadPoolSize); secondaryCache.setCacheFolder(DEFAULT_CACHE_FOLDER); @@ -495,7 +492,7 @@ public List shutdownNow() { * @return * @see {@link PreloadDataCache#getOnGetDataListener()} */ - public OnGetDataListener getOnGetImageListenerOfPrimaryCache() { + public OnGetDataListener getOnGetImageListenerOfPrimaryCache() { return getOnGetDataListener(); } @@ -505,7 +502,7 @@ public OnGetDataListener getOnGetImageListenerOfPrimaryCache() * @param onGetImageListener * @see {@link PreloadDataCache#setOnGetDataListener(OnGetDataListener)} */ - public void setOnGetImageListenerOfPrimaryCache(OnGetDataListener onGetImageListener) { + public void setOnGetImageListenerOfPrimaryCache(OnGetDataListener onGetImageListener) { this.onGetDataListener = onGetImageListener; } diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index ff48f81..8c619a4 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -9,16 +9,16 @@ import java.util.concurrent.Executors; import android.content.Context; -import android.graphics.drawable.Drawable; +import android.graphics.Bitmap; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; +import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.entity.FailedException; import cn.trinea.android.common.entity.FailedReason; import cn.trinea.android.common.entity.FailedReason.FailedType; -import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.util.ImageUtils; import cn.trinea.android.common.util.SizeUtils; @@ -61,7 +61,7 @@ * * @author Trinea 2012-4-5 */ -public class ImageMemoryCache extends PreloadDataCache { +public class ImageMemoryCache extends PreloadDataCache { private static final long serialVersionUID = 1L; @@ -102,7 +102,7 @@ public class ImageMemoryCache extends PreloadDataCache { /** * get image asynchronous. when get image success, it will pass to - * {@link OnImageCallbackListener#onGetSuccess(String, Drawable, View, boolean)} + * {@link OnImageCallbackListener#onGetSuccess(String, Bitmap, View, boolean)} * * @param imageUrl * @param view @@ -137,13 +137,12 @@ public boolean get(final String imageUrl, final List urlList, final View /** * if already in cache, call onImageSDCallbackListener, else new thread to wait for it */ - CacheObject object = getFromCache(imageUrl, urlList); + CacheObject object = getFromCache(imageUrl, urlList); if (object != null) { - Drawable drawable = object.getData(); - if (drawable != null) { + Bitmap bitmap = object.getData(); + if (bitmap != null) { if (onImageCallbackListener != null) { - onImageCallbackListener.onGetSuccess(imageUrl, drawable.getConstantState().newDrawable(), view, - true); + onImageCallbackListener.onGetSuccess(imageUrl, bitmap, view, true); } return true; } else { @@ -320,7 +319,7 @@ public ImageMemoryCache(int maxSize, int threadPoolSize){ super(maxSize, threadPoolSize); super.setOnGetDataListener(getDefaultOnGetImageListener()); - super.setCacheFullRemoveType(new RemoveTypeUsedCountSmall()); + super.setCacheFullRemoveType(new RemoveTypeUsedCountSmall()); this.viewMap = new ConcurrentHashMap(); this.viewSetMap = new HashMap>(); this.handler = new MyHandler(); @@ -359,21 +358,21 @@ public interface OnImageCallbackListener { * callback function after get image successfully, run on ui thread * * @param imageUrl imageUrl - * @param imageDrawable drawable + * @param loadedImage loaded image bitmap * @param view view need the image * @param isInCache whether already in cache or got realtime */ - public void onGetSuccess(String imageUrl, Drawable imageDrawable, View view, boolean isInCache); + public void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolean isInCache); /** * callback function after get image failed, run on ui thread * * @param imageUrl imageUrl - * @param imageDrawable drawable + * @param loadedImage loaded image bitmap * @param view view need the image * @param failedReason failed reason for get image */ - public void onGetFailed(String imageUrl, Drawable imageDrawable, View view, FailedReason failedReason); + public void onGetFailed(String imageUrl, Bitmap loadedImage, View view, FailedReason failedReason); } /** @@ -409,11 +408,7 @@ public void handleMessage(Message message) { } String imageUrl = object.imageUrl; - Drawable drawable = object.drawable; - // to avoid drawable dirty - if (drawable != null) { - drawable = drawable.getConstantState().newDrawable(); - } + Bitmap bitmap = object.bitmap; if (onImageCallbackListener != null) { if (isOpenWaitingQueue) { synchronized (viewSetMap) { @@ -421,12 +416,12 @@ public void handleMessage(Message message) { if (viewSet != null) { for (View view : viewSet) { if (view != null) { - onImageCallbackListener.onGetSuccess(imageUrl, drawable, view, false); + onImageCallbackListener.onGetSuccess(imageUrl, bitmap, view, false); } if (WHAT_GET_IMAGE_SUCCESS == message.what) { - onImageCallbackListener.onGetSuccess(imageUrl, drawable, view, false); + onImageCallbackListener.onGetSuccess(imageUrl, bitmap, view, false); } else { - onImageCallbackListener.onGetFailed(imageUrl, drawable, view, + onImageCallbackListener.onGetFailed(imageUrl, bitmap, view, object.failedReason); } } @@ -436,9 +431,9 @@ public void handleMessage(Message message) { View view = viewMap.get(imageUrl); if (view != null) { if (WHAT_GET_IMAGE_SUCCESS == message.what) { - onImageCallbackListener.onGetSuccess(imageUrl, drawable, view, false); + onImageCallbackListener.onGetSuccess(imageUrl, bitmap, view, false); } else { - onImageCallbackListener.onGetFailed(imageUrl, drawable, view, object.failedReason); + onImageCallbackListener.onGetFailed(imageUrl, bitmap, view, object.failedReason); } } } @@ -464,17 +459,17 @@ public void handleMessage(Message message) { private class MessageObject { String imageUrl; - Drawable drawable; + Bitmap bitmap; FailedReason failedReason; - public MessageObject(String imageUrl, Drawable drawable){ + public MessageObject(String imageUrl, Bitmap bitmap){ this.imageUrl = imageUrl; - this.drawable = drawable; + this.bitmap = bitmap; } - public MessageObject(String imageUrl, Drawable drawable, FailedReason failedReason){ + public MessageObject(String imageUrl, Bitmap bitmap, FailedReason failedReason){ this.imageUrl = imageUrl; - this.drawable = drawable; + this.bitmap = bitmap; this.failedReason = failedReason; } @@ -494,19 +489,19 @@ private void startGetImageThread(final String imageUrl, final List urlLi @Override public void run() { - CacheObject object = get(imageUrl, urlList); - Drawable drawable = (object == null ? null : object.getData()); - if (drawable == null) { - // if drawable is null, remove it + CacheObject object = get(imageUrl, urlList); + Bitmap bitmap = (object == null ? null : object.getData()); + if (bitmap == null) { + // if bitmap is null, remove it remove(imageUrl); FailedReason failedReason = new FailedReason(FailedType.ERROR_NETWORK, new FailedException("get image from network error")); handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, - drawable, + bitmap, failedReason))); } else { handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, - drawable))); + bitmap))); } } }); @@ -517,20 +512,20 @@ public void run() { * * @return */ - public OnGetDataListener getDefaultOnGetImageListener() { - return new OnGetDataListener() { + public OnGetDataListener getDefaultOnGetImageListener() { + return new OnGetDataListener() { private static final long serialVersionUID = 1L; @Override - public CacheObject onGetData(String key) { - Drawable d = null; + public CacheObject onGetData(String key) { + Bitmap d = null; try { - d = ImageUtils.getDrawableFromUrl(key, httpReadTimeOut, requestProperties); + d = ImageUtils.getBitmapFromUrl(key, httpReadTimeOut, requestProperties); } catch (Exception e) { - Log.e(TAG, "get drawable exception, imageUrl is:" + key, e); + Log.e(TAG, "get image exception, imageUrl is:" + key, e); } - return (d == null ? null : new CacheObject(d)); + return (d == null ? null : new CacheObject(d)); } }; } diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 9a26c06..51d4a5e 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -815,7 +815,7 @@ public CacheObject onGetData(String key) { FileUtils.writeFile(savePath, stream); } else { Log.e(TAG, - new StringBuilder().append("get drawable exception while write to file, imageUrl is: ") + new StringBuilder().append("get image exception while write to file, imageUrl is: ") .append(key).append(", savePath is ").append(savePath) .toString(), e); savePath = null; @@ -823,8 +823,8 @@ public CacheObject onGetData(String key) { } } } catch (Exception e) { - Log.e(TAG, new StringBuilder().append("get drawable exception, imageUrl is:").append(key) - .toString(), e); + Log.e(TAG, new StringBuilder().append("get image exception, imageUrl is:").append(key).toString(), + e); } return (StringUtils.isEmpty(savePath) ? null : new CacheObject(savePath)); diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableLarge.java b/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java similarity index 62% rename from src/cn/trinea/android/common/service/impl/RemoveTypeDrawableLarge.java rename to src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java index b6a8b53..c88b3e7 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableLarge.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java @@ -1,27 +1,26 @@ package cn.trinea.android.common.service.impl; -import android.graphics.drawable.Drawable; - +import android.graphics.Bitmap; import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.util.ImageUtils; /** - * Remove type when cache is full, data type of cache is drawable.
                      + * Remove type when cache is full, data type of cache is bitmap.
                      *
                        - *
                      • if drawable is bigger, remove it first
                      • - *
                      • if drawable is equal to each other, remove the one which is used less
                      • - *
                      • if drawable is equal to each other and used count is equal, remove the one which is first in
                      • + *
                      • if bitmap is bigger, remove it first
                      • + *
                      • if bitmap is equal to each other, remove the one which is used less
                      • + *
                      • if bitmap is equal to each other and used count is equal, remove the one which is first in
                      • *
                      * * @author Trinea 2011-12-26 */ -public class RemoveTypeDrawableLarge implements CacheFullRemoveType { +public class RemoveTypeBitmapLarge implements CacheFullRemoveType { private static final long serialVersionUID = 1L; @Override - public int compare(CacheObject obj1, CacheObject obj2) { + public int compare(CacheObject obj1, CacheObject obj2) { long sizeOfFile1 = getSize(obj1); long sizeOfFile2 = getSize(obj2); if (sizeOfFile1 == sizeOfFile2) { @@ -35,18 +34,18 @@ public int compare(CacheObject obj1, CacheObject obj2) { } /** - * get size of drawable + * get size of bitmap * * @param o * @return */ - private long getSize(CacheObject o) { + private long getSize(CacheObject o) { if (o == null) { return -1; } // TODO is there any more efficient way? - byte[] b = ImageUtils.drawableToByte(o.getData()); + byte[] b = ImageUtils.bitmapToByte(o.getData()); return (b == null ? -1 : b.length); } } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableSmall.java b/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java similarity index 62% rename from src/cn/trinea/android/common/service/impl/RemoveTypeDrawableSmall.java rename to src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java index e0c3d8d..26f56c4 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeDrawableSmall.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java @@ -1,27 +1,26 @@ package cn.trinea.android.common.service.impl; -import android.graphics.drawable.Drawable; - +import android.graphics.Bitmap; import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.util.ImageUtils; /** - * Remove type when cache is full, data type of cache is drawable.
                      + * Remove type when cache is full, data type of cache is bitmap.
                      *
                        - *
                      • if drawable is smaller, remove it first
                      • - *
                      • if drawable is equal to each other, remove the one which is used less
                      • - *
                      • if drawable is equal to each other and used count is equal, remove the one which is first in
                      • + *
                      • if bitmap is smaller, remove it first
                      • + *
                      • if bitmap is equal to each other, remove the one which is used less
                      • + *
                      • if bitmap is equal to each other and used count is equal, remove the one which is first in
                      • *
                      * * @author Trinea 2011-12-26 */ -public class RemoveTypeDrawableSmall implements CacheFullRemoveType { +public class RemoveTypeBitmapSmall implements CacheFullRemoveType { private static final long serialVersionUID = 1L; @Override - public int compare(CacheObject obj1, CacheObject obj2) { + public int compare(CacheObject obj1, CacheObject obj2) { long sizeOfFile1 = getSize(obj1); long sizeOfFile2 = getSize(obj2); if (sizeOfFile1 == sizeOfFile2) { @@ -35,18 +34,18 @@ public int compare(CacheObject obj1, CacheObject obj2) { } /** - * get size of drawable + * get size of bitmap * * @param o * @return */ - private long getSize(CacheObject o) { + private long getSize(CacheObject o) { if (o == null) { return -1; } // TODO is there any more efficient way? - byte[] b = ImageUtils.drawableToByte(o.getData()); + byte[] b = ImageUtils.bitmapToByte(o.getData()); return (b == null ? -1 : b.length); } } diff --git a/src/cn/trinea/android/common/util/ImageCacheManager.java b/src/cn/trinea/android/common/util/ImageCacheManager.java index 6457f29..f4ec343 100644 --- a/src/cn/trinea/android/common/util/ImageCacheManager.java +++ b/src/cn/trinea/android/common/util/ImageCacheManager.java @@ -2,7 +2,6 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.Drawable; import android.view.View; import android.view.animation.AlphaAnimation; import android.widget.ImageView; @@ -69,10 +68,10 @@ private static void setImageCache() { OnImageCallbackListener imageCallBack = new OnImageCallbackListener() { @Override - public void onGetSuccess(String imageUrl, Drawable imageDrawable, View view, boolean isInCache) { - if (view != null && imageDrawable != null) { + public void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolean isInCache) { + if (view != null && loadedImage != null) { ImageView imageView = (ImageView)view; - imageView.setImageDrawable(imageDrawable); + imageView.setImageBitmap(loadedImage); // first time show with animation if (!isInCache) { imageView.startAnimation(getInAlphaAnimation(2000)); @@ -85,7 +84,7 @@ public void onPreGet(String imageUrl, View view) { } @Override - public void onGetFailed(String imageUrl, Drawable imageDrawable, View view, FailedReason failedReason) { + public void onGetFailed(String imageUrl, Bitmap loadedImage, View view, FailedReason failedReason) { } @Override @@ -93,7 +92,7 @@ public void onGetNotInCache(String imageUrl, View view) { } }; imageCache.setOnImageCallbackListener(imageCallBack); - imageCache.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); + imageCache.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); imageCache.setHttpReadTimeOut(10000); imageCache.setValidTime(-1); From 824d7143fc1f3b287e06e5b55d76c1a50481fb53 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 20 Feb 2014 20:28:32 +0800 Subject: [PATCH 152/241] modify ImageCache replace Drawable with Bitmap add OutOfMemoryError fix onGetSuccess be called twice --- AndroidManifest.xml | 2 +- .../common/entity/FailedException.java | 22 ------- .../android/common/entity/FailedReason.java | 21 ++++--- .../common/service/impl/ImageMemoryCache.java | 37 ++++++----- .../common/service/impl/ImageSDCardCache.java | 62 +++++++++++-------- .../android/common/util/ShellUtils.java | 2 +- 6 files changed, 73 insertions(+), 73 deletions(-) delete mode 100644 src/cn/trinea/android/common/entity/FailedException.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d58ead9..c118e2c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="4.2.9" > diff --git a/src/cn/trinea/android/common/entity/FailedException.java b/src/cn/trinea/android/common/entity/FailedException.java deleted file mode 100644 index 216dedf..0000000 --- a/src/cn/trinea/android/common/entity/FailedException.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.trinea.android.common.entity; - -/** - * get data failed exception - * - * @author Trinea 2013-11-25 - */ -public class FailedException extends Throwable { - - private static final long serialVersionUID = 1L; - - /** - * Constructs a new exception with the specified detail message. The cause is not initialized, and may subsequently - * be initialized by a call to {@link #initCause}. - * - * @param message the detail message. The detail message is saved for later retrieval by the {@link #getMessage()} - * method. - */ - public FailedException(String message){ - super(message); - } -} diff --git a/src/cn/trinea/android/common/entity/FailedReason.java b/src/cn/trinea/android/common/entity/FailedReason.java index de3bd1e..fbaa443 100644 --- a/src/cn/trinea/android/common/entity/FailedReason.java +++ b/src/cn/trinea/android/common/entity/FailedReason.java @@ -7,11 +7,15 @@ */ public class FailedReason { - private FailedType failedType; - /** reserved field, it's no use now, waiting to be perfect^_^ **/ - private FailedException cause; + private FailedType failedType; + private Throwable cause; - public FailedReason(FailedType failedType, FailedException cause){ + public FailedReason(FailedType failedType, String cause){ + this.failedType = failedType; + this.cause = new Throwable(cause); + } + + public FailedReason(FailedType failedType, Throwable cause){ this.failedType = failedType; this.cause = cause; } @@ -29,18 +33,15 @@ public FailedType getFailedType() { * get cause * * @return the cause - * @deprecated Reserved field, it's no use now, waiting to be perfect^_^ */ - public FailedException getCause() { + public Throwable getCause() { return cause; } public static enum FailedType { - /** get image error from network **/ - ERROR_NETWORK, - /** save image to sdcard error **/ + /** get image from network or save image to sdcard error **/ ERROR_IO, - /** reserved field, it's no use now, waiting to be perfect^_^ **/ + /** get image with out of memory error **/ ERROR_OUT_OF_MEMORY, /** reserved field, it's no use now, waiting to be perfect^_^ **/ ERROR_UNKNOWN, diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index 8c619a4..ff38471 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -16,7 +16,6 @@ import android.util.Log; import android.view.View; import cn.trinea.android.common.entity.CacheObject; -import cn.trinea.android.common.entity.FailedException; import cn.trinea.android.common.entity.FailedReason; import cn.trinea.android.common.entity.FailedReason.FailedType; import cn.trinea.android.common.service.CacheFullRemoveType; @@ -141,9 +140,7 @@ public boolean get(final String imageUrl, final List urlList, final View if (object != null) { Bitmap bitmap = object.getData(); if (bitmap != null) { - if (onImageCallbackListener != null) { - onImageCallbackListener.onGetSuccess(imageUrl, bitmap, view, true); - } + onGetSuccess(imageUrl, bitmap, view, true); return true; } else { remove(imageUrl); @@ -416,13 +413,12 @@ public void handleMessage(Message message) { if (viewSet != null) { for (View view : viewSet) { if (view != null) { - onImageCallbackListener.onGetSuccess(imageUrl, bitmap, view, false); - } - if (WHAT_GET_IMAGE_SUCCESS == message.what) { - onImageCallbackListener.onGetSuccess(imageUrl, bitmap, view, false); - } else { - onImageCallbackListener.onGetFailed(imageUrl, bitmap, view, - object.failedReason); + if (WHAT_GET_IMAGE_SUCCESS == message.what) { + onGetSuccess(imageUrl, bitmap, view, false); + } else { + onImageCallbackListener.onGetFailed(imageUrl, bitmap, view, + object.failedReason); + } } } } @@ -431,7 +427,7 @@ public void handleMessage(Message message) { View view = viewMap.get(imageUrl); if (view != null) { if (WHAT_GET_IMAGE_SUCCESS == message.what) { - onImageCallbackListener.onGetSuccess(imageUrl, bitmap, view, false); + onGetSuccess(imageUrl, bitmap, view, false); } else { onImageCallbackListener.onGetFailed(imageUrl, bitmap, view, object.failedReason); } @@ -451,6 +447,19 @@ public void handleMessage(Message message) { } }; + private void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolean isInCache) { + if (onImageCallbackListener == null) { + return; + } + + try { + onImageCallbackListener.onGetSuccess(imageUrl, loadedImage, view, isInCache); + } catch (OutOfMemoryError e) { + onImageCallbackListener.onGetFailed(imageUrl, loadedImage, view, + new FailedReason(FailedType.ERROR_OUT_OF_MEMORY, e)); + } + } + /** * message object * @@ -494,8 +503,8 @@ public void run() { if (bitmap == null) { // if bitmap is null, remove it remove(imageUrl); - FailedReason failedReason = new FailedReason(FailedType.ERROR_NETWORK, - new FailedException("get image from network error")); + String failedException = "get image from network or save image to sdcard error. please make sure you have added permission android.permission.WRITE_EXTERNAL_STORAGE and android.permission.ACCESS_NETWORK_STATE"; + FailedReason failedReason = new FailedReason(FailedType.ERROR_IO, failedException); handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, bitmap, failedReason))); diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 51d4a5e..151fb34 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -20,7 +20,6 @@ import android.view.View; import cn.trinea.android.common.dao.impl.ImageSDCardCacheDaoImpl; import cn.trinea.android.common.entity.CacheObject; -import cn.trinea.android.common.entity.FailedException; import cn.trinea.android.common.entity.FailedReason; import cn.trinea.android.common.entity.FailedReason.FailedType; import cn.trinea.android.common.service.CacheFullRemoveType; @@ -167,9 +166,7 @@ public boolean get(final String imageUrl, final List urlList, final View if (object != null) { String imagePath = object.getData(); if (!StringUtils.isEmpty(imagePath) && FileUtils.isFileExist(imagePath)) { - if (onImageSDCallbackListener != null) { - onImageSDCallbackListener.onGetSuccess(imageUrl, imagePath, view, true); - } + onGetSuccess(imageUrl, imagePath, view, true); return true; } else { remove(imageUrl); @@ -486,7 +483,7 @@ public void handleMessage(Message message) { for (View view : viewSet) { if (view != null) { if (WHAT_GET_IMAGE_SUCCESS == message.what) { - onImageSDCallbackListener.onGetSuccess(imageUrl, imagePath, view, false); + onGetSuccess(imageUrl, imagePath, view, false); } else { onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, object.failedReason); @@ -499,7 +496,7 @@ public void handleMessage(Message message) { View view = viewMap.get(imageUrl); if (view != null) { if (WHAT_GET_IMAGE_SUCCESS == message.what) { - onImageSDCallbackListener.onGetSuccess(imageUrl, imagePath, view, false); + onGetSuccess(imageUrl, imagePath, view, false); } else { onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, object.failedReason); @@ -520,6 +517,19 @@ public void handleMessage(Message message) { } } + private void onGetSuccess(String imageUrl, String imagePath, View view, boolean isInCache) { + if (onImageSDCallbackListener == null) { + return; + } + + try { + onImageSDCallbackListener.onGetSuccess(imageUrl, imagePath, view, isInCache); + } catch (OutOfMemoryError e) { + onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, + new FailedReason(FailedType.ERROR_OUT_OF_MEMORY, e)); + } + } + /** * message object * @@ -562,13 +572,8 @@ public void run() { if (StringUtils.isEmpty(imagePath) || !FileUtils.isFileExist(imagePath)) { // if image get fail, remove it remove(imageUrl); - FailedReason failedReason; - if (object == null) { - failedReason = new FailedReason(FailedType.ERROR_NETWORK, - new FailedException("get image from network error")); - } else { - failedReason = new FailedReason(FailedType.ERROR_IO, new FailedException("save image error")); - } + String failedException = "get image from network or save image to sdcard error. please make sure you have added permission android.permission.WRITE_EXTERNAL_STORAGE and android.permission.ACCESS_NETWORK_STATE"; + FailedReason failedReason = new FailedReason(FailedType.ERROR_IO, failedException); handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, imagePath, failedReason))); @@ -803,30 +808,37 @@ public OnGetDataListener getDefaultOnGetImageListener() { public CacheObject onGetData(String key) { String savePath = null; + InputStream stream = null; try { - InputStream stream = ImageUtils.getInputStreamFromUrl(key, httpReadTimeOut, requestProperties); - if (stream != null) { - savePath = cacheFolder + File.separator + fileNameRule.getFileName(key); + stream = ImageUtils.getInputStreamFromUrl(key, httpReadTimeOut, requestProperties); + } catch (Exception e) { + Log.e(TAG, new StringBuilder().append("get image exception, imageUrl is:").append(key).toString(), + e); + } + + if (stream != null) { + savePath = cacheFolder + File.separator + fileNameRule.getFileName(key); + try { + FileUtils.writeFile(savePath, stream); + } catch (Exception e1) { try { - FileUtils.writeFile(savePath, stream); - } catch (Exception e) { - if (e.getCause() instanceof FileNotFoundException) { + if (e1.getCause() instanceof FileNotFoundException) { FileUtils.makeFolders(savePath); FileUtils.writeFile(savePath, stream); } else { Log.e(TAG, new StringBuilder().append("get image exception while write to file, imageUrl is: ") .append(key).append(", savePath is ").append(savePath) - .toString(), e); - savePath = null; + .toString(), e1); } + } catch (Exception e2) { + Log.e(TAG, + new StringBuilder().append("get image exception while write to file, imageUrl is: ") + .append(key).append(", savePath is ").append(savePath).toString(), + e2); } } - } catch (Exception e) { - Log.e(TAG, new StringBuilder().append("get image exception, imageUrl is:").append(key).toString(), - e); } - return (StringUtils.isEmpty(savePath) ? null : new CacheObject(savePath)); } }; diff --git a/src/cn/trinea/android/common/util/ShellUtils.java b/src/cn/trinea/android/common/util/ShellUtils.java index e658692..185a1c8 100644 --- a/src/cn/trinea/android/common/util/ShellUtils.java +++ b/src/cn/trinea/android/common/util/ShellUtils.java @@ -186,7 +186,7 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, boole } /** - * result of command, + * result of command *
                        *
                      • {@link CommandResult#result} means result of command, 0 means normal, else means error, same to excute in * linux shell
                      • From 42fce62ba728829ef0c9012bb9d266d18e5f5002 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 20 Feb 2014 20:35:05 +0800 Subject: [PATCH 153/241] modfiy versionCode --- AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c118e2c..9c270e2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,7 +1,7 @@ From 3d388d43da0d01bee2bcab84e36ef916d3edfffb Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 21 Feb 2014 18:54:29 +0800 Subject: [PATCH 154/241] add link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e79b617..22b15ff 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ ####三. 工具类 具体介绍可见:[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) -目前包括HttpUtils、DownloadManagerPro、ShellUtils、PackageUtils、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、MapUtils、ObjectUtils、SerializeUtils、SystemUtils、TimeUtils。 +目前包括HttpUtils、[DownloadManagerPro](http://www.trinea.cn/android/android-downloadmanager/)、[ShellUtils](http://www.trinea.cn/android/android-java-execute-shell-commands/)、[PackageUtils](http://www.trinea.cn/android/android-silent-install/)、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、MapUtils、ObjectUtils、SerializeUtils、SystemUtils、TimeUtils。
                        #####1. Android系统下载管理DownloadManager使用 使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android%E7%B3%BB%E7%BB%9F%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D%E5%8F%8A%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B/) From 09686d1682310c5f001b56ce55f2b5b0020e5bd4 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 22 Feb 2014 19:26:17 +0800 Subject: [PATCH 155/241] modify link --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 22b15ff..4b33cfc 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,14 @@ ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 -使用见:[图片缓存的使用](http://www.trinea.cn/?p=704) +使用见:[图片缓存的使用](http://www.trinea.cn/android/android-imagecache/) 适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。效果图如下: ![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) #####2. 图片SD卡缓存 -使用见:[图片SD卡缓存的使用](http://www.trinea.cn/?p=757) -适用:应用中获取图片较多且图片较大的情况,需要二级缓存及ListView或GridView图片加载推荐使用上面的[ImageCache](http://www.trinea.cn/?p=704)。效果图如下: +使用见:[图片SD卡缓存的使用](http://www.trinea.cn/android/android-imagesdcardcache/) +适用:应用中获取图片较多且图片较大的情况。需要二级缓存及ListView或GridView图片加载推荐使用上面的[ImageCache](http://www.trinea.cn/android/android-imagecache/)。效果图如下: ![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) @@ -37,19 +37,19 @@ ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview -使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/滚动到底部加载更多及下拉刷新listview的使用) +使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/dropdown-to-refresh-and-bottom-load-more-listview/) 实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281)。效果图如下: ![DropDownListView](http://farm8.staticflickr.com/7376/9312162951_74b597ebaa_o.jpg) #####2. 滑动一页(一个Item)的Gallery -使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery%E6%BB%91%E5%8A%A8%E4%B8%80%E9%A1%B5%E4%B8%80%E4%B8%AAitem%E6%95%88%E6%9E%9C/)。效果图如下: +使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery-scroll-one-page/)。效果图如下: ![ViewPager1](http://farm8.staticflickr.com/7330/9321381014_fb404e2430_o.jpg) ![ViewPager2](http://farm3.staticflickr.com/2827/9321380982_d8619d1601_o.jpg) #####3. 滑动到底部或顶部响应的ScrollView -使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/%E6%BB%9A%E5%8A%A8%E5%88%B0%E5%BA%95%E9%83%A8%E6%88%96%E9%A1%B6%E9%83%A8%E5%93%8D%E5%BA%94%E7%9A%84scrollview%E4%BD%BF%E7%94%A8/)。效果图如下: +使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/on-bottom-load-more-scrollview/)。效果图如下: ![ScrollView](http://farm4.staticflickr.com/3669/9459686814_1a523ceeb6_o.jpg) @@ -58,13 +58,13 @@ 目前包括HttpUtils、[DownloadManagerPro](http://www.trinea.cn/android/android-downloadmanager/)、[ShellUtils](http://www.trinea.cn/android/android-java-execute-shell-commands/)、[PackageUtils](http://www.trinea.cn/android/android-silent-install/)、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、MapUtils、ObjectUtils、SerializeUtils、SystemUtils、TimeUtils。
                        #####1. Android系统下载管理DownloadManager使用 -使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android%E7%B3%BB%E7%BB%9F%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D%E5%8F%8A%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B/) -功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android%E4%B8%8B%E8%BD%BD%E7%AE%A1%E7%90%86downloadmanager%E5%8A%9F%E8%83%BD%E5%A2%9E%E5%BC%BA%E5%92%8Cbug%E4%BF%AE%E6%94%B9/) +使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android-downloadmanager/) +功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android-downloadmanager-pro/) 效果图如下: ![downloadManagerDemo](http://www.trinea.cn/wp-content/uploads/2013/05/downloadDemo2.gif) #####2. Android APK root权限静默安装 -使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android%E5%B8%B8%E7%94%A8%E4%BB%A3%E7%A0%81%E4%B9%8Bapk-root%E6%9D%83%E9%99%90%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85/) +使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android-silent-install/) #####3. Android root权限 直接调用[ShellUtils.execCommand](https://github.com/Trinea/AndroidCommon/blob/master/src/cn/trinea/android/common/util/ShellUtils.java#LC43)方法 From 7ae006c977287cc34ce849968df9689bdb849bec Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 25 Feb 2014 19:17:49 +0800 Subject: [PATCH 156/241] add Proguard --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b33cfc..002af90 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,14 @@ #####4. 图片工具类 (1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap 更多工具类介绍见[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) - + + +### Proguard +``` xml +-keep class cn.trinea.android.** { *; } +-keepclassmembers class cn.trinea.android.** { *; } +-dontwarn cn.trinea.android.** +``` ## License From 36c06ceacdf6f81174da1df73ca4dfcaea0954f3 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 25 Feb 2014 20:35:42 +0800 Subject: [PATCH 157/241] Add proguard.cfg --- proguard.cfg | 98 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 77 insertions(+), 21 deletions(-) diff --git a/proguard.cfg b/proguard.cfg index 71053a9..1b58bb4 100644 --- a/proguard.cfg +++ b/proguard.cfg @@ -1,37 +1,93 @@ --optimizationpasses 5 --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} +# see http://sourceforge.net/tracker/?func=detail&aid=2787465&group_id=54750&atid=474707 +-optimizations !code/simplification/arithmetic +-optimizations !code/simplification/cast +-allowaccessmodification + +# To prevent name conflict in incremental obfuscation. +-useuniqueclassmembernames + +# dex does not like code run through proguard optimize and preverify steps. +-dontoptimize -dontpreverify --verbose --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* - --keep public class * extends android.app.Activity --keep public class * extends android.app.Application --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider --keep public class * extends android.app.backup.BackupAgentHelper --keep public class * extends android.preference.Preference --keep public class com.android.vending.licensing.ILicensingService +# Don't obfuscate. We only need dead code striping. +# -dontobfuscate + +# Add this flag in your package's own configuration if it's needed. +#-flattenpackagehierarchy + +# Some classes in the libraries extend package private classes to chare common functionality +# that isn't explicitly part of the API +-dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers + +# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native ; } --keepclasseswithmembernames class * { - public (android.content.Context, android.util.AttributeSet); +# class$ methods are inserted by some compilers to implement .class construct, +# see http://proguard.sourceforge.net/manual/examples.html#library +-keepclassmembernames class * { + java.lang.Class class$(java.lang.String); + java.lang.Class class$(java.lang.String, boolean); } --keepclasseswithmembernames class * { - public (android.content.Context, android.util.AttributeSet, int); +# Keep classes and methods that have the guava @VisibleForTesting annotation +-keep @com.google.common.annotations.VisibleForTesting class * +-keepclassmembers class * { +@com.google.common.annotations.VisibleForTesting *; } --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); +# Keep serializable classes and necessary members for serializable classes +# Copied from the ProGuard manual at http://proguard.sourceforge.net. +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); } + -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } +-keepattributes *Annotation* + +-dontskipnonpubliclibraryclasses +-dontskipnonpubliclibraryclassmembers + +# Keep cn.trinea +-keep class cn.trinea.android.** { *; } +-keepclassmembers class cn.trinea.android.** { *; } +-dontwarn cn.trinea.android.** \ No newline at end of file From bc0c89c2c8c8e4206ce0da7a68d25efd87b6a01a Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 26 Feb 2014 00:08:08 +0800 Subject: [PATCH 158/241] Add Contact Me --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 002af90..8ec105f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)android-common-lib ------------- **主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 -**示例源码**:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 -使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 -**Api Guide**:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 -**个人博客**:[www.trinea.cn](http://www.trinea.cn/) 关注于[Android](http://www.trinea.cn/category/android/)、[Java](http://www.trinea.cn/category/java/)、[性能优化](http://www.trinea.cn/category/perf/)、[开源代码](http://www.trinea.cn/category/open-code/)。 -####示例APK下载(Demo Download): +示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 +使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 +Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 + +微博:[Trinea](https://weibo.com/trinea)    主页:[trinea.cn](http://www.trinea.cn/)    邮箱:[trinea.cn@gmail.com](mailto:trinea.cn@gmail.com)    QQ:[717763774](http://wpa.qq.com/msgrd?v=3&uin=717763774&site=qq&menu=yes) + +####示例APK: From 091e9cc52294d4d61fe40b210319d6a16d7af25e Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 26 Feb 2014 00:35:37 +0800 Subject: [PATCH 159/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ec105f..cc15583 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 -微博:[Trinea](https://weibo.com/trinea)    主页:[trinea.cn](http://www.trinea.cn/)    邮箱:[trinea.cn@gmail.com](mailto:trinea.cn@gmail.com)    QQ:[717763774](http://wpa.qq.com/msgrd?v=3&uin=717763774&site=qq&menu=yes) +微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    QQ:717763774 ####示例APK: From a6f69b6a9545ee5f079fc2413c598b8735221530 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 4 Mar 2014 18:01:00 +0800 Subject: [PATCH 160/241] Modify HttpResponse getExpiredTime --- .../android/common/entity/HttpResponse.java | 17 ++++++++++++----- .../trinea/android/common/util/HttpUtils.java | 1 - 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/cn/trinea/android/common/entity/HttpResponse.java index a9c65d7..6ecdfca 100644 --- a/src/cn/trinea/android/common/entity/HttpResponse.java +++ b/src/cn/trinea/android/common/entity/HttpResponse.java @@ -20,9 +20,8 @@ * Get *
                      • {@link #getResponseBody()}
                      • *
                      • {@link #getUrl()}
                      • - *
                      • {@link #getExpiresInMillis()} expires time
                      • + *
                      • {@link #getExpiredTime()} expires time
                      • *
                      • {@link #getExpiresHeader()}
                      • - *
                      • {@link #getCacheControlMaxAge()}
                      • *
                      *
                        * Setting @@ -47,6 +46,7 @@ public class HttpResponse { /** this is a client mark, whether this response is in client cache **/ private boolean isInCache; + private boolean isInitExpiredTime; /** * An int representing the three digit HTTP Status-Code. *
                          @@ -63,6 +63,7 @@ public HttpResponse(String url){ this.url = url; type = 0; isInCache = false; + isInitExpiredTime = false; responseHeaders = new HashMap(); } @@ -155,6 +156,7 @@ public void setType(int type) { * @param expiredTime */ public void setExpiredTime(long expiredTime) { + isInitExpiredTime = true; this.expiredTime = expiredTime; } @@ -171,7 +173,12 @@ public void setExpiredTime(long expiredTime) { *
                        */ public long getExpiredTime() { - return expiredTime; + if (isInitExpiredTime) { + return expiredTime; + } else { + isInitExpiredTime = true; + return expiredTime = getExpiresInMillis(); + } } /** @@ -222,7 +229,7 @@ public String getExpiresHeader() { * * @return -1 represents http error or no cache-control in response headers, or max-age in seconds */ - public int getCacheControlMaxAge() { + private int getCacheControlMaxAge() { try { String cacheControl = (String)responseHeaders.get(HttpConstants.CACHE_CONTROL); if (!StringUtils.isEmpty(cacheControl)) { @@ -254,7 +261,7 @@ public int getCacheControlMaxAge() { *
                      • if something error, return -1
                      • *
                      */ - public long getExpiresInMillis() { + private long getExpiresInMillis() { int maxAge = getCacheControlMaxAge(); if (maxAge != -1) { return System.currentTimeMillis() + maxAge * 1000; diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index d53a705..25f328b 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -465,7 +465,6 @@ private static void setHttpResponse(HttpURLConnection urlConnection, HttpRespons } response.setResponseHeader(HttpConstants.EXPIRES, urlConnection.getHeaderField("Expires")); response.setResponseHeader(HttpConstants.CACHE_CONTROL, urlConnection.getHeaderField("Cache-Control")); - response.setExpiredTime(response.getExpiresInMillis()); } /** From 670a1f418947e88937a3aef907bb26560e15a4ec Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 11 Mar 2014 09:49:46 +0800 Subject: [PATCH 161/241] Fix OOM bug --- .../common/service/impl/ImageMemoryCache.java | 31 +++++++++++-------- .../common/service/impl/ImageSDCardCache.java | 31 +++++++++++-------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index ff38471..01e82ba 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -498,19 +498,24 @@ private void startGetImageThread(final String imageUrl, final List urlLi @Override public void run() { - CacheObject object = get(imageUrl, urlList); - Bitmap bitmap = (object == null ? null : object.getData()); - if (bitmap == null) { - // if bitmap is null, remove it - remove(imageUrl); - String failedException = "get image from network or save image to sdcard error. please make sure you have added permission android.permission.WRITE_EXTERNAL_STORAGE and android.permission.ACCESS_NETWORK_STATE"; - FailedReason failedReason = new FailedReason(FailedType.ERROR_IO, failedException); - handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, - bitmap, - failedReason))); - } else { - handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, - bitmap))); + try { + CacheObject object = get(imageUrl, urlList); + Bitmap bitmap = (object == null ? null : object.getData()); + if (bitmap == null) { + // if bitmap is null, remove it + remove(imageUrl); + String failedException = "get image from network or save image to sdcard error. please make sure you have added permission android.permission.WRITE_EXTERNAL_STORAGE and android.permission.ACCESS_NETWORK_STATE"; + FailedReason failedReason = new FailedReason(FailedType.ERROR_IO, failedException); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, + new MessageObject(imageUrl, bitmap, failedReason))); + } else { + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, + bitmap))); + } + } catch (OutOfMemoryError e) { + MessageObject msg = new MessageObject(imageUrl, null, + new FailedReason(FailedType.ERROR_OUT_OF_MEMORY, e)); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, msg)); } } }); diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 151fb34..e7496f2 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -567,19 +567,24 @@ private void startGetImageThread(final String imageUrl, final List urlLi @Override public void run() { - CacheObject object = get(imageUrl, urlList); - String imagePath = (object == null ? null : object.getData()); - if (StringUtils.isEmpty(imagePath) || !FileUtils.isFileExist(imagePath)) { - // if image get fail, remove it - remove(imageUrl); - String failedException = "get image from network or save image to sdcard error. please make sure you have added permission android.permission.WRITE_EXTERNAL_STORAGE and android.permission.ACCESS_NETWORK_STATE"; - FailedReason failedReason = new FailedReason(FailedType.ERROR_IO, failedException); - handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, - imagePath, - failedReason))); - } else { - handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, - imagePath))); + try { + CacheObject object = get(imageUrl, urlList); + String imagePath = (object == null ? null : object.getData()); + if (StringUtils.isEmpty(imagePath) || !FileUtils.isFileExist(imagePath)) { + // if image get fail, remove it + remove(imageUrl); + String failedException = "get image from network or save image to sdcard error. please make sure you have added permission android.permission.WRITE_EXTERNAL_STORAGE and android.permission.ACCESS_NETWORK_STATE"; + FailedReason failedReason = new FailedReason(FailedType.ERROR_IO, failedException); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, + new MessageObject(imageUrl, imagePath, failedReason))); + } else { + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, + imagePath))); + } + } catch (OutOfMemoryError e) { + MessageObject msg = new MessageObject(imageUrl, null, + new FailedReason(FailedType.ERROR_OUT_OF_MEMORY, e)); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, msg)); } } }); From 7013abb1456c2284e046114cbcbaf491a000d735 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 11 Mar 2014 15:01:52 +0800 Subject: [PATCH 162/241] Add .project --- .gitignore | 1 - .project | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 .project diff --git a/.gitignore b/.gitignore index 45c174e..93cd6aa 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ gen bin/* *.pydevproject -.project .metadata bin/ tmp/ diff --git a/.project b/.project new file mode 100644 index 0000000..befe3dd --- /dev/null +++ b/.project @@ -0,0 +1,33 @@ + + + trinea-android-common + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + From 78e6634069d2d9aefa354b86e3ab98e51a3d3682 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 24 Mar 2014 20:06:40 +0800 Subject: [PATCH 163/241] Add DigestUtils --- .../android/common/util/DigestUtils.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/cn/trinea/android/common/util/DigestUtils.java diff --git a/src/cn/trinea/android/common/util/DigestUtils.java b/src/cn/trinea/android/common/util/DigestUtils.java new file mode 100644 index 0000000..2ac8b7e --- /dev/null +++ b/src/cn/trinea/android/common/util/DigestUtils.java @@ -0,0 +1,55 @@ +package cn.trinea.android.common.util; + +import java.security.MessageDigest; + +/** + * DigestUtils + * + * @author Trinea 2014-03-20 + */ +public class DigestUtils { + + /** + * Used to build output as Hex + */ + private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', + 'e', 'f' }; + + /** + * encode By MD5 + * + * @param str + * @return String + */ + public static String md5(String str) { + if (str == null) { + return null; + } + try { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.update(str.getBytes()); + return new String(encodeHex(messageDigest.digest())); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order. + * The returned array will be double the length of the passed array, as it takes two characters to represent any + * given byte. + * + * @param data a byte[] to convert to Hex characters + * @return A char[] containing hexadecimal characters + */ + protected static char[] encodeHex(final byte[] data) { + final int l = data.length; + final char[] out = new char[l << 1]; + // two characters form the hex value. + for (int i = 0, j = 0; i < l; i++) { + out[j++] = DIGITS_LOWER[(0xF0 & data[i]) >>> 4]; + out[j++] = DIGITS_LOWER[0x0F & data[i]]; + } + return out; + } +} From 131dac664b42c5cf7f284fb48a50d7a3c9a2c370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=9B=B4=E6=96=B0?= Date: Wed, 9 Apr 2014 21:34:26 +0800 Subject: [PATCH 164/241] Add writeFile(String, List, boolean) --- AndroidManifest.xml | 8 +- project.properties | 2 +- .../trinea/android/common/util/FileUtils.java | 75 ++++++++++++++++++- 3 files changed, 78 insertions(+), 7 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9c270e2..f3bb91a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,10 +1,12 @@ + android:versionCode="30" + android:versionName="4.2.10" > - + diff --git a/project.properties b/project.properties index b3b1d5a..03d0617 100644 --- a/project.properties +++ b/project.properties @@ -11,5 +11,5 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-9 +target=android-10 android.library=true diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index 420d924..6c5f45e 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -19,7 +19,10 @@ * Read or write file *
                    • {@link #readFile(String)} read file
                    • *
                    • {@link #readFileToList(String)} read file to string list
                    • - *
                    • {@link #writeFile(String, String, boolean)} write file
                    • + *
                    • {@link #writeFile(String, String, boolean)} write file from String
                    • + *
                    • {@link #writeFile(String, String)} write file from String
                    • + *
                    • {@link #writeFile(String, List, boolean)} write file from String List
                    • + *
                    • {@link #writeFile(String, List)} write file from String List
                    • *
                    • {@link #writeFile(String, InputStream)} write file
                    • *
                    • {@link #writeFile(String, InputStream, boolean)} write file
                    • *
                    • {@link #writeFile(File, InputStream)} write file
                    • @@ -92,10 +95,14 @@ public static StringBuilder readFile(String filePath, String charsetName) { * @param filePath * @param content * @param append is append, if true, write to the end of file, else clear content of file and write into it - * @return return true + * @return return false if content is empty, true otherwise * @throws RuntimeException if an error occurs while operator FileWriter */ public static boolean writeFile(String filePath, String content, boolean append) { + if (StringUtils.isEmpty(content)) { + return false; + } + FileWriter fileWriter = null; try { makeDirs(filePath); @@ -120,6 +127,68 @@ public static boolean writeFile(String filePath, String content, boolean append) * write file * * @param filePath + * @param contentList + * @param append is append, if true, write to the end of file, else clear content of file and write into it + * @return return false if contentList is empty, true otherwise + * @throws RuntimeException if an error occurs while operator FileWriter + */ + public static boolean writeFile(String filePath, List contentList, boolean append) { + if (ListUtils.isEmpty(contentList)) { + return false; + } + + FileWriter fileWriter = null; + try { + makeDirs(filePath); + fileWriter = new FileWriter(filePath, append); + int i = 0; + for (String line : contentList) { + if (i++ > 0) { + fileWriter.write("\r\n"); + } + fileWriter.write(line); + } + fileWriter.close(); + return true; + } catch (IOException e) { + throw new RuntimeException("IOException occurred. ", e); + } finally { + if (fileWriter != null) { + try { + fileWriter.close(); + } catch (IOException e) { + throw new RuntimeException("IOException occurred. ", e); + } + } + } + } + + /** + * write file, the string will be written to the begin of the file + * + * @param filePath + * @param content + * @return + */ + public static boolean writeFile(String filePath, String content) { + return writeFile(filePath, content, false); + } + + /** + * write file, the string list will be written to the begin of the file + * + * @param filePath + * @param contentList + * @return + */ + public static boolean writeFile(String filePath, List contentList) { + return writeFile(filePath, contentList, false); + } + + /** + * write file, the bytes will be written to the begin of the file + * + * @param filePath * @param stream * @return * @see {@link #writeFile(String, InputStream, boolean)} @@ -142,7 +211,7 @@ public static boolean writeFile(String filePath, InputStream stream, boolean app } /** - * write file + * write file, the bytes will be written to the begin of the file * * @param file * @param stream From 3e8308815b0d2d592276f44fdd3c6b9a02e04587 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 11 Apr 2014 19:37:45 +0800 Subject: [PATCH 165/241] HttpCache support thread cache HttpCache support thread cache Catch ImageCache OutOfMemoryError Not support Android 2.3 --- project.properties | 2 +- .../android/common/service/HttpCache.java | 17 +++++++--- .../common/service/impl/ImageCache.java | 34 +++++++++++-------- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/project.properties b/project.properties index 03d0617..22e1c48 100644 --- a/project.properties +++ b/project.properties @@ -11,5 +11,5 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-10 +target=android-14 android.library=true diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index e0659c3..049396c 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; import android.content.Context; import android.os.AsyncTask; @@ -18,6 +20,7 @@ import cn.trinea.android.common.util.HttpUtils; import cn.trinea.android.common.util.SqliteUtils; import cn.trinea.android.common.util.StringUtils; +import cn.trinea.android.common.util.SystemUtils; /** * Http Cache
                      @@ -51,7 +54,10 @@ public class HttpCache { private Map cache; /** dao to get data from http db cache **/ private HttpCacheDao httpCacheDao; - private int type = -1; + private int type = -1; + + /** Default {@link Executor} that be used to execute tasks in parallel. **/ + public static final Executor THREAD_POOL_EXECUTOR = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); public HttpCache(Context context){ if (context == null) { @@ -128,7 +134,8 @@ public HttpResponse httpGet(HttpRequest request) { if (!isNoCache) { cacheResponse = getFromCache(url); } - return cacheResponse == null ? (isNoStore ? HttpUtils.httpGet(url) : putIntoCache(HttpUtils.httpGet(url))) : cacheResponse; + return cacheResponse == null ? (isNoStore ? HttpUtils.httpGet(url) : putIntoCache(HttpUtils.httpGet(url))) + : cacheResponse; } /** @@ -144,7 +151,7 @@ public HttpResponse httpGet(HttpRequest request) { * something */ public void httpGet(String url, HttpCacheListener listener) { - new HttpCacheStringAsyncTask(listener).execute(url); + new HttpCacheStringAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, url); } /** @@ -160,7 +167,7 @@ public void httpGet(String url, HttpCacheListener listener) { * something */ public void httpGet(HttpRequest request, HttpCacheListener listener) { - new HttpCacheRequestAsyncTask(listener).execute(request); + new HttpCacheRequestAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, request); } /** @@ -309,7 +316,7 @@ private HttpResponse putIntoCache(HttpResponse httpResponse) { *
                    • if is expired, return null, otherwise return cache response
                    • *
                    */ - private HttpResponse getFromCache(String url) { + public HttpResponse getFromCache(String url) { if (StringUtils.isEmpty(url)) { return null; } diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 5fd0a3e..4efca02 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -147,23 +147,27 @@ public ImageCache(int primaryCacheMaxSize, int primaryCacheThreadPoolSize, int s @Override public CacheObject onGetData(String key) { - CacheObject object = secondaryCache.get(key); - String imagePath = (object == null ? null : object.getData()); - if (FileUtils.isFileExist(imagePath)) { - if (compressListener != null) { - compressSize = compressListener.getCompressSize(imagePath); - } - Bitmap bm; - if (compressSize > 1) { - BitmapFactory.Options option = new BitmapFactory.Options(); - option.inSampleSize = compressSize; - bm = BitmapFactory.decodeFile(imagePath, option); + try { + CacheObject object = secondaryCache.get(key); + String imagePath = (object == null ? null : object.getData()); + if (FileUtils.isFileExist(imagePath)) { + if (compressListener != null) { + compressSize = compressListener.getCompressSize(imagePath); + } + Bitmap bm; + if (compressSize > 1) { + BitmapFactory.Options option = new BitmapFactory.Options(); + option.inSampleSize = compressSize; + bm = BitmapFactory.decodeFile(imagePath, option); + } else { + bm = BitmapFactory.decodeFile(imagePath); + } + return (bm == null ? null : new CacheObject(bm)); } else { - bm = BitmapFactory.decodeFile(imagePath); + secondaryCache.remove(key); } - return (bm == null ? null : new CacheObject(bm)); - } else { - secondaryCache.remove(key); + } catch (OutOfMemoryError e) { + e.printStackTrace(); } return null; } From dc8301b0dc7121e121d835ca8ac9628c2e37fdb8 Mon Sep 17 00:00:00 2001 From: lguipeng Date: Sun, 13 Apr 2014 12:18:01 +0800 Subject: [PATCH 166/241] Update ImageCache.java --- .../common/service/impl/ImageCache.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 4efca02..3c1ce96 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -179,7 +179,41 @@ public CacheObject onGetData(String key) { secondaryCache.setCacheFolder(DEFAULT_CACHE_FOLDER); secondaryCache.setFileNameRule(new FileNameRuleImageUrl().setFileExtension("")); } - + /** + set image data from Local + */ + public void setDataFromLocal() + { + setOnGetDataListener(new OnGetDataListener() { + + @Override + public CacheObject onGetData(String key) { + if(FileUtils.isFileExist(key)) + { + Bitmap b; + + if(getCompressListener()!=null) + { + CompressListener compress_listener=getCompressListener(); + compressSize=compress_listener.getCompressSize(key); + } + if(compressSize>1) + { + BitmapFactory.Options option = new BitmapFactory.Options(); + option.inSampleSize = compressSize; + b = BitmapFactory.decodeFile(key, option); + } + else + { + b=BitmapFactory.decodeFile(key); + } + return new CacheObject(b); + }else + return null; + + } + }); + } /** * get compressSize * From 5e9863277150cd37f2c9438386e2a31b7b5a0e4a Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Apr 2014 16:38:49 +0800 Subject: [PATCH 167/241] Code format with new format xml --- .../android/common/constant/DbConstants.java | 22 +- .../common/dao/ImageSDCardCacheDao.java | 2 +- .../common/dao/impl/HttpCacheDaoImpl.java | 10 +- .../dao/impl/ImageSDCardCacheDaoImpl.java | 8 +- .../android/common/entity/CacheObject.java | 6 +- .../android/common/entity/FailedReason.java | 4 +- .../android/common/entity/HttpRequest.java | 4 +- .../android/common/entity/HttpResponse.java | 40 +- .../android/common/entity/PatchResult.java | 2 +- .../android/common/service/HttpCache.java | 29 +- .../service/impl/FileNameRuleCurrentTime.java | 9 +- .../service/impl/FileNameRuleImageUrl.java | 9 +- .../common/service/impl/ImageCache.java | 42 +- .../common/service/impl/ImageMemoryCache.java | 41 +- .../common/service/impl/ImageSDCardCache.java | 93 +-- .../common/service/impl/PreloadDataCache.java | 32 +- .../service/impl/RemoveTypeBitmapLarge.java | 4 +- .../service/impl/RemoveTypeBitmapSmall.java | 4 +- .../impl/RemoveTypeEnterTimeFirst.java | 2 +- .../service/impl/RemoveTypeEnterTimeLast.java | 2 +- .../service/impl/RemoveTypeFileLarge.java | 4 +- .../service/impl/RemoveTypeFileSmall.java | 4 +- .../impl/RemoveTypeLastUsedTimeFirst.java | 4 +- .../impl/RemoveTypeLastUsedTimeLast.java | 4 +- .../service/impl/RemoveTypeUsedCountBig.java | 2 +- .../impl/RemoveTypeUsedCountSmall.java | 2 +- .../common/service/impl/SimpleCache.java | 13 +- .../common/util/AssetDatabaseOpenHelper.java | 2 +- .../android/common/util/CacheManager.java | 2 +- .../trinea/android/common/util/DbHelper.java | 5 +- .../android/common/util/DigestUtils.java | 4 +- .../common/util/DownloadManagerPro.java | 55 +- .../trinea/android/common/util/FileUtils.java | 12 +- .../trinea/android/common/util/HttpUtils.java | 26 +- .../common/util/ImageCacheManager.java | 24 +- .../android/common/util/ImageUtils.java | 10 +- .../trinea/android/common/util/JSONUtils.java | 188 ++--- .../trinea/android/common/util/ListUtils.java | 14 +- .../trinea/android/common/util/MapUtils.java | 76 +- .../android/common/util/ObjectUtils.java | 10 +- .../android/common/util/PackageUtils.java | 52 +- .../android/common/util/ParcelUtils.java | 4 +- .../android/common/util/PreferencesUtils.java | 20 +- .../android/common/util/RandomUtils.java | 26 +- .../android/common/util/ResourceUtils.java | 6 +- .../android/common/util/ScreenUtils.java | 4 +- .../android/common/util/ShellUtils.java | 18 +- .../android/common/util/SqliteUtils.java | 2 +- .../android/common/util/StringUtils.java | 20 +- .../trinea/android/common/util/ViewUtils.java | 6 +- .../android/common/view/BorderScrollView.java | 6 +- .../android/common/view/DropDownListView.java | 48 +- .../common/view/HorizontalListView.java | 708 +++++++++--------- .../common/view/SlideOnePageGallery.java | 6 +- 54 files changed, 868 insertions(+), 884 deletions(-) diff --git a/src/cn/trinea/android/common/constant/DbConstants.java b/src/cn/trinea/android/common/constant/DbConstants.java index 535dcfd..8adde5d 100644 --- a/src/cn/trinea/android/common/constant/DbConstants.java +++ b/src/cn/trinea/android/common/constant/DbConstants.java @@ -69,7 +69,7 @@ public class DbConstants { **/ CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append("CREATE TABLE ").append(IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME); CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(" (").append(IMAGE_SDCARD_CACHE_TABLE_ID) - .append(" integer primary key autoincrement,"); + .append(" integer primary key autoincrement,"); CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_TAG).append(" text,"); CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_URL).append(" text,"); CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(IMAGE_SDCARD_CACHE_TABLE_PATH).append(" text,"); @@ -82,19 +82,17 @@ public class DbConstants { CREATE_IMAGE_SDCARD_CACHE_TABLE_SQL.append(TERMINATOR); CREATE_IMAGE_SDCARD_CACHE_TABLE_INDEX_SQL.append("CREATE INDEX ").append(IMAGE_SDCARD_CACHE_TABLE_INDEX_TAG) - .append(" ON ").append(IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME) - .append("(").append(IMAGE_SDCARD_CACHE_TABLE_TAG).append(")") - .append(TERMINATOR).append("CREATE INDEX ") - .append(IMAGE_SDCARD_CACHE_TABLE_INDEX_URL).append(" ON ") - .append(IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME).append("(") - .append(IMAGE_SDCARD_CACHE_TABLE_URL).append(")").append(TERMINATOR); + .append(" ON ").append(IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME).append("(") + .append(IMAGE_SDCARD_CACHE_TABLE_TAG).append(")").append(TERMINATOR).append("CREATE INDEX ") + .append(IMAGE_SDCARD_CACHE_TABLE_INDEX_URL).append(" ON ").append(IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME) + .append("(").append(IMAGE_SDCARD_CACHE_TABLE_URL).append(")").append(TERMINATOR); /** * sql to http response table **/ CREATE_HTTP_CACHE_TABLE_SQL.append("CREATE TABLE ").append(HTTP_CACHE_TABLE_TABLE_NAME); CREATE_HTTP_CACHE_TABLE_SQL.append(" (").append(HTTP_CACHE_TABLE_ID) - .append(" integer primary key autoincrement,"); + .append(" integer primary key autoincrement,"); CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_URL).append(" text,"); CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_RESPONSE).append(" text,"); CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_EXPIRES).append(" integer,"); @@ -102,11 +100,11 @@ public class DbConstants { CREATE_HTTP_CACHE_TABLE_SQL.append(HTTP_CACHE_TABLE_TYPE).append(" integer)").append(TERMINATOR); CREATE_HTTP_CACHE_TABLE_UNIQUE_INDEX.append("CREATE UNIQUE INDEX ").append(HTTP_CACHE_TABLE_UNIQUE_INDEX_URL) - .append(" ON ").append(HTTP_CACHE_TABLE_TABLE_NAME).append("(") - .append(HTTP_CACHE_TABLE_URL).append(")").append(TERMINATOR); + .append(" ON ").append(HTTP_CACHE_TABLE_TABLE_NAME).append("(").append(HTTP_CACHE_TABLE_URL) + .append(")").append(TERMINATOR); CREATE_HTTP_CACHE_TABLE_INDEX_SQL.append("CREATE INDEX ").append(HTTP_CACHE_TABLE_INDEX_TYPE).append(" ON ") - .append(HTTP_CACHE_TABLE_TABLE_NAME).append("(").append(HTTP_CACHE_TABLE_TYPE) - .append(")").append(TERMINATOR); + .append(HTTP_CACHE_TABLE_TABLE_NAME).append("(").append(HTTP_CACHE_TABLE_TYPE).append(")") + .append(TERMINATOR); } } diff --git a/src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java b/src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java index e5b6c35..094eb54 100644 --- a/src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java +++ b/src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java @@ -19,7 +19,7 @@ public interface ImageSDCardCacheDao { * * @param imageSDCardCache * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or - * empty + * empty * @return */ public boolean putIntoImageSDCardCache(ImageSDCardCache imageSDCardCache, String tag); diff --git a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java index 3c79832..6a93841 100644 --- a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java +++ b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java @@ -21,7 +21,7 @@ public class HttpCacheDaoImpl implements HttpCacheDao { private SqliteUtils sqliteUtils; - public HttpCacheDaoImpl(SqliteUtils sqliteUtils){ + public HttpCacheDaoImpl(SqliteUtils sqliteUtils) { this.sqliteUtils = sqliteUtils; } @@ -44,10 +44,10 @@ public HttpResponse getHttpResponse(String url) { StringBuilder appWhere = new StringBuilder(); appWhere.append(DbConstants.HTTP_CACHE_TABLE_URL).append("=?"); - String[] appWhereArgs = { url }; + String[] appWhereArgs = {url}; synchronized (HttpCacheDaoImpl.class) { Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, - appWhere.toString(), appWhereArgs, null, null, null); + appWhere.toString(), appWhereArgs, null, null, null); if (cursor == null) { return null; } @@ -67,11 +67,11 @@ public HttpResponse getHttpResponse(String url) { public Map getHttpResponsesByType(int type) { StringBuilder whereClause = new StringBuilder(); whereClause.append(DbConstants.HTTP_CACHE_TABLE_TYPE).append("=?"); - String[] whereClauseArgs = { Integer.toString(type) }; + String[] whereClauseArgs = {Integer.toString(type)}; synchronized (HttpCacheDaoImpl.class) { Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, - whereClause.toString(), whereClauseArgs, null, null, null); + whereClause.toString(), whereClauseArgs, null, null, null); if (cursor == null) { return null; diff --git a/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java index 1686a67..f8dcaf7 100644 --- a/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java +++ b/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java @@ -21,7 +21,7 @@ public class ImageSDCardCacheDaoImpl implements ImageSDCardCacheDao { private SqliteUtils sqliteUtils; - public ImageSDCardCacheDaoImpl(SqliteUtils sqliteUtils){ + public ImageSDCardCacheDaoImpl(SqliteUtils sqliteUtils) { this.sqliteUtils = sqliteUtils; } @@ -33,9 +33,9 @@ public boolean putIntoImageSDCardCache(ImageSDCardCache imageSDCardCache, String StringBuilder selection = new StringBuilder(); selection.append(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TAG).append("=?"); - String[] selectionArgs = { tag }; + String[] selectionArgs = {tag}; Cursor cursor = sqliteUtils.getRDb().query(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME, null, - selection.toString(), selectionArgs, null, null, null); + selection.toString(), selectionArgs, null, null, null); if (cursor == null) { return true; } @@ -69,7 +69,7 @@ public boolean deleteAndInsertImageSDCardCache(ImageSDCardCache imageSDCardCache try { StringBuilder whereClause = new StringBuilder(); whereClause.append(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TAG).append("=?"); - String[] whereArgs = { tag }; + String[] whereArgs = {tag}; db.delete(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME, whereClause.toString(), whereArgs); String key; diff --git a/src/cn/trinea/android/common/entity/CacheObject.java b/src/cn/trinea/android/common/entity/CacheObject.java index 2720c57..8766813 100644 --- a/src/cn/trinea/android/common/entity/CacheObject.java +++ b/src/cn/trinea/android/common/entity/CacheObject.java @@ -30,7 +30,7 @@ public class CacheObject implements Serializable, Comparable> /** data **/ protected V data; - public CacheObject(){ + public CacheObject() { this.enterTime = System.currentTimeMillis(); this.lastUsedTime = System.currentTimeMillis(); this.usedCount = 0; @@ -39,7 +39,7 @@ public CacheObject(){ this.isForever = false; } - public CacheObject(V data){ + public CacheObject(V data) { this(); this.data = data; } @@ -200,7 +200,7 @@ public boolean equals(Object o) { return false; } - CacheObject obj = (CacheObject)(o); + CacheObject obj = (CacheObject) (o); return (ObjectUtils.isEquals(this.data, obj.data) && this.enterTime == obj.enterTime && this.priority == obj.priority && this.isExpired == obj.isExpired && this.isForever == obj.isForever); } diff --git a/src/cn/trinea/android/common/entity/FailedReason.java b/src/cn/trinea/android/common/entity/FailedReason.java index fbaa443..73f0d09 100644 --- a/src/cn/trinea/android/common/entity/FailedReason.java +++ b/src/cn/trinea/android/common/entity/FailedReason.java @@ -10,12 +10,12 @@ public class FailedReason { private FailedType failedType; private Throwable cause; - public FailedReason(FailedType failedType, String cause){ + public FailedReason(FailedType failedType, String cause) { this.failedType = failedType; this.cause = new Throwable(cause); } - public FailedReason(FailedType failedType, Throwable cause){ + public FailedReason(FailedType failedType, Throwable cause) { this.failedType = failedType; this.cause = cause; } diff --git a/src/cn/trinea/android/common/entity/HttpRequest.java b/src/cn/trinea/android/common/entity/HttpRequest.java index a83a355..f45d138 100644 --- a/src/cn/trinea/android/common/entity/HttpRequest.java +++ b/src/cn/trinea/android/common/entity/HttpRequest.java @@ -33,14 +33,14 @@ public class HttpRequest { private Map parasMap; private Map requestProperties; - public HttpRequest(String url){ + public HttpRequest(String url) { this.url = url; this.connectTimeout = -1; this.readTimeout = -1; requestProperties = new HashMap(); } - public HttpRequest(String url, Map parasMap){ + public HttpRequest(String url, Map parasMap) { this.url = url; this.parasMap = parasMap; this.connectTimeout = -1; diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/cn/trinea/android/common/entity/HttpResponse.java index 6ecdfca..68e25b5 100644 --- a/src/cn/trinea/android/common/entity/HttpResponse.java +++ b/src/cn/trinea/android/common/entity/HttpResponse.java @@ -59,7 +59,7 @@ public class HttpResponse { */ private int responseCode = -1; - public HttpResponse(String url){ + public HttpResponse(String url) { this.url = url; type = 0; isInCache = false; @@ -67,7 +67,7 @@ public HttpResponse(String url){ responseHeaders = new HashMap(); } - public HttpResponse(){ + public HttpResponse() { responseHeaders = new HashMap(); } @@ -91,14 +91,14 @@ public void setResponseBody(String responseBody) { * get reponse code * * @return An int representing the three digit HTTP Status-Code. - *
                      - *
                    • 1xx: Informational - *
                    • 2xx: Success - *
                    • 3xx: Redirection - *
                    • 4xx: Client Error - *
                    • 5xx: Server Error - *
                    • -1: http error - *
                    + *
                      + *
                    • 1xx: Informational + *
                    • 2xx: Success + *
                    • 3xx: Redirection + *
                    • 4xx: Client Error + *
                    • 5xx: Server Error + *
                    • -1: http error + *
                    */ public int getResponseCode() { return responseCode; @@ -167,10 +167,10 @@ public void setExpiredTime(long expiredTime) { *
                  * * @return
                    - *
                  • if max-age in cache-control is exists, return current time plus it
                  • - *
                  • else return expires
                  • - *
                  • if something error, return -1
                  • - *
                  + *
                • if max-age in cache-control is exists, return current time plus it
                • + *
                • else return expires
                • + *
                • if something error, return -1
                • + *
                */ public long getExpiredTime() { if (isInitExpiredTime) { @@ -217,7 +217,7 @@ public HttpResponse setInCache(boolean isInCache) { */ public String getExpiresHeader() { try { - return responseHeaders == null ? null : (String)responseHeaders.get(HttpConstants.EXPIRES); + return responseHeaders == null ? null : (String) responseHeaders.get(HttpConstants.EXPIRES); } catch (Exception e) { e.printStackTrace(); return null; @@ -231,7 +231,7 @@ public String getExpiresHeader() { */ private int getCacheControlMaxAge() { try { - String cacheControl = (String)responseHeaders.get(HttpConstants.CACHE_CONTROL); + String cacheControl = (String) responseHeaders.get(HttpConstants.CACHE_CONTROL); if (!StringUtils.isEmpty(cacheControl)) { int start = cacheControl.indexOf("max-age="); if (start != -1) { @@ -256,10 +256,10 @@ private int getCacheControlMaxAge() { * get expires * * @return
                  - *
                • if max-age in cache-control is exists, return current time plus it
                • - *
                • else return expires
                • - *
                • if something error, return -1
                • - *
                + *
              • if max-age in cache-control is exists, return current time plus it
              • + *
              • else return expires
              • + *
              • if something error, return -1
              • + *
              */ private long getExpiresInMillis() { int maxAge = getCacheControlMaxAge(); diff --git a/src/cn/trinea/android/common/entity/PatchResult.java b/src/cn/trinea/android/common/entity/PatchResult.java index 6aed141..5631380 100644 --- a/src/cn/trinea/android/common/entity/PatchResult.java +++ b/src/cn/trinea/android/common/entity/PatchResult.java @@ -10,7 +10,7 @@ public class PatchResult { private int status; private String message; - public PatchResult(int status, String message){ + public PatchResult(int status, String message) { this.status = status; this.message = message; } diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 049396c..37005ea 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -57,9 +57,10 @@ public class HttpCache { private int type = -1; /** Default {@link Executor} that be used to execute tasks in parallel. **/ - public static final Executor THREAD_POOL_EXECUTOR = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); + public static final Executor THREAD_POOL_EXECUTOR = Executors + .newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); - public HttpCache(Context context){ + public HttpCache(Context context) { if (context == null) { throw new IllegalArgumentException("The context can not be null."); } @@ -74,7 +75,7 @@ public HttpCache(Context context){ * @param context * @param type get httpResponse whose type is type into memory as primary cache to improve performance */ - private HttpCache(Context context, int type){ + private HttpCache(Context context, int type) { this(context); this.type = type; initData(type); @@ -135,7 +136,7 @@ public HttpResponse httpGet(HttpRequest request) { cacheResponse = getFromCache(url); } return cacheResponse == null ? (isNoStore ? HttpUtils.httpGet(url) : putIntoCache(HttpUtils.httpGet(url))) - : cacheResponse; + : cacheResponse; } /** @@ -148,7 +149,7 @@ public HttpResponse httpGet(HttpRequest request) { * * @param url * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do - * something + * something */ public void httpGet(String url, HttpCacheListener listener) { new HttpCacheStringAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, url); @@ -164,7 +165,7 @@ public void httpGet(String url, HttpCacheListener listener) { * * @param request * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do - * something + * something */ public void httpGet(HttpRequest request, HttpCacheListener listener) { new HttpCacheRequestAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, request); @@ -260,8 +261,7 @@ public static abstract class HttpCacheListener { *
            • this can be null if you not want to do something
            • *
            */ - protected void onPreGet() { - } + protected void onPreGet() {} /** * Runs on the UI thread after httpGet. The httpResponse is returned by httpGet. @@ -272,8 +272,7 @@ protected void onPreGet() { * @param httpResponse get by the url * @param isInCache the data responsed to the url whether is in cache */ - protected void onPostGet(HttpResponse httpResponse, boolean isInCache) { - } + protected void onPostGet(HttpResponse httpResponse, boolean isInCache) {} } /** @@ -312,9 +311,9 @@ private HttpResponse putIntoCache(HttpResponse httpResponse) { * * @param url * @return
              - *
            • if neither exit in memory cache nor db, return null
            • - *
            • if is expired, return null, otherwise return cache response
            • - *
            + *
          • if neither exit in memory cache nor db, return null
          • + *
          • if is expired, return null, otherwise return cache response
          • + *
          */ public HttpResponse getFromCache(String url) { if (StringUtils.isEmpty(url)) { @@ -337,7 +336,7 @@ private class HttpCacheStringAsyncTask extends AsyncTaskTrinea 2012-7-6 */ public enum TimeRule { - YEAR, DAY_OF_MONTH, MILLISECOND, HOUR_OF_DAY_TO_MILLIS, HOUR_OF_DAY_TO_SECONDS, HOUR_OF_DAY_TO_MINUTES, - HOUR_TO_MILLIS, MINUTE_TO_SECONDS, TO_MILLIS, TO_SECONDS + YEAR, DAY_OF_MONTH, MILLISECOND, HOUR_OF_DAY_TO_MILLIS, HOUR_OF_DAY_TO_SECONDS, HOUR_OF_DAY_TO_MINUTES, HOUR_TO_MILLIS, MINUTE_TO_SECONDS, TO_MILLIS, TO_SECONDS } } diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java b/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java index c0e75b7..27d2436 100644 --- a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java +++ b/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java @@ -32,11 +32,10 @@ public String getFileName(String imageUrl) { } String ext = (fileExtension == null ? FileUtils.getFileExtension(imageUrl) : fileExtension); - String fileName = (imageUrl.length() > MAX_FILE_NAME_LENGTH - ? imageUrl.substring(imageUrl.length() - MAX_FILE_NAME_LENGTH, imageUrl.length()) : imageUrl).replaceAll("[\\W]", - "_"); - return StringUtils.isEmpty(ext) ? fileName - : (new StringBuilder().append(fileName).append(".").append(ext.replaceAll("[\\W]", "_")).toString()); + String fileName = (imageUrl.length() > MAX_FILE_NAME_LENGTH ? imageUrl.substring(imageUrl.length() + - MAX_FILE_NAME_LENGTH, imageUrl.length()) : imageUrl).replaceAll("[\\W]", "_"); + return StringUtils.isEmpty(ext) ? fileName : (new StringBuilder().append(fileName).append(".") + .append(ext.replaceAll("[\\W]", "_")).toString()); } public FileNameRuleImageUrl setFileExtension(String fileExtension) { diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index 4efca02..1ee95f0 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -68,13 +68,12 @@ public class ImageCache extends ImageMemoryCache { private CompressListener compressListener; /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = new StringBuilder().append(Environment.getExternalStorageDirectory() - .getAbsolutePath()) - .append(File.separator).append("Trinea") - .append(File.separator) - .append("AndroidCommon") - .append(File.separator).append("ImageCache") - .toString(); + public static final String DEFAULT_CACHE_FOLDER = new StringBuilder() + .append(Environment.getExternalStorageDirectory() + .getAbsolutePath()).append(File.separator) + .append("Trinea").append(File.separator) + .append("AndroidCommon").append(File.separator) + .append("ImageCache").toString(); /** *
            @@ -86,9 +85,9 @@ public class ImageCache extends ImageMemoryCache { * * @see {@link #ImageCache(int, int, int, int)} */ - public ImageCache(){ + public ImageCache() { this(ImageMemoryCache.DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE, - ImageSDCardCache.DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); + ImageSDCardCache.DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } /** @@ -102,9 +101,9 @@ public ImageCache(){ * @param secondaryCacheMaxSize * @see {@link #ImageCache(int, int, int, int)} */ - public ImageCache(int primaryCacheMaxSize){ + public ImageCache(int primaryCacheMaxSize) { this(primaryCacheMaxSize, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE, ImageSDCardCache.DEFAULT_MAX_SIZE, - PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); + PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } /** @@ -114,9 +113,9 @@ public ImageCache(int primaryCacheMaxSize){ * @param secondaryCacheMaxSize * @see {@link #ImageCache(int, int, int, int)} */ - public ImageCache(int primaryCacheMaxSize, int secondaryCacheMaxSize){ + public ImageCache(int primaryCacheMaxSize, int secondaryCacheMaxSize) { this(primaryCacheMaxSize, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE, secondaryCacheMaxSize, - PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); + PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } /** @@ -138,7 +137,7 @@ public ImageCache(int primaryCacheMaxSize, int secondaryCacheMaxSize){ * @param secondaryCacheThreadPoolSize getting data thread pool size of the secondary cache */ public ImageCache(int primaryCacheMaxSize, int primaryCacheThreadPoolSize, int secondaryCacheMaxSize, - int secondaryCacheThreadPoolSize){ + int secondaryCacheThreadPoolSize) { super(primaryCacheMaxSize, primaryCacheThreadPoolSize); setOnGetDataListener(new OnGetDataListener() { @@ -239,11 +238,12 @@ public interface CompressListener { * * @param imagePath * @return return compressSize, If > 1, requests the decoder to subsample the original image, returning a - * smaller image to save memory. The sample size is the number of pixels in either dimension that correspond to - * a single pixel in the decoded bitmap. For example, inSampleSize == 4 returns an image that is 1/4 the - * width/height of the original, and 1/16 the number of pixels. Any value <= 1 is treated the same as 1. Note: - * the decoder will try to fulfill this request, but the resulting bitmap may have different dimensions that - * precisely what has been requested. Also, powers of 2 are often faster/easier for the decoder to honor. + * smaller image to save memory. The sample size is the number of pixels in either dimension that + * correspond to a single pixel in the decoded bitmap. For example, inSampleSize == 4 returns an image + * that is 1/4 the width/height of the original, and 1/16 the number of pixels. Any value <= 1 is + * treated the same as 1. Note: the decoder will try to fulfill this request, but the resulting bitmap + * may have different dimensions that precisely what has been requested. Also, powers of 2 are often + * faster/easier for the decoder to honor. */ public int getCompressSize(String imagePath); } @@ -434,7 +434,7 @@ public void deleteUnusedFiles() { * * @param context * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or - * empty + * empty * @return * @see ImageSDCardCache#loadDataFromDb(Context, ImageSDCardCache, String) */ @@ -454,7 +454,7 @@ public boolean loadDataFromDb(Context context, String tag) { * * @param context * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or - * empty + * empty * @return * @see ImageSDCardCache#saveDataToDb(Context, ImageSDCardCache, String) */ diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index 01e82ba..9be0204 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -86,7 +86,8 @@ public class ImageMemoryCache extends PreloadDataCache { private static final int WHAT_GET_IMAGE_FAILED = 2; /** thread pool whose wait for data got, attention, not the get data thread pool **/ - private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); + private transient ExecutorService threadPool = Executors + .newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); /** * key is image url, value is the newest view which waiting for image loaded, used when {@link #isOpenWaitingQueue} * is false @@ -116,8 +117,8 @@ public boolean get(String imageUrl, View view) { * * @param imageUrl * @param urlList url list, if is null, not preload, else preload forward by - * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by - * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} + * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by + * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} * @param view * @return whether image already in cache or not */ @@ -279,7 +280,7 @@ public void setRequestProperty(String field, String newValue) { * * @see PreloadDataCache#PreloadDataCache() */ - public ImageMemoryCache(){ + public ImageMemoryCache() { this(DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } @@ -295,7 +296,7 @@ public ImageMemoryCache(){ * @param maxSize maximum size of the cache * @see PreloadDataCache#PreloadDataCache(int) */ - public ImageMemoryCache(int maxSize){ + public ImageMemoryCache(int maxSize) { this(maxSize, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } @@ -312,7 +313,7 @@ public ImageMemoryCache(int maxSize){ * @param threadPoolSize getting data thread pool size * @see PreloadDataCache#PreloadDataCache(int, int) */ - public ImageMemoryCache(int maxSize, int threadPoolSize){ + public ImageMemoryCache(int maxSize, int threadPoolSize) { super(maxSize, threadPoolSize); super.setOnGetDataListener(getDefaultOnGetImageListener()); @@ -399,7 +400,7 @@ public void handleMessage(Message message) { switch (message.what) { case WHAT_GET_IMAGE_SUCCESS: case WHAT_GET_IMAGE_FAILED: - MessageObject object = (MessageObject)message.obj; + MessageObject object = (MessageObject) message.obj; if (object == null) { break; } @@ -417,7 +418,7 @@ public void handleMessage(Message message) { onGetSuccess(imageUrl, bitmap, view, false); } else { onImageCallbackListener.onGetFailed(imageUrl, bitmap, view, - object.failedReason); + object.failedReason); } } } @@ -455,8 +456,8 @@ private void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolea try { onImageCallbackListener.onGetSuccess(imageUrl, loadedImage, view, isInCache); } catch (OutOfMemoryError e) { - onImageCallbackListener.onGetFailed(imageUrl, loadedImage, view, - new FailedReason(FailedType.ERROR_OUT_OF_MEMORY, e)); + onImageCallbackListener.onGetFailed(imageUrl, loadedImage, view, new FailedReason( + FailedType.ERROR_OUT_OF_MEMORY, e)); } } @@ -471,12 +472,12 @@ private class MessageObject { Bitmap bitmap; FailedReason failedReason; - public MessageObject(String imageUrl, Bitmap bitmap){ + public MessageObject(String imageUrl, Bitmap bitmap) { this.imageUrl = imageUrl; this.bitmap = bitmap; } - public MessageObject(String imageUrl, Bitmap bitmap, FailedReason failedReason){ + public MessageObject(String imageUrl, Bitmap bitmap, FailedReason failedReason) { this.imageUrl = imageUrl; this.bitmap = bitmap; this.failedReason = failedReason; @@ -489,8 +490,8 @@ public MessageObject(String imageUrl, Bitmap bitmap, FailedReason failedReason){ * * @param imageUrl * @param urlList url list, if is null, not preload, else preload forward by - * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by - * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} + * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by + * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} */ private void startGetImageThread(final String imageUrl, final List urlList) { // wait for image be got success and send message @@ -506,15 +507,15 @@ public void run() { remove(imageUrl); String failedException = "get image from network or save image to sdcard error. please make sure you have added permission android.permission.WRITE_EXTERNAL_STORAGE and android.permission.ACCESS_NETWORK_STATE"; FailedReason failedReason = new FailedReason(FailedType.ERROR_IO, failedException); - handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, - new MessageObject(imageUrl, bitmap, failedReason))); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, + bitmap, failedReason))); } else { handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, - bitmap))); + bitmap))); } } catch (OutOfMemoryError e) { - MessageObject msg = new MessageObject(imageUrl, null, - new FailedReason(FailedType.ERROR_OUT_OF_MEMORY, e)); + MessageObject msg = new MessageObject(imageUrl, null, new FailedReason( + FailedType.ERROR_OUT_OF_MEMORY, e)); handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, msg)); } } @@ -555,7 +556,7 @@ static int getDefaultMaxSize() { return 512; } - int mb = (int)(maxMemory / SizeUtils.MB_2_BYTE); + int mb = (int) (maxMemory / SizeUtils.MB_2_BYTE); return mb > 16 ? mb * 2 : 16; } } diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index e7496f2..9e0d2bf 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -97,15 +97,16 @@ public class ImageSDCardCache extends PreloadDataCache { /** recommend default max cache size according to dalvik max memory **/ public static final int DEFAULT_MAX_SIZE = getDefaultMaxSize(); /** cache folder path which be used when saving images **/ - public static final String DEFAULT_CACHE_FOLDER = new StringBuilder().append(Environment.getExternalStorageDirectory() - .getAbsolutePath()) - .append(File.separator) - .append("Trinea") - .append(File.separator) - .append("AndroidCommon") - .append(File.separator) - .append("ImageSDCardCache") - .toString(); + public static final String DEFAULT_CACHE_FOLDER = new StringBuilder() + .append(Environment + .getExternalStorageDirectory() + .getAbsolutePath()) + .append(File.separator) + .append("Trinea") + .append(File.separator) + .append("AndroidCommon") + .append(File.separator) + .append("ImageSDCardCache").toString(); /** message what for get image successfully **/ private static final int WHAT_GET_IMAGE_SUCCESS = 1; @@ -113,7 +114,8 @@ public class ImageSDCardCache extends PreloadDataCache { private static final int WHAT_GET_IMAGE_FAILED = 2; /** thread pool whose wait for data got, attention, not the get data thread pool **/ - private transient ExecutorService threadPool = Executors.newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); + private transient ExecutorService threadPool = Executors + .newFixedThreadPool(SystemUtils.DEFAULT_THREAD_POOL_SIZE); /** * key is image url, value is the newest view which waiting for image loaded, used when {@link #isOpenWaitingQueue} * is false @@ -142,8 +144,8 @@ public boolean get(String imageUrl, View view) { * * @param imageUrl * @param urlList url list, if is null, not preload, else preload forward by - * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by - * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} + * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by + * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} * @param view * @return whether image already in cache or not */ @@ -348,7 +350,7 @@ public void setRequestProperty(String field, String newValue) { * * @see PreloadDataCache#PreloadDataCache() */ - public ImageSDCardCache(){ + public ImageSDCardCache() { this(DEFAULT_MAX_SIZE, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } @@ -364,7 +366,7 @@ public ImageSDCardCache(){ * @param maxSize maximum size of the cache * @see PreloadDataCache#PreloadDataCache(int) */ - public ImageSDCardCache(int maxSize){ + public ImageSDCardCache(int maxSize) { this(maxSize, PreloadDataCache.DEFAULT_THREAD_POOL_SIZE); } @@ -381,7 +383,7 @@ public ImageSDCardCache(int maxSize){ * @param threadPoolSize getting data thread pool size * @see PreloadDataCache#PreloadDataCache(int, int) */ - public ImageSDCardCache(int maxSize, int threadPoolSize){ + public ImageSDCardCache(int maxSize, int threadPoolSize) { super(maxSize, threadPoolSize); super.setOnGetDataListener(getDefaultOnGetImageListener()); @@ -468,7 +470,7 @@ public void handleMessage(Message message) { switch (message.what) { case WHAT_GET_IMAGE_SUCCESS: case WHAT_GET_IMAGE_FAILED: - MessageObject object = (MessageObject)message.obj; + MessageObject object = (MessageObject) message.obj; if (object == null) { break; } @@ -486,7 +488,7 @@ public void handleMessage(Message message) { onGetSuccess(imageUrl, imagePath, view, false); } else { onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, - object.failedReason); + object.failedReason); } } } @@ -499,7 +501,7 @@ public void handleMessage(Message message) { onGetSuccess(imageUrl, imagePath, view, false); } else { onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, - object.failedReason); + object.failedReason); } } } @@ -525,8 +527,8 @@ private void onGetSuccess(String imageUrl, String imagePath, View view, boolean try { onImageSDCallbackListener.onGetSuccess(imageUrl, imagePath, view, isInCache); } catch (OutOfMemoryError e) { - onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, - new FailedReason(FailedType.ERROR_OUT_OF_MEMORY, e)); + onImageSDCallbackListener.onGetFailed(imageUrl, imagePath, view, new FailedReason( + FailedType.ERROR_OUT_OF_MEMORY, e)); } } @@ -541,12 +543,12 @@ private class MessageObject { String imagePath; FailedReason failedReason; - public MessageObject(String imageUrl, String imagePath){ + public MessageObject(String imageUrl, String imagePath) { this.imageUrl = imageUrl; this.imagePath = imagePath; } - public MessageObject(String imageUrl, String imagePath, FailedReason failedReason){ + public MessageObject(String imageUrl, String imagePath, FailedReason failedReason) { this.imageUrl = imageUrl; this.imagePath = imagePath; this.failedReason = failedReason; @@ -558,8 +560,8 @@ public MessageObject(String imageUrl, String imagePath, FailedReason failedReaso * * @param imageUrl * @param urlList url list, if is null, not preload, else preload forward by - * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by - * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} + * {@link PreloadDataCache#preloadDataForward(Object, List, int)}, preload backward by + * {@link PreloadDataCache#preloadDataBackward(Object, List, int)} */ private void startGetImageThread(final String imageUrl, final List urlList) { // wait for image be got success and send message @@ -575,15 +577,15 @@ public void run() { remove(imageUrl); String failedException = "get image from network or save image to sdcard error. please make sure you have added permission android.permission.WRITE_EXTERNAL_STORAGE and android.permission.ACCESS_NETWORK_STATE"; FailedReason failedReason = new FailedReason(FailedType.ERROR_IO, failedException); - handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, - new MessageObject(imageUrl, imagePath, failedReason))); + handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, new MessageObject(imageUrl, + imagePath, failedReason))); } else { handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_SUCCESS, new MessageObject(imageUrl, - imagePath))); + imagePath))); } } catch (OutOfMemoryError e) { - MessageObject msg = new MessageObject(imageUrl, null, - new FailedReason(FailedType.ERROR_OUT_OF_MEMORY, e)); + MessageObject msg = new MessageObject(imageUrl, null, new FailedReason( + FailedType.ERROR_OUT_OF_MEMORY, e)); handler.sendMessage(handler.obtainMessage(WHAT_GET_IMAGE_FAILED, msg)); } } @@ -689,7 +691,7 @@ public void initData(Context context, String tag) { * * @param context * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or - * empty + * empty * @return * @see #loadDataFromDb(Context, ImageSDCardCache, String) */ @@ -709,7 +711,7 @@ public boolean loadDataFromDb(Context context, String tag) { * * @param context * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or - * empty + * empty * @return * @see #saveDataToDb(Context, ImageSDCardCache, String) */ @@ -729,7 +731,7 @@ public boolean saveDataToDb(Context context, String tag) { * @param context * @param imageSDCardCache * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or - * empty + * empty * @return */ public static boolean loadDataFromDb(Context context, ImageSDCardCache imageSDCardCache, String tag) { @@ -740,7 +742,7 @@ public static boolean loadDataFromDb(Context context, ImageSDCardCache imageSDCa throw new IllegalArgumentException("The tag can not be null or empty."); } return new ImageSDCardCacheDaoImpl(SqliteUtils.getInstance(context)).putIntoImageSDCardCache(imageSDCardCache, - tag); + tag); } /** @@ -757,7 +759,7 @@ public static boolean loadDataFromDb(Context context, ImageSDCardCache imageSDCa * @param context * @param imageSDCardCache * @param tag tag used to mark this cache when save to and load from db, should be unique and cannot be null or - * empty + * empty * @return */ public static boolean saveDataToDb(Context context, ImageSDCardCache imageSDCardCache, String tag) { @@ -767,8 +769,8 @@ public static boolean saveDataToDb(Context context, ImageSDCardCache imageSDCard if (StringUtils.isEmpty(tag)) { throw new IllegalArgumentException("The tag can not be null or empty."); } - return new ImageSDCardCacheDaoImpl(SqliteUtils.getInstance(context)).deleteAndInsertImageSDCardCache(imageSDCardCache, - tag); + return new ImageSDCardCacheDaoImpl(SqliteUtils.getInstance(context)).deleteAndInsertImageSDCardCache( + imageSDCardCache, tag); } /** @@ -779,8 +781,7 @@ public static boolean saveDataToDb(Context context, ImageSDCardCache imageSDCard */ public String getImagePath(String imageUrl) { return (this.containsKey(imageUrl)) ? new StringBuilder(cacheFolder).append(File.separator) - .append(fileNameRule.getFileName(imageUrl)) - .toString() : null; + .append(fileNameRule.getFileName(imageUrl)).toString() : null; } /** @@ -818,7 +819,7 @@ public CacheObject onGetData(String key) { stream = ImageUtils.getInputStreamFromUrl(key, httpReadTimeOut, requestProperties); } catch (Exception e) { Log.e(TAG, new StringBuilder().append("get image exception, imageUrl is:").append(key).toString(), - e); + e); } if (stream != null) { @@ -832,15 +833,15 @@ public CacheObject onGetData(String key) { FileUtils.writeFile(savePath, stream); } else { Log.e(TAG, - new StringBuilder().append("get image exception while write to file, imageUrl is: ") - .append(key).append(", savePath is ").append(savePath) - .toString(), e1); + new StringBuilder() + .append("get image exception while write to file, imageUrl is: ") + .append(key).append(", savePath is ").append(savePath).toString(), e1); } } catch (Exception e2) { Log.e(TAG, - new StringBuilder().append("get image exception while write to file, imageUrl is: ") - .append(key).append(", savePath is ").append(savePath).toString(), - e2); + new StringBuilder() + .append("get image exception while write to file, imageUrl is: ") + .append(key).append(", savePath is ").append(savePath).toString(), e2); } } } @@ -860,7 +861,7 @@ static int getDefaultMaxSize() { return 256; } - int mb = (int)(maxMemory / SizeUtils.MB_2_BYTE); + int mb = (int) (maxMemory / SizeUtils.MB_2_BYTE); return mb > 8 ? mb : 8; } } diff --git a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java index 78f7648..0fcb5fc 100644 --- a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java +++ b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java @@ -101,8 +101,8 @@ public class PreloadDataCache extends SimpleCache { * * @param key * @param keyList key list, if is null, not preload, else preload forward by - * {@link #preloadDataForward(Object, List, int)}, preload backward by - * {@link #preloadDataBackward(Object, List, int)} + * {@link #preloadDataForward(Object, List, int)}, preload backward by + * {@link #preloadDataBackward(Object, List, int)} * @return element if this cache contains the specified key, else get data realtime and wait for it * @see PreloadDataCache#get(Object) */ @@ -175,8 +175,8 @@ CacheObject getFromCache(K key) { * * @param key * @param keyList key list, if is null, not preload, else preload forward by - * {@link #preloadDataForward(Object, List, int)}, preload backward by - * {@link #preloadDataBackward(Object, List, int)} + * {@link #preloadDataForward(Object, List, int)}, preload backward by + * {@link #preloadDataBackward(Object, List, int)} * @return element if this cache contains the specified key, null otherwise. * @see #getFromCache(Object) */ @@ -317,7 +317,7 @@ public synchronized boolean isExistGettingDataThread(K key) { *
          • Size of getting data thread pool is {@link #DEFAULT_THREAD_POOL_SIZE}
          • *
          */ - public PreloadDataCache(){ + public PreloadDataCache() { this(DEFAULT_MAX_SIZE, DEFAULT_THREAD_POOL_SIZE); } @@ -330,7 +330,7 @@ public PreloadDataCache(){ * * @param maxSize maximum size of the cache */ - public PreloadDataCache(int maxSize){ + public PreloadDataCache(int maxSize) { this(maxSize, DEFAULT_THREAD_POOL_SIZE); } @@ -343,7 +343,7 @@ public PreloadDataCache(int maxSize){ * @param maxSize maximum size of the cache * @param threadPoolSize getting data thread pool size */ - public PreloadDataCache(int maxSize, int threadPoolSize){ + public PreloadDataCache(int maxSize, int threadPoolSize) { super(maxSize); if (threadPoolSize <= 0) { @@ -464,15 +464,15 @@ public void setContext(Context context) { * * @param networkType a constant from ConnectivityManager.TYPE_*. * @return one of the NETWORK_* constants - *
            - *
          • if {@link #getContext()} is null, return true
          • - *
          • if network is not avaliable, return false
          • - *
          • if {@link #getAllowedNetworkTypes()} is not match network, return false
          • - *
          + *
            + *
          • if {@link #getContext()} is null, return true
          • + *
          • if network is not avaliable, return false
          • + *
          • if {@link #getAllowedNetworkTypes()} is not match network, return false
          • + *
          */ public boolean checkIsNetworkTypeAllowed() { if (connectivityManager == null && context != null) { - connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); + connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } if (connectivityManager == null) { @@ -481,7 +481,7 @@ public boolean checkIsNetworkTypeAllowed() { NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null - && (allowedNetworkTypes == ~0 || (translateNetworkTypeToApiFlag(networkInfo.getType()) & allowedNetworkTypes) != 0); + && (allowedNetworkTypes == ~0 || (translateNetworkTypeToApiFlag(networkInfo.getType()) & allowedNetworkTypes) != 0); } /** @@ -508,7 +508,7 @@ private int translateNetworkTypeToApiFlag(int networkType) { */ @SuppressWarnings("unchecked") public static PreloadDataCache loadCache(String filePath) { - return (PreloadDataCache)SerializeUtils.deserialization(filePath); + return (PreloadDataCache) SerializeUtils.deserialization(filePath); } /** @@ -558,7 +558,7 @@ private class GetDataThread implements Runnable { * @param key * @param onGetDataListener */ - public GetDataThread(K key, OnGetDataListener onGetDataListener){ + public GetDataThread(K key, OnGetDataListener onGetDataListener) { this.key = key; this.onGetDataListener = onGetDataListener; finishGetDataLock = new CountDownLatch(1); diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java b/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java index c88b3e7..89f54c7 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java @@ -25,8 +25,8 @@ public int compare(CacheObject obj1, CacheObject obj2) { long sizeOfFile2 = getSize(obj2); if (sizeOfFile1 == sizeOfFile2) { if (obj1.getUsedCount() == obj2.getUsedCount()) { - return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 : ((obj1.getEnterTime() == obj2.getEnterTime()) - ? 0 : -1); + return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 + : ((obj1.getEnterTime() == obj2.getEnterTime()) ? 0 : -1); } return (obj1.getUsedCount() > obj2.getUsedCount() ? 1 : -1); } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java b/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java index 26f56c4..31df044 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java @@ -25,8 +25,8 @@ public int compare(CacheObject obj1, CacheObject obj2) { long sizeOfFile2 = getSize(obj2); if (sizeOfFile1 == sizeOfFile2) { if (obj1.getUsedCount() == obj2.getUsedCount()) { - return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 : ((obj1.getEnterTime() == obj2.getEnterTime()) - ? 0 : -1); + return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 + : ((obj1.getEnterTime() == obj2.getEnterTime()) ? 0 : -1); } return (obj1.getUsedCount() > obj2.getUsedCount() ? 1 : -1); } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java b/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java index d8e950f..5eae988 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java @@ -16,6 +16,6 @@ public class RemoveTypeEnterTimeFirst implements CacheFullRemoveType { @Override public int compare(CacheObject obj1, CacheObject obj2) { return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 - : ((obj1.getEnterTime() == obj2.getEnterTime()) ? 0 : -1); + : ((obj1.getEnterTime() == obj2.getEnterTime()) ? 0 : -1); } } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java b/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java index d8555ae..7d10c46 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java @@ -16,6 +16,6 @@ public class RemoveTypeEnterTimeLast implements CacheFullRemoveType { @Override public int compare(CacheObject obj1, CacheObject obj2) { return (obj2.getEnterTime() > obj1.getEnterTime()) ? 1 - : ((obj2.getEnterTime() == obj1.getEnterTime()) ? 0 : -1); + : ((obj2.getEnterTime() == obj1.getEnterTime()) ? 0 : -1); } } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java b/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java index bb5673c..48305d5 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java @@ -24,8 +24,8 @@ public int compare(CacheObject obj1, CacheObject obj2) { long sizeOfFile2 = (obj2 == null ? -1 : FileUtils.getFileSize(obj2.getData())); if (sizeOfFile1 == sizeOfFile2) { if (obj1.getUsedCount() == obj2.getUsedCount()) { - return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 : ((obj1.getEnterTime() == obj2.getEnterTime()) - ? 0 : -1); + return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 + : ((obj1.getEnterTime() == obj2.getEnterTime()) ? 0 : -1); } return (obj1.getUsedCount() > obj2.getUsedCount() ? 1 : -1); } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java b/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java index d26c760..201ebb8 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java @@ -24,8 +24,8 @@ public int compare(CacheObject obj1, CacheObject obj2) { long sizeOfFile2 = (obj2 == null ? -1 : FileUtils.getFileSize(obj2.getData())); if (sizeOfFile1 == sizeOfFile2) { if (obj1.getUsedCount() == obj2.getUsedCount()) { - return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 : ((obj1.getEnterTime() == obj2.getEnterTime()) - ? 0 : -1); + return (obj1.getEnterTime() > obj2.getEnterTime()) ? 1 + : ((obj1.getEnterTime() == obj2.getEnterTime()) ? 0 : -1); } return (obj1.getUsedCount() > obj2.getUsedCount() ? 1 : -1); } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java b/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java index f197848..9d34eb8 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java @@ -15,7 +15,7 @@ public class RemoveTypeLastUsedTimeFirst implements CacheFullRemoveType { @Override public int compare(CacheObject obj1, CacheObject obj2) { - return (obj1.getLastUsedTime() > obj2.getLastUsedTime()) ? 1 - : ((obj1.getLastUsedTime() == obj2.getLastUsedTime()) ? 0 : -1); + return (obj1.getLastUsedTime() > obj2.getLastUsedTime()) ? 1 : ((obj1.getLastUsedTime() == obj2 + .getLastUsedTime()) ? 0 : -1); } } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java b/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java index a888993..e2f80d8 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java @@ -15,7 +15,7 @@ public class RemoveTypeLastUsedTimeLast implements CacheFullRemoveType { @Override public int compare(CacheObject obj1, CacheObject obj2) { - return (obj2.getLastUsedTime() > obj1.getLastUsedTime()) ? 1 - : ((obj2.getLastUsedTime() == obj1.getLastUsedTime()) ? 0 : -1); + return (obj2.getLastUsedTime() > obj1.getLastUsedTime()) ? 1 : ((obj2.getLastUsedTime() == obj1 + .getLastUsedTime()) ? 0 : -1); } } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java b/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java index 92073dd..a00b6e8 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java @@ -16,6 +16,6 @@ public class RemoveTypeUsedCountBig implements CacheFullRemoveType { @Override public int compare(CacheObject obj1, CacheObject obj2) { return (obj2.getUsedCount() > obj1.getUsedCount()) ? 1 - : ((obj2.getUsedCount() == obj1.getUsedCount()) ? 0 : -1); + : ((obj2.getUsedCount() == obj1.getUsedCount()) ? 0 : -1); } } diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java b/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java index 84c4ddd..50e58c0 100644 --- a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java +++ b/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java @@ -16,6 +16,6 @@ public class RemoveTypeUsedCountSmall implements CacheFullRemoveType { @Override public int compare(CacheObject obj1, CacheObject obj2) { return (obj1.getUsedCount() > obj2.getUsedCount()) ? 1 - : ((obj1.getUsedCount() == obj2.getUsedCount()) ? 0 : -1); + : ((obj1.getUsedCount() == obj2.getUsedCount()) ? 0 : -1); } } diff --git a/src/cn/trinea/android/common/service/impl/SimpleCache.java b/src/cn/trinea/android/common/service/impl/SimpleCache.java index 5c27485..d15a3d3 100644 --- a/src/cn/trinea/android/common/service/impl/SimpleCache.java +++ b/src/cn/trinea/android/common/service/impl/SimpleCache.java @@ -80,7 +80,7 @@ public class SimpleCache implements Cache, Serializable { *
        • Remove type is {@link RemoveTypeEnterTimeFirst} when cache is full
        • *
        */ - public SimpleCache(){ + public SimpleCache() { this(DEFAULT_MAX_SIZE); } @@ -92,7 +92,7 @@ public SimpleCache(){ * * @param maxSize maximum size of the cache */ - public SimpleCache(int maxSize){ + public SimpleCache(int maxSize) { if (maxSize <= 0) { throw new IllegalArgumentException("The maxSize of cache must be greater than 0."); } @@ -125,7 +125,7 @@ public long getValidTime() { * set valid time of elements in cache, in mills * * @param validTime valid time of elements in cache, in mills. If less than 0, it will be set to -1 and means not - * invalid. Rule of invalid see {@link #isExpired(CacheObject)} + * invalid. Rule of invalid see {@link #isExpired(CacheObject)} */ public void setValidTime(long validTime) { this.validTime = validTime <= 0 ? -1 : validTime; @@ -363,7 +363,8 @@ public void clear() { */ protected boolean isExpired(CacheObject obj) { return validTime != -1 - && (obj == null || (obj.isExpired() && !obj.isForever()) || (obj.getEnterTime() + validTime) < System.currentTimeMillis()); + && (obj == null || (obj.isExpired() && !obj.isForever()) || (obj.getEnterTime() + validTime) < System + .currentTimeMillis()); } /** @@ -388,7 +389,7 @@ public long getMissCount() { @Override public synchronized double getHitRate() { long total = hitCount.get() + missCount.get(); - return (total == 0 ? 0 : ((double)hitCount.get()) / total); + return (total == 0 ? 0 : ((double) hitCount.get()) / total); } /** @@ -429,7 +430,7 @@ public Collection> values() { */ @SuppressWarnings("unchecked") public static SimpleCache loadCache(String filePath) { - return (SimpleCache)SerializeUtils.deserialization(filePath); + return (SimpleCache) SerializeUtils.deserialization(filePath); } /** diff --git a/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java b/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java index 2b36616..7deb5f1 100644 --- a/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java +++ b/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java @@ -24,7 +24,7 @@ public class AssetDatabaseOpenHelper { private Context context; private String databaseName; - public AssetDatabaseOpenHelper(Context context, String databaseName){ + public AssetDatabaseOpenHelper(Context context, String databaseName) { this.context = context; this.databaseName = databaseName; } diff --git a/src/cn/trinea/android/common/util/CacheManager.java b/src/cn/trinea/android/common/util/CacheManager.java index d588540..d6e141d 100644 --- a/src/cn/trinea/android/common/util/CacheManager.java +++ b/src/cn/trinea/android/common/util/CacheManager.java @@ -15,7 +15,7 @@ public class CacheManager { private static HttpCache httpCache = null; - private CacheManager(){ + private CacheManager() { } diff --git a/src/cn/trinea/android/common/util/DbHelper.java b/src/cn/trinea/android/common/util/DbHelper.java index bcd23a9..b7ec54b 100644 --- a/src/cn/trinea/android/common/util/DbHelper.java +++ b/src/cn/trinea/android/common/util/DbHelper.java @@ -12,7 +12,7 @@ */ public class DbHelper extends SQLiteOpenHelper { - public DbHelper(Context context){ + public DbHelper(Context context) { super(context, DbConstants.DB_NAME, null, DbConstants.DB_VERSION); } @@ -33,6 +33,5 @@ public void onCreate(SQLiteDatabase db) { } @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - } + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} } diff --git a/src/cn/trinea/android/common/util/DigestUtils.java b/src/cn/trinea/android/common/util/DigestUtils.java index 2ac8b7e..e50bcd4 100644 --- a/src/cn/trinea/android/common/util/DigestUtils.java +++ b/src/cn/trinea/android/common/util/DigestUtils.java @@ -12,8 +12,8 @@ public class DigestUtils { /** * Used to build output as Hex */ - private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', - 'e', 'f' }; + private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', + 'e', 'f' }; /** * encode By MD5 diff --git a/src/cn/trinea/android/common/util/DownloadManagerPro.java b/src/cn/trinea/android/common/util/DownloadManagerPro.java index 4d1b88f..e2612f2 100644 --- a/src/cn/trinea/android/common/util/DownloadManagerPro.java +++ b/src/cn/trinea/android/common/util/DownloadManagerPro.java @@ -55,7 +55,7 @@ public class DownloadManagerPro { private DownloadManager downloadManager; - public DownloadManagerPro(DownloadManager downloadManager){ + public DownloadManagerPro(DownloadManager downloadManager) { this.downloadManager = downloadManager; } @@ -74,14 +74,14 @@ public int getStatusById(long downloadId) { * * @param downloadId * @return a int array with two elements - *
          - *
        • result[0] represents downloaded bytes, This will initially be -1.
        • - *
        • result[1] represents total bytes, This will initially be -1.
        • - *
        + *
          + *
        • result[0] represents downloaded bytes, This will initially be -1.
        • + *
        • result[1] represents total bytes, This will initially be -1.
        • + *
        */ public int[] getDownloadBytes(long downloadId) { int[] bytesAndStatus = getBytesAndStatus(downloadId); - return new int[] { bytesAndStatus[0], bytesAndStatus[1] }; + return new int[] {bytesAndStatus[0], bytesAndStatus[1]}; } /** @@ -89,14 +89,14 @@ public int[] getDownloadBytes(long downloadId) { * * @param downloadId * @return a int array with three elements - *
          - *
        • result[0] represents downloaded bytes, This will initially be -1.
        • - *
        • result[1] represents total bytes, This will initially be -1.
        • - *
        • result[2] represents download status, This will initially be 0.
        • - *
        + *
          + *
        • result[0] represents downloaded bytes, This will initially be -1.
        • + *
        • result[1] represents total bytes, This will initially be -1.
        • + *
        • result[2] represents download status, This will initially be 0.
        • + *
        */ public int[] getBytesAndStatus(long downloadId) { - int[] bytesAndStatus = new int[] { -1, -1, 0 }; + int[] bytesAndStatus = new int[] {-1, -1, 0}; DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId); Cursor c = null; try { @@ -127,7 +127,7 @@ public int pauseDownload(long... ids) { } try { - return ((Integer)pauseDownload.invoke(downloadManager, ids)).intValue(); + return ((Integer) pauseDownload.invoke(downloadManager, ids)).intValue(); } catch (Exception e) { /** * accept all exception, include ClassNotFoundException, NoSuchMethodException, InvocationTargetException, @@ -151,7 +151,7 @@ public int resumeDownload(long... ids) { } try { - return ((Integer)resumeDownload.invoke(downloadManager, ids)).intValue(); + return ((Integer) resumeDownload.invoke(downloadManager, ids)).intValue(); } catch (Exception e) { /** * accept all exception, include ClassNotFoundException, NoSuchMethodException, InvocationTargetException, @@ -226,11 +226,12 @@ public String getUri(long downloadId) { * * @param downloadId * @return
          - *
        • if status of downloadId is {@link DownloadManager#STATUS_PAUSED}, return {@link #getPausedReason(long)}
        • - *
        • if status of downloadId is {@link DownloadManager#STATUS_FAILED}, return {@link #getErrorCode(long)}
        • - *
        • if status of downloadId is neither {@link DownloadManager#STATUS_PAUSED} nor - * {@link DownloadManager#STATUS_FAILED}, return 0
        • - *
        + *
      • if status of downloadId is {@link DownloadManager#STATUS_PAUSED}, return + * {@link #getPausedReason(long)}
      • + *
      • if status of downloadId is {@link DownloadManager#STATUS_FAILED}, return {@link #getErrorCode(long)}
      • + *
      • if status of downloadId is neither {@link DownloadManager#STATUS_PAUSED} nor + * {@link DownloadManager#STATUS_FAILED}, return 0
      • + *
      */ public int getReason(long downloadId) { return getInt(downloadId, DownloadManager.COLUMN_REASON); @@ -241,13 +242,13 @@ public int getReason(long downloadId) { * * @param downloadId * @return
        - *
      • if status of downloadId is {@link DownloadManager#STATUS_PAUSED}, return one of - * {@link DownloadManager#PAUSED_WAITING_TO_RETRY}
        - * {@link DownloadManager#PAUSED_WAITING_FOR_NETWORK}
        - * {@link DownloadManager#PAUSED_QUEUED_FOR_WIFI}
        - * {@link DownloadManager#PAUSED_UNKNOWN}
      • - *
      • else return {@link DownloadManager#PAUSED_UNKNOWN}
      • - *
      + *
    • if status of downloadId is {@link DownloadManager#STATUS_PAUSED}, return one of + * {@link DownloadManager#PAUSED_WAITING_TO_RETRY}
      + * {@link DownloadManager#PAUSED_WAITING_FOR_NETWORK}
      + * {@link DownloadManager#PAUSED_QUEUED_FOR_WIFI}
      + * {@link DownloadManager#PAUSED_UNKNOWN}
    • + *
    • else return {@link DownloadManager#PAUSED_UNKNOWN}
    • + *
    */ public int getPausedReason(long downloadId) { return getInt(downloadId, DownloadManager.COLUMN_REASON); @@ -277,7 +278,7 @@ public static class RequestPro extends DownloadManager.Request { /** * @param uri the HTTP URI to download. */ - public RequestPro(Uri uri){ + public RequestPro(Uri uri) { super(uri); } diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index 6c5f45e..e73f072 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -462,12 +462,12 @@ public static String getFileExtension(String filePath) { * * @param filePath * @return true if the necessary directories have been created or the target directory already exists, false one of - * the directories can not be created. - *
      - *
    • if {@link FileUtils#getFolderName(String)} return null, return false
    • - *
    • if target directory already exists, return true
    • - *
    • return {@link java.io.File#makeFolder}
    • - *
    + * the directories can not be created. + *
      + *
    • if {@link FileUtils#getFolderName(String)} return null, return false
    • + *
    • if target directory already exists, return true
    • + *
    • return {@link java.io.File#makeFolder}
    • + *
    */ public static boolean makeDirs(String filePath) { String folderName = getFolderName(filePath); diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index 25f328b..37e1519 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -79,7 +79,7 @@ public static HttpResponse httpGet(HttpRequest request) { try { HttpResponse response = new HttpResponse(request.getUrl()); // default gzip encode - con = (HttpURLConnection)url.openConnection(); + con = (HttpURLConnection) url.openConnection(); setURLConnection(request, con); input = new BufferedReader(new InputStreamReader(con.getInputStream())); StringBuilder sb = new StringBuilder(); @@ -157,7 +157,7 @@ public static String httpGetString(String httpUrl) { * * @param url * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do - * something + * something */ public static void httpGet(String url, HttpListener listener) { new HttpStringAsyncTask(listener).execute(url); @@ -173,7 +173,7 @@ public static void httpGet(String url, HttpListener listener) { * * @param request * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do - * something + * something */ public static void httpGet(HttpRequest request, HttpListener listener) { new HttpRequestAsyncTask(listener).execute(request); @@ -202,7 +202,7 @@ public static HttpResponse httpPost(HttpRequest request) { try { HttpResponse response = new HttpResponse(request.getUrl()); // default gzip encode - con = (HttpURLConnection)url.openConnection(); + con = (HttpURLConnection) url.openConnection(); setURLConnection(request, con); con.setRequestMethod("POST"); con.setDoOutput(true); @@ -270,7 +270,7 @@ public static String httpPostString(String httpUrl) { * * @param httpUrl * @param parasMap paras map, key is para name, value is para value. will be transfrom to String by - * {@link HttpUtils#joinParas(Map)} + * {@link HttpUtils#joinParas(Map)} * @return the content of the url, if null represents http error * @see HttpUtils#httpPost(HttpRequest) */ @@ -334,7 +334,7 @@ public static String joinParas(Map parasMap) { StringBuilder paras = new StringBuilder(); Iterator> ite = parasMap.entrySet().iterator(); while (ite.hasNext()) { - Map.Entry entry = (Map.Entry)ite.next(); + Map.Entry entry = (Map.Entry) ite.next(); paras.append(entry.getKey()).append(EQUAL_SIGN).append(entry.getValue()); if (ite.hasNext()) { paras.append(PARAMETERS_SEPARATOR); @@ -357,7 +357,7 @@ public static String joinParasWithEncodedValue(Map parasMap) { Iterator> ite = parasMap.entrySet().iterator(); try { while (ite.hasNext()) { - Map.Entry entry = (Map.Entry)ite.next(); + Map.Entry entry = (Map.Entry) ite.next(); paras.append(entry.getKey()).append(EQUAL_SIGN).append(StringUtils.utf8Encode(entry.getValue())); if (ite.hasNext()) { paras.append(PARAMETERS_SEPARATOR); @@ -393,7 +393,7 @@ public static String appendParaToUrl(String url, String paraKey, String paraValu } private static final SimpleDateFormat GMT_FORMAT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", - Locale.ENGLISH); + Locale.ENGLISH); /** * parse gmt time to long @@ -476,7 +476,7 @@ private static class HttpStringAsyncTask extends AsyncTaskthis can be null if you not want to do something * */ - protected void onPreGet() { - } + protected void onPreGet() {} /** * Runs on the UI thread after httpGet. The httpResponse is returned by httpGet. @@ -557,7 +556,6 @@ protected void onPreGet() { * * @param httpResponse get by the url */ - protected void onPostGet(HttpResponse httpResponse) { - } + protected void onPostGet(HttpResponse httpResponse) {} } } diff --git a/src/cn/trinea/android/common/util/ImageCacheManager.java b/src/cn/trinea/android/common/util/ImageCacheManager.java index f4ec343..8d850c1 100644 --- a/src/cn/trinea/android/common/util/ImageCacheManager.java +++ b/src/cn/trinea/android/common/util/ImageCacheManager.java @@ -70,7 +70,7 @@ private static void setImageCache() { @Override public void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolean isInCache) { if (view != null && loadedImage != null) { - ImageView imageView = (ImageView)view; + ImageView imageView = (ImageView) view; imageView.setImageBitmap(loadedImage); // first time show with animation if (!isInCache) { @@ -80,16 +80,13 @@ public void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolean } @Override - public void onPreGet(String imageUrl, View view) { - } + public void onPreGet(String imageUrl, View view) {} @Override - public void onGetFailed(String imageUrl, Bitmap loadedImage, View view, FailedReason failedReason) { - } + public void onGetFailed(String imageUrl, Bitmap loadedImage, View view, FailedReason failedReason) {} @Override - public void onGetNotInCache(String imageUrl, View view) { - } + public void onGetNotInCache(String imageUrl, View view) {} }; imageCache.setOnImageCallbackListener(imageCallBack); imageCache.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); @@ -112,7 +109,7 @@ private static void setImageSDCardCache() { @Override public void onGetSuccess(String imageUrl, String imagePath, View view, boolean isInCache) { - ImageView imageView = (ImageView)view; + ImageView imageView = (ImageView) view; // if oom please use BitmapFactory.decodeFile(imagePath, option) Bitmap bm = BitmapFactory.decodeFile(imagePath); @@ -127,16 +124,13 @@ public void onGetSuccess(String imageUrl, String imagePath, View view, boolean i } @Override - public void onPreGet(String imageUrl, View view) { - } + public void onPreGet(String imageUrl, View view) {} @Override - public void onGetNotInCache(String imageUrl, View view) { - } + public void onGetNotInCache(String imageUrl, View view) {} @Override - public void onGetFailed(String imageUrl, String imagePath, View view, FailedReason failedReason) { - } + public void onGetFailed(String imageUrl, String imagePath, View view, FailedReason failedReason) {} }; imageSDCardCache.setOnImageSDCallbackListener(imageCallBack); imageSDCardCache.setCacheFullRemoveType(new RemoveTypeLastUsedTimeFirst()); @@ -152,7 +146,7 @@ public static AlphaAnimation getInAlphaAnimation(long durationMillis) { return inAlphaAnimation; } - private ImageCacheManager(){ + private ImageCacheManager() { } } diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 989900e..7e81efa 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -74,7 +74,7 @@ public static Bitmap byteToBitmap(byte[] b) { * @return */ public static Bitmap drawableToBitmap(Drawable d) { - return d == null ? null : ((BitmapDrawable)d).getBitmap(); + return d == null ? null : ((BitmapDrawable) d).getBitmap(); } /** @@ -130,11 +130,11 @@ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut * @throws IOException */ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis, - Map requestProperties) { + Map requestProperties) { InputStream stream = null; try { URL url = new URL(imageUrl); - HttpURLConnection con = (HttpURLConnection)url.openConnection(); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); HttpUtils.setURLConnection(requestProperties, con); if (readTimeOutMillis > 0) { con.setReadTimeout(readTimeOutMillis); @@ -171,7 +171,7 @@ public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis * @return */ public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis, - Map requestProperties) { + Map requestProperties) { InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOutMillis, requestProperties); Drawable d = Drawable.createFromStream(stream, "src"); closeInputStream(stream); @@ -213,7 +213,7 @@ public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut, Map - *
  • if jsonObject is null, return defaultValue
  • - *
  • if key is null or empty, return defaultValue
  • - *
  • if {@link JSONObject#getLong(String)} exception, return defaultValue
  • - *
  • return {@link JSONObject#getLong(String)}
  • - * + *
  • if jsonObject is null, return defaultValue
  • + *
  • if key is null or empty, return defaultValue
  • + *
  • if {@link JSONObject#getLong(String)} exception, return defaultValue
  • + *
  • return {@link JSONObject#getLong(String)}
  • + * */ public static Long getLong(JSONObject jsonObject, String key, Long defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { @@ -52,10 +52,10 @@ public static Long getLong(JSONObject jsonObject, String key, Long defaultValue) * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONUtils#getLong(JSONObject, String, JSONObject)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONUtils#getLong(JSONObject, String, JSONObject)}
  • + * */ public static Long getLong(String jsonData, String key, Long defaultValue) { if (StringUtils.isEmpty(jsonData)) { @@ -81,7 +81,7 @@ public static Long getLong(String jsonData, String key, Long defaultValue) { * @see JSONUtils#getLong(JSONObject, String, Long) */ public static long getLong(JSONObject jsonObject, String key, long defaultValue) { - return getLong(jsonObject, key, (Long)defaultValue); + return getLong(jsonObject, key, (Long) defaultValue); } /** @@ -92,7 +92,7 @@ public static long getLong(JSONObject jsonObject, String key, long defaultValue) * @see JSONUtils#getLong(String, String, Long) */ public static long getLong(String jsonData, String key, long defaultValue) { - return getLong(jsonData, key, (Long)defaultValue); + return getLong(jsonData, key, (Long) defaultValue); } /** @@ -102,11 +102,11 @@ public static long getLong(String jsonData, String key, long defaultValue) { * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if key is null or empty, return defaultValue
    • - *
    • if {@link JSONObject#getInt(String)} exception, return defaultValue
    • - *
    • return {@link JSONObject#getInt(String)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if key is null or empty, return defaultValue
  • + *
  • if {@link JSONObject#getInt(String)} exception, return defaultValue
  • + *
  • return {@link JSONObject#getInt(String)}
  • + * */ public static Integer getInt(JSONObject jsonObject, String key, Integer defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { @@ -130,10 +130,10 @@ public static Integer getInt(JSONObject jsonObject, String key, Integer defaultV * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONUtils#getInt(JSONObject, String, JSONObject)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONUtils#getInt(JSONObject, String, JSONObject)}
  • + * */ public static Integer getInt(String jsonData, String key, Integer defaultValue) { if (StringUtils.isEmpty(jsonData)) { @@ -159,7 +159,7 @@ public static Integer getInt(String jsonData, String key, Integer defaultValue) * @see JSONUtils#getInt(JSONObject, String, Integer) */ public static int getInt(JSONObject jsonObject, String key, int defaultValue) { - return getInt(jsonObject, key, (Integer)defaultValue); + return getInt(jsonObject, key, (Integer) defaultValue); } /** @@ -170,7 +170,7 @@ public static int getInt(JSONObject jsonObject, String key, int defaultValue) { * @see JSONUtils#getInt(String, String, Integer) */ public static int getInt(String jsonData, String key, int defaultValue) { - return getInt(jsonData, key, (Integer)defaultValue); + return getInt(jsonData, key, (Integer) defaultValue); } /** @@ -180,11 +180,11 @@ public static int getInt(String jsonData, String key, int defaultValue) { * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if key is null or empty, return defaultValue
    • - *
    • if {@link JSONObject#getDouble(String)} exception, return defaultValue
    • - *
    • return {@link JSONObject#getDouble(String)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if key is null or empty, return defaultValue
  • + *
  • if {@link JSONObject#getDouble(String)} exception, return defaultValue
  • + *
  • return {@link JSONObject#getDouble(String)}
  • + * */ public static Double getDouble(JSONObject jsonObject, String key, Double defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { @@ -208,10 +208,10 @@ public static Double getDouble(JSONObject jsonObject, String key, Double default * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONUtils#getDouble(JSONObject, String, JSONObject)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONUtils#getDouble(JSONObject, String, JSONObject)}
  • + * */ public static Double getDouble(String jsonData, String key, Double defaultValue) { if (StringUtils.isEmpty(jsonData)) { @@ -237,7 +237,7 @@ public static Double getDouble(String jsonData, String key, Double defaultValue) * @see JSONUtils#getDouble(JSONObject, String, Double) */ public static double getDouble(JSONObject jsonObject, String key, double defaultValue) { - return getDouble(jsonObject, key, (Double)defaultValue); + return getDouble(jsonObject, key, (Double) defaultValue); } /** @@ -248,7 +248,7 @@ public static double getDouble(JSONObject jsonObject, String key, double default * @see JSONUtils#getDouble(String, String, Double) */ public static double getDouble(String jsonData, String key, double defaultValue) { - return getDouble(jsonData, key, (Double)defaultValue); + return getDouble(jsonData, key, (Double) defaultValue); } /** @@ -258,11 +258,11 @@ public static double getDouble(String jsonData, String key, double defaultValue) * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if key is null or empty, return defaultValue
    • - *
    • if {@link JSONObject#getString(String)} exception, return defaultValue
    • - *
    • return {@link JSONObject#getString(String)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if key is null or empty, return defaultValue
  • + *
  • if {@link JSONObject#getString(String)} exception, return defaultValue
  • + *
  • return {@link JSONObject#getString(String)}
  • + * */ public static String getString(JSONObject jsonObject, String key, String defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { @@ -286,10 +286,10 @@ public static String getString(JSONObject jsonObject, String key, String default * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONUtils#getString(JSONObject, String, JSONObject)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONUtils#getString(JSONObject, String, JSONObject)}
  • + * */ public static String getString(String jsonData, String key, String defaultValue) { if (StringUtils.isEmpty(jsonData)) { @@ -314,12 +314,12 @@ public static String getString(String jsonData, String key, String defaultValue) * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if key is null or empty, return defaultValue
    • - *
    • if {@link JSONObject#getJSONArray(String)} exception, return defaultValue
    • - *
    • if {@link JSONArray#getString(int)} exception, return defaultValue
    • - *
    • return string array
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if key is null or empty, return defaultValue
  • + *
  • if {@link JSONObject#getJSONArray(String)} exception, return defaultValue
  • + *
  • if {@link JSONArray#getString(int)} exception, return defaultValue
  • + *
  • return string array
  • + * */ public static String[] getStringArray(JSONObject jsonObject, String key, String[] defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { @@ -351,10 +351,10 @@ public static String[] getStringArray(JSONObject jsonObject, String key, String[ * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONUtils#getStringArray(JSONObject, String, JSONObject)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONUtils#getStringArray(JSONObject, String, JSONObject)}
  • + * */ public static String[] getStringArray(String jsonData, String key, String[] defaultValue) { if (StringUtils.isEmpty(jsonData)) { @@ -379,11 +379,11 @@ public static String[] getStringArray(String jsonData, String key, String[] defa * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if key is null or empty, return defaultValue
    • - *
    • if {@link JSONObject#getJSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONObject#getJSONObject(String)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if key is null or empty, return defaultValue
  • + *
  • if {@link JSONObject#getJSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONObject#getJSONObject(String)}
  • + * */ public static JSONObject getJSONObject(JSONObject jsonObject, String key, JSONObject defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { @@ -407,10 +407,10 @@ public static JSONObject getJSONObject(JSONObject jsonObject, String key, JSONOb * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONUtils#getJSONObject(JSONObject, String, JSONObject)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONUtils#getJSONObject(JSONObject, String, JSONObject)}
  • + * */ public static JSONObject getJSONObject(String jsonData, String key, JSONObject defaultValue) { if (StringUtils.isEmpty(jsonData)) { @@ -435,11 +435,11 @@ public static JSONObject getJSONObject(String jsonData, String key, JSONObject d * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if key is null or empty, return defaultValue
    • - *
    • if {@link JSONObject#getJSONArray(String)} exception, return defaultValue
    • - *
    • return {@link JSONObject#getJSONArray(String)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if key is null or empty, return defaultValue
  • + *
  • if {@link JSONObject#getJSONArray(String)} exception, return defaultValue
  • + *
  • return {@link JSONObject#getJSONArray(String)}
  • + * */ public static JSONArray getJSONArray(JSONObject jsonObject, String key, JSONArray defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { @@ -463,10 +463,10 @@ public static JSONArray getJSONArray(JSONObject jsonObject, String key, JSONArra * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONUtils#getJSONArray(JSONObject, String, JSONObject)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONUtils#getJSONArray(JSONObject, String, JSONObject)}
  • + * */ public static JSONArray getJSONArray(String jsonData, String key, JSONArray defaultValue) { if (StringUtils.isEmpty(jsonData)) { @@ -491,10 +491,10 @@ public static JSONArray getJSONArray(String jsonData, String key, JSONArray defa * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if key is null or empty, return defaultValue
    • - *
    • return {@link JSONObject#getBoolean(String)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if key is null or empty, return defaultValue
  • + *
  • return {@link JSONObject#getBoolean(String)}
  • + * */ public static boolean getBoolean(JSONObject jsonObject, String key, Boolean defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { @@ -518,10 +518,10 @@ public static boolean getBoolean(JSONObject jsonObject, String key, Boolean defa * @param key * @param defaultValue * @return
      - *
    • if jsonObject is null, return defaultValue
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • - *
    • return {@link JSONUtils#getBoolean(JSONObject, String, Boolean)}
    • - *
    + *
  • if jsonObject is null, return defaultValue
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
  • + *
  • return {@link JSONUtils#getBoolean(JSONObject, String, Boolean)}
  • + * */ public static boolean getBoolean(String jsonData, String key, Boolean defaultValue) { if (StringUtils.isEmpty(jsonData)) { @@ -545,9 +545,9 @@ public static boolean getBoolean(String jsonData, String key, Boolean defaultVal * @param jsonObject key-value pairs json * @param key * @return
      - *
    • if jsonObject is null, return null
    • - *
    • return {@link JSONUtils#parseKeyAndValueToMap(String)}
    • - *
    + *
  • if jsonObject is null, return null
  • + *
  • return {@link JSONUtils#parseKeyAndValueToMap(String)}
  • + * */ public static Map getMap(JSONObject jsonObject, String key) { return JSONUtils.parseKeyAndValueToMap(JSONUtils.getString(jsonObject, key, null)); @@ -559,11 +559,11 @@ public static Map getMap(JSONObject jsonObject, String key) { * @param jsonData key-value pairs string * @param key * @return
      - *
    • if jsonData is null, return null
    • - *
    • if jsonData length is 0, return empty map
    • - *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return null
    • - *
    • return {@link JSONUtils#getMap(JSONObject, String)}
    • - *
    + *
  • if jsonData is null, return null
  • + *
  • if jsonData length is 0, return empty map
  • + *
  • if jsonData {@link JSONObject#JSONObject(String)} exception, return null
  • + *
  • return {@link JSONUtils#getMap(JSONObject, String)}
  • + * */ public static Map getMap(String jsonData, String key) { @@ -590,9 +590,9 @@ public static Map getMap(String jsonData, String key) { * * @param sourceObj key-value pairs json * @return
      - *
    • if sourceObj is null, return null
    • - *
    • else parse entry by {@link MapUtils#putMapNotEmptyKey(Map, String, String)} one by one
    • - *
    + *
  • if sourceObj is null, return null
  • + *
  • else parse entry by {@link MapUtils#putMapNotEmptyKey(Map, String, String)} one by one
  • + * */ @SuppressWarnings("rawtypes") public static Map parseKeyAndValueToMap(JSONObject sourceObj) { @@ -602,7 +602,7 @@ public static Map parseKeyAndValueToMap(JSONObject sourceObj) { Map keyAndValueMap = new HashMap(); for (Iterator iter = sourceObj.keys(); iter.hasNext();) { - String key = (String)iter.next(); + String key = (String) iter.next(); MapUtils.putMapNotEmptyKey(keyAndValueMap, key, getString(sourceObj, key, "")); } @@ -614,10 +614,10 @@ public static Map parseKeyAndValueToMap(JSONObject sourceObj) { * * @param source key-value pairs json * @return
      - *
    • if source is null or source's length is 0, return empty map
    • - *
    • if source {@link JSONObject#JSONObject(String)} exception, return null
    • - *
    • return {@link JSONUtils#parseKeyAndValueToMap(JSONObject)}
    • - *
    + *
  • if source is null or source's length is 0, return empty map
  • + *
  • if source {@link JSONObject#JSONObject(String)} exception, return null
  • + *
  • return {@link JSONUtils#parseKeyAndValueToMap(JSONObject)}
  • + * */ public static Map parseKeyAndValueToMap(String source) { if (StringUtils.isEmpty(source)) { diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index b704519..3c8016b 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -112,7 +112,7 @@ public static String join(List list) { * @return join list to string. if list is empty, return "" */ public static String join(List list, char separator) { - return join(list, new String(new char[] { separator })); + return join(list, new String(new char[] {separator})); } /** @@ -215,10 +215,10 @@ public static int distinctList(List sourceList) { * @param sourceList * @param value * @return
      - *
    • if sourceList is null, return false
    • - *
    • if value is null, return false
    • - *
    • return {@link List#add(Object)}
    • - *
    + *
  • if sourceList is null, return false
  • + *
  • if value is null, return false
  • + *
  • return {@link List#add(Object)}
  • + * */ public static boolean addListNotNullValue(List sourceList, V value) { return (sourceList != null && value != null) ? sourceList.add(value) : false; @@ -229,7 +229,7 @@ public static boolean addListNotNullValue(List sourceList, V value) { */ @SuppressWarnings("unchecked") public static V getLast(List sourceList, V value) { - return (sourceList == null) ? null : (V)ArrayUtils.getLast(sourceList.toArray(), value, true); + return (sourceList == null) ? null : (V) ArrayUtils.getLast(sourceList.toArray(), value, true); } /** @@ -237,7 +237,7 @@ public static V getLast(List sourceList, V value) { */ @SuppressWarnings("unchecked") public static V getNext(List sourceList, V value) { - return (sourceList == null) ? null : (V)ArrayUtils.getNext(sourceList.toArray(), value, true); + return (sourceList == null) ? null : (V) ArrayUtils.getNext(sourceList.toArray(), value, true); } /** diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/cn/trinea/android/common/util/MapUtils.java index a7d2deb..d345ed5 100644 --- a/src/cn/trinea/android/common/util/MapUtils.java +++ b/src/cn/trinea/android/common/util/MapUtils.java @@ -40,10 +40,10 @@ public static boolean isEmpty(Map sourceMap) { * @param key * @param value * @return
      - *
    • if map is null, return false
    • - *
    • if key is null or empty, return false
    • - *
    • return {@link Map#put(Object, Object)}
    • - *
    + *
  • if map is null, return false
  • + *
  • if key is null or empty, return false
  • + *
  • return {@link Map#put(Object, Object)}
  • + * */ public static boolean putMapNotEmptyKey(Map map, String key, String value) { if (map == null || StringUtils.isEmpty(key)) { @@ -61,11 +61,11 @@ public static boolean putMapNotEmptyKey(Map map, String key, Str * @param key * @param value * @return
      - *
    • if map is null, return false
    • - *
    • if key is null or empty, return false
    • - *
    • if value is null or empty, return false
    • - *
    • return {@link Map#put(Object, Object)}
    • - *
    + *
  • if map is null, return false
  • + *
  • if key is null or empty, return false
  • + *
  • if value is null or empty, return false
  • + *
  • return {@link Map#put(Object, Object)}
  • + * */ public static boolean putMapNotEmptyKeyAndValue(Map map, String key, String value) { if (map == null || StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) { @@ -84,14 +84,14 @@ public static boolean putMapNotEmptyKeyAndValue(Map map, String * @param value * @param defaultValue * @return
      - *
    • if map is null, return false
    • - *
    • if key is null or empty, return false
    • - *
    • if value is null or empty, put defaultValue, return true
    • - *
    • if value is neither null nor empty,put value, return true
    • - *
    + *
  • if map is null, return false
  • + *
  • if key is null or empty, return false
  • + *
  • if value is null or empty, put defaultValue, return true
  • + *
  • if value is neither null nor empty,put value, return true
  • + * */ public static boolean putMapNotEmptyKeyAndValue(Map map, String key, String value, - String defaultValue) { + String defaultValue) { if (map == null || StringUtils.isEmpty(key)) { return false; } @@ -107,10 +107,10 @@ public static boolean putMapNotEmptyKeyAndValue(Map map, String * @param key * @param value * @return
      - *
    • if map is null, return false
    • - *
    • if key is null, return false
    • - *
    • return {@link Map#put(Object, Object)}
    • - *
    + *
  • if map is null, return false
  • + *
  • if key is null, return false
  • + *
  • return {@link Map#put(Object, Object)}
  • + * */ public static boolean putMapNotNullKey(Map map, K key, V value) { if (map == null || key == null) { @@ -128,11 +128,11 @@ public static boolean putMapNotNullKey(Map map, K key, V value) { * @param key * @param value * @return
      - *
    • if map is null, return false
    • - *
    • if key is null, return false
    • - *
    • if value is null, return false
    • - *
    • return {@link Map#put(Object, Object)}
    • - *
    + *
  • if map is null, return false
  • + *
  • if key is null, return false
  • + *
  • if value is null, return false
  • + *
  • return {@link Map#put(Object, Object)}
  • + * */ public static boolean putMapNotNullKeyAndValue(Map map, K key, V value) { if (map == null || key == null || value == null) { @@ -154,10 +154,10 @@ public static boolean putMapNotNullKeyAndValue(Map map, K key, V va * @param map * @param value * @return
      - *
    • if map is null, return null
    • - *
    • if value exist, return key
    • - *
    • return null
    • - *
    + *
  • if map is null, return null
  • + *
  • if value exist, return key
  • + *
  • return null
  • + * */ public static K getKeyByValue(Map map, V value) { if (isEmpty(map)) { @@ -195,7 +195,7 @@ public static K getKeyByValue(Map map, V value) { * @return */ public static Map parseKeyAndValueToMap(String source, String keyAndValueSeparator, - String keyAndValuePairSeparator, boolean ignoreSpace) { + String keyAndValuePairSeparator, boolean ignoreSpace) { if (StringUtils.isEmpty(source)) { return null; } @@ -219,10 +219,10 @@ public static Map parseKeyAndValueToMap(String source, String ke if (seperator != -1) { if (ignoreSpace) { MapUtils.putMapNotEmptyKey(keyAndValueMap, valueEntity.substring(0, seperator).trim(), - valueEntity.substring(seperator + 1).trim()); + valueEntity.substring(seperator + 1).trim()); } else { MapUtils.putMapNotEmptyKey(keyAndValueMap, valueEntity.substring(0, seperator), - valueEntity.substring(seperator + 1)); + valueEntity.substring(seperator + 1)); } } } @@ -237,12 +237,12 @@ public static Map parseKeyAndValueToMap(String source, String ke * @param ignoreSpace whether ignore space at the begging or end of key and value * @return * @see {@link MapUtils#parseKeyAndValueToMap(String, String, String, boolean)}, keyAndValueSeparator is - * {@link #DEFAULT_KEY_AND_VALUE_SEPARATOR}, keyAndValuePairSeparator is - * {@link #DEFAULT_KEY_AND_VALUE_PAIR_SEPARATOR} + * {@link #DEFAULT_KEY_AND_VALUE_SEPARATOR}, keyAndValuePairSeparator is + * {@link #DEFAULT_KEY_AND_VALUE_PAIR_SEPARATOR} */ public static Map parseKeyAndValueToMap(String source, boolean ignoreSpace) { return parseKeyAndValueToMap(source, DEFAULT_KEY_AND_VALUE_SEPARATOR, DEFAULT_KEY_AND_VALUE_PAIR_SEPARATOR, - ignoreSpace); + ignoreSpace); } /** @@ -251,12 +251,12 @@ public static Map parseKeyAndValueToMap(String source, boolean i * @param source key-value pairs * @return * @see {@link MapUtils#parseKeyAndValueToMap(String, String, String, boolean)}, keyAndValueSeparator is - * {@link #DEFAULT_KEY_AND_VALUE_SEPARATOR}, keyAndValuePairSeparator is - * {@link #DEFAULT_KEY_AND_VALUE_PAIR_SEPARATOR}, ignoreSpace is true + * {@link #DEFAULT_KEY_AND_VALUE_SEPARATOR}, keyAndValuePairSeparator is + * {@link #DEFAULT_KEY_AND_VALUE_PAIR_SEPARATOR}, ignoreSpace is true */ public static Map parseKeyAndValueToMap(String source) { return parseKeyAndValueToMap(source, DEFAULT_KEY_AND_VALUE_SEPARATOR, DEFAULT_KEY_AND_VALUE_PAIR_SEPARATOR, - true); + true); } /** @@ -274,7 +274,7 @@ public static String toJson(Map map) { paras.append("{"); Iterator> ite = map.entrySet().iterator(); while (ite.hasNext()) { - Map.Entry entry = (Map.Entry)ite.next(); + Map.Entry entry = (Map.Entry) ite.next(); paras.append("\"").append(entry.getKey()).append("\":\"").append(entry.getValue()).append("\""); if (ite.hasNext()) { paras.append(","); diff --git a/src/cn/trinea/android/common/util/ObjectUtils.java b/src/cn/trinea/android/common/util/ObjectUtils.java index 5c87c08..b940732 100644 --- a/src/cn/trinea/android/common/util/ObjectUtils.java +++ b/src/cn/trinea/android/common/util/ObjectUtils.java @@ -13,9 +13,9 @@ public class ObjectUtils { * @param actual * @param expected * @return
      - *
    • if both are null, return true
    • - *
    • return actual.{@link Object#equals(Object)}
    • - *
    + *
  • if both are null, return true
  • + *
  • return actual.{@link Object#equals(Object)}
  • + * */ public static boolean isEquals(Object actual, Object expected) { return actual == expected || (actual == null ? expected == null : actual.equals(expected)); @@ -97,8 +97,8 @@ public static int[] transformIntArray(Integer[] source) { * @param v2 * @return */ - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({"unchecked", "rawtypes"}) public static int compare(V v1, V v2) { - return v1 == null ? (v2 == null ? 0 : -1) : (v2 == null ? 1 : ((Comparable)v1).compareTo(v2)); + return v1 == null ? (v2 == null ? 0 : -1) : (v2 == null ? 1 : ((Comparable) v1).compareTo(v2)); } } diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 4f1fe09..3c4e184 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -108,7 +108,7 @@ public static boolean installNormal(Context context, String filePath) { * @param context * @param filePath file path of package * @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see - * {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_* + * {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_* * @see #installSilent(Context, String, String) */ public static int installSilent(Context context, String filePath) { @@ -128,7 +128,7 @@ public static int installSilent(Context context, String filePath) { * @param filePath file path of package * @param pmParams pm install params * @return {@link PackageUtils#INSTALL_SUCCEEDED} means install success, other means failed. details see - * {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_* + * {@link PackageUtils}.INSTALL_FAILED_*. same to {@link PackageManager}.INSTALL_* */ public static int installSilent(Context context, String filePath, String pmParams) { if (filePath == null || filePath.length() == 0) { @@ -145,17 +145,16 @@ public static int installSilent(Context context, String filePath, String pmParam * android:name="android.permission.INSTALL_PACKAGES" /> in mainfest **/ StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install ") - .append(pmParams == null ? "" : pmParams).append(" ") - .append(filePath.replace(" ", "\\ ")); + .append(pmParams == null ? "" : pmParams).append(" ").append(filePath.replace(" ", "\\ ")); CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true); if (commandResult.successMsg != null - && (commandResult.successMsg.contains("Success") || commandResult.successMsg.contains("success"))) { + && (commandResult.successMsg.contains("Success") || commandResult.successMsg.contains("success"))) { return INSTALL_SUCCEEDED; } Log.e(TAG, - new StringBuilder().append("installSilent successMsg:").append(commandResult.successMsg) - .append(", ErrorMsg:").append(commandResult.errorMsg).toString()); + new StringBuilder().append("installSilent successMsg:").append(commandResult.successMsg) + .append(", ErrorMsg:").append(commandResult.errorMsg).toString()); if (commandResult.errorMsg == null) { return INSTALL_FAILED_OTHER; } @@ -299,7 +298,7 @@ public static boolean uninstallNormal(Context context, String packageName) { } Intent i = new Intent(Intent.ACTION_DELETE, Uri.parse(new StringBuilder(32).append("package:") - .append(packageName).toString())); + .append(packageName).toString())); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); return true; @@ -330,10 +329,10 @@ public static int uninstallSilent(Context context, String packageName) { * @param packageName package name of app * @param isKeepData whether keep the data and cache directories around after package removal * @return
      - *
    • {@link #DELETE_SUCCEEDED} means uninstall success
    • - *
    • {@link #DELETE_FAILED_INTERNAL_ERROR} means internal error
    • - *
    • {@link #DELETE_FAILED_INVALID_PACKAGE} means package name error
    • - *
    • {@link #DELETE_FAILED_PERMISSION_DENIED} means permission denied
    • + *
    • {@link #DELETE_SUCCEEDED} means uninstall success
    • + *
    • {@link #DELETE_FAILED_INTERNAL_ERROR} means internal error
    • + *
    • {@link #DELETE_FAILED_INVALID_PACKAGE} means package name error
    • + *
    • {@link #DELETE_FAILED_PERMISSION_DENIED} means permission denied
    • */ public static int uninstallSilent(Context context, String packageName, boolean isKeepData) { if (packageName == null || packageName.length() == 0) { @@ -345,16 +344,15 @@ public static int uninstallSilent(Context context, String packageName, boolean i * android:name="android.permission.DELETE_PACKAGES" /> in mainfest **/ StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm uninstall") - .append(isKeepData ? " -k " : " ") - .append(packageName.replace(" ", "\\ ")); + .append(isKeepData ? " -k " : " ").append(packageName.replace(" ", "\\ ")); CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true); if (commandResult.successMsg != null - && (commandResult.successMsg.contains("Success") || commandResult.successMsg.contains("success"))) { + && (commandResult.successMsg.contains("Success") || commandResult.successMsg.contains("success"))) { return DELETE_SUCCEEDED; } Log.e(TAG, - new StringBuilder().append("uninstallSilent successMsg:").append(commandResult.successMsg) - .append(", ErrorMsg:").append(commandResult.errorMsg).toString()); + new StringBuilder().append("uninstallSilent successMsg:").append(commandResult.successMsg) + .append(", ErrorMsg:").append(commandResult.errorMsg).toString()); if (commandResult.errorMsg == null) { return DELETE_FAILED_INTERNAL_ERROR; } @@ -399,12 +397,12 @@ public static boolean isSystemApplication(Context context, String packageName) { * @param packageManager * @param packageName * @return
        - *
      • if packageManager is null, return false
      • - *
      • if package name is null or is empty, return false
      • - *
      • if package name not exit, return false
      • - *
      • if package name exit, but not system app, return false
      • - *
      • else return true
      • - *
      + *
    • if packageManager is null, return false
    • + *
    • if package name is null or is empty, return false
    • + *
    • if package name not exit, return false
    • + *
    • if package name exit, but not system app, return false
    • + *
    • else return true
    • + *
    */ public static boolean isSystemApplication(PackageManager packageManager, String packageName) { if (packageManager == null || packageName == null || packageName.length() == 0) { @@ -430,14 +428,14 @@ public static boolean isSystemApplication(PackageManager packageManager, String * @param context * @param packageName * @return if params error or task stack is null, return null, otherwise retun whether the app is on the top of - * stack + * stack */ public static Boolean isTopActivity(Context context, String packageName) { if (context == null || StringUtils.isEmpty(packageName)) { return null; } - ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List tasksInfo = activityManager.getRunningTasks(1); if (ListUtils.isEmpty(tasksInfo)) { return null; @@ -482,8 +480,8 @@ public static int getAppVersionCode(Context context) { * @see {@link IPackageManager#getInstallLocation()} */ public static int getInstallLocation() { - CommandResult commandResult = ShellUtils.execCommand("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm get-install-location", - false, true); + CommandResult commandResult = ShellUtils.execCommand( + "LD_LIBRARY_PATH=/vendor/lib:/system/lib pm get-install-location", false, true); if (commandResult.result == 0 && commandResult.successMsg != null && commandResult.successMsg.length() > 0) { try { int location = Integer.parseInt(commandResult.successMsg.substring(0, 1)); diff --git a/src/cn/trinea/android/common/util/ParcelUtils.java b/src/cn/trinea/android/common/util/ParcelUtils.java index 3601c66..2cac908 100644 --- a/src/cn/trinea/android/common/util/ParcelUtils.java +++ b/src/cn/trinea/android/common/util/ParcelUtils.java @@ -99,7 +99,7 @@ public static Map readHashMapStringKey(Parcel Map map = new HashMap(); for (int i = 0; i < size; i++) { String key = in.readString(); - map.put(key, (V)in.readParcelable(loader)); + map.put(key, (V) in.readParcelable(loader)); } return map; } @@ -145,7 +145,7 @@ public static Map readHashMap Map map = new HashMap(); for (int i = 0; i < size; i++) { - map.put((K)in.readParcelable(loader), (V)in.readParcelable(loader)); + map.put((K) in.readParcelable(loader), (V) in.readParcelable(loader)); } return map; } diff --git a/src/cn/trinea/android/common/util/PreferencesUtils.java b/src/cn/trinea/android/common/util/PreferencesUtils.java index c3b3594..767d4b1 100644 --- a/src/cn/trinea/android/common/util/PreferencesUtils.java +++ b/src/cn/trinea/android/common/util/PreferencesUtils.java @@ -53,7 +53,7 @@ public static boolean putString(Context context, String key, String value) { * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or null. Throws ClassCastException if there is a preference with this - * name that is not a string + * name that is not a string * @see #getString(Context, String, String) */ public static String getString(Context context, String key) { @@ -67,7 +67,7 @@ public static String getString(Context context, String key) { * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with - * this name that is not a string + * this name that is not a string */ public static String getString(Context context, String key, String defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -95,7 +95,7 @@ public static boolean putInt(Context context, String key, int value) { * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this - * name that is not a int + * name that is not a int * @see #getInt(Context, String, int) */ public static int getInt(Context context, String key) { @@ -109,7 +109,7 @@ public static int getInt(Context context, String key) { * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with - * this name that is not a int + * this name that is not a int */ public static int getInt(Context context, String key, int defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -137,7 +137,7 @@ public static boolean putLong(Context context, String key, long value) { * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this - * name that is not a long + * name that is not a long * @see #getLong(Context, String, long) */ public static long getLong(Context context, String key) { @@ -151,7 +151,7 @@ public static long getLong(Context context, String key) { * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with - * this name that is not a long + * this name that is not a long */ public static long getLong(Context context, String key, long defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -179,7 +179,7 @@ public static boolean putFloat(Context context, String key, float value) { * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or -1. Throws ClassCastException if there is a preference with this - * name that is not a float + * name that is not a float * @see #getFloat(Context, String, float) */ public static float getFloat(Context context, String key) { @@ -193,7 +193,7 @@ public static float getFloat(Context context, String key) { * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with - * this name that is not a float + * this name that is not a float */ public static float getFloat(Context context, String key, float defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -221,7 +221,7 @@ public static boolean putBoolean(Context context, String key, boolean value) { * @param context * @param key The name of the preference to retrieve * @return The preference value if it exists, or false. Throws ClassCastException if there is a preference with this - * name that is not a boolean + * name that is not a boolean * @see #getBoolean(Context, String, boolean) */ public static boolean getBoolean(Context context, String key) { @@ -235,7 +235,7 @@ public static boolean getBoolean(Context context, String key) { * @param key The name of the preference to retrieve * @param defaultValue Value to return if this preference does not exist * @return The preference value if it exists, or defValue. Throws ClassCastException if there is a preference with - * this name that is not a boolean + * this name that is not a boolean */ public static boolean getBoolean(Context context, String key, boolean defaultValue) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index cea49b3..ab119c0 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -102,9 +102,9 @@ public static String getRandomLowerCaseLetters(int length) { * @param source * @param length * @return
      - *
    • if source is null or empty, return null
    • - *
    • else see {@link RandomUtils#getRandom(char[] sourceChar, int length)}
    • - *
    + *
  • if source is null or empty, return null
  • + *
  • else see {@link RandomUtils#getRandom(char[] sourceChar, int length)}
  • + * */ public static String getRandom(String source, int length) { return StringUtils.isEmpty(source) ? null : getRandom(source.toCharArray(), length); @@ -116,9 +116,9 @@ public static String getRandom(String source, int length) { * @param sourceChar * @param length * @return
      - *
    • if sourceChar is null or empty, return null
    • - *
    • if length less than 0, return null
    • - *
    + *
  • if sourceChar is null or empty, return null
  • + *
  • if length less than 0, return null
  • + * */ public static String getRandom(char[] sourceChar, int length) { if (sourceChar == null || sourceChar.length == 0 || length < 0) { @@ -138,9 +138,9 @@ public static String getRandom(char[] sourceChar, int length) { * * @param max * @return
      - *
    • if max <= 0, return 0
    • - *
    • else return random int between 0 and max
    • - *
    + *
  • if max <= 0, return 0
  • + *
  • else return random int between 0 and max
  • + * */ public static int getRandom(int max) { return getRandom(0, max); @@ -152,10 +152,10 @@ public static int getRandom(int max) { * @param min * @param max * @return
      - *
    • if min > max, return 0
    • - *
    • if min == max, return min
    • - *
    • else return random int between min and max
    • - *
    + *
  • if min > max, return 0
  • + *
  • if min == max, return min
  • + *
  • else return random int between min and max
  • + * */ public static int getRandom(int min, int max) { if (min > max) { diff --git a/src/cn/trinea/android/common/util/ResourceUtils.java b/src/cn/trinea/android/common/util/ResourceUtils.java index b6dad39..78ce066 100644 --- a/src/cn/trinea/android/common/util/ResourceUtils.java +++ b/src/cn/trinea/android/common/util/ResourceUtils.java @@ -44,9 +44,9 @@ public static String geFileFromAssets(Context context, String fileName) { } /** - * get content from a raw resource. This can only be used with resources whose value is the name of an - * asset files -- that is, it can be used to open drawable, sound, and raw resources; it will fail on string and - * color resources. + * get content from a raw resource. This can only be used with resources whose value is the name of an asset files + * -- that is, it can be used to open drawable, sound, and raw resources; it will fail on string and color + * resources. * * @param context * @param resId The resource identifier to open, as generated by the appt tool. diff --git a/src/cn/trinea/android/common/util/ScreenUtils.java b/src/cn/trinea/android/common/util/ScreenUtils.java index 786cd64..4ccbd0d 100644 --- a/src/cn/trinea/android/common/util/ScreenUtils.java +++ b/src/cn/trinea/android/common/util/ScreenUtils.java @@ -29,10 +29,10 @@ public static float pxToDp(Context context, float px) { } public static float dpToPxInt(Context context, float dp) { - return (int)(dpToPx(context, dp) + 0.5f); + return (int) (dpToPx(context, dp) + 0.5f); } public static float pxToDpCeilInt(Context context, float px) { - return (int)(pxToDp(context, px) + 0.5f); + return (int) (pxToDp(context, px) + 0.5f); } } diff --git a/src/cn/trinea/android/common/util/ShellUtils.java b/src/cn/trinea/android/common/util/ShellUtils.java index 185a1c8..5678596 100644 --- a/src/cn/trinea/android/common/util/ShellUtils.java +++ b/src/cn/trinea/android/common/util/ShellUtils.java @@ -49,7 +49,7 @@ public static boolean checkRootPermission() { * @see ShellUtils#execCommand(String[], boolean, boolean) */ public static CommandResult execCommand(String command, boolean isRoot) { - return execCommand(new String[] { command }, isRoot, true); + return execCommand(new String[] {command}, isRoot, true); } /** @@ -86,7 +86,7 @@ public static CommandResult execCommand(String[] commands, boolean isRoot) { * @see ShellUtils#execCommand(String[], boolean, boolean) */ public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) { - return execCommand(new String[] { command }, isRoot, isNeedResultMsg); + return execCommand(new String[] {command}, isRoot, isNeedResultMsg); } /** @@ -109,10 +109,10 @@ public static CommandResult execCommand(List commands, boolean isRoot, b * @param isRoot whether need to run with root * @param isNeedResultMsg whether need result msg * @return
      - *
    • if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and {@link CommandResult#errorMsg} is - * null.
    • - *
    • if {@link CommandResult#result} is -1, there maybe some excepiton.
    • - *
    + *
  • if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and + * {@link CommandResult#errorMsg} is null.
  • + *
  • if {@link CommandResult#result} is -1, there maybe some excepiton.
  • + * */ public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) { int result = -1; @@ -182,7 +182,7 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, boole } } return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null - : errorMsg.toString()); + : errorMsg.toString()); } /** @@ -205,11 +205,11 @@ public static class CommandResult { /** error message of command result **/ public String errorMsg; - public CommandResult(int result){ + public CommandResult(int result) { this.result = result; } - public CommandResult(int result, String successMsg, String errorMsg){ + public CommandResult(int result, String successMsg, String errorMsg) { this.result = result; this.successMsg = successMsg; this.errorMsg = errorMsg; diff --git a/src/cn/trinea/android/common/util/SqliteUtils.java b/src/cn/trinea/android/common/util/SqliteUtils.java index ff41018..681c9e3 100644 --- a/src/cn/trinea/android/common/util/SqliteUtils.java +++ b/src/cn/trinea/android/common/util/SqliteUtils.java @@ -16,7 +16,7 @@ public class SqliteUtils { private SQLiteDatabase wDb; private SQLiteDatabase rDb; - private SqliteUtils(Context context){ + private SqliteUtils(Context context) { dbHelper = new DbHelper(context); wDb = dbHelper.getWritableDatabase(); rDb = dbHelper.getReadableDatabase(); diff --git a/src/cn/trinea/android/common/util/StringUtils.java b/src/cn/trinea/android/common/util/StringUtils.java index 96de3b8..35f6753 100644 --- a/src/cn/trinea/android/common/util/StringUtils.java +++ b/src/cn/trinea/android/common/util/StringUtils.java @@ -97,8 +97,8 @@ public static String capitalizeFirstLetter(String str) { } char c = str.charAt(0); - return (!Character.isLetter(c) || Character.isUpperCase(c)) ? str - : new StringBuilder(str.length()).append(Character.toUpperCase(c)).append(str.substring(1)).toString(); + return (!Character.isLetter(c) || Character.isUpperCase(c)) ? str : new StringBuilder(str.length()) + .append(Character.toUpperCase(c)).append(str.substring(1)).toString(); } /** @@ -164,10 +164,10 @@ public static String utf8Encode(String str, String defultReturn) { * * @param href * @return
      - *
    • if href is null, return ""
    • - *
    • if not match regx, return source
    • - *
    • return the last string that match regx
    • - *
    + *
  • if href is null, return ""
  • + *
  • if not match regx, return source
  • + *
  • return the last string that match regx
  • + * */ public static String getHrefInnerHtml(String href) { if (isEmpty(href)) { @@ -202,7 +202,7 @@ public static String getHrefInnerHtml(String href) { */ public static String htmlEscapeCharsToString(String source) { return StringUtils.isEmpty(source) ? source : source.replaceAll("<", "<").replaceAll(">", ">") - .replaceAll("&", "&").replaceAll(""", "\""); + .replaceAll("&", "&").replaceAll(""", "\""); } /** @@ -230,7 +230,7 @@ public static String fullWidthToHalfWidth(String s) { // } else if (source[i] == 12290) { // source[i] = '.'; } else if (source[i] >= 65281 && source[i] <= 65374) { - source[i] = (char)(source[i] - 65248); + source[i] = (char) (source[i] - 65248); } else { source[i] = source[i]; } @@ -259,11 +259,11 @@ public static String halfWidthToFullWidth(String s) { char[] source = s.toCharArray(); for (int i = 0; i < source.length; i++) { if (source[i] == ' ') { - source[i] = (char)12288; + source[i] = (char) 12288; // } else if (source[i] == '.') { // source[i] = (char)12290; } else if (source[i] >= 33 && source[i] <= 126) { - source[i] = (char)(source[i] + 65248); + source[i] = (char) (source[i] + 65248); } else { source[i] = source[i]; } diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/cn/trinea/android/common/util/ViewUtils.java index bcf11b1..47de867 100644 --- a/src/cn/trinea/android/common/util/ViewUtils.java +++ b/src/cn/trinea/android/common/util/ViewUtils.java @@ -122,7 +122,7 @@ public static int getGridViewVerticalSpacing(GridView view) { demo = Class.forName(CLASS_NAME_GRID_VIEW); Field field = demo.getDeclaredField(FIELD_NAME_VERTICAL_SPACING); field.setAccessible(true); - verticalSpacing = (Integer)field.get(view); + verticalSpacing = (Integer) field.get(view); return verticalSpacing; } catch (Exception e) { /** @@ -212,7 +212,7 @@ public static void setAbsListViewHeightBasedOnChildren(AbsListView view) { */ public static void setSearchViewOnClickListener(View v, OnClickListener listener) { if (v instanceof ViewGroup) { - ViewGroup group = (ViewGroup)v; + ViewGroup group = (ViewGroup) v; int count = group.getChildCount(); for (int i = 0; i < count; i++) { View child = group.getChildAt(i); @@ -221,7 +221,7 @@ public static void setSearchViewOnClickListener(View v, OnClickListener listener } if (child instanceof TextView) { - TextView text = (TextView)child; + TextView text = (TextView) child; text.setFocusable(false); } child.setOnClickListener(listener); diff --git a/src/cn/trinea/android/common/view/BorderScrollView.java b/src/cn/trinea/android/common/view/BorderScrollView.java index 9e20921..6f31a9e 100644 --- a/src/cn/trinea/android/common/view/BorderScrollView.java +++ b/src/cn/trinea/android/common/view/BorderScrollView.java @@ -19,15 +19,15 @@ public class BorderScrollView extends ScrollView { private OnBorderListener onBorderListener; private View contentView; - public BorderScrollView(Context context){ + public BorderScrollView(Context context) { super(context); } - public BorderScrollView(Context context, AttributeSet attrs){ + public BorderScrollView(Context context, AttributeSet attrs) { super(context, attrs); } - public BorderScrollView(Context context, AttributeSet attrs, int defStyle){ + public BorderScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index 4fb2f30..a86875b 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -116,18 +116,18 @@ public class DropDownListView extends ListView implements OnScrollListener { /** whether is on bottom loading **/ private boolean isOnBottomLoading = false; - public DropDownListView(Context context){ + public DropDownListView(Context context) { super(context); init(context); } - public DropDownListView(Context context, AttributeSet attrs){ + public DropDownListView(Context context, AttributeSet attrs) { super(context, attrs); getAttrs(context, attrs); init(context); } - public DropDownListView(Context context, AttributeSet attrs, int defStyle){ + public DropDownListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); getAttrs(context, attrs); init(context); @@ -158,15 +158,15 @@ private void initDropDownStyle() { return; } - headerReleaseMinDistance = context.getResources() - .getDimensionPixelSize(R.dimen.drop_down_list_header_release_min_distance); + headerReleaseMinDistance = context.getResources().getDimensionPixelSize( + R.dimen.drop_down_list_header_release_min_distance); flipAnimation = new RotateAnimation(0, 180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, - RotateAnimation.RELATIVE_TO_SELF, 0.5f); + RotateAnimation.RELATIVE_TO_SELF, 0.5f); flipAnimation.setInterpolator(new LinearInterpolator()); flipAnimation.setDuration(250); flipAnimation.setFillAfter(true); reverseFlipAnimation = new RotateAnimation(-180, 0, RotateAnimation.RELATIVE_TO_SELF, 0.5f, - RotateAnimation.RELATIVE_TO_SELF, 0.5f); + RotateAnimation.RELATIVE_TO_SELF, 0.5f); reverseFlipAnimation.setInterpolator(new LinearInterpolator()); reverseFlipAnimation.setDuration(250); reverseFlipAnimation.setFillAfter(true); @@ -176,12 +176,12 @@ private void initDropDownStyle() { headerReleaseText = context.getString(R.string.drop_down_list_header_release_text); headerLoadingText = context.getString(R.string.drop_down_list_header_loading_text); - LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - headerLayout = (RelativeLayout)inflater.inflate(R.layout.drop_down_list_header, this, false); - headerText = (TextView)headerLayout.findViewById(R.id.drop_down_list_header_default_text); - headerImage = (ImageView)headerLayout.findViewById(R.id.drop_down_list_header_image); - headerProgressBar = (ProgressBar)headerLayout.findViewById(R.id.drop_down_list_header_progress_bar); - headerSecondText = (TextView)headerLayout.findViewById(R.id.drop_down_list_header_second_text); + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + headerLayout = (RelativeLayout) inflater.inflate(R.layout.drop_down_list_header, this, false); + headerText = (TextView) headerLayout.findViewById(R.id.drop_down_list_header_default_text); + headerImage = (ImageView) headerLayout.findViewById(R.id.drop_down_list_header_image); + headerProgressBar = (ProgressBar) headerLayout.findViewById(R.id.drop_down_list_header_progress_bar); + headerSecondText = (TextView) headerLayout.findViewById(R.id.drop_down_list_header_second_text); headerLayout.setClickable(true); headerLayout.setOnClickListener(new OnClickListener() { @@ -219,13 +219,13 @@ private void initOnBottomStyle() { footerLoadingText = context.getString(R.string.drop_down_list_footer_loading_text); footerNoMoreText = context.getString(R.string.drop_down_list_footer_no_more_text); - LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - footerLayout = (RelativeLayout)inflater.inflate(R.layout.drop_down_list_footer, this, false); - footerButton = (Button)footerLayout.findViewById(R.id.drop_down_list_footer_button); + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + footerLayout = (RelativeLayout) inflater.inflate(R.layout.drop_down_list_footer, this, false); + footerButton = (Button) footerLayout.findViewById(R.id.drop_down_list_footer_button); footerButton.setDrawingCacheBackgroundColor(0); footerButton.setEnabled(true); - footerProgressBar = (ProgressBar)footerLayout.findViewById(R.id.drop_down_list_footer_progress_bar); + footerProgressBar = (ProgressBar) footerLayout.findViewById(R.id.drop_down_list_footer_progress_bar); addFooterView(footerLayout); } @@ -427,7 +427,7 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCoun setHeaderStatusClickToLoad(); } } else if (currentScrollState == SCROLL_STATE_FLING && firstVisibleItem == 0 - && currentHeaderStatus != HEADER_STATUS_LOADING) { + && currentHeaderStatus != HEADER_STATUS_LOADING) { /** * when state of ListView is SCROLL_STATE_FLING(ListView is scrolling but finger has leave screen) and * first item(header layout) is visible and header status is not HEADER_STATUS_LOADING, then hide first @@ -897,10 +897,12 @@ private void adjustHeaderPadding(MotionEvent ev) { } for (int i = 0; i < pointerCount; i++) { if (currentHeaderStatus == HEADER_STATUS_DROP_DOWN_TO_LOAD - || currentHeaderStatus == HEADER_STATUS_RELEASE_TO_LOAD) { - headerLayout.setPadding(headerLayout.getPaddingLeft(), - (int)(((ev.getHistoricalY(i) - actionDownPointY) - headerOriginalHeight) / headerPaddingTopRate), - headerLayout.getPaddingRight(), headerLayout.getPaddingBottom()); + || currentHeaderStatus == HEADER_STATUS_RELEASE_TO_LOAD) { + headerLayout + .setPadding( + headerLayout.getPaddingLeft(), + (int) (((ev.getHistoricalY(i) - actionDownPointY) - headerOriginalHeight) / headerPaddingTopRate), + headerLayout.getPaddingRight(), headerLayout.getPaddingBottom()); } } } @@ -910,7 +912,7 @@ private void adjustHeaderPadding(MotionEvent ev) { */ private void resetHeaderPadding() { headerLayout.setPadding(headerLayout.getPaddingLeft(), headerOriginalTopPadding, - headerLayout.getPaddingRight(), headerLayout.getPaddingBottom()); + headerLayout.getPaddingRight(), headerLayout.getPaddingBottom()); } /** diff --git a/src/cn/trinea/android/common/view/HorizontalListView.java b/src/cn/trinea/android/common/view/HorizontalListView.java index d5f46b9..cf6f5cc 100644 --- a/src/cn/trinea/android/common/view/HorizontalListView.java +++ b/src/cn/trinea/android/common/view/HorizontalListView.java @@ -1,28 +1,21 @@ /* * HorizontalListView.java v1.5 - * * - * The MIT License - * Copyright (c) 2011 Paul Soucy (paul@dev-smart.com) * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: + * The MIT License Copyright (c) 2011 Paul Soucy (paul@dev-smart.com) * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to the following conditions: * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package cn.trinea.android.common.view; @@ -44,346 +37,347 @@ public class HorizontalListView extends AdapterView { - public boolean mAlwaysOverrideTouch = true; - protected ListAdapter mAdapter; - private int mLeftViewIndex = -1; - private int mRightViewIndex = 0; - protected int mCurrentX; - protected int mNextX; - private int mMaxX = Integer.MAX_VALUE; - private int mDisplayOffset = 0; - protected Scroller mScroller; - private GestureDetector mGesture; - private Queue mRemovedViewQueue = new LinkedList(); - private OnItemSelectedListener mOnItemSelected; - private OnItemClickListener mOnItemClicked; - private OnItemLongClickListener mOnItemLongClicked; - private boolean mDataChanged = false; - - - public HorizontalListView(Context context, AttributeSet attrs) { - super(context, attrs); - initView(); - } - - private synchronized void initView() { - mLeftViewIndex = -1; - mRightViewIndex = 0; - mDisplayOffset = 0; - mCurrentX = 0; - mNextX = 0; - mMaxX = Integer.MAX_VALUE; - mScroller = new Scroller(getContext()); - mGesture = new GestureDetector(getContext(), mOnGesture); - } - - @Override - public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { - mOnItemSelected = listener; - } - - @Override - public void setOnItemClickListener(AdapterView.OnItemClickListener listener){ - mOnItemClicked = listener; - } - - @Override - public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { - mOnItemLongClicked = listener; - } - - private DataSetObserver mDataObserver = new DataSetObserver() { - - @Override - public void onChanged() { - synchronized(HorizontalListView.this){ - mDataChanged = true; - } - invalidate(); - requestLayout(); - } - - @Override - public void onInvalidated() { - reset(); - invalidate(); - requestLayout(); - } - - }; - - @Override - public ListAdapter getAdapter() { - return mAdapter; - } - - @Override - public View getSelectedView() { - //TODO: implement - return null; - } - - @Override - public void setAdapter(ListAdapter adapter) { - if(mAdapter != null) { - mAdapter.unregisterDataSetObserver(mDataObserver); - } - mAdapter = adapter; - mAdapter.registerDataSetObserver(mDataObserver); - reset(); - } - - private synchronized void reset(){ - initView(); - removeAllViewsInLayout(); + public boolean mAlwaysOverrideTouch = true; + protected ListAdapter mAdapter; + private int mLeftViewIndex = -1; + private int mRightViewIndex = 0; + protected int mCurrentX; + protected int mNextX; + private int mMaxX = Integer.MAX_VALUE; + private int mDisplayOffset = 0; + protected Scroller mScroller; + private GestureDetector mGesture; + private Queue mRemovedViewQueue = new LinkedList(); + private OnItemSelectedListener mOnItemSelected; + private OnItemClickListener mOnItemClicked; + private OnItemLongClickListener mOnItemLongClicked; + private boolean mDataChanged = false; + + public HorizontalListView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(); + } + + private synchronized void initView() { + mLeftViewIndex = -1; + mRightViewIndex = 0; + mDisplayOffset = 0; + mCurrentX = 0; + mNextX = 0; + mMaxX = Integer.MAX_VALUE; + mScroller = new Scroller(getContext()); + mGesture = new GestureDetector(getContext(), mOnGesture); + } + + @Override + public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { + mOnItemSelected = listener; + } + + @Override + public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { + mOnItemClicked = listener; + } + + @Override + public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { + mOnItemLongClicked = listener; + } + + private DataSetObserver mDataObserver = new DataSetObserver() { + + @Override + public void onChanged() { + synchronized (HorizontalListView.this) { + mDataChanged = true; + } + invalidate(); + requestLayout(); + } + + @Override + public void onInvalidated() { + reset(); + invalidate(); + requestLayout(); + } + + }; + + @Override + public ListAdapter getAdapter() { + return mAdapter; + } + + @Override + public View getSelectedView() { + // TODO: implement + return null; + } + + @Override + public void setAdapter(ListAdapter adapter) { + if (mAdapter != null) { + mAdapter.unregisterDataSetObserver(mDataObserver); + } + mAdapter = adapter; + mAdapter.registerDataSetObserver(mDataObserver); + reset(); + } + + private synchronized void reset() { + initView(); + removeAllViewsInLayout(); requestLayout(); - } - - @Override - public void setSelection(int position) { - //TODO: implement - } - - private void addAndMeasureChild(final View child, int viewPos) { - LayoutParams params = child.getLayoutParams(); - if(params == null) { - params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); - } - - addViewInLayout(child, viewPos, params, true); - child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), - MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); - } - - - - @Override - protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - - if(mAdapter == null){ - return; - } - - if(mDataChanged){ - int oldCurrentX = mCurrentX; - initView(); - removeAllViewsInLayout(); - mNextX = oldCurrentX; - mDataChanged = false; - } - - if(mScroller.computeScrollOffset()){ - int scrollx = mScroller.getCurrX(); - mNextX = scrollx; - } - - if(mNextX <= 0){ - mNextX = 0; - mScroller.forceFinished(true); - } - if(mNextX >= mMaxX) { - mNextX = mMaxX; - mScroller.forceFinished(true); - } - - int dx = mCurrentX - mNextX; - - removeNonVisibleItems(dx); - fillList(dx); - positionItems(dx); - - mCurrentX = mNextX; - - if(!mScroller.isFinished()){ - post(new Runnable(){ - @Override - public void run() { - requestLayout(); - } - }); - - } - } - - private void fillList(final int dx) { - int edge = 0; - View child = getChildAt(getChildCount()-1); - if(child != null) { - edge = child.getRight(); - } - fillListRight(edge, dx); - - edge = 0; - child = getChildAt(0); - if(child != null) { - edge = child.getLeft(); - } - fillListLeft(edge, dx); - - - } - - private void fillListRight(int rightEdge, final int dx) { - while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { - - View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this); - addAndMeasureChild(child, -1); - rightEdge += child.getMeasuredWidth(); - - if(mRightViewIndex == mAdapter.getCount()-1) { - mMaxX = mCurrentX + rightEdge - getWidth(); - } - - if (mMaxX < 0) { - mMaxX = 0; - } - mRightViewIndex++; - } - - } - - private void fillListLeft(int leftEdge, final int dx) { - while(leftEdge + dx > 0 && mLeftViewIndex >= 0) { - View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this); - addAndMeasureChild(child, 0); - leftEdge -= child.getMeasuredWidth(); - mLeftViewIndex--; - mDisplayOffset -= child.getMeasuredWidth(); - } - } - - private void removeNonVisibleItems(final int dx) { - View child = getChildAt(0); - while(child != null && child.getRight() + dx <= 0) { - mDisplayOffset += child.getMeasuredWidth(); - mRemovedViewQueue.offer(child); - removeViewInLayout(child); - mLeftViewIndex++; - child = getChildAt(0); - - } - - child = getChildAt(getChildCount()-1); - while(child != null && child.getLeft() + dx >= getWidth()) { - mRemovedViewQueue.offer(child); - removeViewInLayout(child); - mRightViewIndex--; - child = getChildAt(getChildCount()-1); - } - } - - private void positionItems(final int dx) { - if(getChildCount() > 0){ - mDisplayOffset += dx; - int left = mDisplayOffset; - for(int i=0;i= mMaxX) { + mNextX = mMaxX; + mScroller.forceFinished(true); + } + + int dx = mCurrentX - mNextX; + + removeNonVisibleItems(dx); + fillList(dx); + positionItems(dx); + + mCurrentX = mNextX; + + if (!mScroller.isFinished()) { + post(new Runnable() { + + @Override + public void run() { + requestLayout(); + } + }); + + } + } + + private void fillList(final int dx) { + int edge = 0; + View child = getChildAt(getChildCount() - 1); + if (child != null) { + edge = child.getRight(); } - }; + fillListRight(edge, dx); + + edge = 0; + child = getChildAt(0); + if (child != null) { + edge = child.getLeft(); + } + fillListLeft(edge, dx); + + } + + private void fillListRight(int rightEdge, final int dx) { + while (rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { + + View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this); + addAndMeasureChild(child, -1); + rightEdge += child.getMeasuredWidth(); + + if (mRightViewIndex == mAdapter.getCount() - 1) { + mMaxX = mCurrentX + rightEdge - getWidth(); + } + + if (mMaxX < 0) { + mMaxX = 0; + } + mRightViewIndex++; + } + + } + + private void fillListLeft(int leftEdge, final int dx) { + while (leftEdge + dx > 0 && mLeftViewIndex >= 0) { + View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this); + addAndMeasureChild(child, 0); + leftEdge -= child.getMeasuredWidth(); + mLeftViewIndex--; + mDisplayOffset -= child.getMeasuredWidth(); + } + } + + private void removeNonVisibleItems(final int dx) { + View child = getChildAt(0); + while (child != null && child.getRight() + dx <= 0) { + mDisplayOffset += child.getMeasuredWidth(); + mRemovedViewQueue.offer(child); + removeViewInLayout(child); + mLeftViewIndex++; + child = getChildAt(0); + + } + + child = getChildAt(getChildCount() - 1); + while (child != null && child.getLeft() + dx >= getWidth()) { + mRemovedViewQueue.offer(child); + removeViewInLayout(child); + mRightViewIndex--; + child = getChildAt(getChildCount() - 1); + } + } + + private void positionItems(final int dx) { + if (getChildCount() > 0) { + mDisplayOffset += dx; + int left = mDisplayOffset; + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + int childWidth = child.getMeasuredWidth(); + child.layout(left, 0, left + childWidth, child.getMeasuredHeight()); + left += childWidth + child.getPaddingRight(); + } + } + } + + public synchronized void scrollTo(int x) { + mScroller.startScroll(mNextX, 0, x - mNextX, 0); + requestLayout(); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + boolean handled = super.dispatchTouchEvent(ev); + handled |= mGesture.onTouchEvent(ev); + return handled; + } + + protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + synchronized (HorizontalListView.this) { + mScroller.fling(mNextX, 0, (int) -velocityX, 0, 0, mMaxX, 0, 0); + } + requestLayout(); + + return true; + } + + protected boolean onDown(MotionEvent e) { + mScroller.forceFinished(true); + return true; + } + + private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() { + + @Override + public boolean onDown(MotionEvent e) { + return HorizontalListView.this.onDown(e); + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, + float velocityY) { + return HorizontalListView.this.onFling(e1, e2, velocityX, velocityY); + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, + float distanceY) { + + synchronized (HorizontalListView.this) { + mNextX += (int) distanceX; + } + requestLayout(); + + return true; + } + + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (isEventWithinView(e, child)) { + if (mOnItemClicked != null) { + mOnItemClicked.onItemClick(HorizontalListView.this, child, + mLeftViewIndex + 1 + i, + mAdapter.getItemId(mLeftViewIndex + 1 + i)); + } + if (mOnItemSelected != null) { + mOnItemSelected.onItemSelected(HorizontalListView.this, + child, mLeftViewIndex + 1 + i, + mAdapter.getItemId(mLeftViewIndex + 1 + i)); + } + break; + } + + } + return true; + } + + @Override + public void onLongPress(MotionEvent e) { + int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = getChildAt(i); + if (isEventWithinView(e, child)) { + if (mOnItemLongClicked != null) { + mOnItemLongClicked.onItemLongClick( + HorizontalListView.this, child, mLeftViewIndex + 1 + + i, + mAdapter.getItemId(mLeftViewIndex + 1 + i)); + } + break; + } + + } + } - + private boolean isEventWithinView(MotionEvent e, View child) { + Rect viewRect = new Rect(); + int[] childPosition = new int[2]; + child.getLocationOnScreen(childPosition); + int left = childPosition[0]; + int right = left + child.getWidth(); + int top = childPosition[1]; + int bottom = top + child.getHeight(); + viewRect.set(left, top, right, bottom); + return viewRect.contains((int) e.getRawX(), (int) e.getRawY()); + } + }; } diff --git a/src/cn/trinea/android/common/view/SlideOnePageGallery.java b/src/cn/trinea/android/common/view/SlideOnePageGallery.java index 3afd197..c5d8485 100644 --- a/src/cn/trinea/android/common/view/SlideOnePageGallery.java +++ b/src/cn/trinea/android/common/view/SlideOnePageGallery.java @@ -13,15 +13,15 @@ */ public class SlideOnePageGallery extends Gallery { - public SlideOnePageGallery(Context context, AttributeSet attrs, int defStyle){ + public SlideOnePageGallery(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } - public SlideOnePageGallery(Context context, AttributeSet attrs){ + public SlideOnePageGallery(Context context, AttributeSet attrs) { super(context, attrs); } - public SlideOnePageGallery(Context context){ + public SlideOnePageGallery(Context context) { super(context); } From ba5b43f0e570134f72f45de4d29e08162684da06 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Apr 2014 16:43:09 +0800 Subject: [PATCH 168/241] Code format with new format xml --- .../android/common/entity/CacheObject.java | 2 +- .../android/common/entity/HttpResponse.java | 4 ++-- .../common/service/impl/ImageMemoryCache.java | 4 ++-- .../common/service/impl/ImageSDCardCache.java | 4 ++-- .../common/service/impl/PreloadDataCache.java | 4 ++-- .../common/service/impl/SimpleCache.java | 4 ++-- .../common/util/DownloadManagerPro.java | 4 ++-- .../trinea/android/common/util/HttpUtils.java | 8 +++---- .../common/util/ImageCacheManager.java | 4 ++-- .../android/common/util/ImageUtils.java | 6 ++--- .../trinea/android/common/util/JSONUtils.java | 14 ++++++------ .../trinea/android/common/util/ListUtils.java | 4 ++-- .../trinea/android/common/util/MapUtils.java | 2 +- .../android/common/util/ObjectUtils.java | 2 +- .../android/common/util/PackageUtils.java | 2 +- .../android/common/util/ParcelUtils.java | 4 ++-- .../android/common/util/ScreenUtils.java | 4 ++-- .../android/common/util/StringUtils.java | 6 ++--- .../trinea/android/common/util/ViewUtils.java | 6 ++--- .../android/common/view/DropDownListView.java | 22 +++++++++---------- .../common/view/HorizontalListView.java | 6 ++--- 21 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/cn/trinea/android/common/entity/CacheObject.java b/src/cn/trinea/android/common/entity/CacheObject.java index 8766813..4015cea 100644 --- a/src/cn/trinea/android/common/entity/CacheObject.java +++ b/src/cn/trinea/android/common/entity/CacheObject.java @@ -200,7 +200,7 @@ public boolean equals(Object o) { return false; } - CacheObject obj = (CacheObject) (o); + CacheObject obj = (CacheObject)(o); return (ObjectUtils.isEquals(this.data, obj.data) && this.enterTime == obj.enterTime && this.priority == obj.priority && this.isExpired == obj.isExpired && this.isForever == obj.isForever); } diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/cn/trinea/android/common/entity/HttpResponse.java index 68e25b5..5f28ce2 100644 --- a/src/cn/trinea/android/common/entity/HttpResponse.java +++ b/src/cn/trinea/android/common/entity/HttpResponse.java @@ -217,7 +217,7 @@ public HttpResponse setInCache(boolean isInCache) { */ public String getExpiresHeader() { try { - return responseHeaders == null ? null : (String) responseHeaders.get(HttpConstants.EXPIRES); + return responseHeaders == null ? null : (String)responseHeaders.get(HttpConstants.EXPIRES); } catch (Exception e) { e.printStackTrace(); return null; @@ -231,7 +231,7 @@ public String getExpiresHeader() { */ private int getCacheControlMaxAge() { try { - String cacheControl = (String) responseHeaders.get(HttpConstants.CACHE_CONTROL); + String cacheControl = (String)responseHeaders.get(HttpConstants.CACHE_CONTROL); if (!StringUtils.isEmpty(cacheControl)) { int start = cacheControl.indexOf("max-age="); if (start != -1) { diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index 9be0204..c4886de 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -400,7 +400,7 @@ public void handleMessage(Message message) { switch (message.what) { case WHAT_GET_IMAGE_SUCCESS: case WHAT_GET_IMAGE_FAILED: - MessageObject object = (MessageObject) message.obj; + MessageObject object = (MessageObject)message.obj; if (object == null) { break; } @@ -556,7 +556,7 @@ static int getDefaultMaxSize() { return 512; } - int mb = (int) (maxMemory / SizeUtils.MB_2_BYTE); + int mb = (int)(maxMemory / SizeUtils.MB_2_BYTE); return mb > 16 ? mb * 2 : 16; } } diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java index 9e0d2bf..04d4c2a 100644 --- a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java @@ -470,7 +470,7 @@ public void handleMessage(Message message) { switch (message.what) { case WHAT_GET_IMAGE_SUCCESS: case WHAT_GET_IMAGE_FAILED: - MessageObject object = (MessageObject) message.obj; + MessageObject object = (MessageObject)message.obj; if (object == null) { break; } @@ -861,7 +861,7 @@ static int getDefaultMaxSize() { return 256; } - int mb = (int) (maxMemory / SizeUtils.MB_2_BYTE); + int mb = (int)(maxMemory / SizeUtils.MB_2_BYTE); return mb > 8 ? mb : 8; } } diff --git a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java index 0fcb5fc..771d1af 100644 --- a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java +++ b/src/cn/trinea/android/common/service/impl/PreloadDataCache.java @@ -472,7 +472,7 @@ public void setContext(Context context) { */ public boolean checkIsNetworkTypeAllowed() { if (connectivityManager == null && context != null) { - connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); } if (connectivityManager == null) { @@ -508,7 +508,7 @@ private int translateNetworkTypeToApiFlag(int networkType) { */ @SuppressWarnings("unchecked") public static PreloadDataCache loadCache(String filePath) { - return (PreloadDataCache) SerializeUtils.deserialization(filePath); + return (PreloadDataCache)SerializeUtils.deserialization(filePath); } /** diff --git a/src/cn/trinea/android/common/service/impl/SimpleCache.java b/src/cn/trinea/android/common/service/impl/SimpleCache.java index d15a3d3..468d460 100644 --- a/src/cn/trinea/android/common/service/impl/SimpleCache.java +++ b/src/cn/trinea/android/common/service/impl/SimpleCache.java @@ -389,7 +389,7 @@ public long getMissCount() { @Override public synchronized double getHitRate() { long total = hitCount.get() + missCount.get(); - return (total == 0 ? 0 : ((double) hitCount.get()) / total); + return (total == 0 ? 0 : ((double)hitCount.get()) / total); } /** @@ -430,7 +430,7 @@ public Collection> values() { */ @SuppressWarnings("unchecked") public static SimpleCache loadCache(String filePath) { - return (SimpleCache) SerializeUtils.deserialization(filePath); + return (SimpleCache)SerializeUtils.deserialization(filePath); } /** diff --git a/src/cn/trinea/android/common/util/DownloadManagerPro.java b/src/cn/trinea/android/common/util/DownloadManagerPro.java index e2612f2..0f466ca 100644 --- a/src/cn/trinea/android/common/util/DownloadManagerPro.java +++ b/src/cn/trinea/android/common/util/DownloadManagerPro.java @@ -127,7 +127,7 @@ public int pauseDownload(long... ids) { } try { - return ((Integer) pauseDownload.invoke(downloadManager, ids)).intValue(); + return ((Integer)pauseDownload.invoke(downloadManager, ids)).intValue(); } catch (Exception e) { /** * accept all exception, include ClassNotFoundException, NoSuchMethodException, InvocationTargetException, @@ -151,7 +151,7 @@ public int resumeDownload(long... ids) { } try { - return ((Integer) resumeDownload.invoke(downloadManager, ids)).intValue(); + return ((Integer)resumeDownload.invoke(downloadManager, ids)).intValue(); } catch (Exception e) { /** * accept all exception, include ClassNotFoundException, NoSuchMethodException, InvocationTargetException, diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index 37e1519..18e373b 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -79,7 +79,7 @@ public static HttpResponse httpGet(HttpRequest request) { try { HttpResponse response = new HttpResponse(request.getUrl()); // default gzip encode - con = (HttpURLConnection) url.openConnection(); + con = (HttpURLConnection)url.openConnection(); setURLConnection(request, con); input = new BufferedReader(new InputStreamReader(con.getInputStream())); StringBuilder sb = new StringBuilder(); @@ -202,7 +202,7 @@ public static HttpResponse httpPost(HttpRequest request) { try { HttpResponse response = new HttpResponse(request.getUrl()); // default gzip encode - con = (HttpURLConnection) url.openConnection(); + con = (HttpURLConnection)url.openConnection(); setURLConnection(request, con); con.setRequestMethod("POST"); con.setDoOutput(true); @@ -334,7 +334,7 @@ public static String joinParas(Map parasMap) { StringBuilder paras = new StringBuilder(); Iterator> ite = parasMap.entrySet().iterator(); while (ite.hasNext()) { - Map.Entry entry = (Map.Entry) ite.next(); + Map.Entry entry = (Map.Entry)ite.next(); paras.append(entry.getKey()).append(EQUAL_SIGN).append(entry.getValue()); if (ite.hasNext()) { paras.append(PARAMETERS_SEPARATOR); @@ -357,7 +357,7 @@ public static String joinParasWithEncodedValue(Map parasMap) { Iterator> ite = parasMap.entrySet().iterator(); try { while (ite.hasNext()) { - Map.Entry entry = (Map.Entry) ite.next(); + Map.Entry entry = (Map.Entry)ite.next(); paras.append(entry.getKey()).append(EQUAL_SIGN).append(StringUtils.utf8Encode(entry.getValue())); if (ite.hasNext()) { paras.append(PARAMETERS_SEPARATOR); diff --git a/src/cn/trinea/android/common/util/ImageCacheManager.java b/src/cn/trinea/android/common/util/ImageCacheManager.java index 8d850c1..c1fa0a0 100644 --- a/src/cn/trinea/android/common/util/ImageCacheManager.java +++ b/src/cn/trinea/android/common/util/ImageCacheManager.java @@ -70,7 +70,7 @@ private static void setImageCache() { @Override public void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolean isInCache) { if (view != null && loadedImage != null) { - ImageView imageView = (ImageView) view; + ImageView imageView = (ImageView)view; imageView.setImageBitmap(loadedImage); // first time show with animation if (!isInCache) { @@ -109,7 +109,7 @@ private static void setImageSDCardCache() { @Override public void onGetSuccess(String imageUrl, String imagePath, View view, boolean isInCache) { - ImageView imageView = (ImageView) view; + ImageView imageView = (ImageView)view; // if oom please use BitmapFactory.decodeFile(imagePath, option) Bitmap bm = BitmapFactory.decodeFile(imagePath); diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 7e81efa..7055964 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -74,7 +74,7 @@ public static Bitmap byteToBitmap(byte[] b) { * @return */ public static Bitmap drawableToBitmap(Drawable d) { - return d == null ? null : ((BitmapDrawable) d).getBitmap(); + return d == null ? null : ((BitmapDrawable)d).getBitmap(); } /** @@ -134,7 +134,7 @@ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut InputStream stream = null; try { URL url = new URL(imageUrl); - HttpURLConnection con = (HttpURLConnection) url.openConnection(); + HttpURLConnection con = (HttpURLConnection)url.openConnection(); HttpUtils.setURLConnection(requestProperties, con); if (readTimeOutMillis > 0) { con.setReadTimeout(readTimeOutMillis); @@ -213,7 +213,7 @@ public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut, Map parseKeyAndValueToMap(JSONObject sourceObj) { Map keyAndValueMap = new HashMap(); for (Iterator iter = sourceObj.keys(); iter.hasNext();) { - String key = (String) iter.next(); + String key = (String)iter.next(); MapUtils.putMapNotEmptyKey(keyAndValueMap, key, getString(sourceObj, key, "")); } diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index 3c8016b..0396b8e 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -229,7 +229,7 @@ public static boolean addListNotNullValue(List sourceList, V value) { */ @SuppressWarnings("unchecked") public static V getLast(List sourceList, V value) { - return (sourceList == null) ? null : (V) ArrayUtils.getLast(sourceList.toArray(), value, true); + return (sourceList == null) ? null : (V)ArrayUtils.getLast(sourceList.toArray(), value, true); } /** @@ -237,7 +237,7 @@ public static V getLast(List sourceList, V value) { */ @SuppressWarnings("unchecked") public static V getNext(List sourceList, V value) { - return (sourceList == null) ? null : (V) ArrayUtils.getNext(sourceList.toArray(), value, true); + return (sourceList == null) ? null : (V)ArrayUtils.getNext(sourceList.toArray(), value, true); } /** diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/cn/trinea/android/common/util/MapUtils.java index d345ed5..8b19770 100644 --- a/src/cn/trinea/android/common/util/MapUtils.java +++ b/src/cn/trinea/android/common/util/MapUtils.java @@ -274,7 +274,7 @@ public static String toJson(Map map) { paras.append("{"); Iterator> ite = map.entrySet().iterator(); while (ite.hasNext()) { - Map.Entry entry = (Map.Entry) ite.next(); + Map.Entry entry = (Map.Entry)ite.next(); paras.append("\"").append(entry.getKey()).append("\":\"").append(entry.getValue()).append("\""); if (ite.hasNext()) { paras.append(","); diff --git a/src/cn/trinea/android/common/util/ObjectUtils.java b/src/cn/trinea/android/common/util/ObjectUtils.java index b940732..d7d9f92 100644 --- a/src/cn/trinea/android/common/util/ObjectUtils.java +++ b/src/cn/trinea/android/common/util/ObjectUtils.java @@ -99,6 +99,6 @@ public static int[] transformIntArray(Integer[] source) { */ @SuppressWarnings({"unchecked", "rawtypes"}) public static int compare(V v1, V v2) { - return v1 == null ? (v2 == null ? 0 : -1) : (v2 == null ? 1 : ((Comparable) v1).compareTo(v2)); + return v1 == null ? (v2 == null ? 0 : -1) : (v2 == null ? 1 : ((Comparable)v1).compareTo(v2)); } } diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 3c4e184..983ee3f 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -435,7 +435,7 @@ public static Boolean isTopActivity(Context context, String packageName) { return null; } - ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List tasksInfo = activityManager.getRunningTasks(1); if (ListUtils.isEmpty(tasksInfo)) { return null; diff --git a/src/cn/trinea/android/common/util/ParcelUtils.java b/src/cn/trinea/android/common/util/ParcelUtils.java index 2cac908..3601c66 100644 --- a/src/cn/trinea/android/common/util/ParcelUtils.java +++ b/src/cn/trinea/android/common/util/ParcelUtils.java @@ -99,7 +99,7 @@ public static Map readHashMapStringKey(Parcel Map map = new HashMap(); for (int i = 0; i < size; i++) { String key = in.readString(); - map.put(key, (V) in.readParcelable(loader)); + map.put(key, (V)in.readParcelable(loader)); } return map; } @@ -145,7 +145,7 @@ public static Map readHashMap Map map = new HashMap(); for (int i = 0; i < size; i++) { - map.put((K) in.readParcelable(loader), (V) in.readParcelable(loader)); + map.put((K)in.readParcelable(loader), (V)in.readParcelable(loader)); } return map; } diff --git a/src/cn/trinea/android/common/util/ScreenUtils.java b/src/cn/trinea/android/common/util/ScreenUtils.java index 4ccbd0d..786cd64 100644 --- a/src/cn/trinea/android/common/util/ScreenUtils.java +++ b/src/cn/trinea/android/common/util/ScreenUtils.java @@ -29,10 +29,10 @@ public static float pxToDp(Context context, float px) { } public static float dpToPxInt(Context context, float dp) { - return (int) (dpToPx(context, dp) + 0.5f); + return (int)(dpToPx(context, dp) + 0.5f); } public static float pxToDpCeilInt(Context context, float px) { - return (int) (pxToDp(context, px) + 0.5f); + return (int)(pxToDp(context, px) + 0.5f); } } diff --git a/src/cn/trinea/android/common/util/StringUtils.java b/src/cn/trinea/android/common/util/StringUtils.java index 35f6753..88a7f26 100644 --- a/src/cn/trinea/android/common/util/StringUtils.java +++ b/src/cn/trinea/android/common/util/StringUtils.java @@ -230,7 +230,7 @@ public static String fullWidthToHalfWidth(String s) { // } else if (source[i] == 12290) { // source[i] = '.'; } else if (source[i] >= 65281 && source[i] <= 65374) { - source[i] = (char) (source[i] - 65248); + source[i] = (char)(source[i] - 65248); } else { source[i] = source[i]; } @@ -259,11 +259,11 @@ public static String halfWidthToFullWidth(String s) { char[] source = s.toCharArray(); for (int i = 0; i < source.length; i++) { if (source[i] == ' ') { - source[i] = (char) 12288; + source[i] = (char)12288; // } else if (source[i] == '.') { // source[i] = (char)12290; } else if (source[i] >= 33 && source[i] <= 126) { - source[i] = (char) (source[i] + 65248); + source[i] = (char)(source[i] + 65248); } else { source[i] = source[i]; } diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/cn/trinea/android/common/util/ViewUtils.java index 47de867..bcf11b1 100644 --- a/src/cn/trinea/android/common/util/ViewUtils.java +++ b/src/cn/trinea/android/common/util/ViewUtils.java @@ -122,7 +122,7 @@ public static int getGridViewVerticalSpacing(GridView view) { demo = Class.forName(CLASS_NAME_GRID_VIEW); Field field = demo.getDeclaredField(FIELD_NAME_VERTICAL_SPACING); field.setAccessible(true); - verticalSpacing = (Integer) field.get(view); + verticalSpacing = (Integer)field.get(view); return verticalSpacing; } catch (Exception e) { /** @@ -212,7 +212,7 @@ public static void setAbsListViewHeightBasedOnChildren(AbsListView view) { */ public static void setSearchViewOnClickListener(View v, OnClickListener listener) { if (v instanceof ViewGroup) { - ViewGroup group = (ViewGroup) v; + ViewGroup group = (ViewGroup)v; int count = group.getChildCount(); for (int i = 0; i < count; i++) { View child = group.getChildAt(i); @@ -221,7 +221,7 @@ public static void setSearchViewOnClickListener(View v, OnClickListener listener } if (child instanceof TextView) { - TextView text = (TextView) child; + TextView text = (TextView)child; text.setFocusable(false); } child.setOnClickListener(listener); diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index a86875b..e7880ba 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -176,12 +176,12 @@ private void initDropDownStyle() { headerReleaseText = context.getString(R.string.drop_down_list_header_release_text); headerLoadingText = context.getString(R.string.drop_down_list_header_loading_text); - LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - headerLayout = (RelativeLayout) inflater.inflate(R.layout.drop_down_list_header, this, false); - headerText = (TextView) headerLayout.findViewById(R.id.drop_down_list_header_default_text); - headerImage = (ImageView) headerLayout.findViewById(R.id.drop_down_list_header_image); - headerProgressBar = (ProgressBar) headerLayout.findViewById(R.id.drop_down_list_header_progress_bar); - headerSecondText = (TextView) headerLayout.findViewById(R.id.drop_down_list_header_second_text); + LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + headerLayout = (RelativeLayout)inflater.inflate(R.layout.drop_down_list_header, this, false); + headerText = (TextView)headerLayout.findViewById(R.id.drop_down_list_header_default_text); + headerImage = (ImageView)headerLayout.findViewById(R.id.drop_down_list_header_image); + headerProgressBar = (ProgressBar)headerLayout.findViewById(R.id.drop_down_list_header_progress_bar); + headerSecondText = (TextView)headerLayout.findViewById(R.id.drop_down_list_header_second_text); headerLayout.setClickable(true); headerLayout.setOnClickListener(new OnClickListener() { @@ -219,13 +219,13 @@ private void initOnBottomStyle() { footerLoadingText = context.getString(R.string.drop_down_list_footer_loading_text); footerNoMoreText = context.getString(R.string.drop_down_list_footer_no_more_text); - LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - footerLayout = (RelativeLayout) inflater.inflate(R.layout.drop_down_list_footer, this, false); - footerButton = (Button) footerLayout.findViewById(R.id.drop_down_list_footer_button); + LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + footerLayout = (RelativeLayout)inflater.inflate(R.layout.drop_down_list_footer, this, false); + footerButton = (Button)footerLayout.findViewById(R.id.drop_down_list_footer_button); footerButton.setDrawingCacheBackgroundColor(0); footerButton.setEnabled(true); - footerProgressBar = (ProgressBar) footerLayout.findViewById(R.id.drop_down_list_footer_progress_bar); + footerProgressBar = (ProgressBar)footerLayout.findViewById(R.id.drop_down_list_footer_progress_bar); addFooterView(footerLayout); } @@ -901,7 +901,7 @@ private void adjustHeaderPadding(MotionEvent ev) { headerLayout .setPadding( headerLayout.getPaddingLeft(), - (int) (((ev.getHistoricalY(i) - actionDownPointY) - headerOriginalHeight) / headerPaddingTopRate), + (int)(((ev.getHistoricalY(i) - actionDownPointY) - headerOriginalHeight) / headerPaddingTopRate), headerLayout.getPaddingRight(), headerLayout.getPaddingBottom()); } } diff --git a/src/cn/trinea/android/common/view/HorizontalListView.java b/src/cn/trinea/android/common/view/HorizontalListView.java index cf6f5cc..13d30fd 100644 --- a/src/cn/trinea/android/common/view/HorizontalListView.java +++ b/src/cn/trinea/android/common/view/HorizontalListView.java @@ -290,7 +290,7 @@ public boolean dispatchTouchEvent(MotionEvent ev) { protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { synchronized (HorizontalListView.this) { - mScroller.fling(mNextX, 0, (int) -velocityX, 0, 0, mMaxX, 0, 0); + mScroller.fling(mNextX, 0, (int)-velocityX, 0, 0, mMaxX, 0, 0); } requestLayout(); @@ -320,7 +320,7 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { synchronized (HorizontalListView.this) { - mNextX += (int) distanceX; + mNextX += (int)distanceX; } requestLayout(); @@ -376,7 +376,7 @@ private boolean isEventWithinView(MotionEvent e, View child) { int top = childPosition[1]; int bottom = top + child.getHeight(); viewRect.set(left, top, right, bottom); - return viewRect.contains((int) e.getRawX(), (int) e.getRawY()); + return viewRect.contains((int)e.getRawX(), (int)e.getRawY()); } }; From d265ade9c4babd506bf42b8db8f11b5d6a12def0 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Apr 2014 16:44:27 +0800 Subject: [PATCH 169/241] Code format with new format xml --- .../android/common/service/impl/FileNameRuleCurrentTime.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java b/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java index 681ccf0..895e344 100644 --- a/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java +++ b/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java @@ -98,6 +98,7 @@ public String getFileName(String imageUrl) { * @author Trinea 2012-7-6 */ public enum TimeRule { - YEAR, DAY_OF_MONTH, MILLISECOND, HOUR_OF_DAY_TO_MILLIS, HOUR_OF_DAY_TO_SECONDS, HOUR_OF_DAY_TO_MINUTES, HOUR_TO_MILLIS, MINUTE_TO_SECONDS, TO_MILLIS, TO_SECONDS + YEAR, DAY_OF_MONTH, MILLISECOND, HOUR_OF_DAY_TO_MILLIS, HOUR_OF_DAY_TO_SECONDS, HOUR_OF_DAY_TO_MINUTES, + HOUR_TO_MILLIS, MINUTE_TO_SECONDS, TO_MILLIS, TO_SECONDS } } From 084c55408e47cb256165224e17d9e0f434d968e3 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Apr 2014 18:21:15 +0800 Subject: [PATCH 170/241] Add getImageFromSdcardListener --- .../common/service/impl/ImageCache.java | 37 +--------- .../common/service/impl/ImageMemoryCache.java | 2 +- .../common/util/ImageCacheManager.java | 69 ++++++++++++++----- 3 files changed, 56 insertions(+), 52 deletions(-) diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/cn/trinea/android/common/service/impl/ImageCache.java index b2e8795..0bb666d 100644 --- a/src/cn/trinea/android/common/service/impl/ImageCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageCache.java @@ -13,6 +13,7 @@ import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.service.CacheFullRemoveType; import cn.trinea.android.common.service.FileNameRule; +import cn.trinea.android.common.service.impl.ImageMemoryCache.OnImageCallbackListener; import cn.trinea.android.common.util.FileUtils; /** @@ -178,41 +179,7 @@ public CacheObject onGetData(String key) { secondaryCache.setCacheFolder(DEFAULT_CACHE_FOLDER); secondaryCache.setFileNameRule(new FileNameRuleImageUrl().setFileExtension("")); } - /** - set image data from Local - */ - public void setDataFromLocal() - { - setOnGetDataListener(new OnGetDataListener() { - - @Override - public CacheObject onGetData(String key) { - if(FileUtils.isFileExist(key)) - { - Bitmap b; - - if(getCompressListener()!=null) - { - CompressListener compress_listener=getCompressListener(); - compressSize=compress_listener.getCompressSize(key); - } - if(compressSize>1) - { - BitmapFactory.Options option = new BitmapFactory.Options(); - option.inSampleSize = compressSize; - b = BitmapFactory.decodeFile(key, option); - } - else - { - b=BitmapFactory.decodeFile(key); - } - return new CacheObject(b); - }else - return null; - - } - }); - } + /** * get compressSize * diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java index c4886de..f4054e0 100644 --- a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java +++ b/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java @@ -523,7 +523,7 @@ public void run() { } /** - * default get image listener + * default get image from network listener * * @return */ diff --git a/src/cn/trinea/android/common/util/ImageCacheManager.java b/src/cn/trinea/android/common/util/ImageCacheManager.java index c1fa0a0..4e099e7 100644 --- a/src/cn/trinea/android/common/util/ImageCacheManager.java +++ b/src/cn/trinea/android/common/util/ImageCacheManager.java @@ -2,15 +2,18 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.util.Log; import android.view.View; import android.view.animation.AlphaAnimation; import android.widget.ImageView; +import cn.trinea.android.common.entity.CacheObject; import cn.trinea.android.common.entity.FailedReason; import cn.trinea.android.common.service.impl.FileNameRuleImageUrl; import cn.trinea.android.common.service.impl.ImageCache; import cn.trinea.android.common.service.impl.ImageMemoryCache.OnImageCallbackListener; import cn.trinea.android.common.service.impl.ImageSDCardCache; import cn.trinea.android.common.service.impl.ImageSDCardCache.OnImageSDCallbackListener; +import cn.trinea.android.common.service.impl.PreloadDataCache.OnGetDataListener; import cn.trinea.android.common.service.impl.RemoveTypeLastUsedTimeFirst; /** @@ -20,11 +23,12 @@ */ public class ImageCacheManager { + public static final String TAG = "ImageCacheManager"; private static ImageCache imageCache = null; private static ImageSDCardCache imageSDCardCache = null; /** - * get the singleton instance of ImageCache + * get the singleton instance of {@link ImageCache} * * @return */ @@ -41,7 +45,7 @@ public static ImageCache getImageCache() { } /** - * get the singleton instance of ImageSDCardCache + * get the singleton instance of {@link ImageSDCardCache} * * @return */ @@ -70,11 +74,16 @@ private static void setImageCache() { @Override public void onGetSuccess(String imageUrl, Bitmap loadedImage, View view, boolean isInCache) { if (view != null && loadedImage != null) { - ImageView imageView = (ImageView)view; - imageView.setImageBitmap(loadedImage); - // first time show with animation - if (!isInCache) { - imageView.startAnimation(getInAlphaAnimation(2000)); + if (view instanceof ImageView) { + ImageView imageView = (ImageView)view; + imageView.setImageBitmap(loadedImage); + // first time show with animation + if (!isInCache) { + imageView.startAnimation(getInAlphaAnimation(2000)); + } + } else { + Log.e(TAG, + "View is not instance of ImageView, you need to setOnImageCallbackListener() by your self"); } } } @@ -109,17 +118,22 @@ private static void setImageSDCardCache() { @Override public void onGetSuccess(String imageUrl, String imagePath, View view, boolean isInCache) { - ImageView imageView = (ImageView)view; + if (view != null && view instanceof ImageView) { + ImageView imageView = (ImageView)view; - // if oom please use BitmapFactory.decodeFile(imagePath, option) - Bitmap bm = BitmapFactory.decodeFile(imagePath); - if (bm != null) { - imageView.setImageBitmap(bm); + // if oom please use BitmapFactory.decodeFile(imagePath, option) + Bitmap bm = BitmapFactory.decodeFile(imagePath); + if (bm != null) { + imageView.setImageBitmap(bm); - // first time show with animation - if (!isInCache) { - imageView.startAnimation(getInAlphaAnimation(2000)); + // first time show with animation + if (!isInCache) { + imageView.startAnimation(getInAlphaAnimation(2000)); + } } + } else { + Log.e(TAG, + "View is not instance of ImageView, you need to setOnImageSDCallbackListener() by your self"); } } @@ -146,7 +160,30 @@ public static AlphaAnimation getInAlphaAnimation(long durationMillis) { return inAlphaAnimation; } - private ImageCacheManager() { + /** + * get image from sdcard listener + * + * @return + */ + public static OnGetDataListener getImageFromSdcardListener() { + return new OnGetDataListener() { + private static final long serialVersionUID = 1L; + + @Override + public CacheObject onGetData(String key) { + if (FileUtils.isFileExist(key)) { + // if oom please use BitmapFactory.decodeFile(imagePath, option),like this + // BitmapFactory.Options option = new BitmapFactory.Options(); + // option.inSampleSize = 2; + // b = BitmapFactory.decodeFile(key, option); + return new CacheObject(BitmapFactory.decodeFile(key)); + } else + return null; + + } + }; } + + private ImageCacheManager() {} } From 339959aaa3f2002a21f7f70e8bf683fe980af9cb Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Apr 2014 18:51:15 +0800 Subject: [PATCH 171/241] Add two-dimensional code download --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cc15583..1160f42 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_a + ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 From 422ba073b663817c77d77c9a4ea87cad5039f300 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 26 Apr 2014 18:56:50 +0800 Subject: [PATCH 172/241] Add two-dimensional code download --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1160f42..a4e4ee0 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_a - + ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 From 04165b227c0ebf244c4b484c26bc09deadb951aa Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 27 Apr 2014 00:28:31 +0800 Subject: [PATCH 173/241] Add local download --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a4e4ee0..68b6ac5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_a - + + 本地下载 ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 #####1. 图片缓存 @@ -99,8 +100,4 @@ Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_a WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/Trinea/androidcommon/trend.png)](https://bitdeli.com/free "Bitdeli Badge") - -[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/0e64e2f00112f86af822e39ce45bca31 "githalytics.com")](http://githalytics.com/Trinea/AndroidCommon) From bb1e77b391f79674c97bb099e04590ff918bab84 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 27 Apr 2014 00:39:18 +0800 Subject: [PATCH 174/241] Add qrcode --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68b6ac5..52c6c79 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_a - + 本地下载 ####一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 From ab739cfae63c4b66dbcbeb22f22f8ea0d82d95c0 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 27 Apr 2014 11:03:38 +0800 Subject: [PATCH 175/241] Adapter HttpCache to Android2.3 --- src/cn/trinea/android/common/service/HttpCache.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 37005ea..dfa0090 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -10,6 +10,7 @@ import android.content.Context; import android.os.AsyncTask; +import android.os.Build.VERSION; import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.dao.HttpCacheDao; import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; @@ -152,7 +153,12 @@ public HttpResponse httpGet(HttpRequest request) { * something */ public void httpGet(String url, HttpCacheListener listener) { - new HttpCacheStringAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, url); + // if bigger than android 4.0 use executeOnExecutor, else use execute + if (VERSION.SDK_INT >= 14) { + new HttpCacheStringAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, url); + } else { + new HttpCacheStringAsyncTask(listener).execute(url); + } } /** From 8cf89d60cba27115d7157cc9aa6531bcc87e976b Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 27 Apr 2014 15:52:07 +0800 Subject: [PATCH 176/241] Adapter HttpCache to Android2.3 --- .../common/constant/AndroidConstants.java | 17 +++++++++++++++++ .../android/common/service/HttpCache.java | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/cn/trinea/android/common/constant/AndroidConstants.java diff --git a/src/cn/trinea/android/common/constant/AndroidConstants.java b/src/cn/trinea/android/common/constant/AndroidConstants.java new file mode 100644 index 0000000..4a59195 --- /dev/null +++ b/src/cn/trinea/android/common/constant/AndroidConstants.java @@ -0,0 +1,17 @@ +/* + * Copyright 2014 trinea.cn All right reserved. This software is the confidential and proprietary information of + * trinea.cn ("Confidential Information"). You shall not disclose such Confidential Information and shall use it only in + * accordance with the terms of the license agreement you entered into with trinea.cn. + */ +package cn.trinea.android.common.constant; + +/** + * + * AndroidConstants + * + * @author Trinea 2014-4-27 + */ +public class AndroidConstants { + /** same to {@link oVERSION_CODES.ICE_CREAM_SANDWICH} **/ + public static final int ICE_CREAM_SANDWICH = 14; +} diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index dfa0090..0e19ac9 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -11,6 +11,7 @@ import android.content.Context; import android.os.AsyncTask; import android.os.Build.VERSION; +import cn.trinea.android.common.constant.AndroidConstants; import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.dao.HttpCacheDao; import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; @@ -154,7 +155,7 @@ public HttpResponse httpGet(HttpRequest request) { */ public void httpGet(String url, HttpCacheListener listener) { // if bigger than android 4.0 use executeOnExecutor, else use execute - if (VERSION.SDK_INT >= 14) { + if (VERSION.SDK_INT >= AndroidConstants.ICE_CREAM_SANDWICH) { new HttpCacheStringAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, url); } else { new HttpCacheStringAsyncTask(listener).execute(url); From 6e6fc05a497c99c83f9e7585cb85c862cc9e995f Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 27 Apr 2014 23:38:12 +0800 Subject: [PATCH 177/241] Add pom.xml --- pom.xml | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2fef384 --- /dev/null +++ b/pom.xml @@ -0,0 +1,80 @@ + + + + 4.0.0 + cn.trinea.android.common + trinea-android-common + 4.2.10-SNAPSHOT + apklib + + https://github.com/Trinea/android-common + Trinea Android Common Library + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + http://svn.apache.org/viewcvs.cgi/maven + http://svn.apache.org/viewcvs.cgi/maven + + + + UTF-8 + + + + + trinea + Trinea + trinea.cn+code@gmail.com + + + + + + + com.google.android + android + 4.0.1.2 + provided + + + + + src + test + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + 3.8.1 + + + 17 + + + true + + + org.apache.maven.plugins + maven-eclipse-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + + \ No newline at end of file From 9cb3ac9ab51a9f40953f9fe34633736e251dabc7 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 27 Apr 2014 23:50:54 +0800 Subject: [PATCH 178/241] Add pom.xml --- pom.xml | 138 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/pom.xml b/pom.xml index 2fef384..84725e0 100644 --- a/pom.xml +++ b/pom.xml @@ -1,80 +1,80 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - 4.0.0 - cn.trinea.android.common - trinea-android-common - 4.2.10-SNAPSHOT - apklib + 4.0.0 + cn.trinea.android.common + trinea-android-common + 4.2.10-SNAPSHOT + apklib - https://github.com/Trinea/android-common - Trinea Android Common Library + https://github.com/Trinea/android-common + Trinea Android Common Library - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - http://svn.apache.org/viewcvs.cgi/maven - http://svn.apache.org/viewcvs.cgi/maven - + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + http://svn.apache.org/viewcvs.cgi/maven + http://svn.apache.org/viewcvs.cgi/maven + - - UTF-8 - + + UTF-8 + - - - trinea - Trinea - trinea.cn+code@gmail.com - - + + + trinea + Trinea + trinea.cn+code@gmail.com + + - - - - com.google.android - android - 4.0.1.2 - provided - - + + + + com.google.android + android + 4.0.1.2 + provided + + - - src - test + + src + test - - - com.jayway.maven.plugins.android.generation2 - android-maven-plugin - 3.8.1 - - - 17 - - - true - - - org.apache.maven.plugins - maven-eclipse-plugin - - - org.apache.maven.plugins - maven-source-plugin - - - org.apache.maven.plugins - maven-javadoc-plugin - - - + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + 3.8.1 + + + 17 + + + true + + + org.apache.maven.plugins + maven-eclipse-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + \ No newline at end of file From 7716826cb47b2be89bff9d5e329fbbbb5f73557e Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 7 May 2014 12:50:44 +0800 Subject: [PATCH 179/241] Add AppUtils --- .../trinea/android/common/util/AppUtils.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/cn/trinea/android/common/util/AppUtils.java diff --git a/src/cn/trinea/android/common/util/AppUtils.java b/src/cn/trinea/android/common/util/AppUtils.java new file mode 100644 index 0000000..5725101 --- /dev/null +++ b/src/cn/trinea/android/common/util/AppUtils.java @@ -0,0 +1,51 @@ +package cn.trinea.android.common.util; + +import java.util.List; + +import android.app.ActivityManager; +import android.app.ActivityManager.RunningAppProcessInfo; +import android.content.Context; + +/** + * AppUtils + *
      + *
    • {@link AppUtils#isNamedProcess(Context, String)}
    • + *
    + * + * @author Trinea 2014-5-07 + */ +public class AppUtils { + + /** + * whether this process is named with processName + * + * @param context + * @param processName + * @return
      + * return whether this process is named with processName + *
    • if context is null, return false
    • + *
    • if {@link ActivityManager#getRunningAppProcesses()} is null, return false
    • + *
    • if one process of {@link ActivityManager#getRunningAppProcesses()} is equal to processName, return + * true, otherwise return false
    • + *
    + */ + public static boolean isNamedProcess(Context context, String processName) { + if (context == null) { + return false; + } + + int pid = android.os.Process.myPid(); + ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); + List processInfoList = manager.getRunningAppProcesses(); + if (processInfoList == null) { + return true; + } + + for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { + if (processInfo.pid == pid && ObjectUtils.isEquals(processName, processInfo.processName)) { + return true; + } + } + return false; + } +} From 1fe95ca9d5473e5926d894aabb5b87016bf3aa3d Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 16:25:45 +0800 Subject: [PATCH 180/241] Add Sonatype OSS config --- .gitignore | 1 + pom.xml | 91 +++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 81 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 93cd6aa..6d6d6a6 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ tmp/ *.swp *~.nib local.properties +release.properties .classpath .settings/ .loadpath diff --git a/pom.xml b/pom.xml index 84725e0..9077f80 100644 --- a/pom.xml +++ b/pom.xml @@ -7,11 +7,19 @@ 4.0.0 cn.trinea.android.common trinea-android-common - 4.2.10-SNAPSHOT - apklib + pom - https://github.com/Trinea/android-common Trinea Android Common Library + 4.2.10-SNAPSHOT + https://github.com/Trinea/android-common + Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on + 2012 + + + org.sonatype.oss + oss-parent + 7 + @@ -21,14 +29,11 @@ - http://svn.apache.org/viewcvs.cgi/maven - http://svn.apache.org/viewcvs.cgi/maven + scm:git:git://github.com/Trinea/android-common.git + scm:git:git@github.com:Trinea/android-common.git + https://github.com/Trinea/android-common - - UTF-8 - - trinea @@ -37,6 +42,16 @@ + + GitHub Issues + https://github.com/Trinea/android-common/issues + + + + UTF-8 + UTF-8 + + @@ -52,28 +67,82 @@ test + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-release-plugin + 2.4 + + v@{project.version} + + com.jayway.maven.plugins.android.generation2 android-maven-plugin - 3.8.1 + 3.8.0 - 17 + ${android.platform} + true true org.apache.maven.plugins maven-eclipse-plugin + 2.9 + + + com.google.android:android + + bin + + com.android.ide.eclipse.adt.ANDROID_FRAMEWORK + + + com.android.ide.eclipse.adt.AndroidNature + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + com.android.ide.eclipse.adt.PreCompilerBuilder + com.android.ide.eclipse.adt.ApkBuilder + + org.apache.maven.plugins maven-source-plugin + 2.2.1 + + + attach-sources + + jar + + + org.apache.maven.plugins maven-javadoc-plugin + 2.9 + + + attach-javadocs + + jar + + + From f09aabe54c9c5f6430e3001312a88beb78e561c1 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 16:27:18 +0800 Subject: [PATCH 181/241] [maven-release-plugin] prepare release v4.2.10 --- pom.xml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 9077f80..63def89 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,5 @@ - + 4.0.0 cn.trinea.android.common @@ -10,7 +7,7 @@ pom Trinea Android Common Library - 4.2.10-SNAPSHOT + 4.2.10 https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -32,7 +29,8 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - + v4.2.10 + From 85e64a8c9f4cf38335814d0691324cb2706dd0ae Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 16:27:30 +0800 Subject: [PATCH 182/241] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 63def89..948fac9 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ pom Trinea Android Common Library - 4.2.10 + 4.2.11-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - v4.2.10 + HEAD From 418e31eb76af83a7240d11ab52ad604c04ee3fba Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 16:29:28 +0800 Subject: [PATCH 183/241] [maven-release-plugin] prepare release v4.2.11 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 948fac9..05f13da 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ pom Trinea Android Common Library - 4.2.11-SNAPSHOT + 4.2.11 https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - HEAD + v4.2.11 From b6db32e1e71290ceb73aa751dd6476ec70a80b99 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 16:29:41 +0800 Subject: [PATCH 184/241] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 05f13da..1a8c439 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ pom Trinea Android Common Library - 4.2.11 + 4.2.12-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - v4.2.11 + HEAD From 7b8f51a578260dc384a50605fb07a3514d5c0714 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:10:52 +0800 Subject: [PATCH 185/241] Modify pom.xml --- pom.xml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 1a8c439..c52c02d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,8 @@ - + 4.0.0 cn.trinea.android.common @@ -7,7 +10,7 @@ pom Trinea Android Common Library - 4.2.12-SNAPSHOT + 4.2.10-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,8 +32,8 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - HEAD - + HEAD + From ef199be85bc2e3f3dfbeab5dd5eb10d1b60c624a Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:12:36 +0800 Subject: [PATCH 186/241] [maven-release-plugin] prepare release v4.2.10 --- pom.xml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index c52c02d..7d45077 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,5 @@ - + 4.0.0 cn.trinea.android.common @@ -10,7 +7,7 @@ pom Trinea Android Common Library - 4.2.10-SNAPSHOT + 4.2.10 https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -32,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - HEAD + v4.2.10 From 91830d0f800c1f0ba94e542fa886b16589554f01 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:17:29 +0800 Subject: [PATCH 187/241] Modify version --- pom.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 7d45077..c52c02d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,8 @@ - + 4.0.0 cn.trinea.android.common @@ -7,7 +10,7 @@ pom Trinea Android Common Library - 4.2.10 + 4.2.10-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +32,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - v4.2.10 + HEAD From e34edcda2541417ae90b87deaf0e12a732ae2b40 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:18:21 +0800 Subject: [PATCH 188/241] [maven-release-plugin] prepare release v4.2.10 --- pom.xml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index c52c02d..7d45077 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,5 @@ - + 4.0.0 cn.trinea.android.common @@ -10,7 +7,7 @@ pom Trinea Android Common Library - 4.2.10-SNAPSHOT + 4.2.10 https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -32,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - HEAD + v4.2.10 From 57f898c1a6e2616a816b753cdbf5759d25fcd39f Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:23:49 +0800 Subject: [PATCH 189/241] Add maven config --- AndroidManifest.xml | 2 +- pom.xml | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f3bb91a..58847e1 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="4.2.13" > - + 4.0.0 cn.trinea.android.common @@ -7,7 +10,7 @@ pom Trinea Android Common Library - 4.2.10 + 4.2.13-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +32,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - v4.2.10 + HEAD From bd1a8fbb7098d8b01c5c9b186da5af2536ca24fd Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:25:19 +0800 Subject: [PATCH 190/241] [maven-release-plugin] prepare release v4.2.13 --- pom.xml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index e0c70b7..8a8f021 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,5 @@ - + 4.0.0 cn.trinea.android.common @@ -10,7 +7,7 @@ pom Trinea Android Common Library - 4.2.13-SNAPSHOT + 4.2.13 https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -32,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - HEAD + v4.2.13 From 41d83b38c9a658c75096dbbfdfb691b343955051 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:25:38 +0800 Subject: [PATCH 191/241] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8a8f021..a5621f2 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ pom Trinea Android Common Library - 4.2.13 + 4.2.14-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - v4.2.13 + HEAD From 8b7b643a667f60240eb58d13b6b9aafb7c2cedf6 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:37:35 +0800 Subject: [PATCH 192/241] Modify packaging to apklib --- AndroidManifest.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 58847e1..a395da5 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="4.2.14" > 4.0.0 cn.trinea.android.common trinea-android-common - pom + apklib Trinea Android Common Library 4.2.14-SNAPSHOT From 485a0d5344836f041cc64ffac7a9c73d0377b25a Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 19:57:08 +0800 Subject: [PATCH 193/241] Modify packaging to aar --- pom.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index e2116e1..5a32aee 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 cn.trinea.android.common trinea-android-common - apklib + aar Trinea Android Common Library 4.2.14-SNAPSHOT @@ -29,7 +29,6 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - HEAD @@ -87,9 +86,6 @@ android-maven-plugin 3.8.0 - - ${android.platform} - true true From f6d68c44e9faebeaed595357d5d1126c4d3fe753 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 20:00:07 +0800 Subject: [PATCH 194/241] Modify android-maven-plugin version --- pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5a32aee..2a26128 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,8 @@ - + 4.0.0 cn.trinea.android.common @@ -86,6 +89,9 @@ android-maven-plugin 3.8.0 + + 14 + true true From d0e66df18f3fe9bb3e11beb8c3bc9b9aa66ff417 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 20:01:37 +0800 Subject: [PATCH 195/241] Modify maven-compiler-plugin java version --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2a26128..f92e035 100644 --- a/pom.xml +++ b/pom.xml @@ -72,8 +72,8 @@ maven-compiler-plugin 3.0 - ${java.version} - ${java.version} + 1.6 + 1.6 From 533557927937ef92c869ea2c57cb7f58796a7979 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 20:03:14 +0800 Subject: [PATCH 196/241] [maven-release-plugin] prepare release v4.2.14 --- pom.xml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index f92e035..37c2441 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,5 @@ - + 4.0.0 cn.trinea.android.common @@ -10,7 +7,7 @@ aar Trinea Android Common Library - 4.2.14-SNAPSHOT + 4.2.14 https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -32,7 +29,8 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - + v4.2.14 + From 1b3fe8544bee46bbb33975e7ea88ab1b86ebf24c Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 11 May 2014 20:03:29 +0800 Subject: [PATCH 197/241] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 37c2441..8ab28ba 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ aar Trinea Android Common Library - 4.2.14 + 4.2.15-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - v4.2.14 + HEAD From af02f12a50b0e959e90b6a59b9f665729db08dff Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 13 May 2014 23:20:37 +0800 Subject: [PATCH 198/241] Modify Cache Class Diagram --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 52c6c79..d812247 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_a #####4. 预取数据缓存 使用见:[预取数据缓存](http://www.trinea.cn/android/preloaddatacache/) 缓存类关系图如下:其中HttpCache为后续计划的http缓存 -![ImageSDCardCache](http://farm4.staticflickr.com/3818/9318670513_1576253fd5_o.jpg) +![Image Cache](https://farm8.staticflickr.com/7336/13991252450_f1e154012d_o.png) ####二. 公用的view #####1. 下拉刷新及滚动到底部加载更多的Listview From 9232dbbab40c3e247cd23e74a3c7d7db1df7dfd1 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 14 May 2014 00:04:48 +0800 Subject: [PATCH 199/241] [maven-release-plugin] prepare release v4.2.15 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8ab28ba..0dfe0b0 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ aar Trinea Android Common Library - 4.2.15-SNAPSHOT + 4.2.15 https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - HEAD + v4.2.15 From 57d93f1e8defed4443df7d111fc0eb65a6747a3e Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 14 May 2014 00:12:24 +0800 Subject: [PATCH 200/241] Add SNAPSHOT --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0dfe0b0..c31c50b 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ aar Trinea Android Common Library - 4.2.15 + 4.2.15-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +29,6 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - v4.2.15 From 4b6891350eb81dcf2978fca96eca8ee5e605d1d1 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 14 May 2014 00:13:24 +0800 Subject: [PATCH 201/241] [maven-release-plugin] prepare release v4.2.15 --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c31c50b..e6a5749 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ aar Trinea Android Common Library - 4.2.15-SNAPSHOT + 4.2.15 https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,6 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common + v4.2.15 From bae6530fbcf13b486f67c4a86770de4b7a4ade11 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 14 May 2014 00:13:41 +0800 Subject: [PATCH 202/241] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e6a5749..c72d620 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ aar Trinea Android Common Library - 4.2.15 + 4.2.16-SNAPSHOT https://github.com/Trinea/android-common Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on 2012 @@ -29,7 +29,7 @@ scm:git:git://github.com/Trinea/android-common.git scm:git:git@github.com:Trinea/android-common.git https://github.com/Trinea/android-common - v4.2.15 + HEAD From 7917d5c50bd5d802097173faea554344730e2fb3 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 28 May 2014 20:57:48 +0800 Subject: [PATCH 203/241] Add SingletonUtils --- .../android/common/util/SingletonUtils.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/cn/trinea/android/common/util/SingletonUtils.java diff --git a/src/cn/trinea/android/common/util/SingletonUtils.java b/src/cn/trinea/android/common/util/SingletonUtils.java new file mode 100644 index 0000000..6ef8ba5 --- /dev/null +++ b/src/cn/trinea/android/common/util/SingletonUtils.java @@ -0,0 +1,25 @@ +package cn.trinea.android.common.util; + +/** + * Singleton helper class for lazily initialization. + * + * @author Trinea + * + * @param + */ +public abstract class SingletonUtils { + private T instance; + + protected abstract T newInstance(); + + public final T getInstance() { + if (instance == null) { + synchronized (SingletonUtils.class) { + if (instance == null) { + instance = newInstance(); + } + } + } + return instance; + } +} From 2430f0ae75bbe5f4be2de786936284dccfb1b84a Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 10 Jul 2014 09:51:21 +0800 Subject: [PATCH 204/241] Add read raw or assets file to list --- .../android/common/util/ResourceUtils.java | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/cn/trinea/android/common/util/ResourceUtils.java b/src/cn/trinea/android/common/util/ResourceUtils.java index 78ce066..5e7cb82 100644 --- a/src/cn/trinea/android/common/util/ResourceUtils.java +++ b/src/cn/trinea/android/common/util/ResourceUtils.java @@ -3,8 +3,8 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; - -import cn.trinea.android.common.util.StringUtils; +import java.util.ArrayList; +import java.util.List; import android.content.Context; @@ -71,4 +71,61 @@ public static String geFileFromRaw(Context context, int resId) { return null; } } + + /** + * same to {@link ResourceUtils#geFileFromAssets(Context, String)}, but return type is List + * + * @param context + * @param fileName + * @return + */ + public static List geFileToListFromAssets(Context context, String fileName) { + if (context == null || StringUtils.isEmpty(fileName)) { + return null; + } + + List fileContent = new ArrayList(); + try { + InputStreamReader in = new InputStreamReader(context.getResources().getAssets().open(fileName)); + BufferedReader br = new BufferedReader(in); + String line; + while ((line = br.readLine()) != null) { + fileContent.add(line); + } + br.close(); + return fileContent; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + /** + * same to {@link ResourceUtils#geFileFromRaw(Context, int)}, but return type is List + * + * @param context + * @param resId + * @return + */ + public static List geFileToListFromRaw(Context context, int resId) { + if (context == null) { + return null; + } + + List fileContent = new ArrayList(); + BufferedReader reader = null; + try { + InputStreamReader in = new InputStreamReader(context.getResources().openRawResource(resId)); + reader = new BufferedReader(in); + String line = null; + while ((line = reader.readLine()) != null) { + fileContent.add(line); + } + reader.close(); + return fileContent; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } } From a0dfb10c6a21d7e5daede44616bcdaaba28b6266 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 30 Jul 2014 12:58:51 +0800 Subject: [PATCH 205/241] remove android version digit --- .../common/constant/AndroidConstants.java | 17 ----------------- .../android/common/service/HttpCache.java | 12 ++++++++---- .../android/common/util/DownloadManagerPro.java | 3 ++- .../android/common/util/PackageUtils.java | 5 +++-- .../trinea/android/common/util/ViewUtils.java | 2 +- 5 files changed, 14 insertions(+), 25 deletions(-) delete mode 100644 src/cn/trinea/android/common/constant/AndroidConstants.java diff --git a/src/cn/trinea/android/common/constant/AndroidConstants.java b/src/cn/trinea/android/common/constant/AndroidConstants.java deleted file mode 100644 index 4a59195..0000000 --- a/src/cn/trinea/android/common/constant/AndroidConstants.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2014 trinea.cn All right reserved. This software is the confidential and proprietary information of - * trinea.cn ("Confidential Information"). You shall not disclose such Confidential Information and shall use it only in - * accordance with the terms of the license agreement you entered into with trinea.cn. - */ -package cn.trinea.android.common.constant; - -/** - * - * AndroidConstants - * - * @author Trinea 2014-4-27 - */ -public class AndroidConstants { - /** same to {@link oVERSION_CODES.ICE_CREAM_SANDWICH} **/ - public static final int ICE_CREAM_SANDWICH = 14; -} diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/cn/trinea/android/common/service/HttpCache.java index 0e19ac9..3c02e22 100644 --- a/src/cn/trinea/android/common/service/HttpCache.java +++ b/src/cn/trinea/android/common/service/HttpCache.java @@ -10,8 +10,7 @@ import android.content.Context; import android.os.AsyncTask; -import android.os.Build.VERSION; -import cn.trinea.android.common.constant.AndroidConstants; +import android.os.Build; import cn.trinea.android.common.constant.HttpConstants; import cn.trinea.android.common.dao.HttpCacheDao; import cn.trinea.android.common.dao.impl.HttpCacheDaoImpl; @@ -155,7 +154,7 @@ public HttpResponse httpGet(HttpRequest request) { */ public void httpGet(String url, HttpCacheListener listener) { // if bigger than android 4.0 use executeOnExecutor, else use execute - if (VERSION.SDK_INT >= AndroidConstants.ICE_CREAM_SANDWICH) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { new HttpCacheStringAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, url); } else { new HttpCacheStringAsyncTask(listener).execute(url); @@ -175,7 +174,12 @@ public void httpGet(String url, HttpCacheListener listener) { * something */ public void httpGet(HttpRequest request, HttpCacheListener listener) { - new HttpCacheRequestAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, request); + // if bigger than android 4.0 use executeOnExecutor, else use execute + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + new HttpCacheRequestAsyncTask(listener).executeOnExecutor(THREAD_POOL_EXECUTOR, request); + } else { + new HttpCacheRequestAsyncTask(listener).execute(request); + } } /** diff --git a/src/cn/trinea/android/common/util/DownloadManagerPro.java b/src/cn/trinea/android/common/util/DownloadManagerPro.java index 0f466ca..e39f47b 100644 --- a/src/cn/trinea/android/common/util/DownloadManagerPro.java +++ b/src/cn/trinea/android/common/util/DownloadManagerPro.java @@ -208,7 +208,8 @@ private static void initResumeMethod() { * @return */ public String getFileName(long downloadId) { - return getString(downloadId, (Build.VERSION.SDK_INT < 11 ? COLUMN_LOCAL_URI : COLUMN_LOCAL_FILENAME)); + return getString(downloadId, (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB ? COLUMN_LOCAL_URI + : COLUMN_LOCAL_FILENAME)); } /** diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 983ee3f..8c07c25 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -524,13 +524,14 @@ private static String getInstallLocationParams() { public static void startInstalledAppDetails(Context context, String packageName) { Intent intent = new Intent(); int sdkVersion = Build.VERSION.SDK_INT; - if (sdkVersion >= 9) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", packageName, null)); } else { intent.setAction(Intent.ACTION_VIEW); intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); - intent.putExtra((sdkVersion == 8 ? "pkg" : "com.android.settings.ApplicationPkgName"), packageName); + intent.putExtra((sdkVersion == Build.VERSION_CODES.FROYO ? "pkg" + : "com.android.settings.ApplicationPkgName"), packageName); } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/cn/trinea/android/common/util/ViewUtils.java index bcf11b1..414cf0e 100644 --- a/src/cn/trinea/android/common/util/ViewUtils.java +++ b/src/cn/trinea/android/common/util/ViewUtils.java @@ -84,7 +84,7 @@ public static int getListViewHeightBasedOnChildren(ListView view) { // if (view == null || view.getChildCount() <= 0) { // return 0; // } - // if (Build.VERSION.SDK_INT >= 11) { + // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // return getNumColumnsCompat11(view); // // } else { From 18e90affcc1410f4ef9c21d2721b35b5555b45c7 Mon Sep 17 00:00:00 2001 From: arai-wa Date: Mon, 4 Aug 2014 16:21:39 +0900 Subject: [PATCH 206/241] Add a method to get descended views --- .../trinea/android/common/util/ViewUtils.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/cn/trinea/android/common/util/ViewUtils.java index 414cf0e..2b23cc5 100644 --- a/src/cn/trinea/android/common/util/ViewUtils.java +++ b/src/cn/trinea/android/common/util/ViewUtils.java @@ -1,6 +1,8 @@ package cn.trinea.android.common.util; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; import android.view.View; import android.view.View.OnClickListener; @@ -228,4 +230,29 @@ public static void setSearchViewOnClickListener(View v, OnClickListener listener } } } + + /** + * get descended views from parent. + * + * @param parent + * @param filter Type of views which will be returned. + * @param includeSubClass Whether returned list will include views which are subclass of filter or not. + * @return + */ + public static List getDescendants(ViewGroup parent, Class filter, boolean includeSubClass) { + List allDescendedView = new ArrayList(); + + int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = parent.getChildAt(i); + Class childsClass = child.getClass(); + if (includeSubClass && filter.isAssignableFrom(childsClass) || !includeSubClass && childsClass == filter) { + allDescendedView.add(filter.cast(child)); + } + if (child instanceof ViewGroup) { + allDescendedView.addAll(getDescendants((ViewGroup) child, filter, includeSubClass)); + } + } + return allDescendedView; + } } From dd1f9e0eaa7d53abe4bc2aed02a152dd9e08c903 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 5 Aug 2014 10:38:51 +0800 Subject: [PATCH 207/241] Code format --- src/cn/trinea/android/common/util/ViewUtils.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/cn/trinea/android/common/util/ViewUtils.java index 2b23cc5..72cf064 100644 --- a/src/cn/trinea/android/common/util/ViewUtils.java +++ b/src/cn/trinea/android/common/util/ViewUtils.java @@ -230,7 +230,7 @@ public static void setSearchViewOnClickListener(View v, OnClickListener listener } } } - + /** * get descended views from parent. * @@ -240,19 +240,19 @@ public static void setSearchViewOnClickListener(View v, OnClickListener listener * @return */ public static List getDescendants(ViewGroup parent, Class filter, boolean includeSubClass) { - List allDescendedView = new ArrayList(); - + List descendedViewList = new ArrayList(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); Class childsClass = child.getClass(); - if (includeSubClass && filter.isAssignableFrom(childsClass) || !includeSubClass && childsClass == filter) { - allDescendedView.add(filter.cast(child)); + if ((includeSubClass && filter.isAssignableFrom(childsClass)) + || (!includeSubClass && childsClass == filter)) { + descendedViewList.add(filter.cast(child)); } if (child instanceof ViewGroup) { - allDescendedView.addAll(getDescendants((ViewGroup) child, filter, includeSubClass)); + descendedViewList.addAll(getDescendants((ViewGroup)child, filter, includeSubClass)); } } - return allDescendedView; + return descendedViewList; } } From ac78ada5a7526bdec25ca9e796bbfa1c7b8b9a27 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 8 Aug 2014 16:53:39 +0800 Subject: [PATCH 208/241] Add getStringList from JSON --- .../trinea/android/common/util/JSONUtils.java | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/JSONUtils.java b/src/cn/trinea/android/common/util/JSONUtils.java index 9f45ed8..ed8305c 100644 --- a/src/cn/trinea/android/common/util/JSONUtils.java +++ b/src/cn/trinea/android/common/util/JSONUtils.java @@ -1,7 +1,9 @@ package cn.trinea.android.common.util; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.json.JSONArray; @@ -372,10 +374,75 @@ public static String[] getStringArray(String jsonData, String key, String[] defa } } + /** + * get String list from jsonObject + * + * @param jsonObject + * @param key + * @param defaultValue + * @return
      + *
    • if jsonObject is null, return defaultValue
    • + *
    • if key is null or empty, return defaultValue
    • + *
    • if {@link JSONObject#getJSONArray(String)} exception, return defaultValue
    • + *
    • if {@link JSONArray#getString(int)} exception, return defaultValue
    • + *
    • return string array
    • + *
    + */ + public static List getStringList(JSONObject jsonObject, String key, List defaultValue) { + if (jsonObject == null || StringUtils.isEmpty(key)) { + return defaultValue; + } + + try { + JSONArray statusArray = jsonObject.getJSONArray(key); + if (statusArray != null) { + List list = new ArrayList(); + for (int i = 0; i < statusArray.length(); i++) { + list.add(statusArray.getString(i)); + } + return list; + } + } catch (JSONException e) { + if (isPrintException) { + e.printStackTrace(); + } + return defaultValue; + } + return defaultValue; + } + + /** + * get String list from jsonData + * + * @param jsonData + * @param key + * @param defaultValue + * @return
      + *
    • if jsonObject is null, return defaultValue
    • + *
    • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
    • + *
    • return {@link JSONUtils#getStringList(JSONObject, String, List)}
    • + *
    + */ + public static List getStringList(String jsonData, String key, List defaultValue) { + if (StringUtils.isEmpty(jsonData)) { + return defaultValue; + } + + try { + JSONObject jsonObject = new JSONObject(jsonData); + return getStringList(jsonObject, key, defaultValue); + } catch (JSONException e) { + if (isPrintException) { + e.printStackTrace(); + } + return defaultValue; + } + } + /** * get JSONObject from jsonObject * - * @param jsonObject + * @param jsonObject * @param key * @param defaultValue * @return
      From 31b0e42dc93728dec124a2deb31327b450c436e4 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 12 Aug 2014 15:42:18 +0800 Subject: [PATCH 209/241] Add getStringCascade getJSONObjectCascade for JSONUtils --- .../trinea/android/common/util/JSONUtils.java | 115 +++++++++++++++++- 1 file changed, 114 insertions(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/JSONUtils.java b/src/cn/trinea/android/common/util/JSONUtils.java index ed8305c..e29b6f6 100644 --- a/src/cn/trinea/android/common/util/JSONUtils.java +++ b/src/cn/trinea/android/common/util/JSONUtils.java @@ -309,6 +309,62 @@ public static String getString(String jsonData, String key, String defaultValue) } } + /** + * get String from jsonObject + * + * @param jsonObject + * @param defaultValue + * @param keyArray + * @return
        + *
      • if jsonObject is null, return defaultValue
      • + *
      • if keyArray is null or empty, return defaultValue
      • + *
      • get {@link #getJSONObject(JSONObject, String, JSONObject)} by recursion, return it. if anyone is + * null, return directly
      • + *
      + */ + public static String getStringCascade(JSONObject jsonObject, String defaultValue, String... keyArray) { + if (jsonObject == null || ArrayUtils.isEmpty(keyArray)) { + return defaultValue; + } + + String data = jsonObject.toString(); + for (String key : keyArray) { + data = getStringCascade(data, key, defaultValue); + if (data == null) { + return defaultValue; + } + } + return data; + } + + /** + * get String from jsonData + * + * @param jsonData + * @param defaultValue + * @param keyArray + * @return
        + *
      • if jsonData is null, return defaultValue
      • + *
      • if keyArray is null or empty, return defaultValue
      • + *
      • get {@link #getJSONObject(JSONObject, String, JSONObject)} by recursion, return it. if anyone is + * null, return directly
      • + *
      + */ + public static String getStringCascade(String jsonData, String defaultValue, String... keyArray) { + if (StringUtils.isEmpty(jsonData)) { + return defaultValue; + } + + String data = jsonData; + for (String key : keyArray) { + data = getString(data, key, defaultValue); + if (data == null) { + return defaultValue; + } + } + return data; + } + /** * get String array from jsonObject * @@ -474,7 +530,7 @@ public static JSONObject getJSONObject(JSONObject jsonObject, String key, JSONOb * @param key * @param defaultValue * @return
        - *
      • if jsonObject is null, return defaultValue
      • + *
      • if jsonData is null, return defaultValue
      • *
      • if jsonData {@link JSONObject#JSONObject(String)} exception, return defaultValue
      • *
      • return {@link JSONUtils#getJSONObject(JSONObject, String, JSONObject)}
      • *
      @@ -495,6 +551,63 @@ public static JSONObject getJSONObject(String jsonData, String key, JSONObject d } } + /** + * get JSONObject from jsonObject + * + * @param jsonObject + * @param defaultValue + * @param keyArray + * @return
        + *
      • if jsonObject is null, return defaultValue
      • + *
      • if keyArray is null or empty, return defaultValue
      • + *
      • get {@link #getJSONObject(JSONObject, String, JSONObject)} by recursion, return it. if anyone is + * null, return directly
      • + *
      + */ + public static JSONObject getJSONObjectCascade(JSONObject jsonObject, JSONObject defaultValue, String... keyArray) { + if (jsonObject == null || ArrayUtils.isEmpty(keyArray)) { + return defaultValue; + } + + JSONObject js = jsonObject; + for (String key : keyArray) { + js = getJSONObject(js, key, defaultValue); + if (js == null) { + return defaultValue; + } + } + return js; + } + + /** + * get JSONObject from jsonData + * + * @param jsonData + * @param defaultValue + * @param keyArray + * @return
        + *
      • if jsonData is null, return defaultValue
      • + *
      • if keyArray is null or empty, return defaultValue
      • + *
      • get {@link #getJSONObject(JSONObject, String, JSONObject)} by recursion, return it. if anyone is + * null, return directly
      • + *
      + */ + public static JSONObject getJSONObjectCascade(String jsonData, JSONObject defaultValue, String... keyArray) { + if (StringUtils.isEmpty(jsonData)) { + return defaultValue; + } + + try { + JSONObject jsonObject = new JSONObject(jsonData); + return getJSONObjectCascade(jsonObject, defaultValue, keyArray); + } catch (JSONException e) { + if (isPrintException) { + e.printStackTrace(); + } + return defaultValue; + } + } + /** * get JSONArray from jsonObject * From d7420ee3f3d31ec8e9ef628197aeaa9b736e9125 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 18 Aug 2014 17:55:15 +0800 Subject: [PATCH 210/241] Add isApplicationInBackground for AppUtils --- .gitignore | 184 +++--------------- .../trinea/android/common/util/AppUtils.java | 23 +++ 2 files changed, 53 insertions(+), 154 deletions(-) diff --git a/.gitignore b/.gitignore index 6d6d6a6..4de61f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,167 +1,43 @@ -################# -## Eclipse -################# -target/* -.svn -gen -bin/* - -*.pydevproject -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -release.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.vspscc -.builds -*.dotCover - -## TODO: If you have NuGet Package Restore enabled, uncomment this -#packages/ - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf +# built application files +# *.apk +*.ap_ -# Visual Studio profiler -*.psess -*.vsp - -# ReSharper is a .NET coding add-in -_ReSharper* - -# Installshield output folder -[Ee]xpress - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish - -# Others -[Bb]in -[Oo]bj -sql -TestResults -*.Cache -ClientBin -stylecop.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML +# files for the dex VM +*.dex +# Java class files +*.class +# generated files +bin/ +gen/ -############ -## Windows -############ +# Local configuration file (sdk path, etc) +local.properties -# Windows image file caches +# Windows thumbnail db Thumbs.db -# Folder config file -Desktop.ini - - -############# -## Python -############# - -*.py[co] +# OSX files +.DS_Store -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg +# Eclipse project files +.classpath +.project +.settings -# Installer logs -pip-log.txt +# Android Studio +.idea +#.idea/workspace.xml - remove # and delete .idea if it better suit your needs. +build/ +.gradle -# Unit test / coverage reports -.coverage -.tox +# Proguard folder generated by Eclipse +proguard/ -#Translations -*.mo +# Log Files +*.log -#Mr Developer -.mr.developer.cfg +# Other +.svn -# Mac crap -.DS_Store diff --git a/src/cn/trinea/android/common/util/AppUtils.java b/src/cn/trinea/android/common/util/AppUtils.java index 5725101..cb17b40 100644 --- a/src/cn/trinea/android/common/util/AppUtils.java +++ b/src/cn/trinea/android/common/util/AppUtils.java @@ -4,6 +4,8 @@ import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; +import android.app.ActivityManager.RunningTaskInfo; +import android.content.ComponentName; import android.content.Context; /** @@ -48,4 +50,25 @@ public static boolean isNamedProcess(Context context, String processName) { } return false; } + + /** + * whether application is in background + *
        + *
      • need use permission android.permission.GET_TASKS in Manifest.xml
      • + *
      + * + * @param context + * @return if application is in background return true, otherwise return false + */ + public static boolean isApplicationInBackground(Context context) { + ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); + List taskList = am.getRunningTasks(1); + if (taskList != null && !taskList.isEmpty()) { + ComponentName topActivity = taskList.get(0).topActivity; + if (topActivity != null && !topActivity.getPackageName().equals(context.getPackageName())) { + return true; + } + } + return false; + } } From e6cfb425d772964d41f96bdda850ad9231750acf Mon Sep 17 00:00:00 2001 From: Trinea Date: Sat, 23 Aug 2014 15:46:44 +0800 Subject: [PATCH 211/241] Delete dbHelper.getReadableDatabase --- .../android/common/dao/impl/HttpCacheDaoImpl.java | 8 ++++---- .../common/dao/impl/ImageSDCardCacheDaoImpl.java | 4 ++-- src/cn/trinea/android/common/util/SqliteUtils.java | 14 ++++---------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java index 6a93841..c000946 100644 --- a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java +++ b/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java @@ -32,7 +32,7 @@ public long insertHttpResponse(HttpResponse httpResponse) { return -1; } synchronized (HttpCacheDaoImpl.class) { - return sqliteUtils.getWDb().replace(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, contentValues); + return sqliteUtils.getDb().replace(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, contentValues); } } @@ -46,7 +46,7 @@ public HttpResponse getHttpResponse(String url) { appWhere.append(DbConstants.HTTP_CACHE_TABLE_URL).append("=?"); String[] appWhereArgs = {url}; synchronized (HttpCacheDaoImpl.class) { - Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, + Cursor cursor = sqliteUtils.getDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, appWhere.toString(), appWhereArgs, null, null, null); if (cursor == null) { return null; @@ -70,7 +70,7 @@ public Map getHttpResponsesByType(int type) { String[] whereClauseArgs = {Integer.toString(type)}; synchronized (HttpCacheDaoImpl.class) { - Cursor cursor = sqliteUtils.getRDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, + Cursor cursor = sqliteUtils.getDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, whereClause.toString(), whereClauseArgs, null, null, null); if (cursor == null) { @@ -100,7 +100,7 @@ public Map getHttpResponsesByType(int type) { @Override public int deleteAllHttpResponse() { - return sqliteUtils.getWDb().delete(DbConstants.HTTP_CACHE_TABLE_TYPE, null, null); + return sqliteUtils.getDb().delete(DbConstants.HTTP_CACHE_TABLE_TYPE, null, null); } /** diff --git a/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java b/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java index f8dcaf7..c60b3a5 100644 --- a/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java +++ b/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java @@ -34,7 +34,7 @@ public boolean putIntoImageSDCardCache(ImageSDCardCache imageSDCardCache, String StringBuilder selection = new StringBuilder(); selection.append(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TAG).append("=?"); String[] selectionArgs = {tag}; - Cursor cursor = sqliteUtils.getRDb().query(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME, null, + Cursor cursor = sqliteUtils.getDb().query(DbConstants.IMAGE_SDCARD_CACHE_TABLE_TABLE_NAME, null, selection.toString(), selectionArgs, null, null, null); if (cursor == null) { return true; @@ -64,7 +64,7 @@ public boolean deleteAndInsertImageSDCardCache(ImageSDCardCache imageSDCardCache return false; } - SQLiteDatabase db = sqliteUtils.getWDb(); + SQLiteDatabase db = sqliteUtils.getDb(); db.beginTransaction(); try { StringBuilder whereClause = new StringBuilder(); diff --git a/src/cn/trinea/android/common/util/SqliteUtils.java b/src/cn/trinea/android/common/util/SqliteUtils.java index 681c9e3..b73cff4 100644 --- a/src/cn/trinea/android/common/util/SqliteUtils.java +++ b/src/cn/trinea/android/common/util/SqliteUtils.java @@ -13,13 +13,11 @@ public class SqliteUtils { private static volatile SqliteUtils instance; private DbHelper dbHelper; - private SQLiteDatabase wDb; - private SQLiteDatabase rDb; + private SQLiteDatabase db; private SqliteUtils(Context context) { dbHelper = new DbHelper(context); - wDb = dbHelper.getWritableDatabase(); - rDb = dbHelper.getReadableDatabase(); + db = dbHelper.getWritableDatabase(); } public static SqliteUtils getInstance(Context context) { @@ -33,11 +31,7 @@ public static SqliteUtils getInstance(Context context) { return instance; } - public SQLiteDatabase getWDb() { - return wDb; - } - - public SQLiteDatabase getRDb() { - return rDb; + public SQLiteDatabase getDb() { + return db; } } From 27d3416693ffe097c2b58abf9399d8d36b2eba9c Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 9 Sep 2014 12:50:32 +0800 Subject: [PATCH 212/241] Modify javadoc --- src/cn/trinea/android/common/view/DropDownListView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index e7880ba..a3d6120 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -21,7 +21,7 @@ import cn.trinea.android.common.R; /** - * Listview whick can do something when drop down or scroll to bottom. for example, drop down to refresh and + * Listview which can do something when drop down or scroll to bottom. for example, drop down to refresh and * load more when scroll to bottom *
        * DropDown Listener From 8168b4c9cebe2786e99ec2b0fc7ecd0eacdb2d13 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 11 Sep 2014 00:29:05 +0800 Subject: [PATCH 213/241] Add weibo --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d812247..0a2e22d 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 -微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    QQ:717763774 +> 关于我,欢迎关注 +> 微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    QQ:717763774 ####示例APK: From 69f2e32474f48da8631cd26e3fa3e5f41c06dd43 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 11 Sep 2014 00:30:57 +0800 Subject: [PATCH 214/241] Add my info --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0a2e22d..eb74e9f 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)android-common-lib ------------- +> 关于我,欢迎关注 +> 微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    QQ:717763774 + **主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 -> 关于我,欢迎关注 -> 微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    QQ:717763774 - ####示例APK: From 60c25d4b08ac1db3c4159f470fc83aa6a8d10953 Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 26 Oct 2014 11:33:31 +0800 Subject: [PATCH 215/241] Add Maven --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index eb74e9f..70994fe 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,16 @@ Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_a -dontwarn cn.trinea.android.** ``` +### Download +Maven: +``` xml + + cn.trinea.android.common + trinea-android-common + 4.2.15 + +``` + ## License Copyright 2013 trinea.cn From da956044627bef2bad381fb77a7cd80c850d3688 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 3 Nov 2014 10:18:42 +0800 Subject: [PATCH 216/241] Modify return type of getCacheControlMaxAge to long --- src/cn/trinea/android/common/entity/HttpResponse.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/cn/trinea/android/common/entity/HttpResponse.java index 5f28ce2..65659e6 100644 --- a/src/cn/trinea/android/common/entity/HttpResponse.java +++ b/src/cn/trinea/android/common/entity/HttpResponse.java @@ -229,7 +229,7 @@ public String getExpiresHeader() { * * @return -1 represents http error or no cache-control in response headers, or max-age in seconds */ - private int getCacheControlMaxAge() { + private long getCacheControlMaxAge() { try { String cacheControl = (String)responseHeaders.get(HttpConstants.CACHE_CONTROL); if (!StringUtils.isEmpty(cacheControl)) { @@ -242,7 +242,7 @@ private int getCacheControlMaxAge() { } else { maxAge = cacheControl.substring(start + "max-age=".length()); } - return Integer.parseInt(maxAge); + return Long.parseLong(maxAge); } } return -1; @@ -262,7 +262,7 @@ private int getCacheControlMaxAge() { *
      */ private long getExpiresInMillis() { - int maxAge = getCacheControlMaxAge(); + long maxAge = getCacheControlMaxAge(); if (maxAge != -1) { return System.currentTimeMillis() + maxAge * 1000; } else { From 9ec84231720aa08c4687e62fc3e084cd9d8b2923 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 5 Nov 2014 17:39:00 +0800 Subject: [PATCH 217/241] Add private constructor --- .../trinea/android/common/util/AppUtils.java | 4 ++++ .../android/common/util/ArrayUtils.java | 4 ++++ .../android/common/util/CacheManager.java | 2 +- .../android/common/util/DigestUtils.java | 4 ++++ .../trinea/android/common/util/FileUtils.java | 4 ++++ .../trinea/android/common/util/HttpUtils.java | 4 ++++ .../common/util/ImageCacheManager.java | 6 ++++-- .../android/common/util/ImageUtils.java | 4 ++++ .../trinea/android/common/util/JSONUtils.java | 4 ++++ .../trinea/android/common/util/ListUtils.java | 4 ++++ .../trinea/android/common/util/MapUtils.java | 5 ++++- .../android/common/util/ObjectUtils.java | 20 +++++++++++++++++++ .../android/common/util/PackageUtils.java | 13 ++++++++---- .../android/common/util/ParcelUtils.java | 4 ++++ .../android/common/util/PreferencesUtils.java | 4 ++++ .../android/common/util/RandomUtils.java | 4 ++++ .../android/common/util/ResourceUtils.java | 4 ++++ .../android/common/util/ScreenUtils.java | 4 ++++ .../android/common/util/SerializeUtils.java | 4 ++++ .../android/common/util/ShellUtils.java | 4 ++++ .../android/common/util/SingletonUtils.java | 1 + .../trinea/android/common/util/SizeUtils.java | 4 ++++ .../android/common/util/StringUtils.java | 12 +++++++---- .../android/common/util/SystemUtils.java | 4 ++++ .../trinea/android/common/util/TimeUtils.java | 4 ++++ .../android/common/util/ToastUtils.java | 4 ++++ .../trinea/android/common/util/ViewUtils.java | 4 ++++ 27 files changed, 127 insertions(+), 12 deletions(-) diff --git a/src/cn/trinea/android/common/util/AppUtils.java b/src/cn/trinea/android/common/util/AppUtils.java index cb17b40..7c60424 100644 --- a/src/cn/trinea/android/common/util/AppUtils.java +++ b/src/cn/trinea/android/common/util/AppUtils.java @@ -18,6 +18,10 @@ */ public class AppUtils { + private AppUtils() { + throw new AssertionError(); + } + /** * whether this process is named with processName * diff --git a/src/cn/trinea/android/common/util/ArrayUtils.java b/src/cn/trinea/android/common/util/ArrayUtils.java index df652e2..e9ebf89 100644 --- a/src/cn/trinea/android/common/util/ArrayUtils.java +++ b/src/cn/trinea/android/common/util/ArrayUtils.java @@ -20,6 +20,10 @@ */ public class ArrayUtils { + private ArrayUtils() { + throw new AssertionError(); + } + /** * is null or its length is 0 * diff --git a/src/cn/trinea/android/common/util/CacheManager.java b/src/cn/trinea/android/common/util/CacheManager.java index d6e141d..a28e58d 100644 --- a/src/cn/trinea/android/common/util/CacheManager.java +++ b/src/cn/trinea/android/common/util/CacheManager.java @@ -16,7 +16,7 @@ public class CacheManager { private static HttpCache httpCache = null; private CacheManager() { - + throw new AssertionError(); } /** diff --git a/src/cn/trinea/android/common/util/DigestUtils.java b/src/cn/trinea/android/common/util/DigestUtils.java index e50bcd4..a016c86 100644 --- a/src/cn/trinea/android/common/util/DigestUtils.java +++ b/src/cn/trinea/android/common/util/DigestUtils.java @@ -15,6 +15,10 @@ public class DigestUtils { private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + private DigestUtils() { + throw new AssertionError(); + } + /** * encode By MD5 * diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index e73f072..8522993 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -48,6 +48,10 @@ public class FileUtils { public final static String FILE_EXTENSION_SEPARATOR = "."; + private FileUtils() { + throw new AssertionError(); + } + /** * read file * diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index 18e373b..0e52c45 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -57,6 +57,10 @@ public class HttpUtils { /** equal sign **/ public static final String EQUAL_SIGN = "="; + private HttpUtils() { + throw new AssertionError(); + } + /** * http get synchronous *
        diff --git a/src/cn/trinea/android/common/util/ImageCacheManager.java b/src/cn/trinea/android/common/util/ImageCacheManager.java index 4e099e7..f05e0ce 100644 --- a/src/cn/trinea/android/common/util/ImageCacheManager.java +++ b/src/cn/trinea/android/common/util/ImageCacheManager.java @@ -27,6 +27,10 @@ public class ImageCacheManager { private static ImageCache imageCache = null; private static ImageSDCardCache imageSDCardCache = null; + private ImageCacheManager() { + throw new AssertionError(); + } + /** * get the singleton instance of {@link ImageCache} * @@ -184,6 +188,4 @@ public CacheObject onGetData(String key) { } }; } - - private ImageCacheManager() {} } diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 7055964..0a7ff59 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -41,6 +41,10 @@ */ public class ImageUtils { + private ImageUtils() { + throw new AssertionError(); + } + /** * convert Bitmap to byte array * diff --git a/src/cn/trinea/android/common/util/JSONUtils.java b/src/cn/trinea/android/common/util/JSONUtils.java index e29b6f6..5a476a2 100644 --- a/src/cn/trinea/android/common/util/JSONUtils.java +++ b/src/cn/trinea/android/common/util/JSONUtils.java @@ -19,6 +19,10 @@ public class JSONUtils { public static boolean isPrintException = true; + private JSONUtils() { + throw new AssertionError(); + } + /** * get Long from jsonObject * diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index 0396b8e..c5cc732 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -13,6 +13,10 @@ public class ListUtils { /** default join separator **/ public static final String DEFAULT_JOIN_SEPARATOR = ","; + private ListUtils() { + throw new AssertionError(); + } + /** * get size of list * diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/cn/trinea/android/common/util/MapUtils.java index 8b19770..55f937b 100644 --- a/src/cn/trinea/android/common/util/MapUtils.java +++ b/src/cn/trinea/android/common/util/MapUtils.java @@ -16,7 +16,10 @@ public class MapUtils { public static final String DEFAULT_KEY_AND_VALUE_SEPARATOR = ":"; /** default separator between key-value pairs **/ public static final String DEFAULT_KEY_AND_VALUE_PAIR_SEPARATOR = ","; - + + private MapUtils() { + throw new AssertionError(); + } /** * is null or its size is 0 * diff --git a/src/cn/trinea/android/common/util/ObjectUtils.java b/src/cn/trinea/android/common/util/ObjectUtils.java index d7d9f92..d3c77fe 100644 --- a/src/cn/trinea/android/common/util/ObjectUtils.java +++ b/src/cn/trinea/android/common/util/ObjectUtils.java @@ -7,6 +7,10 @@ */ public class ObjectUtils { + private ObjectUtils() { + throw new AssertionError(); + } + /** * compare two object * @@ -21,6 +25,22 @@ public static boolean isEquals(Object actual, Object expected) { return actual == expected || (actual == null ? expected == null : actual.equals(expected)); } + /** + * null Object to empty string + * + *
        +     * nullStrToEmpty(null) = "";
        +     * nullStrToEmpty("") = "";
        +     * nullStrToEmpty("aa") = "aa";
        +     * 
        + * + * @param str + * @return + */ + public static String nullStrToEmpty(Object str) { + return (str == null ? "" : (str instanceof String ? (String)str : str.toString())); + } + /** * convert long array to Long array * diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index 8c07c25..d38cda2 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -49,13 +49,18 @@ */ public class PackageUtils { - public static final String TAG = "PackageUtils"; + public static final String TAG = "PackageUtils"; + + private PackageUtils() { + throw new AssertionError(); + } + /** * App installation location settings values, same to {@link #PackageHelper} */ - public static final int APP_INSTALL_AUTO = 0; - public static final int APP_INSTALL_INTERNAL = 1; - public static final int APP_INSTALL_EXTERNAL = 2; + public static final int APP_INSTALL_AUTO = 0; + public static final int APP_INSTALL_INTERNAL = 1; + public static final int APP_INSTALL_EXTERNAL = 2; /** * install according conditions diff --git a/src/cn/trinea/android/common/util/ParcelUtils.java b/src/cn/trinea/android/common/util/ParcelUtils.java index 3601c66..a78cb99 100644 --- a/src/cn/trinea/android/common/util/ParcelUtils.java +++ b/src/cn/trinea/android/common/util/ParcelUtils.java @@ -14,6 +14,10 @@ */ public class ParcelUtils { + private ParcelUtils() { + throw new AssertionError(); + } + /** * read boolean * diff --git a/src/cn/trinea/android/common/util/PreferencesUtils.java b/src/cn/trinea/android/common/util/PreferencesUtils.java index 767d4b1..974cde7 100644 --- a/src/cn/trinea/android/common/util/PreferencesUtils.java +++ b/src/cn/trinea/android/common/util/PreferencesUtils.java @@ -32,6 +32,10 @@ public class PreferencesUtils { public static String PREFERENCE_NAME = "TrineaAndroidCommon"; + private PreferencesUtils() { + throw new AssertionError(); + } + /** * put string preferences * diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/cn/trinea/android/common/util/RandomUtils.java index ab119c0..103ad3d 100644 --- a/src/cn/trinea/android/common/util/RandomUtils.java +++ b/src/cn/trinea/android/common/util/RandomUtils.java @@ -41,6 +41,10 @@ public class RandomUtils { public static final String CAPITAL_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static final String LOWER_CASE_LETTERS = "abcdefghijklmnopqrstuvwxyz"; + private RandomUtils() { + throw new AssertionError(); + } + /** * get a fixed-length random string, its a mixture of uppercase, lowercase letters and numbers * diff --git a/src/cn/trinea/android/common/util/ResourceUtils.java b/src/cn/trinea/android/common/util/ResourceUtils.java index 5e7cb82..49be12b 100644 --- a/src/cn/trinea/android/common/util/ResourceUtils.java +++ b/src/cn/trinea/android/common/util/ResourceUtils.java @@ -15,6 +15,10 @@ */ public class ResourceUtils { + private ResourceUtils() { + throw new AssertionError(); + } + /** * get an asset using ACCESS_STREAMING mode. This provides access to files that have been bundled with an * application as assets -- that is, files placed in to the "assets" directory. diff --git a/src/cn/trinea/android/common/util/ScreenUtils.java b/src/cn/trinea/android/common/util/ScreenUtils.java index 786cd64..b4c1117 100644 --- a/src/cn/trinea/android/common/util/ScreenUtils.java +++ b/src/cn/trinea/android/common/util/ScreenUtils.java @@ -14,6 +14,10 @@ */ public class ScreenUtils { + private ScreenUtils() { + throw new AssertionError(); + } + public static float dpToPx(Context context, float dp) { if (context == null) { return -1; diff --git a/src/cn/trinea/android/common/util/SerializeUtils.java b/src/cn/trinea/android/common/util/SerializeUtils.java index adfa27b..b319cf4 100644 --- a/src/cn/trinea/android/common/util/SerializeUtils.java +++ b/src/cn/trinea/android/common/util/SerializeUtils.java @@ -14,6 +14,10 @@ */ public class SerializeUtils { + private SerializeUtils() { + throw new AssertionError(); + } + /** * deserialization from file * diff --git a/src/cn/trinea/android/common/util/ShellUtils.java b/src/cn/trinea/android/common/util/ShellUtils.java index 5678596..fab13de 100644 --- a/src/cn/trinea/android/common/util/ShellUtils.java +++ b/src/cn/trinea/android/common/util/ShellUtils.java @@ -31,6 +31,10 @@ public class ShellUtils { public static final String COMMAND_EXIT = "exit\n"; public static final String COMMAND_LINE_END = "\n"; + private ShellUtils() { + throw new AssertionError(); + } + /** * check whether has root permission * diff --git a/src/cn/trinea/android/common/util/SingletonUtils.java b/src/cn/trinea/android/common/util/SingletonUtils.java index 6ef8ba5..362625a 100644 --- a/src/cn/trinea/android/common/util/SingletonUtils.java +++ b/src/cn/trinea/android/common/util/SingletonUtils.java @@ -8,6 +8,7 @@ * @param */ public abstract class SingletonUtils { + private T instance; protected abstract T newInstance(); diff --git a/src/cn/trinea/android/common/util/SizeUtils.java b/src/cn/trinea/android/common/util/SizeUtils.java index fcbd74d..6dd09db 100644 --- a/src/cn/trinea/android/common/util/SizeUtils.java +++ b/src/cn/trinea/android/common/util/SizeUtils.java @@ -13,4 +13,8 @@ public class SizeUtils { public static final long MB_2_BYTE = 1048576; /** kb to byte **/ public static final long KB_2_BYTE = 1024; + + private SizeUtils() { + throw new AssertionError(); + } } diff --git a/src/cn/trinea/android/common/util/StringUtils.java b/src/cn/trinea/android/common/util/StringUtils.java index 88a7f26..bd58d21 100644 --- a/src/cn/trinea/android/common/util/StringUtils.java +++ b/src/cn/trinea/android/common/util/StringUtils.java @@ -12,6 +12,10 @@ */ public class StringUtils { + private StringUtils() { + throw new AssertionError(); + } + /** * is null or its length is 0 or it is made by space * @@ -44,7 +48,7 @@ public static boolean isBlank(String str) { * @param str * @return if string is null or its size is 0, return true, else return false. */ - public static boolean isEmpty(String str) { + public static boolean isEmpty(CharSequence str) { return (str == null || str.length() == 0); } @@ -61,7 +65,7 @@ public static boolean isEquals(String actual, String expected) { } /** - * null string to empty string + * null Object to empty string * *
              * nullStrToEmpty(null) = "";
        @@ -72,8 +76,8 @@ public static boolean isEquals(String actual, String expected) {
              * @param str
              * @return
              */
        -    public static String nullStrToEmpty(String str) {
        -        return (str == null ? "" : str);
        +    public static String nullStrToEmpty(Object str) {
        +        return (str == null ? "" : (str instanceof String ? (String)str : str.toString()));
             }
         
             /**
        diff --git a/src/cn/trinea/android/common/util/SystemUtils.java b/src/cn/trinea/android/common/util/SystemUtils.java
        index cc1fc04..e4306b6 100644
        --- a/src/cn/trinea/android/common/util/SystemUtils.java
        +++ b/src/cn/trinea/android/common/util/SystemUtils.java
        @@ -10,6 +10,10 @@ public class SystemUtils {
             /** recommend default thread pool size according to system available processors, {@link #getDefaultThreadPoolSize()} **/
             public static final int DEFAULT_THREAD_POOL_SIZE = getDefaultThreadPoolSize();
         
        +    private SystemUtils() {
        +        throw new AssertionError();
        +    }
        +
             /**
              * get recommend default thread pool size
              * 
        diff --git a/src/cn/trinea/android/common/util/TimeUtils.java b/src/cn/trinea/android/common/util/TimeUtils.java
        index ffaf263..3dbdcf4 100644
        --- a/src/cn/trinea/android/common/util/TimeUtils.java
        +++ b/src/cn/trinea/android/common/util/TimeUtils.java
        @@ -13,6 +13,10 @@ public class TimeUtils {
             public static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             public static final SimpleDateFormat DATE_FORMAT_DATE    = new SimpleDateFormat("yyyy-MM-dd");
         
        +    private TimeUtils() {
        +        throw new AssertionError();
        +    }
        +
             /**
              * long time to string
              * 
        diff --git a/src/cn/trinea/android/common/util/ToastUtils.java b/src/cn/trinea/android/common/util/ToastUtils.java
        index 0673cdd..e5ebb80 100644
        --- a/src/cn/trinea/android/common/util/ToastUtils.java
        +++ b/src/cn/trinea/android/common/util/ToastUtils.java
        @@ -10,6 +10,10 @@
          */
         public class ToastUtils {
         
        +    private ToastUtils() {
        +        throw new AssertionError();
        +    }
        +
             public static void show(Context context, int resId) {
                 show(context, context.getResources().getText(resId), Toast.LENGTH_SHORT);
             }
        diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/cn/trinea/android/common/util/ViewUtils.java
        index 72cf064..acdb8e7 100644
        --- a/src/cn/trinea/android/common/util/ViewUtils.java
        +++ b/src/cn/trinea/android/common/util/ViewUtils.java
        @@ -42,6 +42,10 @@
          */
         public class ViewUtils {
         
        +    private ViewUtils() {
        +        throw new AssertionError();
        +    }
        +
             /**
              * get ListView height according to every children
              * 
        
        From 94ebda7b04a3992b5a7b570a11ba1c54831312cc Mon Sep 17 00:00:00 2001
        From: Trinea 
        Date: Wed, 5 Nov 2014 17:41:31 +0800
        Subject: [PATCH 218/241] Add CollectionUtils.java
        
        ---
         .gitignore                                    |   4 +
         .../android/common/util/CollectionUtils.java  | 119 ++++++++++++++++++
         2 files changed, 123 insertions(+)
         create mode 100644 src/cn/trinea/android/common/util/CollectionUtils.java
        
        diff --git a/.gitignore b/.gitignore
        index 4de61f2..27222b9 100644
        --- a/.gitignore
        +++ b/.gitignore
        @@ -1,6 +1,7 @@
         # built application files
         # *.apk
         *.ap_
        +lint.xml
         
         # files for the dex VM
         *.dex
        @@ -12,6 +13,9 @@
         bin/
         gen/
         
        +# maven
        +target/
        +
         # Local configuration file (sdk path, etc)
         local.properties
         
        diff --git a/src/cn/trinea/android/common/util/CollectionUtils.java b/src/cn/trinea/android/common/util/CollectionUtils.java
        new file mode 100644
        index 0000000..92c1315
        --- /dev/null
        +++ b/src/cn/trinea/android/common/util/CollectionUtils.java
        @@ -0,0 +1,119 @@
        +package cn.trinea.android.common.util;
        +
        +import java.util.Collection;
        +
        +/**
        + * CollectionUtils
        + * 
        + * @author Trinea 2012-7-22
        + */
        +public class CollectionUtils {
        +
        +    /** default join separator **/
        +    public static final String DEFAULT_JOIN_SEPARATOR = ",";
        +
        +    private CollectionUtils() {
        +        throw new AssertionError();
        +    }
        +
        +    /**
        +     * is null or its size is 0
        +     * 
        +     * 
        +     * isEmpty(null)   =   true;
        +     * isEmpty({})     =   true;
        +     * isEmpty({1})    =   false;
        +     * 
        + * + * @param + * @param c + * @return if collection is null or its size is 0, return true, else return false. + */ + public static boolean isEmpty(Collection c) { + return (c == null || c.size() == 0); + } + + /** + * join collection to string, separator is "," + * + *
        +     * join(null)      =   "";
        +     * join({})        =   "";
        +     * join({a,b})     =   "a,b";
        +     * 
        + * + * @param c + * @return join collection to string, separator is ",". if collection is empty, return "" + */ + public static String join(Collection c) { + return join(c, DEFAULT_JOIN_SEPARATOR); + } + + /** + * join collection to string + * + *
        +     * join(null, '#')     =   "";
        +     * join({}, '#')       =   "";
        +     * join({a,b,c}, ' ')  =   "abc";
        +     * join({a,b,c}, '#')  =   "a#b#c";
        +     * 
        + * + * @param collection + * @param separator + * @return join collection to string. if collection is empty, return "" + */ + public static String join(Collection c, char separator) { + return join(c, new String(new char[] {separator})); + } + + /** + * join collection to string. if separator is null, use {@link #DEFAULT_JOIN_SEPARATOR} + * + *
        +     * join(null, "#")     =   "";
        +     * join({}, "#$")      =   "";
        +     * join({a,b,c}, null) =   "a,b,c";
        +     * join({a,b,c}, "")   =   "abc";
        +     * join({a,b,c}, "#")  =   "a#b#c";
        +     * join({a,b,c}, "#$") =   "a#$b#$c";
        +     * 
        + * + * @param + * + * @param c + * @param separator + * @return join collection to string with separator. if collection is empty, return "" + */ + public static String join(Collection c, String separator) { + if (isEmpty(c)) { + return ""; + } + if (separator == null) { + separator = DEFAULT_JOIN_SEPARATOR; + } + + StringBuilder joinStr = new StringBuilder(); + int count = 0, lastIndex = c.size() - 1; + Boolean isString = null; + + for (T item : c) { + if (isString == null) { + isString = item instanceof String; + } + + if (item == null) { + joinStr.append(""); + } else { + joinStr.append(isString ? (String)item : item.toString()); + } + + if (count != lastIndex) { + joinStr.append(separator); + } + count++; + } + + return joinStr.toString(); + } +} From 2879671aa3ecf802b7753062127429aa2fe68037 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 5 Nov 2014 17:45:48 +0800 Subject: [PATCH 219/241] Add NetWorkUtils.java --- .../android/common/util/NetWorkUtils.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/cn/trinea/android/common/util/NetWorkUtils.java diff --git a/src/cn/trinea/android/common/util/NetWorkUtils.java b/src/cn/trinea/android/common/util/NetWorkUtils.java new file mode 100644 index 0000000..e377209 --- /dev/null +++ b/src/cn/trinea/android/common/util/NetWorkUtils.java @@ -0,0 +1,101 @@ +package cn.trinea.android.common.util; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.telephony.TelephonyManager; +import android.text.TextUtils; + +/** + * NetWork Utils + * + * @author Trinea 2014-11-03 + */ +public class NetWorkUtils { + + public static final String NETWORK_TYPE_WIFI = "wifi"; + public static final String NETWORK_TYPE_3G = "eg"; + public static final String NETWORK_TYPE_2G = "2g"; + public static final String NETWORK_TYPE_WAP = "wap"; + public static final String NETWORK_TYPE_UNKNOWN = "unknown"; + public static final String NETWORK_TYPE_DISCONNECT = "disconnect"; + + /** + * Get network type + * + * @param context + * @return + */ + public static String getNetWorkType(Context context) { + ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo; + String type = NETWORK_TYPE_DISCONNECT; + if (manager == null || (networkInfo = manager.getActiveNetworkInfo()) == null) { + return type; + }; + + if (networkInfo.isConnected()) { + String typeName = networkInfo.getTypeName(); + if ("WIFI".equalsIgnoreCase(typeName)) { + type = NETWORK_TYPE_WIFI; + } else if ("MOBILE".equalsIgnoreCase(typeName)) { + String proxyHost = android.net.Proxy.getDefaultHost(); + type = TextUtils.isEmpty(proxyHost) ? (isFastMobileNetwork(context) ? NETWORK_TYPE_3G : NETWORK_TYPE_2G) + : NETWORK_TYPE_WAP; + } else { + type = NETWORK_TYPE_UNKNOWN; + } + } + return type; + } + + /** + * Whether is fast mobile network + * + * @param context + * @return + */ + private static boolean isFastMobileNetwork(Context context) { + TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); + if (telephonyManager == null) { + return false; + } + + switch (telephonyManager.getNetworkType()) { + case TelephonyManager.NETWORK_TYPE_1xRTT: + return false; + case TelephonyManager.NETWORK_TYPE_CDMA: + return false; + case TelephonyManager.NETWORK_TYPE_EDGE: + return false; + case TelephonyManager.NETWORK_TYPE_EVDO_0: + return true; + case TelephonyManager.NETWORK_TYPE_EVDO_A: + return true; + case TelephonyManager.NETWORK_TYPE_GPRS: + return false; + case TelephonyManager.NETWORK_TYPE_HSDPA: + return true; + case TelephonyManager.NETWORK_TYPE_HSPA: + return true; + case TelephonyManager.NETWORK_TYPE_HSUPA: + return true; + case TelephonyManager.NETWORK_TYPE_UMTS: + return true; + case TelephonyManager.NETWORK_TYPE_EHRPD: + return true; + case TelephonyManager.NETWORK_TYPE_EVDO_B: + return true; + case TelephonyManager.NETWORK_TYPE_HSPAP: + return true; + case TelephonyManager.NETWORK_TYPE_IDEN: + return false; + case TelephonyManager.NETWORK_TYPE_LTE: + return true; + case TelephonyManager.NETWORK_TYPE_UNKNOWN: + return false; + default: + return false; + } + } +} From 47bdbcab92c8e16d17fa98fc9f57480c5f4cc311 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 5 Nov 2014 17:47:48 +0800 Subject: [PATCH 220/241] Add NetWorkUtils.java --- src/cn/trinea/android/common/util/NetWorkUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cn/trinea/android/common/util/NetWorkUtils.java b/src/cn/trinea/android/common/util/NetWorkUtils.java index e377209..24028b7 100644 --- a/src/cn/trinea/android/common/util/NetWorkUtils.java +++ b/src/cn/trinea/android/common/util/NetWorkUtils.java @@ -8,6 +8,10 @@ /** * NetWork Utils + *
          + * Attentions + *
        • You should add android.permission.ACCESS_NETWORK_STATE in manifest, to get network status.
        • + *
        * * @author Trinea 2014-11-03 */ From f0b893c93cb94cf60c83696d9f06b108c9e0b759 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 5 Nov 2014 20:42:49 +0800 Subject: [PATCH 221/241] Modify join function --- .../android/common/util/CollectionUtils.java | 81 ++----------------- .../trinea/android/common/util/ListUtils.java | 18 +---- 2 files changed, 11 insertions(+), 88 deletions(-) diff --git a/src/cn/trinea/android/common/util/CollectionUtils.java b/src/cn/trinea/android/common/util/CollectionUtils.java index 92c1315..aea485c 100644 --- a/src/cn/trinea/android/common/util/CollectionUtils.java +++ b/src/cn/trinea/android/common/util/CollectionUtils.java @@ -2,6 +2,8 @@ import java.util.Collection; +import android.text.TextUtils; + /** * CollectionUtils * @@ -10,7 +12,7 @@ public class CollectionUtils { /** default join separator **/ - public static final String DEFAULT_JOIN_SEPARATOR = ","; + public static final CharSequence DEFAULT_JOIN_SEPARATOR = ","; private CollectionUtils() { throw new AssertionError(); @@ -34,7 +36,7 @@ public static boolean isEmpty(Collection c) { } /** - * join collection to string, separator is "," + * join collection to string, separator is {@link #DEFAULT_JOIN_SEPARATOR} * *
              * join(null)      =   "";
        @@ -42,78 +44,11 @@ public static  boolean isEmpty(Collection c) {
              * join({a,b})     =   "a,b";
              * 
        * - * @param c - * @return join collection to string, separator is ",". if collection is empty, return "" - */ - public static String join(Collection c) { - return join(c, DEFAULT_JOIN_SEPARATOR); - } - - /** - * join collection to string - * - *
        -     * join(null, '#')     =   "";
        -     * join({}, '#')       =   "";
        -     * join({a,b,c}, ' ')  =   "abc";
        -     * join({a,b,c}, '#')  =   "a#b#c";
        -     * 
        - * * @param collection - * @param separator - * @return join collection to string. if collection is empty, return "" + * @return join collection to string, separator is {@link #DEFAULT_JOIN_SEPARATOR}. if collection is empty, return + * "" */ - public static String join(Collection c, char separator) { - return join(c, new String(new char[] {separator})); - } - - /** - * join collection to string. if separator is null, use {@link #DEFAULT_JOIN_SEPARATOR} - * - *
        -     * join(null, "#")     =   "";
        -     * join({}, "#$")      =   "";
        -     * join({a,b,c}, null) =   "a,b,c";
        -     * join({a,b,c}, "")   =   "abc";
        -     * join({a,b,c}, "#")  =   "a#b#c";
        -     * join({a,b,c}, "#$") =   "a#$b#$c";
        -     * 
        - * - * @param - * - * @param c - * @param separator - * @return join collection to string with separator. if collection is empty, return "" - */ - public static String join(Collection c, String separator) { - if (isEmpty(c)) { - return ""; - } - if (separator == null) { - separator = DEFAULT_JOIN_SEPARATOR; - } - - StringBuilder joinStr = new StringBuilder(); - int count = 0, lastIndex = c.size() - 1; - Boolean isString = null; - - for (T item : c) { - if (isString == null) { - isString = item instanceof String; - } - - if (item == null) { - joinStr.append(""); - } else { - joinStr.append(isString ? (String)item : item.toString()); - } - - if (count != lastIndex) { - joinStr.append(separator); - } - count++; - } - - return joinStr.toString(); + public static String join(Iterable collection) { + return collection == null ? "" : TextUtils.join(DEFAULT_JOIN_SEPARATOR, collection); } } diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/cn/trinea/android/common/util/ListUtils.java index c5cc732..3521294 100644 --- a/src/cn/trinea/android/common/util/ListUtils.java +++ b/src/cn/trinea/android/common/util/ListUtils.java @@ -3,6 +3,8 @@ import java.util.ArrayList; import java.util.List; +import android.text.TextUtils; + /** * List Utils * @@ -136,21 +138,7 @@ public static String join(List list, char separator) { * @return join list to string with separator. if list is empty, return "" */ public static String join(List list, String separator) { - if (isEmpty(list)) { - return ""; - } - if (separator == null) { - separator = DEFAULT_JOIN_SEPARATOR; - } - - StringBuilder joinStr = new StringBuilder(); - for (int i = 0; i < list.size(); i++) { - joinStr.append(list.get(i)); - if (i != list.size() - 1) { - joinStr.append(separator); - } - } - return joinStr.toString(); + return list == null ? "" : TextUtils.join(separator, list); } /** From 0752572d301944e7720b6e723b3731e01921ad0e Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 3 Dec 2014 15:02:23 +0800 Subject: [PATCH 222/241] Add Gradle Import --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 70994fe..5b898e5 100644 --- a/README.md +++ b/README.md @@ -87,13 +87,9 @@ Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_a ``` ### Download -Maven: +Gradle: ``` xml - - cn.trinea.android.common - trinea-android-common - 4.2.15 - +compile 'cn.trinea.android.common:trinea-android-common:4.2.15' ``` ## License From e1461d74bc25337f4e5d53bde036f8e743919c98 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 13 Feb 2015 00:02:59 +0800 Subject: [PATCH 223/241] Add FileUtils.moveFile --- .../trinea/android/common/util/AppUtils.java | 9 +++--- .../trinea/android/common/util/FileUtils.java | 30 +++++++++++++++++++ .../android/common/util/NetWorkUtils.java | 15 +++++++++- .../android/common/util/StringUtils.java | 16 ++++++++++ 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/cn/trinea/android/common/util/AppUtils.java b/src/cn/trinea/android/common/util/AppUtils.java index 7c60424..a52f63c 100644 --- a/src/cn/trinea/android/common/util/AppUtils.java +++ b/src/cn/trinea/android/common/util/AppUtils.java @@ -43,12 +43,13 @@ public static boolean isNamedProcess(Context context, String processName) { int pid = android.os.Process.myPid(); ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List processInfoList = manager.getRunningAppProcesses(); - if (processInfoList == null) { - return true; + if (ListUtils.isEmpty(processInfoList)) { + return false; } - for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { - if (processInfo.pid == pid && ObjectUtils.isEquals(processName, processInfo.processName)) { + for (RunningAppProcessInfo processInfo : processInfoList) { + if (processInfo != null && processInfo.pid == pid + && ObjectUtils.isEquals(processName, processInfo.processName)) { return true; } } diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index 8522993..da0413f 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -13,6 +13,8 @@ import java.util.ArrayList; import java.util.List; +import android.text.TextUtils; + /** * File Utils *
          @@ -30,6 +32,7 @@ *
        *
          * Operate file + *
        • {@link #moveFile(File, File)} or {@link #moveFile(String, String)}
        • *
        • {@link #copyFile(String, String)}
        • *
        • {@link #getFileExtension(String)}
        • *
        • {@link #getFileName(String)}
        • @@ -263,6 +266,33 @@ public static boolean writeFile(File file, InputStream stream, boolean append) { } } + /** + * move file + * + * @param sourceFilePath + * @param destFilePath + */ + public static void moveFile(String sourceFilePath, String destFilePath) { + if (TextUtils.isEmpty(sourceFilePath) || TextUtils.isEmpty(destFilePath)) { + throw new RuntimeException("Both sourceFilePath and destFilePath cannot be null."); + } + moveFile(new File(sourceFilePath), new File(destFilePath)); + } + + /** + * move file + * + * @param srcFile + * @param destFile + */ + public static void moveFile(File srcFile, File destFile) { + boolean rename = srcFile.renameTo(destFile); + if (!rename) { + copyFile(srcFile.getAbsolutePath(), destFile.getAbsolutePath()); + deleteFile(srcFile.getAbsolutePath()); + } + } + /** * copy file * diff --git a/src/cn/trinea/android/common/util/NetWorkUtils.java b/src/cn/trinea/android/common/util/NetWorkUtils.java index 24028b7..b966ff1 100644 --- a/src/cn/trinea/android/common/util/NetWorkUtils.java +++ b/src/cn/trinea/android/common/util/NetWorkUtils.java @@ -30,7 +30,20 @@ public class NetWorkUtils { * @param context * @return */ - public static String getNetWorkType(Context context) { + public static int getNetworkType(Context context) { + ConnectivityManager connectivityManager = (ConnectivityManager)context + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = connectivityManager == null ? null : connectivityManager.getActiveNetworkInfo(); + return networkInfo == null ? -1 : networkInfo.getType(); + } + + /** + * Get network type name + * + * @param context + * @return + */ + public static String getNetworkTypeName(Context context) { ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo; String type = NETWORK_TYPE_DISCONNECT; diff --git a/src/cn/trinea/android/common/util/StringUtils.java b/src/cn/trinea/android/common/util/StringUtils.java index bd58d21..d22b064 100644 --- a/src/cn/trinea/android/common/util/StringUtils.java +++ b/src/cn/trinea/android/common/util/StringUtils.java @@ -64,6 +64,22 @@ public static boolean isEquals(String actual, String expected) { return ObjectUtils.isEquals(actual, expected); } + /** + * get length of CharSequence + * + *
          +     * length(null) = 0;
          +     * length(\"\") = 0;
          +     * length(\"abc\") = 3;
          +     * 
          + * + * @param str + * @return if str is null or empty, return 0, else return {@link CharSequence#length()}. + */ + public static int length(CharSequence str) { + return str == null ? 0 : str.length(); + } + /** * null Object to empty string * From d5010b8758e13207db833329ee3a4725fe71e389 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 11 Mar 2015 00:30:34 +0800 Subject: [PATCH 224/241] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b898e5..9efca77 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)android-common-lib ------------- > 关于我,欢迎关注 -> 微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    QQ:717763774 + 微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    微信:codek2 **主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 From 4ae351699ad99455c2667c1d2fea000da8a73518 Mon Sep 17 00:00:00 2001 From: Trinea Date: Mon, 30 Mar 2015 10:54:09 +0800 Subject: [PATCH 225/241] Add judege isDropDownStyle when setOnBottomListener --- src/cn/trinea/android/common/view/DropDownListView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/cn/trinea/android/common/view/DropDownListView.java index a3d6120..ef9851f 100644 --- a/src/cn/trinea/android/common/view/DropDownListView.java +++ b/src/cn/trinea/android/common/view/DropDownListView.java @@ -348,6 +348,10 @@ public void setOnDropDownListener(OnDropDownListener onDropDownListener) { * @param onBottomListener */ public void setOnBottomListener(OnClickListener onBottomListener) { + if (!isDropDownStyle) { + throw new RuntimeException( + "isDropDownStyle is false, cannot call setOnBottomListener, you can call setDropDownStyle(true) at fitst."); + } footerButton.setOnClickListener(onBottomListener); } From f5822b34f7951e327f5c3f64f00394e514fa413d Mon Sep 17 00:00:00 2001 From: ddyos Date: Wed, 29 Jul 2015 10:32:47 +0800 Subject: [PATCH 226/241] change return type --- src/cn/trinea/android/common/util/ScreenUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cn/trinea/android/common/util/ScreenUtils.java b/src/cn/trinea/android/common/util/ScreenUtils.java index b4c1117..a009471 100644 --- a/src/cn/trinea/android/common/util/ScreenUtils.java +++ b/src/cn/trinea/android/common/util/ScreenUtils.java @@ -32,11 +32,11 @@ public static float pxToDp(Context context, float px) { return px / context.getResources().getDisplayMetrics().density; } - public static float dpToPxInt(Context context, float dp) { + public static int dpToPxInt(Context context, float dp) { return (int)(dpToPx(context, dp) + 0.5f); } - public static float pxToDpCeilInt(Context context, float px) { + public static int pxToDpCeilInt(Context context, float px) { return (int)(pxToDp(context, px) + 0.5f); } } From eb19d9e0b083296d339a919dd0c5bda5bf2088ce Mon Sep 17 00:00:00 2001 From: Vladislav Bauer Date: Wed, 26 Aug 2015 02:32:06 +0600 Subject: [PATCH 227/241] Add IOUtils --- .../trinea/android/common/util/FileUtils.java | 50 +++---------------- .../trinea/android/common/util/HttpUtils.java | 16 +----- .../trinea/android/common/util/IOUtils.java | 47 +++++++++++++++++ .../android/common/util/ImageUtils.java | 26 ++-------- .../android/common/util/SerializeUtils.java | 30 ++++------- 5 files changed, 71 insertions(+), 98 deletions(-) create mode 100644 src/cn/trinea/android/common/util/IOUtils.java diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/cn/trinea/android/common/util/FileUtils.java index da0413f..522ab1e 100644 --- a/src/cn/trinea/android/common/util/FileUtils.java +++ b/src/cn/trinea/android/common/util/FileUtils.java @@ -19,8 +19,8 @@ * File Utils *
            * Read or write file - *
          • {@link #readFile(String)} read file
          • - *
          • {@link #readFileToList(String)} read file to string list
          • + *
          • {@link #readFile(String, String)} read file
          • + *
          • {@link #readFileToList(String, String)} read file to string list
          • *
          • {@link #writeFile(String, String, boolean)} write file from String
          • *
          • {@link #writeFile(String, String)} write file from String
          • *
          • {@link #writeFile(String, List, boolean)} write file from String List
          • @@ -81,18 +81,11 @@ public static StringBuilder readFile(String filePath, String charsetName) { } fileContent.append(line); } - reader.close(); return fileContent; } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } - } + IOUtils.close(reader); } } @@ -115,18 +108,11 @@ public static boolean writeFile(String filePath, String content, boolean append) makeDirs(filePath); fileWriter = new FileWriter(filePath, append); fileWriter.write(content); - fileWriter.close(); return true; } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } finally { - if (fileWriter != null) { - try { - fileWriter.close(); - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } - } + IOUtils.close(fileWriter); } } @@ -155,18 +141,11 @@ public static boolean writeFile(String filePath, List contentList, boole } fileWriter.write(line); } - fileWriter.close(); return true; } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } finally { - if (fileWriter != null) { - try { - fileWriter.close(); - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } - } + IOUtils.close(fileWriter); } } @@ -255,14 +234,8 @@ public static boolean writeFile(File file, InputStream stream, boolean append) { } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } finally { - if (o != null) { - try { - o.close(); - stream.close(); - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } - } + IOUtils.close(o); + IOUtils.close(stream); } } @@ -334,18 +307,11 @@ public static List readFileToList(String filePath, String charsetName) { while ((line = reader.readLine()) != null) { fileContent.add(line); } - reader.close(); return fileContent; } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - throw new RuntimeException("IOException occurred. ", e); - } - } + IOUtils.close(reader); } } diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/cn/trinea/android/common/util/HttpUtils.java index 0e52c45..64b5957 100644 --- a/src/cn/trinea/android/common/util/HttpUtils.java +++ b/src/cn/trinea/android/common/util/HttpUtils.java @@ -101,13 +101,7 @@ public static HttpResponse httpGet(HttpRequest request) { e1.printStackTrace(); } finally { // close buffered - if (input != null) { - try { - input.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } + IOUtils.closeQuietly(input); // disconnecting releases the resources held by a connection so they may be closed or reused if (con != null) { con.disconnect(); @@ -230,13 +224,7 @@ public static HttpResponse httpPost(HttpRequest request) { e1.printStackTrace(); } finally { // close buffered - if (input != null) { - try { - input.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } + IOUtils.closeQuietly(input); // disconnecting releases the resources held by a connection so they may be closed or reused if (con != null) { con.disconnect(); diff --git a/src/cn/trinea/android/common/util/IOUtils.java b/src/cn/trinea/android/common/util/IOUtils.java new file mode 100644 index 0000000..54ba9c0 --- /dev/null +++ b/src/cn/trinea/android/common/util/IOUtils.java @@ -0,0 +1,47 @@ +package cn.trinea.android.common.util; + +import java.io.Closeable; +import java.io.IOException; + +/** + * IO utils + * + * @author Vladislav Bauer + */ + +public class IOUtils { + + private IOUtils() { + throw new AssertionError(); + } + + + /** + * Close closable object and wrap {@link IOException} with {@link RuntimeException} + * @param closeable closeable object + */ + public static void close(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException e) { + throw new RuntimeException("IOException occurred. ", e); + } + } + } + + /** + * Close closable and hide possible {@link IOException} + * @param closeable closeable object + */ + public static void closeQuietly(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException e) { + // Ignored + } + } + } + +} diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/cn/trinea/android/common/util/ImageUtils.java index 0a7ff59..a725882 100644 --- a/src/cn/trinea/android/common/util/ImageUtils.java +++ b/src/cn/trinea/android/common/util/ImageUtils.java @@ -145,10 +145,10 @@ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOut } stream = con.getInputStream(); } catch (MalformedURLException e) { - closeInputStream(stream); + IOUtils.close(stream); throw new RuntimeException("MalformedURLException occurred. ", e); } catch (IOException e) { - closeInputStream(stream); + IOUtils.close(stream); throw new RuntimeException("IOException occurred. ", e); } return stream; @@ -178,7 +178,7 @@ public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis Map requestProperties) { InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOutMillis, requestProperties); Drawable d = Drawable.createFromStream(stream, "src"); - closeInputStream(stream); + IOUtils.close(stream); return d; } @@ -204,7 +204,7 @@ public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut) { public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut, Map requestProperties) { InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOut, requestProperties); Bitmap b = BitmapFactory.decodeStream(stream); - closeInputStream(stream); + IOUtils.close(stream); return b; } @@ -217,7 +217,7 @@ public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut, Map Date: Fri, 28 Aug 2015 00:31:41 +0800 Subject: [PATCH 228/241] Add annotation for Not Progurad --- .../android/common/annotation/NotProguard.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/cn/trinea/android/common/annotation/NotProguard.java diff --git a/src/cn/trinea/android/common/annotation/NotProguard.java b/src/cn/trinea/android/common/annotation/NotProguard.java new file mode 100644 index 0000000..2fe3d8d --- /dev/null +++ b/src/cn/trinea/android/common/annotation/NotProguard.java @@ -0,0 +1,18 @@ +package cn.trinea.android.common.annotation; + +/** + * NotProguard, Means not proguard something, like class, method, field
            + * + * @author Trinea 2015-08-07 + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) +public @interface NotProguard { + +} \ No newline at end of file From 6ada6fe5783bc12c442472af9aedf8d5fce0a24e Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 28 Aug 2015 01:01:09 +0800 Subject: [PATCH 229/241] Update NotProguard.java --- src/cn/trinea/android/common/annotation/NotProguard.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cn/trinea/android/common/annotation/NotProguard.java b/src/cn/trinea/android/common/annotation/NotProguard.java index 2fe3d8d..457e76a 100644 --- a/src/cn/trinea/android/common/annotation/NotProguard.java +++ b/src/cn/trinea/android/common/annotation/NotProguard.java @@ -10,9 +10,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; - @Retention(RetentionPolicy.CLASS) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) public @interface NotProguard { -} \ No newline at end of file +} From d6e1e10688829ed442c739602a033aa1a545d63b Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 28 Aug 2015 01:02:08 +0800 Subject: [PATCH 230/241] Update NotProguard.java --- src/cn/trinea/android/common/annotation/NotProguard.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/annotation/NotProguard.java b/src/cn/trinea/android/common/annotation/NotProguard.java index 457e76a..fb2adf2 100644 --- a/src/cn/trinea/android/common/annotation/NotProguard.java +++ b/src/cn/trinea/android/common/annotation/NotProguard.java @@ -5,11 +5,11 @@ * * @author Trinea 2015-08-07 */ - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; + @Retention(RetentionPolicy.CLASS) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) public @interface NotProguard { From 1bb287671e15449c87679fee96bf90d9dbe4e450 Mon Sep 17 00:00:00 2001 From: Trinea Date: Fri, 28 Aug 2015 01:15:06 +0800 Subject: [PATCH 231/241] Text format --- .../android/common/annotation/NotProguard.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cn/trinea/android/common/annotation/NotProguard.java b/src/cn/trinea/android/common/annotation/NotProguard.java index 457e76a..40222fd 100644 --- a/src/cn/trinea/android/common/annotation/NotProguard.java +++ b/src/cn/trinea/android/common/annotation/NotProguard.java @@ -1,17 +1,17 @@ package cn.trinea.android.common.annotation; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + /** * NotProguard, Means not proguard something, like class, method, field
            * * @author Trinea 2015-08-07 */ - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; @Retention(RetentionPolicy.CLASS) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) public @interface NotProguard { -} +} \ No newline at end of file From a3b6ec30d9653b8f2b45dcb71eb52f6852f8701d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=9A=E8=8A=82?= Date: Tue, 25 Oct 2016 21:47:11 +0800 Subject: [PATCH 232/241] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E9=9D=99=E9=BB=98=E5=8D=B8=E8=BD=BD=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E4=B8=8D=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 部分手机上执行静默安装或者卸载不成功,错误信息是ErrorMsg:CANNOT LINK EXECUTABLE: could not load library "libc.so" needed by "/system/bin/sh"; caused by "libc.so" is 32-bit instead of 64-bit。修改后可以同时兼容32位和64位。 --- src/cn/trinea/android/common/util/PackageUtils.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/cn/trinea/android/common/util/PackageUtils.java index d38cda2..7297a71 100644 --- a/src/cn/trinea/android/common/util/PackageUtils.java +++ b/src/cn/trinea/android/common/util/PackageUtils.java @@ -149,7 +149,7 @@ public static int installSilent(Context context, String filePath, String pmParam * if context is system app, don't need root permission, but should add in mainfest **/ - StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install ") + StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib*:/system/lib* pm install ") .append(pmParams == null ? "" : pmParams).append(" ").append(filePath.replace(" ", "\\ ")); CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true); if (commandResult.successMsg != null @@ -348,7 +348,7 @@ public static int uninstallSilent(Context context, String packageName, boolean i * if context is system app, don't need root permission, but should add in mainfest **/ - StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm uninstall") + StringBuilder command = new StringBuilder().append("LD_LIBRARY_PATH=/vendor/lib*:/system/lib* pm uninstall") .append(isKeepData ? " -k " : " ").append(packageName.replace(" ", "\\ ")); CommandResult commandResult = ShellUtils.execCommand(command.toString(), !isSystemApplication(context), true); if (commandResult.successMsg != null @@ -486,7 +486,7 @@ public static int getAppVersionCode(Context context) { */ public static int getInstallLocation() { CommandResult commandResult = ShellUtils.execCommand( - "LD_LIBRARY_PATH=/vendor/lib:/system/lib pm get-install-location", false, true); + "LD_LIBRARY_PATH=/vendor/lib*:/system/lib* pm get-install-location", false, true); if (commandResult.result == 0 && commandResult.successMsg != null && commandResult.successMsg.length() > 0) { try { int location = Integer.parseInt(commandResult.successMsg.substring(0, 1)); From 84350f7f3346eb96408509e011a78f53004770fb Mon Sep 17 00:00:00 2001 From: Trinea Date: Sun, 16 Feb 2020 21:44:41 +0800 Subject: [PATCH 233/241] Add Dev Tools App info --- README.md | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 9efca77..11c81ad 100644 --- a/README.md +++ b/README.md @@ -1,80 +1,81 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)android-common-lib ------------- > 关于我,欢迎关注 - 微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    微信:codek2 + 微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    微信:codek2 **主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 -####示例APK: - - - - - - 本地下载 -####一. 缓存类 + +### Dev Tools App +The Dev Tools App is a powerful android development tool that can help you improve efficiency greatly, It can be used to view the latest open source projects, view activity history, view manifest, decompile, color picker, extract apk or so, view app info, open or close the options in the developer options quickly, and more. + +You can download it from **[DevTools@Google Play](https://play.google.com/store/apps/details?id=cn.trinea.android.developertools)**. +![](https://lh3.googleusercontent.com/ERb20Y50r3u_tZMMlqpH5cnS_MC_n366WoKvEjJyFfHz6d-EwvhaEUf7ZKAgRajboTWR=w720-h440-rw) + + +#### 一. 缓存类 主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 -#####1. 图片缓存 +##### 1. 图片缓存 使用见:[图片缓存的使用](http://www.trinea.cn/android/android-imagecache/) 适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。效果图如下: ![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) -#####2. 图片SD卡缓存 +##### 2. 图片SD卡缓存 使用见:[图片SD卡缓存的使用](http://www.trinea.cn/android/android-imagesdcardcache/) 适用:应用中获取图片较多且图片较大的情况。需要二级缓存及ListView或GridView图片加载推荐使用上面的[ImageCache](http://www.trinea.cn/android/android-imagecache/)。效果图如下: ![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) -#####3. 网络缓存 +##### 3. 网络缓存 使用见:[Android网络缓存](http://www.trinea.cn/android/android-http-cache) 适用:网络获取内容不大的应用,尤其是api接口数据,如新浪微博、twitter的timeline、微信公众账号发送的内容等等。效果图如下: ![HttpCache](http://farm3.staticflickr.com/2843/12566457534_2cfa4297a1_o.jpg) -#####4. 预取数据缓存 +##### 4. 预取数据缓存 使用见:[预取数据缓存](http://www.trinea.cn/android/preloaddatacache/) 缓存类关系图如下:其中HttpCache为后续计划的http缓存 ![Image Cache](https://farm8.staticflickr.com/7336/13991252450_f1e154012d_o.png) -####二. 公用的view -#####1. 下拉刷新及滚动到底部加载更多的Listview +#### 二. 公用的view +##### 1. 下拉刷新及滚动到底部加载更多的Listview 使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/dropdown-to-refresh-and-bottom-load-more-listview/) 实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281)。效果图如下: ![DropDownListView](http://farm8.staticflickr.com/7376/9312162951_74b597ebaa_o.jpg) -#####2. 滑动一页(一个Item)的Gallery +##### 2. 滑动一页(一个Item)的Gallery 使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery-scroll-one-page/)。效果图如下: ![ViewPager1](http://farm8.staticflickr.com/7330/9321381014_fb404e2430_o.jpg) ![ViewPager2](http://farm3.staticflickr.com/2827/9321380982_d8619d1601_o.jpg) -#####3. 滑动到底部或顶部响应的ScrollView +##### 3. 滑动到底部或顶部响应的ScrollView 使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/on-bottom-load-more-scrollview/)。效果图如下: ![ScrollView](http://farm4.staticflickr.com/3669/9459686814_1a523ceeb6_o.jpg) -####三. 工具类 +#### 三. 工具类 具体介绍可见:[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) 目前包括HttpUtils、[DownloadManagerPro](http://www.trinea.cn/android/android-downloadmanager/)、[ShellUtils](http://www.trinea.cn/android/android-java-execute-shell-commands/)、[PackageUtils](http://www.trinea.cn/android/android-silent-install/)、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、MapUtils、ObjectUtils、SerializeUtils、SystemUtils、TimeUtils。
            -#####1. Android系统下载管理DownloadManager使用 +##### 1. Android系统下载管理DownloadManager使用 使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android-downloadmanager/) 功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android-downloadmanager-pro/) 效果图如下: ![downloadManagerDemo](http://www.trinea.cn/wp-content/uploads/2013/05/downloadDemo2.gif) -#####2. Android APK root权限静默安装 +##### 2. Android APK root权限静默安装 使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android-silent-install/) -#####3. Android root权限 +##### 3. Android root权限 直接调用[ShellUtils.execCommand](https://github.com/Trinea/AndroidCommon/blob/master/src/cn/trinea/android/common/util/ShellUtils.java#LC43)方法 -#####4. 图片工具类 +##### 4. 图片工具类 (1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap 更多工具类介绍见[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) From 58cc75c13d867296e7dfadfd390e14181558110b Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 6 Dec 2023 23:08:45 +0800 Subject: [PATCH 234/241] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 11c81ad..68ffd4c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ ![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)android-common-lib ------------- +**已停止维护** +**已停止维护** +**已停止维护** + > 关于我,欢迎关注 - 微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    微信:codek2 + 微博:Trinea    主页:codekk.com    邮箱:trinea.cn#gmail.com    微信:codek2 **主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 From afb1d8b9866732fb3efdedc1d310e2ce0a027df3 Mon Sep 17 00:00:00 2001 From: Trinea Date: Wed, 6 Dec 2023 23:09:34 +0800 Subject: [PATCH 235/241] Update README.md --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 68ffd4c..8e908d3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,3 @@ -![Trinea](http://farm8.staticflickr.com/7426/9456847893_053161c7a4_o.png)android-common-lib -------------- -**已停止维护** -**已停止维护** **已停止维护** > 关于我,欢迎关注 From 9d53f321e43842897c9c96393d42fef6b4965ed9 Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 27 Feb 2024 00:08:40 +0800 Subject: [PATCH 236/241] execCommand support timeout --- .../android/common/util/ShellUtils.java | 177 ++++++++++++------ 1 file changed, 120 insertions(+), 57 deletions(-) diff --git a/src/cn/trinea/android/common/util/ShellUtils.java b/src/cn/trinea/android/common/util/ShellUtils.java index fab13de..9f296fd 100644 --- a/src/cn/trinea/android/common/util/ShellUtils.java +++ b/src/cn/trinea/android/common/util/ShellUtils.java @@ -1,10 +1,13 @@ -package cn.trinea.android.common.util; +package cn.trinea.android.lib.util; + +import android.os.Build; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; +import java.util.concurrent.TimeUnit; /** * ShellUtils @@ -14,21 +17,27 @@ *
          *
            * Execte command + *
          • {@link ShellUtils#execCommand(String)}
          • + *
          • {@link ShellUtils#execCommand(String, long)}
          • *
          • {@link ShellUtils#execCommand(String, boolean)}
          • + *
          • {@link ShellUtils#execCommand(String, boolean, long)}
          • *
          • {@link ShellUtils#execCommand(String, boolean, boolean)}
          • + *
          • {@link ShellUtils#execCommand(String, boolean, long, boolean)}
          • *
          • {@link ShellUtils#execCommand(List, boolean)}
          • - *
          • {@link ShellUtils#execCommand(List, boolean, boolean)}
          • + *
          • {@link ShellUtils#execCommand(List, boolean, long)}
          • + *
          • {@link ShellUtils#execCommand(List, boolean, long, boolean)}
          • *
          • {@link ShellUtils#execCommand(String[], boolean)}
          • - *
          • {@link ShellUtils#execCommand(String[], boolean, boolean)}
          • + *
          • {@link ShellUtils#execCommand(String[], boolean, long)}
          • + *
          • {@link ShellUtils#execCommand(String[], boolean, long, boolean)}
          • *
          - * - * @author Trinea 2013-5-16 + * + * @author Trinea 2013-5-16 */ public class ShellUtils { - public static final String COMMAND_SU = "su"; - public static final String COMMAND_SH = "sh"; - public static final String COMMAND_EXIT = "exit\n"; + public static final String COMMAND_SU = "su"; + public static final String COMMAND_SH = "sh"; + public static final String COMMAND_EXIT = "exit\n"; public static final String COMMAND_LINE_END = "\n"; private ShellUtils() { @@ -37,88 +46,118 @@ private ShellUtils() { /** * check whether has root permission - * + * * @return */ public static boolean checkRootPermission() { - return execCommand("echo root", true, false).result == 0; + return execCommand("echo root", true, 5000, false).result == 0; + } + + public static CommandResult execCommand(String command) { + return execCommand(new String[]{command}, false, -1, true); + } + + public static CommandResult execCommand(String command, long timeoutInMills) { + return execCommand(new String[]{command}, false, timeoutInMills, true); + } + + public static CommandResult execCommand(String command, boolean isRoot) { + return execCommand(new String[]{command}, isRoot, -1, true); } /** * execute shell command, default return result msg - * - * @param command command - * @param isRoot whether need to run with root + * + * @param command command + * @param isRoot whether need to run with root + * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O * @return - * @see ShellUtils#execCommand(String[], boolean, boolean) + * @see ShellUtils#execCommand(String[], boolean, long, boolean) */ - public static CommandResult execCommand(String command, boolean isRoot) { - return execCommand(new String[] {command}, isRoot, true); + public static CommandResult execCommand(String command, boolean isRoot, long timeoutInMills) { + return execCommand(new String[]{command}, isRoot, timeoutInMills, true); + } + + public static CommandResult execCommand(List commands, boolean isRoot) { + return execCommand(commands == null ? null : commands.toArray(new String[]{}), isRoot, -1, true); } /** * execute shell commands, default return result msg - * - * @param commands command list - * @param isRoot whether need to run with root + * + * @param commands command list + * @param isRoot whether need to run with root + * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O * @return - * @see ShellUtils#execCommand(String[], boolean, boolean) + * @see ShellUtils#execCommand(String[], boolean, long, boolean) */ - public static CommandResult execCommand(List commands, boolean isRoot) { - return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, true); + public static CommandResult execCommand(List commands, boolean isRoot, long timeoutInMills) { + return execCommand(commands == null ? null : commands.toArray(new String[]{}), isRoot, timeoutInMills, true); + } + + public static CommandResult execCommand(String[] commands, boolean isRoot) { + return execCommand(commands, isRoot, -1, true); } /** * execute shell commands, default return result msg - * - * @param commands command array - * @param isRoot whether need to run with root + * + * @param commands command array + * @param isRoot whether need to run with root + * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O * @return - * @see ShellUtils#execCommand(String[], boolean, boolean) + * @see ShellUtils#execCommand(String[], boolean, long, boolean) */ - public static CommandResult execCommand(String[] commands, boolean isRoot) { - return execCommand(commands, isRoot, true); + public static CommandResult execCommand(String[] commands, boolean isRoot, long timeoutInMills) { + return execCommand(commands, isRoot, timeoutInMills, true); + } + + public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) { + return execCommand(new String[]{command}, isRoot, -1, isNeedResultMsg); } /** * execute shell command - * - * @param command command - * @param isRoot whether need to run with root + * + * @param command command + * @param isRoot whether need to run with root + * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O * @param isNeedResultMsg whether need result msg * @return - * @see ShellUtils#execCommand(String[], boolean, boolean) + * @see ShellUtils#execCommand(String[], boolean, long, boolean) */ - public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) { - return execCommand(new String[] {command}, isRoot, isNeedResultMsg); + public static CommandResult execCommand(String command, boolean isRoot, long timeoutInMills, boolean isNeedResultMsg) { + return execCommand(new String[]{command}, isRoot, timeoutInMills, isNeedResultMsg); } /** * execute shell commands - * - * @param commands command list - * @param isRoot whether need to run with root + * + * @param commands command list + * @param isRoot whether need to run with root + * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O * @param isNeedResultMsg whether need result msg * @return - * @see ShellUtils#execCommand(String[], boolean, boolean) + * @see ShellUtils#execCommand(String[], boolean, long, boolean) */ - public static CommandResult execCommand(List commands, boolean isRoot, boolean isNeedResultMsg) { - return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, isNeedResultMsg); + public static CommandResult execCommand(List commands, boolean isRoot, long timeoutInMills, boolean isNeedResultMsg) { + return execCommand(commands == null ? null : commands.toArray(new String[]{}), isRoot, timeoutInMills, isNeedResultMsg); } /** * execute shell commands - * - * @param commands command array - * @param isRoot whether need to run with root + * + * @param commands command array + * @param isRoot whether need to run with root + * @param timeoutInMills timeout in millSeconds, -1 means no timeout, if bigger than 0, you must make sure Android Version is not smaller than Android O * @param isNeedResultMsg whether need result msg * @return
            - *
          • if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and - * {@link CommandResult#errorMsg} is null.
          • - *
          • if {@link CommandResult#result} is -1, there maybe some excepiton.
          • - *
          + *
        • if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and + * {@link CommandResult#errorMsg} is null.
        • + *
        • if {@link CommandResult#result} is -1, there maybe some excepiton.
        • + *
        */ - public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) { + public static CommandResult execCommand(String[] commands, boolean isRoot, long timeoutInMills, boolean isNeedResultMsg) { int result = -1; if (commands == null || commands.length == 0) { return new CommandResult(result, null, null); @@ -131,6 +170,7 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, boole StringBuilder errorMsg = null; DataOutputStream os = null; + boolean isTimeout = false; try { process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH); os = new DataOutputStream(process.getOutputStream()); @@ -147,7 +187,14 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, boole os.writeBytes(COMMAND_EXIT); os.flush(); - result = process.waitFor(); + if (timeoutInMills <= 0) { + result = process.waitFor(); + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + isTimeout = process.waitFor(timeoutInMills, TimeUnit.MILLISECONDS); + result = isTimeout ? -1 : 0; + } + } // get command result if (isNeedResultMsg) { successMsg = new StringBuilder(); @@ -156,10 +203,10 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, boole errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); String s; while ((s = successResult.readLine()) != null) { - successMsg.append(s); + successMsg.append(s).append(COMMAND_LINE_END); } while ((s = errorResult.readLine()) != null) { - errorMsg.append(s); + errorMsg.append(s).append(COMMAND_LINE_END); } } } catch (IOException e) { @@ -185,6 +232,9 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, boole process.destroy(); } } + if (isTimeout && errorMsg.length() == 0) { + errorMsg.append("Timeout, possibly due to lack of permissions."); + } return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null : errorMsg.toString()); } @@ -197,16 +247,22 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, boole *
      • {@link CommandResult#successMsg} means success message of command result
      • *
      • {@link CommandResult#errorMsg} means error message of command result
      • *
      - * - * @author Trinea 2013-5-16 + * + * @author Trinea 2013-5-16 */ public static class CommandResult { - /** result of command **/ - public int result; - /** success message of command result **/ + /** + * result of command + **/ + public int result; + /** + * success message of command result + **/ public String successMsg; - /** error message of command result **/ + /** + * error message of command result + **/ public String errorMsg; public CommandResult(int result) { @@ -218,5 +274,12 @@ public CommandResult(int result, String successMsg, String errorMsg) { this.successMsg = successMsg; this.errorMsg = errorMsg; } + + @Override + public String toString() { + return "result is: " + result + + "\nsuccessMsg is: '" + successMsg + "'" + + "\nerrorMsg is: '" + errorMsg + "'"; + } } } From 77a29eb754bbe7069edf18413112a6cb15f2c287 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 29 Feb 2024 00:00:47 +0800 Subject: [PATCH 237/241] Shell.execCommand support timeout --- src/cn/trinea/android/common/util/ShellUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cn/trinea/android/common/util/ShellUtils.java b/src/cn/trinea/android/common/util/ShellUtils.java index 9f296fd..4ca686e 100644 --- a/src/cn/trinea/android/common/util/ShellUtils.java +++ b/src/cn/trinea/android/common/util/ShellUtils.java @@ -192,7 +192,7 @@ public static CommandResult execCommand(String[] commands, boolean isRoot, long } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { isTimeout = process.waitFor(timeoutInMills, TimeUnit.MILLISECONDS); - result = isTimeout ? -1 : 0; + result = isTimeout ? 0 : -1; } } // get command result From 0f17e6cdae645096475b6bfdc5f61ddfb512470c Mon Sep 17 00:00:00 2001 From: Trinea Date: Tue, 24 Mar 2026 08:00:05 +0800 Subject: [PATCH 238/241] Update guideline --- README.md | 140 ++++++++----------------------- README.zh.md | 110 ++++++++++++++++++++++++ docs/oss-program-readiness.en.md | 43 ++++++++++ docs/oss-program-readiness.md | 44 ++++++++++ 4 files changed, 230 insertions(+), 107 deletions(-) create mode 100644 README.zh.md create mode 100644 docs/oss-program-readiness.en.md create mode 100644 docs/oss-program-readiness.md diff --git a/README.md b/README.md index 8e908d3..4be6d83 100644 --- a/README.md +++ b/README.md @@ -1,111 +1,37 @@ -**已停止维护** - -> 关于我,欢迎关注 - 微博:Trinea    主页:codekk.com    邮箱:trinea.cn#gmail.com    微信:codek2 - -**主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 -示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 -使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 -Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 - - -### Dev Tools App -The Dev Tools App is a powerful android development tool that can help you improve efficiency greatly, It can be used to view the latest open source projects, view activity history, view manifest, decompile, color picker, extract apk or so, view app info, open or close the options in the developer options quickly, and more. - -You can download it from **[DevTools@Google Play](https://play.google.com/store/apps/details?id=cn.trinea.android.developertools)**. -![](https://lh3.googleusercontent.com/ERb20Y50r3u_tZMMlqpH5cnS_MC_n366WoKvEjJyFfHz6d-EwvhaEUf7ZKAgRajboTWR=w720-h440-rw) - - -#### 一. 缓存类 -主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 -##### 1. 图片缓存 -使用见:[图片缓存的使用](http://www.trinea.cn/android/android-imagecache/) -适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。效果图如下: -![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) - - -##### 2. 图片SD卡缓存 -使用见:[图片SD卡缓存的使用](http://www.trinea.cn/android/android-imagesdcardcache/) -适用:应用中获取图片较多且图片较大的情况。需要二级缓存及ListView或GridView图片加载推荐使用上面的[ImageCache](http://www.trinea.cn/android/android-imagecache/)。效果图如下: -![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) - - -##### 3. 网络缓存 -使用见:[Android网络缓存](http://www.trinea.cn/android/android-http-cache) -适用:网络获取内容不大的应用,尤其是api接口数据,如新浪微博、twitter的timeline、微信公众账号发送的内容等等。效果图如下: -![HttpCache](http://farm3.staticflickr.com/2843/12566457534_2cfa4297a1_o.jpg) - - -##### 4. 预取数据缓存 -使用见:[预取数据缓存](http://www.trinea.cn/android/preloaddatacache/) -缓存类关系图如下:其中HttpCache为后续计划的http缓存 -![Image Cache](https://farm8.staticflickr.com/7336/13991252450_f1e154012d_o.png) - -#### 二. 公用的view -##### 1. 下拉刷新及滚动到底部加载更多的Listview -使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/dropdown-to-refresh-and-bottom-load-more-listview/) -实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281)。效果图如下: -![DropDownListView](http://farm8.staticflickr.com/7376/9312162951_74b597ebaa_o.jpg) - - -##### 2. 滑动一页(一个Item)的Gallery -使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery-scroll-one-page/)。效果图如下: -![ViewPager1](http://farm8.staticflickr.com/7330/9321381014_fb404e2430_o.jpg) -![ViewPager2](http://farm3.staticflickr.com/2827/9321380982_d8619d1601_o.jpg) - - -##### 3. 滑动到底部或顶部响应的ScrollView -使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/on-bottom-load-more-scrollview/)。效果图如下: -![ScrollView](http://farm4.staticflickr.com/3669/9459686814_1a523ceeb6_o.jpg) - - -#### 三. 工具类 -具体介绍可见:[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) -目前包括HttpUtils、[DownloadManagerPro](http://www.trinea.cn/android/android-downloadmanager/)、[ShellUtils](http://www.trinea.cn/android/android-java-execute-shell-commands/)、[PackageUtils](http://www.trinea.cn/android/android-silent-install/)、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、MapUtils、ObjectUtils、SerializeUtils、SystemUtils、TimeUtils。 -
      -##### 1. Android系统下载管理DownloadManager使用 -使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android-downloadmanager/) -功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android-downloadmanager-pro/) -效果图如下: -![downloadManagerDemo](http://www.trinea.cn/wp-content/uploads/2013/05/downloadDemo2.gif) - -##### 2. Android APK root权限静默安装 -使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android-silent-install/) - -##### 3. Android root权限 -直接调用[ShellUtils.execCommand](https://github.com/Trinea/AndroidCommon/blob/master/src/cn/trinea/android/common/util/ShellUtils.java#LC43)方法 - -##### 4. 图片工具类 -(1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap -更多工具类介绍见[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) - - -### Proguard -``` xml --keep class cn.trinea.android.** { *; } --keepclassmembers class cn.trinea.android.** { *; } --dontwarn cn.trinea.android.** -``` - -### Download -Gradle: -``` xml -compile 'cn.trinea.android.common:trinea-android-common:4.2.15' -``` +# Trinea Android Common + +## Overview +Trinea Android Common is a collection of cache components, UI widgets, and utility helpers that power thousands of Android apps. The project focuses on reproducible solutions for list pagination, image/network caching, download management, and day-to-day toolkit gaps so that small teams can ship stable products quickly. + +## Modules at a Glance +- **Cache suite**: in-memory/disk image caches, HTTP cache, and preload data cache with FIFO/LIFO/LRU/etc. policies plus persistence helpers. +- **Reusable views**: pull-to-refresh & infinite scroll `ListView`, paged `Gallery`, responsive `ScrollView`, ad/banner carousel, and more. +- **Utility helpers**: `DownloadManagerPro`, shell/package/resource/file/json/string/collection utilities, silent install helpers, time/date helpers, and random utilities used across apps. +- **Dev Tools App**: [Dev Tools on Google Play](https://play.google.com/store/apps/details?id=cn.trinea.android.developertools) lets developers browse the latest OSS projects, inspect activities, decompile APKs, perform color pick, dump manifest info, and toggle developer options quickly. + +## Getting Started +1. Import the library module or add the dependency: + ```groovy + implementation 'cn.trinea.android.common:trinea-android-common:4.2.15' + ``` +2. Proguard + ``` xml + -keep class cn.trinea.android.** { *; } + -keepclassmembers class cn.trinea.android.** { *; } + -dontwarn cn.trinea.android.** + ``` +3. Review the [API Guide](http://trinea.github.io/doc/trinea_android_common/index.html) and [sample app](https://github.com/Trinea/AndroidDemo) for usage patterns. +4. When integrating as a library project, open *Project Properties → Android → Library* and add **TrineaAndroidCommon**. + +## Maintenance & Roadmap +Although the codebase has been quiet recently, the components remain in active use across the community. We are preparing modernization work (AndroidX migration, refreshed sample app, expanded tests) and will leverage Claude/Codex for OSS to accelerate documentation, governance, and CI improvements. Community members can watch GitHub Issues/Discussions for upcoming milestones. ## License +Apache License 2.0 — see [LICENSE](./LICENSE). - Copyright 2013 trinea.cn - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +## Contact & Community +- GitHub: [@Trinea](https://github.com/Trinea) +- Website: [codekk.com](https://codekk.com/) +- Email: [trinea.cn@gmail.com](mailto:trinea.cn@gmail.com) +We welcome issues and pull requests that help modernize the toolkit and keep long-lived apps healthy. diff --git a/README.zh.md b/README.zh.md new file mode 100644 index 0000000..c078e02 --- /dev/null +++ b/README.zh.md @@ -0,0 +1,110 @@ +> 语言:当前为简体中文,[English](./README.md) + +> 关于我,欢迎关注 + 微博:Trinea    主页:codekk.com    邮箱:trinea.cn#gmail.com    微信:codek2 + +**主要包括**:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、底部加载更多ScrollView、滑动一页Gallery)及Android常用工具类(网络、下载、Android资源操作、shell、文件、Json、随机数、Collection等等)。 +示例源码:[TrineaAndroidDemo](https://github.com/Trinea/AndroidDemo)。 +使        用:拉取代码导入IDE,右击你的工程->properties->Android,在library中选择TrineaAndroidCommon。 +Api Guide:[TrineaAndroidCommon API Guide](http://trinea.github.io/doc/trinea_android_common/index.html)。 + + +### Dev Tools App +The Dev Tools App is a powerful android development tool that can help you improve efficiency greatly, It can be used to view the latest open source projects, view activity history, view manifest, decompile, color picker, extract apk or so, view app info, open or close the options in the developer options quickly, and more. + +You can download it from **[DevTools@Google Play](https://play.google.com/store/apps/details?id=cn.trinea.android.developertools)**. +![](https://lh3.googleusercontent.com/ERb20Y50r3u_tZMMlqpH5cnS_MC_n366WoKvEjJyFfHz6d-EwvhaEUf7ZKAgRajboTWR=w720-h440-rw) + + +#### 一. 缓存类 +主要特性:(1).使用简单 (2).轻松获取及预取取新图片 (3).包含二级缓存 (4).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5).可方便的保存及初始化恢复数据 (6).省流量性能佳(有且仅有一个线程获取图片) (7).支持http请求header设置及不同类型网络处理(8).可根据系统配置初始化缓存 (9).扩展性强 (10).支持等待队列 (11)包含map的大多数接口。 +##### 1. 图片缓存 +使用见:[图片缓存的使用](http://www.trinea.cn/android/android-imagecache/) +适用:获取图片较多且图片使用频繁的应用,包含二级缓存,如新浪微博、twitter、微信头像、美丽说、蘑菇街、花瓣、淘宝等等。效果图如下: +![ImageCahe](http://farm4.staticflickr.com/3710/9312163125_81f1c1997b_o.jpg) + + +##### 2. 图片SD卡缓存 +使用见:[图片SD卡缓存的使用](http://www.trinea.cn/android/android-imagesdcardcache/) +适用:应用中获取图片较多且图片较大的情况。需要二级缓存及ListView或GridView图片加载推荐使用上面的[ImageCache](http://www.trinea.cn/android/android-imagecache/)。效果图如下: +![ImageSDCardCache](http://farm3.staticflickr.com/2834/9314949798_ea69bdb5e8_o.jpg) + + +##### 3. 网络缓存 +使用见:[Android网络缓存](http://www.trinea.cn/android/android-http-cache) +适用:网络获取内容不大的应用,尤其是api接口数据,如新浪微博、twitter的timeline、微信公众账号发送的内容等等。效果图如下: +![HttpCache](http://farm3.staticflickr.com/2843/12566457534_2cfa4297a1_o.jpg) + + +##### 4. 预取数据缓存 +使用见:[预取数据缓存](http://www.trinea.cn/android/preloaddatacache/) +缓存类关系图如下:其中HttpCache为后续计划的http缓存 +![Image Cache](https://farm8.staticflickr.com/7336/13991252450_f1e154012d_o.png) + +#### 二. 公用的view +##### 1. 下拉刷新及滚动到底部加载更多的Listview +使用: [下拉刷新及滚动到底部加载更多listview的使用](http://www.trinea.cn/android/dropdown-to-refresh-and-bottom-load-more-listview/) +实现原理: [http://trinea.iteye.com/blog/1562281](http://trinea.iteye.com/blog/1562281)。效果图如下: +![DropDownListView](http://farm8.staticflickr.com/7376/9312162951_74b597ebaa_o.jpg) + + +##### 2. 滑动一页(一个Item)的Gallery +使用及实现原理:[滑动一页(一个Item)的Gallery的使用](http://www.trinea.cn/android/gallery-scroll-one-page/)。效果图如下: +![ViewPager1](http://farm8.staticflickr.com/7330/9321381014_fb404e2430_o.jpg) +![ViewPager2](http://farm3.staticflickr.com/2827/9321380982_d8619d1601_o.jpg) + + +##### 3. 滑动到底部或顶部响应的ScrollView +使用及实现原理: [滚动到底部或顶部响应的ScrollView使用](http://www.trinea.cn/android/on-bottom-load-more-scrollview/)。效果图如下: +![ScrollView](http://farm4.staticflickr.com/3669/9459686814_1a523ceeb6_o.jpg) + + +#### 三. 工具类 +具体介绍可见:[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) +目前包括HttpUtils、[DownloadManagerPro](http://www.trinea.cn/android/android-downloadmanager/)、[ShellUtils](http://www.trinea.cn/android/android-java-execute-shell-commands/)、[PackageUtils](http://www.trinea.cn/android/android-silent-install/)、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、MapUtils、ObjectUtils、SerializeUtils、SystemUtils、TimeUtils。 +
      +##### 1. Android系统下载管理DownloadManager使用 +使用示例:[Android系统下载管理DownloadManager功能介绍及使用示例](http://www.trinea.cn/android/android-downloadmanager/) +功能扩展:[Android下载管理DownloadManager功能扩展和bug修改](http://www.trinea.cn/android/android-downloadmanager-pro/) +效果图如下: +![downloadManagerDemo](http://www.trinea.cn/wp-content/uploads/2013/05/downloadDemo2.gif) + +##### 2. Android APK root权限静默安装 +使用示例:[Android APK root权限静默安装](http://www.trinea.cn/android/android-silent-install/) + +##### 3. Android root权限 +直接调用[ShellUtils.execCommand](https://github.com/Trinea/AndroidCommon/blob/master/src/cn/trinea/android/common/util/ShellUtils.java#LC43)方法 + +##### 4. 图片工具类 +(1)Drawable、Bitmap、byte数组相互转换; (2)根据url获得InputStream、Drawable、Bitmap +更多工具类介绍见[Android常用工具类](http://www.trinea.cn/android/android-common-utils/) + + +### Proguard +``` xml +-keep class cn.trinea.android.** { *; } +-keepclassmembers class cn.trinea.android.** { *; } +-dontwarn cn.trinea.android.** +``` + +### Download +Gradle: +``` xml +compile 'cn.trinea.android.common:trinea-android-common:4.2.15' +``` + +## License + + Copyright 2013 trinea.cn + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/oss-program-readiness.en.md b/docs/oss-program-readiness.en.md new file mode 100644 index 0000000..b19dbdf --- /dev/null +++ b/docs/oss-program-readiness.en.md @@ -0,0 +1,43 @@ +# Claude for OSS & Codex for OSS Readiness + +## Project Overview +- **Project**: Trinea Android Common (`android-common`) +- **Mission**: provide ready-to-use cache implementations, UI widgets, and utility helpers so Android teams can bootstrap stable apps quickly. +- **Scope**: image/network/cache layers, pull-to-refresh and paging widgets, DownloadManager extensions, shell/package/file/json utilities, etc. + +## Governance & Compliance +- **License**: Apache License 2.0. +- **Maintainer**: [Trinea](https://github.com/Trinea); decisions shared via GitHub Discussions, Issue templates, and CodeKK. +- **Contribution flow**: Fork → feature branch → PR with CLA confirmation → unit tests/static analysis → review → merge. +- **Distribution**: Gradle/Maven Central (`cn.trinea.android.common:trinea-android-common`) plus Dev Tools App scaffolds. + +## Impact +- Used by thousands of domestic and international apps, 5k+ GitHub stars. +- Referenced by InfoQ, GeekTime, and enterprise templates to teach caching/tooling patterns. +- Maven Central downloads historically exceed 100k/month, validating real-world demand. + +## Claude for OSS Plan +1. **Docs modernization**: Claude helps refresh multilingual README/API guides and migration docs. +2. **Issue triage**: summarize duplicate issues, propose first-pass diagnostics, and improve response quality. +3. **Knowledge transfer**: generate design docs/comments so new maintainers can onboard faster. + +## Codex for OSS Plan +1. **AndroidX migration**: Codex assists with scripts that port legacy support APIs to AndroidX and upgrade AGP/Gradle. +2. **Test coverage**: auto-generate unit/instrumentation tests for caches and utilities. +3. **Performance insights**: use Codex to script benchmarks/LeakCanary configurations and analyze regressions. + +## Responsible AI Use +- Every AI-assisted change is reviewed and annotated in PRs/releases. +- Sensitive logs or proprietary data are never uploaded; data is anonymized when needed. +- Rollback mechanisms and audit history ensure traceability. + +## Support Needs +1. Align modules with AndroidX + Kotlin best practices and publish a refreshed release. +2. Raise test coverage above 50% and add benchmarking. +3. Update samples/docs with modern Compose-centric guidance. + +## Contact +- Email: [trinea.cn@gmail.com](mailto:trinea.cn@gmail.com) +- Issues: https://github.com/Trinea/AndroidCommon/issues + +> Use this document when submitting Claude for OSS / Codex for OSS applications. diff --git a/docs/oss-program-readiness.md b/docs/oss-program-readiness.md new file mode 100644 index 0000000..6562db7 --- /dev/null +++ b/docs/oss-program-readiness.md @@ -0,0 +1,44 @@ +# Claude for OSS & Codex for OSS 准备情况 + +## 项目概述 +- **项目**:Trinea Android Common(android-common) +- **使命**:沉淀 Android 客户端开发中的基础能力(缓存、常用控件、工具库),为中小团队提供可直接复用的组件,帮助其快速搭建稳定的应用架构。 +- **组件范围**:图片/网络缓存、下拉刷新与分页控件、DownloadManager 扩展、Shell/Package/File/JSON 等工具类,覆盖典型移动应用场景。 + +## 资质与治理 +- **许可证**:Apache License 2.0,满足 Claude for OSS & Codex for OSS 的开源合规要求。 +- **主要维护者**:Trinea (github.com/Trinea)。未来会在 GitHub Discussions、Issue 模板以及 CodeKK 社区同步治理决策。 +- **贡献流程**:Fork -> Feature Branch -> Pull Request -> CLA 确认 -> 单元测试 -> Review -> Merge。CI 将覆盖单元测试与静态分析。 +- **发布通道**:标准 Gradle/Maven Central 库(`cn.trinea.android.common:trinea-android-common`)以及 Dev Tools App 的脚手架模板。 + +## 影响力 +- 工程累计在国内外数千个应用中使用,GitHub Star 5k+,多家企业内部骨架项目默认依赖该库。 +- 被 InfoQ、极客时间等技术社区引用,用于讲解缓存与工具集实现。 +- 高峰期 Maven Central 月下载量超过 100k,说明具备真实社区需求。 + +## Claude for OSS 计划 +1. **文档现代化**:使用 Claude 生成/校对多语言 README、API Guide 与迁移手册,加速恢复维护。 +2. **Issue 辅助**:Claude 帮助识别重复 Issue、概括问题并提供初步诊断,改善响应体验。 +3. **知识传承**:通过 Claude 生成的设计文档和代码注释,降低新贡献者的上手门槛。 + +## Codex for OSS 计划 +1. **AndroidX/现代构建迁移**:Codex 协助编写脚本将旧 Support 包迁移到 AndroidX,并升级到 Gradle/AGP 最新版本。 +2. **自动化测试补齐**:借助 Codex 生成单元测试与仪器测试样例,覆盖缓存及工具类的关键路径。 +3. **性能与内存分析**:Codex 将辅助编写基准测试、LeakCanary/Perfetto 配置,持续评估库的性能表现。 + +## 负责任的 AI 使用 +- AI 输出只在经维护者审核后合入主干,并在 PR/Release 中标注 AI 参与程度。 +- 拒绝上传含有商业或隐私信息的日志/样本,必要时会脱敏处理。 +- 建立回滚机制和审计日志,确保可追踪性。 + +## 支持需求 +1. 重新对齐分层架构,发布 AndroidX + Kotlin 版本。 +2. 增补 50% 以上的代码覆盖率,建立基准测试。 +3. 更新示例 App 与文档,提供 Compose 时代的用法。 + +## 联系方式 +- Email:trinea.cn@gmail.com +- GitHub Issues:github.com/Trinea/AndroidCommon/issues +- 社区:CodeKK 微信公众号、QQ 群(485334692) + +> 该文档用于向 Claude for OSS / Codex for OSS 说明项目影响力、治理架构及 AI 赋能路径,可随申请材料附上。 From 83329efc827cf45005b6a9860e6ed2da5e6cf6fb Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 26 Mar 2026 00:39:52 +0800 Subject: [PATCH 239/241] Adapter for newest android --- .project | 33 ------- build.gradle | 21 ++++ proguard.cfg | 93 ------------------ project.properties | 15 --- .../main/AndroidManifest.xml | 3 - .../common/annotation/NotProguard.java | 0 .../android/common/constant/DbConstants.java | 0 .../common/constant/HttpConstants.java | 0 .../android/common/dao/HttpCacheDao.java | 0 .../common/dao/ImageSDCardCacheDao.java | 0 .../common/dao/impl/HttpCacheDaoImpl.java | 0 .../dao/impl/ImageSDCardCacheDaoImpl.java | 0 .../android/common/entity/CacheObject.java | 0 .../android/common/entity/FailedReason.java | 0 .../android/common/entity/HttpRequest.java | 0 .../android/common/entity/HttpResponse.java | 0 .../android/common/entity/PatchResult.java | 0 .../trinea/android/common/service/Cache.java | 0 .../common/service/CacheFullRemoveType.java | 0 .../android/common/service/FileNameRule.java | 0 .../android/common/service/HttpCache.java | 0 .../service/impl/FileNameRuleCurrentTime.java | 0 .../service/impl/FileNameRuleImageUrl.java | 0 .../common/service/impl/ImageCache.java | 0 .../common/service/impl/ImageMemoryCache.java | 0 .../common/service/impl/ImageSDCardCache.java | 0 .../common/service/impl/PreloadDataCache.java | 0 .../service/impl/RemoveTypeBitmapLarge.java | 0 .../service/impl/RemoveTypeBitmapSmall.java | 0 .../service/impl/RemoveTypeDataBig.java | 0 .../service/impl/RemoveTypeDataSmall.java | 0 .../impl/RemoveTypeEnterTimeFirst.java | 0 .../service/impl/RemoveTypeEnterTimeLast.java | 0 .../service/impl/RemoveTypeFileLarge.java | 0 .../service/impl/RemoveTypeFileSmall.java | 0 .../impl/RemoveTypeLastUsedTimeFirst.java | 0 .../impl/RemoveTypeLastUsedTimeLast.java | 0 .../service/impl/RemoveTypeNotRemove.java | 0 .../service/impl/RemoveTypePriorityHigh.java | 0 .../service/impl/RemoveTypePriorityLow.java | 0 .../service/impl/RemoveTypeUsedCountBig.java | 0 .../impl/RemoveTypeUsedCountSmall.java | 0 .../common/service/impl/SimpleCache.java | 0 .../trinea/android/common/util/AppUtils.java | 0 .../android/common/util/ArrayUtils.java | 0 .../common/util/AssetDatabaseOpenHelper.java | 0 .../android/common/util/CacheManager.java | 0 .../android/common/util/CollectionUtils.java | 0 .../trinea/android/common/util/DbHelper.java | 0 .../android/common/util/DigestUtils.java | 0 .../common/util/DownloadManagerPro.java | 0 .../trinea/android/common/util/FileUtils.java | 0 .../trinea/android/common/util/HttpUtils.java | 0 .../trinea/android/common/util/IOUtils.java | 0 .../common/util/ImageCacheManager.java | 0 .../android/common/util/ImageUtils.java | 0 .../trinea/android/common/util/JSONUtils.java | 0 .../trinea/android/common/util/ListUtils.java | 0 .../trinea/android/common/util/MapUtils.java | 0 .../android/common/util/NetWorkUtils.java | 0 .../android/common/util/ObjectUtils.java | 0 .../android/common/util/PackageUtils.java | 0 .../android/common/util/ParcelUtils.java | 0 .../android/common/util/PatchUtils.java | 0 .../android/common/util/PreferencesUtils.java | 0 .../android/common/util/RandomUtils.java | 0 .../android/common/util/ResourceUtils.java | 0 .../android/common/util/ScreenUtils.java | 0 .../android/common/util/SerializeUtils.java | 0 .../android/common/util/ShellUtils.java | 2 +- .../android/common/util/SingletonUtils.java | 0 .../trinea/android/common/util/SizeUtils.java | 0 .../android/common/util/SqliteUtils.java | 0 .../android/common/util/StringUtils.java | 0 .../android/common/util/SystemUtils.java | 0 .../trinea/android/common/util/TimeUtils.java | 0 .../android/common/util/ToastUtils.java | 0 .../trinea/android/common/util/ViewUtils.java | 0 .../android/common/view/BorderScrollView.java | 0 .../android/common/view/DropDownListView.java | 0 .../common/view/HorizontalListView.java | 0 .../common/view/SlideOnePageGallery.java | 0 .../drawable-hdpi/drop_down_list_arrow.png | Bin .../drawable-ldpi/drop_down_list_arrow.png | Bin .../drawable-mdpi/drop_down_list_arrow.png | Bin .../res}/layout/drop_down_list_footer.xml | 0 .../res}/layout/drop_down_list_header.xml | 0 .../main/res}/values-zh-rCN/strings.xml | 0 .../main/res}/values-zh-rTW/strings.xml | 0 {res => src/main/res}/values/attrs.xml | 0 {res => src/main/res}/values/colors.xml | 0 {res => src/main/res}/values/dimens.xml | 0 {res => src/main/res}/values/strings.xml | 0 {res => src/main/res}/values/styles.xml | 0 94 files changed, 22 insertions(+), 145 deletions(-) delete mode 100644 .project create mode 100644 build.gradle delete mode 100644 proguard.cfg delete mode 100644 project.properties rename AndroidManifest.xml => src/main/AndroidManifest.xml (74%) rename src/{ => main/java}/cn/trinea/android/common/annotation/NotProguard.java (100%) rename src/{ => main/java}/cn/trinea/android/common/constant/DbConstants.java (100%) rename src/{ => main/java}/cn/trinea/android/common/constant/HttpConstants.java (100%) rename src/{ => main/java}/cn/trinea/android/common/dao/HttpCacheDao.java (100%) rename src/{ => main/java}/cn/trinea/android/common/dao/ImageSDCardCacheDao.java (100%) rename src/{ => main/java}/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java (100%) rename src/{ => main/java}/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java (100%) rename src/{ => main/java}/cn/trinea/android/common/entity/CacheObject.java (100%) rename src/{ => main/java}/cn/trinea/android/common/entity/FailedReason.java (100%) rename src/{ => main/java}/cn/trinea/android/common/entity/HttpRequest.java (100%) rename src/{ => main/java}/cn/trinea/android/common/entity/HttpResponse.java (100%) rename src/{ => main/java}/cn/trinea/android/common/entity/PatchResult.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/Cache.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/CacheFullRemoveType.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/FileNameRule.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/HttpCache.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/ImageCache.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/ImageMemoryCache.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/ImageSDCardCache.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/PreloadDataCache.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java (100%) rename src/{ => main/java}/cn/trinea/android/common/service/impl/SimpleCache.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/AppUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ArrayUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/CacheManager.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/CollectionUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/DbHelper.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/DigestUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/DownloadManagerPro.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/FileUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/HttpUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/IOUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ImageCacheManager.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ImageUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/JSONUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ListUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/MapUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/NetWorkUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ObjectUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/PackageUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ParcelUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/PatchUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/PreferencesUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/RandomUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ResourceUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ScreenUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/SerializeUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ShellUtils.java (99%) rename src/{ => main/java}/cn/trinea/android/common/util/SingletonUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/SizeUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/SqliteUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/StringUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/SystemUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/TimeUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ToastUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/util/ViewUtils.java (100%) rename src/{ => main/java}/cn/trinea/android/common/view/BorderScrollView.java (100%) rename src/{ => main/java}/cn/trinea/android/common/view/DropDownListView.java (100%) rename src/{ => main/java}/cn/trinea/android/common/view/HorizontalListView.java (100%) rename src/{ => main/java}/cn/trinea/android/common/view/SlideOnePageGallery.java (100%) rename {res => src/main/res}/drawable-hdpi/drop_down_list_arrow.png (100%) rename {res => src/main/res}/drawable-ldpi/drop_down_list_arrow.png (100%) rename {res => src/main/res}/drawable-mdpi/drop_down_list_arrow.png (100%) rename {res => src/main/res}/layout/drop_down_list_footer.xml (100%) rename {res => src/main/res}/layout/drop_down_list_header.xml (100%) rename {res => src/main/res}/values-zh-rCN/strings.xml (100%) rename {res => src/main/res}/values-zh-rTW/strings.xml (100%) rename {res => src/main/res}/values/attrs.xml (100%) rename {res => src/main/res}/values/colors.xml (100%) rename {res => src/main/res}/values/dimens.xml (100%) rename {res => src/main/res}/values/strings.xml (100%) rename {res => src/main/res}/values/styles.xml (100%) diff --git a/.project b/.project deleted file mode 100644 index befe3dd..0000000 --- a/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - trinea-android-common - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..10d1ecb --- /dev/null +++ b/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'com.android.library' + +android { + namespace 'cn.trinea.android.common' + compileSdk 34 + + defaultConfig { + minSdk 21 + targetSdk 34 + } + + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.6.1' +} diff --git a/proguard.cfg b/proguard.cfg deleted file mode 100644 index 1b58bb4..0000000 --- a/proguard.cfg +++ /dev/null @@ -1,93 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} -# see http://sourceforge.net/tracker/?func=detail&aid=2787465&group_id=54750&atid=474707 --optimizations !code/simplification/arithmetic --optimizations !code/simplification/cast --allowaccessmodification - -# To prevent name conflict in incremental obfuscation. --useuniqueclassmembernames - -# dex does not like code run through proguard optimize and preverify steps. --dontoptimize --dontpreverify - -# Don't obfuscate. We only need dead code striping. -# -dontobfuscate - -# Add this flag in your package's own configuration if it's needed. -#-flattenpackagehierarchy - -# Some classes in the libraries extend package private classes to chare common functionality -# that isn't explicitly part of the API --dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers - -# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - -# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native --keepclasseswithmembernames class * { - native ; -} - -# class$ methods are inserted by some compilers to implement .class construct, -# see http://proguard.sourceforge.net/manual/examples.html#library --keepclassmembernames class * { - java.lang.Class class$(java.lang.String); - java.lang.Class class$(java.lang.String, boolean); -} - -# Keep classes and methods that have the guava @VisibleForTesting annotation --keep @com.google.common.annotations.VisibleForTesting class * --keepclassmembers class * { -@com.google.common.annotations.VisibleForTesting *; -} - -# Keep serializable classes and necessary members for serializable classes -# Copied from the ProGuard manual at http://proguard.sourceforge.net. --keepnames class * implements java.io.Serializable --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - private static final java.io.ObjectStreamField[] serialPersistentFields; - !static !transient ; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - - --keep class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator *; -} - --keepattributes *Annotation* - --dontskipnonpubliclibraryclasses --dontskipnonpubliclibraryclassmembers - -# Keep cn.trinea --keep class cn.trinea.android.** { *; } --keepclassmembers class cn.trinea.android.** { *; } --dontwarn cn.trinea.android.** \ No newline at end of file diff --git a/project.properties b/project.properties deleted file mode 100644 index 22e1c48..0000000 --- a/project.properties +++ /dev/null @@ -1,15 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-14 -android.library=true diff --git a/AndroidManifest.xml b/src/main/AndroidManifest.xml similarity index 74% rename from AndroidManifest.xml rename to src/main/AndroidManifest.xml index a395da5..fbadcfd 100644 --- a/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -4,9 +4,6 @@ android:versionCode="30" android:versionName="4.2.14" > - diff --git a/src/cn/trinea/android/common/annotation/NotProguard.java b/src/main/java/cn/trinea/android/common/annotation/NotProguard.java similarity index 100% rename from src/cn/trinea/android/common/annotation/NotProguard.java rename to src/main/java/cn/trinea/android/common/annotation/NotProguard.java diff --git a/src/cn/trinea/android/common/constant/DbConstants.java b/src/main/java/cn/trinea/android/common/constant/DbConstants.java similarity index 100% rename from src/cn/trinea/android/common/constant/DbConstants.java rename to src/main/java/cn/trinea/android/common/constant/DbConstants.java diff --git a/src/cn/trinea/android/common/constant/HttpConstants.java b/src/main/java/cn/trinea/android/common/constant/HttpConstants.java similarity index 100% rename from src/cn/trinea/android/common/constant/HttpConstants.java rename to src/main/java/cn/trinea/android/common/constant/HttpConstants.java diff --git a/src/cn/trinea/android/common/dao/HttpCacheDao.java b/src/main/java/cn/trinea/android/common/dao/HttpCacheDao.java similarity index 100% rename from src/cn/trinea/android/common/dao/HttpCacheDao.java rename to src/main/java/cn/trinea/android/common/dao/HttpCacheDao.java diff --git a/src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java b/src/main/java/cn/trinea/android/common/dao/ImageSDCardCacheDao.java similarity index 100% rename from src/cn/trinea/android/common/dao/ImageSDCardCacheDao.java rename to src/main/java/cn/trinea/android/common/dao/ImageSDCardCacheDao.java diff --git a/src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java b/src/main/java/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java similarity index 100% rename from src/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java rename to src/main/java/cn/trinea/android/common/dao/impl/HttpCacheDaoImpl.java diff --git a/src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java b/src/main/java/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java similarity index 100% rename from src/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java rename to src/main/java/cn/trinea/android/common/dao/impl/ImageSDCardCacheDaoImpl.java diff --git a/src/cn/trinea/android/common/entity/CacheObject.java b/src/main/java/cn/trinea/android/common/entity/CacheObject.java similarity index 100% rename from src/cn/trinea/android/common/entity/CacheObject.java rename to src/main/java/cn/trinea/android/common/entity/CacheObject.java diff --git a/src/cn/trinea/android/common/entity/FailedReason.java b/src/main/java/cn/trinea/android/common/entity/FailedReason.java similarity index 100% rename from src/cn/trinea/android/common/entity/FailedReason.java rename to src/main/java/cn/trinea/android/common/entity/FailedReason.java diff --git a/src/cn/trinea/android/common/entity/HttpRequest.java b/src/main/java/cn/trinea/android/common/entity/HttpRequest.java similarity index 100% rename from src/cn/trinea/android/common/entity/HttpRequest.java rename to src/main/java/cn/trinea/android/common/entity/HttpRequest.java diff --git a/src/cn/trinea/android/common/entity/HttpResponse.java b/src/main/java/cn/trinea/android/common/entity/HttpResponse.java similarity index 100% rename from src/cn/trinea/android/common/entity/HttpResponse.java rename to src/main/java/cn/trinea/android/common/entity/HttpResponse.java diff --git a/src/cn/trinea/android/common/entity/PatchResult.java b/src/main/java/cn/trinea/android/common/entity/PatchResult.java similarity index 100% rename from src/cn/trinea/android/common/entity/PatchResult.java rename to src/main/java/cn/trinea/android/common/entity/PatchResult.java diff --git a/src/cn/trinea/android/common/service/Cache.java b/src/main/java/cn/trinea/android/common/service/Cache.java similarity index 100% rename from src/cn/trinea/android/common/service/Cache.java rename to src/main/java/cn/trinea/android/common/service/Cache.java diff --git a/src/cn/trinea/android/common/service/CacheFullRemoveType.java b/src/main/java/cn/trinea/android/common/service/CacheFullRemoveType.java similarity index 100% rename from src/cn/trinea/android/common/service/CacheFullRemoveType.java rename to src/main/java/cn/trinea/android/common/service/CacheFullRemoveType.java diff --git a/src/cn/trinea/android/common/service/FileNameRule.java b/src/main/java/cn/trinea/android/common/service/FileNameRule.java similarity index 100% rename from src/cn/trinea/android/common/service/FileNameRule.java rename to src/main/java/cn/trinea/android/common/service/FileNameRule.java diff --git a/src/cn/trinea/android/common/service/HttpCache.java b/src/main/java/cn/trinea/android/common/service/HttpCache.java similarity index 100% rename from src/cn/trinea/android/common/service/HttpCache.java rename to src/main/java/cn/trinea/android/common/service/HttpCache.java diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java b/src/main/java/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java rename to src/main/java/cn/trinea/android/common/service/impl/FileNameRuleCurrentTime.java diff --git a/src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java b/src/main/java/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java rename to src/main/java/cn/trinea/android/common/service/impl/FileNameRuleImageUrl.java diff --git a/src/cn/trinea/android/common/service/impl/ImageCache.java b/src/main/java/cn/trinea/android/common/service/impl/ImageCache.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/ImageCache.java rename to src/main/java/cn/trinea/android/common/service/impl/ImageCache.java diff --git a/src/cn/trinea/android/common/service/impl/ImageMemoryCache.java b/src/main/java/cn/trinea/android/common/service/impl/ImageMemoryCache.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/ImageMemoryCache.java rename to src/main/java/cn/trinea/android/common/service/impl/ImageMemoryCache.java diff --git a/src/cn/trinea/android/common/service/impl/ImageSDCardCache.java b/src/main/java/cn/trinea/android/common/service/impl/ImageSDCardCache.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/ImageSDCardCache.java rename to src/main/java/cn/trinea/android/common/service/impl/ImageSDCardCache.java diff --git a/src/cn/trinea/android/common/service/impl/PreloadDataCache.java b/src/main/java/cn/trinea/android/common/service/impl/PreloadDataCache.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/PreloadDataCache.java rename to src/main/java/cn/trinea/android/common/service/impl/PreloadDataCache.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeBitmapLarge.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeBitmapSmall.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeDataBig.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeDataSmall.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeFirst.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeEnterTimeLast.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeFileLarge.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeFileSmall.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeFirst.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeLastUsedTimeLast.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeNotRemove.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypePriorityHigh.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypePriorityLow.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeUsedCountBig.java diff --git a/src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java b/src/main/java/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java rename to src/main/java/cn/trinea/android/common/service/impl/RemoveTypeUsedCountSmall.java diff --git a/src/cn/trinea/android/common/service/impl/SimpleCache.java b/src/main/java/cn/trinea/android/common/service/impl/SimpleCache.java similarity index 100% rename from src/cn/trinea/android/common/service/impl/SimpleCache.java rename to src/main/java/cn/trinea/android/common/service/impl/SimpleCache.java diff --git a/src/cn/trinea/android/common/util/AppUtils.java b/src/main/java/cn/trinea/android/common/util/AppUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/AppUtils.java rename to src/main/java/cn/trinea/android/common/util/AppUtils.java diff --git a/src/cn/trinea/android/common/util/ArrayUtils.java b/src/main/java/cn/trinea/android/common/util/ArrayUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ArrayUtils.java rename to src/main/java/cn/trinea/android/common/util/ArrayUtils.java diff --git a/src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java b/src/main/java/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java similarity index 100% rename from src/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java rename to src/main/java/cn/trinea/android/common/util/AssetDatabaseOpenHelper.java diff --git a/src/cn/trinea/android/common/util/CacheManager.java b/src/main/java/cn/trinea/android/common/util/CacheManager.java similarity index 100% rename from src/cn/trinea/android/common/util/CacheManager.java rename to src/main/java/cn/trinea/android/common/util/CacheManager.java diff --git a/src/cn/trinea/android/common/util/CollectionUtils.java b/src/main/java/cn/trinea/android/common/util/CollectionUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/CollectionUtils.java rename to src/main/java/cn/trinea/android/common/util/CollectionUtils.java diff --git a/src/cn/trinea/android/common/util/DbHelper.java b/src/main/java/cn/trinea/android/common/util/DbHelper.java similarity index 100% rename from src/cn/trinea/android/common/util/DbHelper.java rename to src/main/java/cn/trinea/android/common/util/DbHelper.java diff --git a/src/cn/trinea/android/common/util/DigestUtils.java b/src/main/java/cn/trinea/android/common/util/DigestUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/DigestUtils.java rename to src/main/java/cn/trinea/android/common/util/DigestUtils.java diff --git a/src/cn/trinea/android/common/util/DownloadManagerPro.java b/src/main/java/cn/trinea/android/common/util/DownloadManagerPro.java similarity index 100% rename from src/cn/trinea/android/common/util/DownloadManagerPro.java rename to src/main/java/cn/trinea/android/common/util/DownloadManagerPro.java diff --git a/src/cn/trinea/android/common/util/FileUtils.java b/src/main/java/cn/trinea/android/common/util/FileUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/FileUtils.java rename to src/main/java/cn/trinea/android/common/util/FileUtils.java diff --git a/src/cn/trinea/android/common/util/HttpUtils.java b/src/main/java/cn/trinea/android/common/util/HttpUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/HttpUtils.java rename to src/main/java/cn/trinea/android/common/util/HttpUtils.java diff --git a/src/cn/trinea/android/common/util/IOUtils.java b/src/main/java/cn/trinea/android/common/util/IOUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/IOUtils.java rename to src/main/java/cn/trinea/android/common/util/IOUtils.java diff --git a/src/cn/trinea/android/common/util/ImageCacheManager.java b/src/main/java/cn/trinea/android/common/util/ImageCacheManager.java similarity index 100% rename from src/cn/trinea/android/common/util/ImageCacheManager.java rename to src/main/java/cn/trinea/android/common/util/ImageCacheManager.java diff --git a/src/cn/trinea/android/common/util/ImageUtils.java b/src/main/java/cn/trinea/android/common/util/ImageUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ImageUtils.java rename to src/main/java/cn/trinea/android/common/util/ImageUtils.java diff --git a/src/cn/trinea/android/common/util/JSONUtils.java b/src/main/java/cn/trinea/android/common/util/JSONUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/JSONUtils.java rename to src/main/java/cn/trinea/android/common/util/JSONUtils.java diff --git a/src/cn/trinea/android/common/util/ListUtils.java b/src/main/java/cn/trinea/android/common/util/ListUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ListUtils.java rename to src/main/java/cn/trinea/android/common/util/ListUtils.java diff --git a/src/cn/trinea/android/common/util/MapUtils.java b/src/main/java/cn/trinea/android/common/util/MapUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/MapUtils.java rename to src/main/java/cn/trinea/android/common/util/MapUtils.java diff --git a/src/cn/trinea/android/common/util/NetWorkUtils.java b/src/main/java/cn/trinea/android/common/util/NetWorkUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/NetWorkUtils.java rename to src/main/java/cn/trinea/android/common/util/NetWorkUtils.java diff --git a/src/cn/trinea/android/common/util/ObjectUtils.java b/src/main/java/cn/trinea/android/common/util/ObjectUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ObjectUtils.java rename to src/main/java/cn/trinea/android/common/util/ObjectUtils.java diff --git a/src/cn/trinea/android/common/util/PackageUtils.java b/src/main/java/cn/trinea/android/common/util/PackageUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/PackageUtils.java rename to src/main/java/cn/trinea/android/common/util/PackageUtils.java diff --git a/src/cn/trinea/android/common/util/ParcelUtils.java b/src/main/java/cn/trinea/android/common/util/ParcelUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ParcelUtils.java rename to src/main/java/cn/trinea/android/common/util/ParcelUtils.java diff --git a/src/cn/trinea/android/common/util/PatchUtils.java b/src/main/java/cn/trinea/android/common/util/PatchUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/PatchUtils.java rename to src/main/java/cn/trinea/android/common/util/PatchUtils.java diff --git a/src/cn/trinea/android/common/util/PreferencesUtils.java b/src/main/java/cn/trinea/android/common/util/PreferencesUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/PreferencesUtils.java rename to src/main/java/cn/trinea/android/common/util/PreferencesUtils.java diff --git a/src/cn/trinea/android/common/util/RandomUtils.java b/src/main/java/cn/trinea/android/common/util/RandomUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/RandomUtils.java rename to src/main/java/cn/trinea/android/common/util/RandomUtils.java diff --git a/src/cn/trinea/android/common/util/ResourceUtils.java b/src/main/java/cn/trinea/android/common/util/ResourceUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ResourceUtils.java rename to src/main/java/cn/trinea/android/common/util/ResourceUtils.java diff --git a/src/cn/trinea/android/common/util/ScreenUtils.java b/src/main/java/cn/trinea/android/common/util/ScreenUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ScreenUtils.java rename to src/main/java/cn/trinea/android/common/util/ScreenUtils.java diff --git a/src/cn/trinea/android/common/util/SerializeUtils.java b/src/main/java/cn/trinea/android/common/util/SerializeUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/SerializeUtils.java rename to src/main/java/cn/trinea/android/common/util/SerializeUtils.java diff --git a/src/cn/trinea/android/common/util/ShellUtils.java b/src/main/java/cn/trinea/android/common/util/ShellUtils.java similarity index 99% rename from src/cn/trinea/android/common/util/ShellUtils.java rename to src/main/java/cn/trinea/android/common/util/ShellUtils.java index 4ca686e..937ce90 100644 --- a/src/cn/trinea/android/common/util/ShellUtils.java +++ b/src/main/java/cn/trinea/android/common/util/ShellUtils.java @@ -1,4 +1,4 @@ -package cn.trinea.android.lib.util; +package cn.trinea.android.common.util; import android.os.Build; diff --git a/src/cn/trinea/android/common/util/SingletonUtils.java b/src/main/java/cn/trinea/android/common/util/SingletonUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/SingletonUtils.java rename to src/main/java/cn/trinea/android/common/util/SingletonUtils.java diff --git a/src/cn/trinea/android/common/util/SizeUtils.java b/src/main/java/cn/trinea/android/common/util/SizeUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/SizeUtils.java rename to src/main/java/cn/trinea/android/common/util/SizeUtils.java diff --git a/src/cn/trinea/android/common/util/SqliteUtils.java b/src/main/java/cn/trinea/android/common/util/SqliteUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/SqliteUtils.java rename to src/main/java/cn/trinea/android/common/util/SqliteUtils.java diff --git a/src/cn/trinea/android/common/util/StringUtils.java b/src/main/java/cn/trinea/android/common/util/StringUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/StringUtils.java rename to src/main/java/cn/trinea/android/common/util/StringUtils.java diff --git a/src/cn/trinea/android/common/util/SystemUtils.java b/src/main/java/cn/trinea/android/common/util/SystemUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/SystemUtils.java rename to src/main/java/cn/trinea/android/common/util/SystemUtils.java diff --git a/src/cn/trinea/android/common/util/TimeUtils.java b/src/main/java/cn/trinea/android/common/util/TimeUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/TimeUtils.java rename to src/main/java/cn/trinea/android/common/util/TimeUtils.java diff --git a/src/cn/trinea/android/common/util/ToastUtils.java b/src/main/java/cn/trinea/android/common/util/ToastUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ToastUtils.java rename to src/main/java/cn/trinea/android/common/util/ToastUtils.java diff --git a/src/cn/trinea/android/common/util/ViewUtils.java b/src/main/java/cn/trinea/android/common/util/ViewUtils.java similarity index 100% rename from src/cn/trinea/android/common/util/ViewUtils.java rename to src/main/java/cn/trinea/android/common/util/ViewUtils.java diff --git a/src/cn/trinea/android/common/view/BorderScrollView.java b/src/main/java/cn/trinea/android/common/view/BorderScrollView.java similarity index 100% rename from src/cn/trinea/android/common/view/BorderScrollView.java rename to src/main/java/cn/trinea/android/common/view/BorderScrollView.java diff --git a/src/cn/trinea/android/common/view/DropDownListView.java b/src/main/java/cn/trinea/android/common/view/DropDownListView.java similarity index 100% rename from src/cn/trinea/android/common/view/DropDownListView.java rename to src/main/java/cn/trinea/android/common/view/DropDownListView.java diff --git a/src/cn/trinea/android/common/view/HorizontalListView.java b/src/main/java/cn/trinea/android/common/view/HorizontalListView.java similarity index 100% rename from src/cn/trinea/android/common/view/HorizontalListView.java rename to src/main/java/cn/trinea/android/common/view/HorizontalListView.java diff --git a/src/cn/trinea/android/common/view/SlideOnePageGallery.java b/src/main/java/cn/trinea/android/common/view/SlideOnePageGallery.java similarity index 100% rename from src/cn/trinea/android/common/view/SlideOnePageGallery.java rename to src/main/java/cn/trinea/android/common/view/SlideOnePageGallery.java diff --git a/res/drawable-hdpi/drop_down_list_arrow.png b/src/main/res/drawable-hdpi/drop_down_list_arrow.png similarity index 100% rename from res/drawable-hdpi/drop_down_list_arrow.png rename to src/main/res/drawable-hdpi/drop_down_list_arrow.png diff --git a/res/drawable-ldpi/drop_down_list_arrow.png b/src/main/res/drawable-ldpi/drop_down_list_arrow.png similarity index 100% rename from res/drawable-ldpi/drop_down_list_arrow.png rename to src/main/res/drawable-ldpi/drop_down_list_arrow.png diff --git a/res/drawable-mdpi/drop_down_list_arrow.png b/src/main/res/drawable-mdpi/drop_down_list_arrow.png similarity index 100% rename from res/drawable-mdpi/drop_down_list_arrow.png rename to src/main/res/drawable-mdpi/drop_down_list_arrow.png diff --git a/res/layout/drop_down_list_footer.xml b/src/main/res/layout/drop_down_list_footer.xml similarity index 100% rename from res/layout/drop_down_list_footer.xml rename to src/main/res/layout/drop_down_list_footer.xml diff --git a/res/layout/drop_down_list_header.xml b/src/main/res/layout/drop_down_list_header.xml similarity index 100% rename from res/layout/drop_down_list_header.xml rename to src/main/res/layout/drop_down_list_header.xml diff --git a/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml similarity index 100% rename from res/values-zh-rCN/strings.xml rename to src/main/res/values-zh-rCN/strings.xml diff --git a/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml similarity index 100% rename from res/values-zh-rTW/strings.xml rename to src/main/res/values-zh-rTW/strings.xml diff --git a/res/values/attrs.xml b/src/main/res/values/attrs.xml similarity index 100% rename from res/values/attrs.xml rename to src/main/res/values/attrs.xml diff --git a/res/values/colors.xml b/src/main/res/values/colors.xml similarity index 100% rename from res/values/colors.xml rename to src/main/res/values/colors.xml diff --git a/res/values/dimens.xml b/src/main/res/values/dimens.xml similarity index 100% rename from res/values/dimens.xml rename to src/main/res/values/dimens.xml diff --git a/res/values/strings.xml b/src/main/res/values/strings.xml similarity index 100% rename from res/values/strings.xml rename to src/main/res/values/strings.xml diff --git a/res/values/styles.xml b/src/main/res/values/styles.xml similarity index 100% rename from res/values/styles.xml rename to src/main/res/values/styles.xml From f0738f07ffb8e0c97d2d31feae915c43c2f6fce0 Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 26 Mar 2026 00:55:37 +0800 Subject: [PATCH 240/241] Fix http fail --- .gitattributes | 23 --- pom.xml | 147 ------------------ .../trinea/android/common/util/HttpUtils.java | 129 ++++++++------- 3 files changed, 75 insertions(+), 224 deletions(-) delete mode 100644 .gitattributes delete mode 100644 pom.xml diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 8fb2c27..0000000 --- a/.gitattributes +++ /dev/null @@ -1,23 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/pom.xml b/pom.xml deleted file mode 100644 index c72d620..0000000 --- a/pom.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - 4.0.0 - cn.trinea.android.common - trinea-android-common - aar - - Trinea Android Common Library - 4.2.16-SNAPSHOT - https://github.com/Trinea/android-common - Android common lib, include ImageCache, HttpCache, DropDownListView, DownloadManager, Utils and so on - 2012 - - - org.sonatype.oss - oss-parent - 7 - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - scm:git:git://github.com/Trinea/android-common.git - scm:git:git@github.com:Trinea/android-common.git - https://github.com/Trinea/android-common - HEAD - - - - - trinea - Trinea - trinea.cn+code@gmail.com - - - - - GitHub Issues - https://github.com/Trinea/android-common/issues - - - - UTF-8 - UTF-8 - - - - - - com.google.android - android - 4.0.1.2 - provided - - - - - src - test - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.0 - - 1.6 - 1.6 - - - - org.apache.maven.plugins - maven-release-plugin - 2.4 - - v@{project.version} - - - - com.jayway.maven.plugins.android.generation2 - android-maven-plugin - 3.8.0 - - - 14 - - true - - true - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.9 - - - com.google.android:android - - bin - - com.android.ide.eclipse.adt.ANDROID_FRAMEWORK - - - com.android.ide.eclipse.adt.AndroidNature - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - com.android.ide.eclipse.adt.PreCompilerBuilder - com.android.ide.eclipse.adt.ApkBuilder - - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9 - - - attach-javadocs - - jar - - - - - - - \ No newline at end of file diff --git a/src/main/java/cn/trinea/android/common/util/HttpUtils.java b/src/main/java/cn/trinea/android/common/util/HttpUtils.java index 64b5957..534f212 100644 --- a/src/main/java/cn/trinea/android/common/util/HttpUtils.java +++ b/src/main/java/cn/trinea/android/common/util/HttpUtils.java @@ -23,7 +23,8 @@ * Http get, you can also use {@link HttpCache} *
    • {@link #httpGet(HttpRequest)} http get synchronous
    • *
    • {@link #httpGet(String)} http get synchronous
    • - *
    • {@link #httpGetString(String)} http get synchronous, response is String
    • + *
    • {@link #httpGetString(String)} http get synchronous, response is + * String
    • *
    • {@link #httpGet(HttpRequest, HttpListener)} http get asynchronous
    • *
    • {@link #httpGet(String, HttpListener)} http get asynchronous
    • *
    @@ -43,7 +44,7 @@ *
  • {@link #appendParaToUrl(String, String, String)}
  • *
  • {@link #parseGmtTime(String)}
  • * - * + * * @author Trinea 2013-5-12 */ public class HttpUtils { @@ -51,11 +52,11 @@ public class HttpUtils { /** url and para separator **/ public static final String URL_AND_PARA_SEPARATOR = "?"; /** parameters separator **/ - public static final String PARAMETERS_SEPARATOR = "&"; + public static final String PARAMETERS_SEPARATOR = "&"; /** paths separator **/ - public static final String PATHS_SEPARATOR = "/"; + public static final String PATHS_SEPARATOR = "/"; /** equal sign **/ - public static final String EQUAL_SIGN = "="; + public static final String EQUAL_SIGN = "="; private HttpUtils() { throw new AssertionError(); @@ -67,7 +68,7 @@ private HttpUtils() { *
  • use gzip compression default
  • *
  • use bufferedReader to improve the reading speed
  • * - * + * * @param request * @return the response of the url, if null represents http error */ @@ -83,7 +84,7 @@ public static HttpResponse httpGet(HttpRequest request) { try { HttpResponse response = new HttpResponse(request.getUrl()); // default gzip encode - con = (HttpURLConnection)url.openConnection(); + con = (HttpURLConnection) url.openConnection(); setURLConnection(request, con); input = new BufferedReader(new InputStreamReader(con.getInputStream())); StringBuilder sb = new StringBuilder(); @@ -102,7 +103,8 @@ public static HttpResponse httpGet(HttpRequest request) { } finally { // close buffered IOUtils.closeQuietly(input); - // disconnecting releases the resources held by a connection so they may be closed or reused + // disconnecting releases the resources held by a connection so they may be + // closed or reused if (con != null) { con.disconnect(); } @@ -113,7 +115,7 @@ public static HttpResponse httpGet(HttpRequest request) { /** * http get synchronous - * + * * @param httpUrl * @return the response of the url, if null represents http error * @see HttpUtils#httpGet(HttpRequest) @@ -124,7 +126,7 @@ public static HttpResponse httpGet(String httpUrl) { /** * http get synchronous - * + * * @param request * @return the content of the url, if null represents http error * @see HttpUtils#httpGet(HttpRequest) @@ -136,7 +138,7 @@ public static String httpGetString(HttpRequest request) { /** * http get synchronous - * + * * @param httpUrl * @return the content of the url, if null represents http error * @see HttpUtils#httpGet(HttpRequest) @@ -150,12 +152,14 @@ public static String httpGetString(String httpUrl) { * http get asynchronous *
      *
    • It gets data from network asynchronous.
    • - *
    • If you want get data synchronous, use {@link #httpGet(HttpRequest)} or {@link #httpGetString(HttpRequest)}
    • + *
    • If you want get data synchronous, use {@link #httpGet(HttpRequest)} or + * {@link #httpGetString(HttpRequest)}
    • *
    - * + * * @param url - * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do - * something + * @param listener listener which can do something before or after HttpGet. this + * can be null if you not want to do + * something */ public static void httpGet(String url, HttpListener listener) { new HttpStringAsyncTask(listener).execute(url); @@ -165,13 +169,15 @@ public static void httpGet(String url, HttpListener listener) { * http get asynchronous *
      *
    • It gets data or network asynchronous.
    • - *
    • If you want get data synchronous, use {@link HttpCache#httpGet(HttpRequest)} or + *
    • If you want get data synchronous, use + * {@link HttpCache#httpGet(HttpRequest)} or * {@link HttpCache#httpGetString(HttpRequest)}
    • *
    - * + * * @param request - * @param listener listener which can do something before or after HttpGet. this can be null if you not want to do - * something + * @param listener listener which can do something before or after HttpGet. this + * can be null if you not want to do + * something */ public static void httpGet(HttpRequest request, HttpListener listener) { new HttpRequestAsyncTask(listener).execute(request); @@ -183,7 +189,7 @@ public static void httpGet(HttpRequest request, HttpListener listener) { *
  • use gzip compression default
  • *
  • use bufferedReader to improve the reading speed
  • * - * + * * @param httpUrl * @param paras * @return the response of the url, if null represents http error @@ -200,7 +206,7 @@ public static HttpResponse httpPost(HttpRequest request) { try { HttpResponse response = new HttpResponse(request.getUrl()); // default gzip encode - con = (HttpURLConnection)url.openConnection(); + con = (HttpURLConnection) url.openConnection(); setURLConnection(request, con); con.setRequestMethod("POST"); con.setDoOutput(true); @@ -225,7 +231,8 @@ public static HttpResponse httpPost(HttpRequest request) { } finally { // close buffered IOUtils.closeQuietly(input); - // disconnecting releases the resources held by a connection so they may be closed or reused + // disconnecting releases the resources held by a connection so they may be + // closed or reused if (con != null) { con.disconnect(); } @@ -236,7 +243,7 @@ public static HttpResponse httpPost(HttpRequest request) { /** * http post - * + * * @param httpUrl * @return the response of the url, if null represents http error * @see HttpUtils#httpPost(HttpRequest) @@ -247,7 +254,7 @@ public static HttpResponse httpPost(String httpUrl) { /** * http post - * + * * @param httpUrl * @return the content of the url, if null represents http error * @see HttpUtils#httpPost(HttpRequest) @@ -259,10 +266,11 @@ public static String httpPostString(String httpUrl) { /** * http post - * + * * @param httpUrl - * @param parasMap paras map, key is para name, value is para value. will be transfrom to String by - * {@link HttpUtils#joinParas(Map)} + * @param parasMap paras map, key is para name, value is para value. will be + * transfrom to String by + * {@link HttpUtils#joinParas(Map)} * @return the content of the url, if null represents http error * @see HttpUtils#httpPost(HttpRequest) */ @@ -273,15 +281,15 @@ public static String httpPostString(String httpUrl, Map parasMap /** * join url and paras - * + * *
          * getUrlWithParas(null, {(a, b)})                        =   "?a=b";
          * getUrlWithParas("baidu.com", {})                       =   "baidu.com";
          * getUrlWithParas("baidu.com", {(a, b), (i, j)})         =   "baidu.com?a=b&i=j";
          * getUrlWithParas("baidu.com", {(a, b), (i, j), (c, d)}) =   "baidu.com?a=b&i=j&c=d";
          * 
    - * - * @param url url + * + * @param url url * @param parasMap paras map, key is para name, value is para value * @return if url is null, process it as empty string */ @@ -296,7 +304,7 @@ public static String getUrlWithParas(String url, Map parasMap) { /** * join url and encoded paras - * + * * @param url * @param parasMap * @return @@ -314,9 +322,10 @@ public static String getUrlWithValueEncodeParas(String url, Map /** * join paras - * + * * @param parasMap paras map, key is para name, value is para value - * @return join key and value with {@link #EQUAL_SIGN}, join keys with {@link #PARAMETERS_SEPARATOR} + * @return join key and value with {@link #EQUAL_SIGN}, join keys with + * {@link #PARAMETERS_SEPARATOR} */ public static String joinParas(Map parasMap) { if (parasMap == null || parasMap.size() == 0) { @@ -326,7 +335,7 @@ public static String joinParas(Map parasMap) { StringBuilder paras = new StringBuilder(); Iterator> ite = parasMap.entrySet().iterator(); while (ite.hasNext()) { - Map.Entry entry = (Map.Entry)ite.next(); + Map.Entry entry = (Map.Entry) ite.next(); paras.append(entry.getKey()).append(EQUAL_SIGN).append(entry.getValue()); if (ite.hasNext()) { paras.append(PARAMETERS_SEPARATOR); @@ -337,7 +346,7 @@ public static String joinParas(Map parasMap) { /** * join paras with encoded value - * + * * @param parasMap * @return * @see #joinParas(Map) @@ -349,7 +358,7 @@ public static String joinParasWithEncodedValue(Map parasMap) { Iterator> ite = parasMap.entrySet().iterator(); try { while (ite.hasNext()) { - Map.Entry entry = (Map.Entry)ite.next(); + Map.Entry entry = (Map.Entry) ite.next(); paras.append(entry.getKey()).append(EQUAL_SIGN).append(StringUtils.utf8Encode(entry.getValue())); if (ite.hasNext()) { paras.append(PARAMETERS_SEPARATOR); @@ -364,7 +373,7 @@ public static String joinParasWithEncodedValue(Map parasMap) { /** * append a key and value pair to url - * + * * @param url * @param paraKey * @param paraValue @@ -385,11 +394,11 @@ public static String appendParaToUrl(String url, String paraKey, String paraValu } private static final SimpleDateFormat GMT_FORMAT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", - Locale.ENGLISH); + Locale.ENGLISH); /** * parse gmt time to long - * + * * @param gmtTime likes Thu, 11 Apr 2013 10:20:30 GMT * @return -1 represents exception otherwise time in milliseconds */ @@ -404,8 +413,8 @@ public static long parseGmtTime(String gmtTime) { /** * set HttpRequest to HttpURLConnection - * - * @param request source request + * + * @param request source request * @param urlConnection destin url connection */ private static void setURLConnection(HttpRequest request, HttpURLConnection urlConnection) { @@ -424,27 +433,37 @@ private static void setURLConnection(HttpRequest request, HttpURLConnection urlC /** * set HttpURLConnection property - * + * * @param requestProperties * @param urlConnection */ public static void setURLConnection(Map requestProperties, HttpURLConnection urlConnection) { - if (MapUtils.isEmpty(requestProperties) || urlConnection == null) { + if (urlConnection == null) { return; } - for (Map.Entry entry : requestProperties.entrySet()) { - if (!StringUtils.isEmpty(entry.getKey())) { - urlConnection.setRequestProperty(entry.getKey(), entry.getValue()); + boolean hasUserAgent = false; + if (!MapUtils.isEmpty(requestProperties)) { + for (Map.Entry entry : requestProperties.entrySet()) { + if (!StringUtils.isEmpty(entry.getKey())) { + urlConnection.setRequestProperty(entry.getKey(), entry.getValue()); + if ("User-Agent".equalsIgnoreCase(entry.getKey())) { + hasUserAgent = true; + } + } } } + if (!hasUserAgent) { + urlConnection.setRequestProperty("User-Agent", + "Mozilla/5.0 (Linux; Android 10; Android Demo) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Mobile Safari/537.36"); + } } /** * set HttpURLConnection to HttpResponse - * + * * @param urlConnection source url connection - * @param response destin response + * @param response destin response */ private static void setHttpResponse(HttpURLConnection urlConnection, HttpResponse response) { if (response == null || urlConnection == null) { @@ -461,7 +480,7 @@ private static void setHttpResponse(HttpURLConnection urlConnection, HttpRespons /** * AsyncTask to get data by String url - * + * * @author Trinea 2013-11-15 */ private static class HttpStringAsyncTask extends AsyncTask { @@ -494,7 +513,7 @@ protected void onPostExecute(HttpResponse httpResponse) { /** * AsyncTask to get data by HttpRequest - * + * * @author Trinea 2013-11-15 */ private static class HttpRequestAsyncTask extends AsyncTask { @@ -527,7 +546,7 @@ protected void onPostExecute(HttpResponse httpResponse) { /** * HttpListener, can do something before or after HttpGet - * + * * @author Trinea 2013-11-15 */ public static abstract class HttpListener { @@ -538,16 +557,18 @@ public static abstract class HttpListener { *
  • this can be null if you not want to do something
  • * */ - protected void onPreGet() {} + protected void onPreGet() { + } /** * Runs on the UI thread after httpGet. The httpResponse is returned by httpGet. *
      *
    • this can be null if you not want to do something
    • *
    - * + * * @param httpResponse get by the url */ - protected void onPostGet(HttpResponse httpResponse) {} + protected void onPostGet(HttpResponse httpResponse) { + } } } From 56be038544ef00e02c86052ce16398dda1987a4d Mon Sep 17 00:00:00 2001 From: Trinea Date: Thu, 26 Mar 2026 01:04:15 +0800 Subject: [PATCH 241/241] Delete some files --- .gitignore | 47 ----------------------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 27222b9..0000000 --- a/.gitignore +++ /dev/null @@ -1,47 +0,0 @@ -# built application files -# *.apk -*.ap_ -lint.xml - -# files for the dex VM -*.dex - -# Java class files -*.class - -# generated files -bin/ -gen/ - -# maven -target/ - -# Local configuration file (sdk path, etc) -local.properties - -# Windows thumbnail db -Thumbs.db - -# OSX files -.DS_Store - -# Eclipse project files -.classpath -.project -.settings - -# Android Studio -.idea -#.idea/workspace.xml - remove # and delete .idea if it better suit your needs. -build/ -.gradle - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Other -.svn -