From 0078755f817d088011e05f72585c588217b60a76 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Fri, 31 Jul 2015 12:01:38 +0800 Subject: [PATCH 001/106] update README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index de36b9c..03a044c 100644 --- a/README.md +++ b/README.md @@ -6,17 +6,17 @@ Less code, more efficient for android Main freatures ------ -* support many more simpler method than android +* support more effective methods than android * high performence -* easy integrate -* very small (less than 100k, only 60k+ now) +* easy integration +* small size (less than 100k, only 60k+ now) * open source Gradle ------ core version: ```groovy -compile('com.jayfeng:lesscode-core:0.4.2') { +compile('com.jayfeng:lesscode-core:0.6.4') { // exclusion for update the android support jar (for example, you can use the appcompat-v7 in your project) exclude group: 'com.android.support', module: 'support-v4' } From 3e94cdeffbfc84ca14fa2086251950eb2783b9ad Mon Sep 17 00:00:00 2001 From: fengjian Date: Thu, 20 Aug 2015 20:57:28 +0800 Subject: [PATCH 002/106] fix the item null exception --- lesscode-core/build.gradle | 2 +- .../com/jayfeng/lesscode/core/AdapterLess.java | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index ccd6484..a5dfad1 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.6.4" // #CONFIG# // project version +version = "0.6.5" // #CONFIG# // project version android { compileSdkVersion 21 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java index bb9a09e..62e2273 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java @@ -31,7 +31,10 @@ public RecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { @Override public void onBindViewHolder(RecycleViewHolder viewHolder, int position) { - T t = list.get(position); + T t = null; + if (position < list.size()) { + t = list.get(position); + } recycleCallBack.onBindViewHolder(position, viewHolder, t); } @@ -77,12 +80,14 @@ public View getView(int position, View convertView, ViewGroup parent) { if (null == convertView) { holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(layoutId, null); - ; convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } - T t = getItem(position); + T t = null; + if (position < list.size()) { + t = getItem(position); + } return callBack.getView(position, convertView, holder, t); } @@ -142,7 +147,10 @@ public View getView(int position, View convertView, ViewGroup parent) { } else { holders[i] = (ViewHolder) convertView.getTag(); } - T t = getItem(position); + T t = null; + if (position < list.size()) { + t = getItem(position); + } return fullCallBack.getView(position, convertView, holders[i], t); } From bacbe52a5dc25cda7f2048c4ae0d6dd545f5d165 Mon Sep 17 00:00:00 2001 From: fengjian Date: Sat, 10 Oct 2015 15:11:13 +0800 Subject: [PATCH 003/106] update env and readme doc --- README.md | 9 ++++----- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 03a044c..1bdcb89 100644 --- a/README.md +++ b/README.md @@ -4,19 +4,18 @@ Less code, more efficient for android > Author weibo:冯建V    mail:673592063@qq.com    QQ:673592063 -Main freatures +Features ------ * support more effective methods than android * high performence * easy integration -* small size (less than 100k, only 60k+ now) +* small size (less than 100k, only 80k+ now) * open source Gradle ------ -core version: ```groovy -compile('com.jayfeng:lesscode-core:0.6.4') { +compile('com.jayfeng:lesscode-core:0.6.5') { // exclusion for update the android support jar (for example, you can use the appcompat-v7 in your project) exclude group: 'com.android.support', module: 'support-v4' } @@ -66,4 +65,4 @@ ActivityLess.$noTitle(this); ActivityLess.$fullScreen(this); ``` -See more details on the [WIKI](https://github.com/openproject/LessCode/wiki) +See more details on the [Wiki](https://github.com/openproject/LessCode/wiki) diff --git a/build.gradle b/build.gradle index cc7daad..ba4f65c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:1.3.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0' classpath 'com.github.dcendents:android-maven-plugin:1.2' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c71e76..2a6b295 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-all.zip From 39393fec16c56d49e878fb5c86acab1dc14efd3c Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Wed, 28 Oct 2015 13:39:43 +0800 Subject: [PATCH 004/106] fix the network online impl --- lesscode-core/build.gradle | 2 +- .../main/java/com/jayfeng/lesscode/core/NetworkLess.java | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index a5dfad1..9d56e5d 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.6.5" // #CONFIG# // project version +version = "0.6.6" // #CONFIG# // project version android { compileSdkVersion 21 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java index 3e98b21..acfa56e 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java @@ -12,8 +12,13 @@ public static enum NetworkType { } public static boolean $online() { - NetworkType networkType = $type(); - return networkType != NetworkType.NONE; + ConnectivityManager manager = (ConnectivityManager) $.sAppContext + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = manager.getActiveNetworkInfo(); + if (networkInfo != null) { + return networkInfo.isAvailable(); + } + return false; } public static NetworkType $type() { From 097b5f7a24b68d4ef69ed373edf86a2982d2449f Mon Sep 17 00:00:00 2001 From: think <673592063@qq.com> Date: Thu, 29 Oct 2015 00:27:44 +0800 Subject: [PATCH 005/106] fix the android-maven-gradle-plugin --- app-ref-lesscode-core/build.gradle | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app-ref-lesscode-core/build.gradle b/app-ref-lesscode-core/build.gradle index 232cf73..33b7040 100644 --- a/app-ref-lesscode-core/build.gradle +++ b/app-ref-lesscode-core/build.gradle @@ -22,7 +22,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.1.1' - compile('com.jayfeng:lesscode-core:0.6') { + compile('com.jayfeng:lesscode-core:0.6.6') { exclude group: 'com.android.support', module: 'support-v4' } } diff --git a/build.gradle b/build.gradle index ba4f65c..7508bc5 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:1.3.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0' - classpath 'com.github.dcendents:android-maven-plugin:1.2' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } From b3fe871fb001ca426f2f0286482baa19c2d49e42 Mon Sep 17 00:00:00 2001 From: fengjian Date: Thu, 29 Oct 2015 13:48:11 +0800 Subject: [PATCH 006/106] add apache license --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 1bdcb89..7d0995c 100644 --- a/README.md +++ b/README.md @@ -66,3 +66,21 @@ ActivityLess.$fullScreen(this); ``` See more details on the [Wiki](https://github.com/openproject/LessCode/wiki) + +License +------- +``` +Copyright (C) LessCode Open Source Project + +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. +``` From 05332ea697595ed935caf2ddf2943490b9faab11 Mon Sep 17 00:00:00 2001 From: fengjian Date: Thu, 29 Oct 2015 13:50:35 +0800 Subject: [PATCH 007/106] update readme --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7d0995c..40639b8 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,9 @@ Features Gradle ------ ```groovy -compile('com.jayfeng:lesscode-core:0.6.5') { - // exclusion for update the android support jar (for example, you can use the appcompat-v7 in your project) +compile('com.jayfeng:lesscode-core:0.6.6') { + // exclusion for update the android support jar + // for example, you can use the appcompat-v7 in your project exclude group: 'com.android.support', module: 'support-v4' } ``` From 25435b9bef6b9950482baf66aa2a1d011caa936e Mon Sep 17 00:00:00 2001 From: fengjian Date: Tue, 3 Nov 2015 09:43:35 +0800 Subject: [PATCH 008/106] add the download url error check --- app-ref-lesscode-core/build.gradle | 2 +- lesscode-core/build.gradle | 2 +- .../java/com/jayfeng/lesscode/core/UpdateService.java | 10 ++++++++++ lesscode-core/src/main/res/values/strings.xml | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app-ref-lesscode-core/build.gradle b/app-ref-lesscode-core/build.gradle index 33b7040..1100826 100644 --- a/app-ref-lesscode-core/build.gradle +++ b/app-ref-lesscode-core/build.gradle @@ -22,7 +22,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.1.1' - compile('com.jayfeng:lesscode-core:0.6.6') { + compile('com.jayfeng:lesscode-core:0.6.7') { exclude group: 'com.android.support', module: 'support-v4' } } diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index 9d56e5d..c2a43e9 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.6.6" // #CONFIG# // project version +version = "0.6.7" // #CONFIG# // project version android { compileSdkVersion 21 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java index 6ff3885..812a8e0 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java @@ -27,6 +27,7 @@ public class UpdateService extends Service { private static final int DOWNLOAD_STATE_START = 1; private static final int DOWNLOAD_STATE_INSTALL = 2; private static final int DOWNLOAD_STATE_ERROR_SDCARD = 3; + private static final int DOWNLOAD_STATE_ERROR_URL = 4; private static final int NOTIFICATION_ID = 3956; private NotificationManager mNotificationManager = null; @@ -59,6 +60,9 @@ public boolean handleMessage(Message msg) { case DOWNLOAD_STATE_ERROR_SDCARD: Toast.makeText(getApplicationContext(), R.string.less_app_download_error_sdcard, Toast.LENGTH_LONG).show(); break; + case DOWNLOAD_STATE_ERROR_URL: + Toast.makeText(getApplicationContext(), R.string.less_app_download_error_url, Toast.LENGTH_LONG).show(); + break; default: break; } @@ -103,6 +107,11 @@ public int onStartCommand(Intent intent, int flags, int startId) { mDownloadSDPath = $.sDownloadSDPath; } + if (TextUtils.isEmpty(mDownloadUrl)) { + sendMessage(DOWNLOAD_STATE_ERROR_URL); + return super.onStartCommand(intent, flags, startId); + } + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { mDestDir = new File(Environment.getExternalStorageDirectory().getPath() + "/" + mDownloadSDPath); @@ -206,6 +215,7 @@ public void run() { if (mDestDir.exists() || mDestDir.mkdirs()) { mDestFile = new File(mDestDir.getPath() + "/" + URLEncoder.encode(mDownloadUrl)); + if (mDestFile.exists() && mDestFile.isFile() && checkApkFile(mDestFile.getPath())) { diff --git a/lesscode-core/src/main/res/values/strings.xml b/lesscode-core/src/main/res/values/strings.xml index a4d2128..c693493 100644 --- a/lesscode-core/src/main/res/values/strings.xml +++ b/lesscode-core/src/main/res/values/strings.xml @@ -9,4 +9,5 @@ 开始下载 准备安装 未找到SD卡,无法下载。 + 下载地址错误,无法下载。 \ No newline at end of file From 4099992724bbb077c1697fb0af511babde1b548d Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Sat, 28 Nov 2015 10:16:56 +0800 Subject: [PATCH 009/106] clean some code and add comments - part 1 --- README.md | 1 + build.gradle | 2 +- .../jayfeng/lesscode/core/ActivityLess.java | 20 + .../jayfeng/lesscode/core/AdapterLess.java | 71 +++- .../com/jayfeng/lesscode/core/CacheLess.java | 32 +- .../com/jayfeng/lesscode/core/EncodeLess.java | 3 + .../com/jayfeng/lesscode/core/FileLess.java | 19 +- .../jayfeng/lesscode/core/KeyBoardLess.java | 13 + .../com/jayfeng/lesscode/core/LogLess.java | 20 + .../jayfeng/lesscode/core/NetworkLess.java | 14 + .../jayfeng/lesscode/core/PackageLess.java | 394 ------------------ .../jayfeng/lesscode/core/ResourceLess.java | 10 + .../jayfeng/lesscode/core/SerializeLess.java | 15 + .../com/jayfeng/lesscode/core/ShellLess.java | 130 ------ .../jayfeng/lesscode/core/StorageLess.java | 4 + .../com/jayfeng/lesscode/core/ToastLess.java | 3 + .../com/jayfeng/lesscode/core/UpdateLess.java | 3 + .../jayfeng/lesscode/core/UpdateService.java | 9 + .../com/jayfeng/lesscode/core/ViewLess.java | 9 + 19 files changed, 233 insertions(+), 539 deletions(-) delete mode 100644 lesscode-core/src/main/java/com/jayfeng/lesscode/core/PackageLess.java delete mode 100644 lesscode-core/src/main/java/com/jayfeng/lesscode/core/ShellLess.java diff --git a/README.md b/README.md index 40639b8..89292b6 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ compile('com.jayfeng:lesscode-core:0.6.6') { // exclusion for update the android support jar // for example, you can use the appcompat-v7 in your project exclude group: 'com.android.support', module: 'support-v4' + exclude group: 'com.android.support', module: 'recyclerview-v7' } ``` diff --git a/build.gradle b/build.gradle index 7508bc5..dfd6d54 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.3.0' + classpath 'com.android.tools.build:gradle:1.5.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' // NOTE: Do not place your application dependencies here; they belong diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ActivityLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ActivityLess.java index 9e8afce..fe9af80 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ActivityLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ActivityLess.java @@ -6,18 +6,34 @@ public class ActivityLess { + /** + * 第一次和第二次的退出间隔时间基准 + */ private static final long EXIT_TWICE_INTERVAL = 2000; private static long mExitTime = 0; + /** + * 设置Activity无标题 + * @param activity + */ public static void $noTitle(Activity activity) { activity.requestWindowFeature(Window.FEATURE_NO_TITLE); } + /** + * 设置Activity全屏 + * @param activity + */ public static void $fullScreen(Activity activity) { $fullScreen(activity, true); } + /** + * 根据参数设置Activity是否全屏 + * @param activity + * @param fullScreen + */ public static void $fullScreen(Activity activity, boolean fullScreen) { if (fullScreen) { activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); @@ -31,6 +47,10 @@ public class ActivityLess { } + /** + * 第二次按退出则返回true,否则返回false + * @return + */ public static boolean $exitTwice() { long newExitTime = System.currentTimeMillis(); if (newExitTime - mExitTime > EXIT_TWICE_INTERVAL) { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java index 62e2273..a8b24ca 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java @@ -14,8 +14,25 @@ import java.util.List; +/** + * 适配器简化相关的工具类 + * 常用于:ListView,ViewPager,RecyclerView + */ public class AdapterLess { + /** + * 创建一个RecyclerView.Adapter + * 主要是: + * 1. 抽象出重复代码,默认实现一些常规代码 + * 2. 封装了RecyclerViewHolder + * 3. 自动传递Model给getView + * @param context + * @param list model的列表 + * @param layoutId 布局xml的id + * @param recycleCallBack 包含nBindViewHolder方法的回调 + * @param + * @return + */ public static RecyclerView.Adapter $recycle(final Context context, final List list, final int layoutId, @@ -49,6 +66,18 @@ public int getItemCount() { return result; } + /** + * 创建BaseAdapter + * 1. 抽象出重复代码,默认实现一些常规代码 + * 2. 封装了ViewHolder + * 3. 自动传递Model给getView + * @param context + * @param list model的列表 + * @param layoutId 布局xml的id + * @param callBack 包含getView方法的回调 + * @param + * @return + */ public static BaseAdapter $base(final Context context, final List list, final int layoutId, @@ -96,6 +125,18 @@ public View getView(int position, View convertView, ViewGroup parent) { } + /** + * 同上,也是创建了BaseAdapter + * 支持多布局,也多增加了两个回调方法,便于自定义: + * 1. getViewType + * 2. isEnabled + * @param context + * @param list model列表 + * @param layoutIds 布局xml的id数组 + * @param fullCallBack 包含getView,getViewType,isEnabled方法的回调 + * @param + * @return + */ public static BaseAdapter $base(final Context context, final List list, final int[] layoutIds, @@ -158,6 +199,19 @@ public View getView(int position, View convertView, ViewGroup parent) { return result; } + /** + * 创建PagerAdapter + * 主要是: + * 1. 抽象出重复代码,默认实现一些常规代码 + * 2. 封装了instantiateItem + * 3. 自动传递Model给getView + * @param context + * @param list + * @param layoutId + * @param pageCallBack + * @param + * @return + */ public static PagerAdapter $pager(final Context context, final List list, final int layoutId, @@ -259,9 +313,22 @@ public interface FullFragmentPagerCallBack { } + /** + * ViewHolder类相当于一个享元模式的工厂类 + * 主要用了以下优化点: + * 1. 缓存了findViewById的view,如果已经创建,则直接返回,提高了性能 + * 2. 用SparseArray代替HashMap优化性能 + */ public static class ViewHolder { - public SparseArray views = new SparseArray(); - + public SparseArray views = new SparseArray<>(); + + /** + * 从缓存里获取viewId对应的View + * @param convertView + * @param viewId + * @param + * @return + */ public T $view(View convertView, int viewId) { View v = views.get(viewId); if (null == v) { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/CacheLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/CacheLess.java index 93d2a80..3067241 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/CacheLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/CacheLess.java @@ -3,8 +3,18 @@ import java.io.File; import java.io.IOException; +/** + * 缓存相关的工具类 + * 常用于缓存网络请求返回的json保存到本地的缓存策略 + */ public class CacheLess { + /** + * 根据key查找缓存的内容 + * @param key + * @param expireTime + * @return + */ public static String $get(String key, long expireTime) { String result = null; @@ -17,19 +27,16 @@ public class CacheLess { if (file.exists() && file.isFile()) { long storageTime = System.currentTimeMillis() - file.lastModified(); - NetworkLess.NetworkType networkType = NetworkLess.$type(); + boolean online = NetworkLess.$online(); - //1. in case the system time is incorrect (the time is turn back long ago) - //2. when the network is invalid, you can only read the cache - if (networkType != NetworkLess.NetworkType.NONE && storageTime < 0) { + // 如果系统时间不对(被调回很久之前),storageTime和expireTime的比较就没有意义了 + // 在这种情况下,如果有网就请求新内容,否则才考虑缓存 + if (online && storageTime < 0) { return null; } - if(networkType == NetworkLess.NetworkType.WIFI_FAST && storageTime > expireTime) { - return null; - } else if ((networkType == NetworkLess.NetworkType.MOBILE_FAST - || networkType == NetworkLess.NetworkType.MOBILE_MIDDLE - || networkType == NetworkLess.NetworkType.MOBILE_SLOW) - && storageTime > expireTime) { + // 如果有网的情况下,且缓存已经过期,则返回null + // 在无网的情况下, 即使过期也返回缓存 + if (online && storageTime > expireTime) { return null; } try { @@ -41,6 +48,11 @@ public class CacheLess { return result; } + /** + * 设置字符串为特定key的缓存,保存到本地 + * @param key + * @param data + */ public static void $set(String key, String data) { File cacheDir = $.sAppContext.getCacheDir(); if (StorageLess.Sdcard.$ready()) { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/EncodeLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/EncodeLess.java index e51033b..8dd81c0 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/EncodeLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/EncodeLess.java @@ -4,6 +4,9 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +/** + * 加解密相关的工具类 + */ public class EncodeLess { public static String $md5(String string) { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/FileLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/FileLess.java index 4b4f203..27f7971 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/FileLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/FileLess.java @@ -9,10 +9,16 @@ import java.io.InputStream; import java.io.InputStreamReader; +/** + * 文件操作相关的工具类 + */ public class FileLess { /** - * read content from file + * 读取文件为字符串 + * @param file 文件 + * @return 文件内容字符串 + * @throws IOException */ public static String $read(File file) throws IOException { String text = null; @@ -29,7 +35,10 @@ public class FileLess { } /** - * read content from inputstream + * 读取输入流为字符串,最常见的是网络请求 + * @param is 输入流 + * @return 输入流内容字符串 + * @throws IOException */ public static String $read(InputStream is) throws IOException { StringBuffer strbuffer = new StringBuffer(); @@ -48,6 +57,12 @@ public class FileLess { return strbuffer.toString(); } + /** + * 把字符串写入到文件中 + * @param file 被写入的目标文件 + * @param str 要写入的字符串内容 + * @throws IOException + */ public static void $write(File file, String str) throws IOException { DataOutputStream out = null; try { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/KeyBoardLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/KeyBoardLess.java index 43ae197..ceebc8e 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/KeyBoardLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/KeyBoardLess.java @@ -4,8 +4,16 @@ import android.view.View; import android.view.inputmethod.InputMethodManager; +/** + * 输入法相关的工具类 + */ public class KeyBoardLess { + /** + * 显示输入法 + * @param context + * @param view + */ public static void $show(Context context, View view) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); @@ -13,6 +21,11 @@ public class KeyBoardLess { imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); } + /** + * 隐藏输入法 + * @param context + * @param view + */ public static void $hide(Context context, View view) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java index 87e55f4..3b4252e 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java @@ -15,30 +15,50 @@ public class LogLess { public static final boolean DEBUG_TAG_LOG = Log.isLoggable($.sTAG, Log.VERBOSE); + /** + * verbose + * @param str + */ public static void v(String str) { if ($.sDebug || DEBUG_TAG_LOG) { Log.v(getTag(), buildLogString(str)); } } + /** + * debug + * @param str + */ public static void $d(String str) { if ($.sDebug || DEBUG_TAG_LOG) { Log.d(getTag(), buildLogString(str)); } } + /** + * info + * @param str + */ public static void $i(String str) { if ($.sDebug || DEBUG_TAG_LOG) { Log.i(getTag(), buildLogString(str)); } } + /** + * warning + * @param str + */ public static void $w(String str) { if ($.sDebug || DEBUG_TAG_LOG) { Log.w(getTag(), buildLogString(str)); } } + /** + * error + * @param str + */ public static void $e(String str) { if ($.sDebug || DEBUG_TAG_LOG) { Log.e(getTag(), buildLogString(str)); diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java index acfa56e..4436c2b 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java @@ -5,12 +5,22 @@ import android.net.NetworkInfo; import android.telephony.TelephonyManager; +/** + * 手机网络相关的工具类 + */ public class NetworkLess { + /** + * 定义网络类型的枚举分类 + */ public static enum NetworkType { WIRED_FAST, WIFI_FAST, MOBILE_FAST, MOBILE_MIDDLE, MOBILE_SLOW, NONE, } + /** + * 是否网络在线 + * @return + */ public static boolean $online() { ConnectivityManager manager = (ConnectivityManager) $.sAppContext .getSystemService(Context.CONNECTIVITY_SERVICE); @@ -21,6 +31,10 @@ public static enum NetworkType { return false; } + /** + * 当期的网络类型 + * @return + */ public static NetworkType $type() { ConnectivityManager manager = (ConnectivityManager) $.sAppContext .getSystemService(Context.CONNECTIVITY_SERVICE); diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/PackageLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/PackageLess.java deleted file mode 100644 index 3b3e710..0000000 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/PackageLess.java +++ /dev/null @@ -1,394 +0,0 @@ -package com.jayfeng.lesscode.core; - -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.net.Uri; -import android.util.Log; - -import java.io.File; - -public class PackageLess { - - public static final String TAG = "PackageLess"; - - 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 INSTALL_SUCCEEDED = 1; - - public static final int INSTALL_FAILED_ALREADY_EXISTS = -1; - - public static final int INSTALL_FAILED_INVALID_APK = -2; - - public static final int INSTALL_FAILED_INVALID_URI = -3; - - public static final int INSTALL_FAILED_INSUFFICIENT_STORAGE = -4; - - public static final int INSTALL_FAILED_DUPLICATE_PACKAGE = -5; - - public static final int INSTALL_FAILED_NO_SHARED_USER = -6; - - public static final int INSTALL_FAILED_UPDATE_INCOMPATIBLE = -7; - - public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8; - - public static final int INSTALL_FAILED_MISSING_SHARED_LIBRARY = -9; - - public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10; - - public static final int INSTALL_FAILED_DEXOPT = -11; - - public static final int INSTALL_FAILED_OLDER_SDK = -12; - - public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13; - - public static final int INSTALL_FAILED_NEWER_SDK = -14; - - public static final int INSTALL_FAILED_TEST_ONLY = -15; - - public static final int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE = -16; - - public static final int INSTALL_FAILED_MISSING_FEATURE = -17; - - public static final int INSTALL_FAILED_CONTAINER_ERROR = -18; - - public static final int INSTALL_FAILED_INVALID_INSTALL_LOCATION = -19; - - public static final int INSTALL_FAILED_MEDIA_UNAVAILABLE = -20; - - public static final int INSTALL_FAILED_VERIFICATION_TIMEOUT = -21; - - public static final int INSTALL_FAILED_VERIFICATION_FAILURE = -22; - - public static final int INSTALL_FAILED_PACKAGE_CHANGED = -23; - - public static final int INSTALL_FAILED_UID_CHANGED = -24; - - public static final int INSTALL_PARSE_FAILED_NOT_APK = -100; - - public static final int INSTALL_PARSE_FAILED_BAD_MANIFEST = -101; - - public static final int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION = -102; - - public static final int INSTALL_PARSE_FAILED_NO_CERTIFICATES = -103; - - public static final int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES = -104; - - public static final int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING = -105; - - public static final int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME = -106; - - public static final int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID = -107; - - public static final int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED = -108; - - public static final int INSTALL_PARSE_FAILED_MANIFEST_EMPTY = -109; - - public static final int INSTALL_FAILED_INTERNAL_ERROR = -110; - - public static final int INSTALL_FAILED_OTHER = -1000000; - - public static final int DELETE_SUCCEEDED = 1; - - public static final int DELETE_FAILED_INTERNAL_ERROR = -1; - - public static final int DELETE_FAILED_DEVICE_POLICY_MANAGER = -2; - - public static final int DELETE_FAILED_INVALID_PACKAGE = -3; - - public static final int DELETE_FAILED_PERMISSION_DENIED = -4; - - public static final int install(Context context, String filePath) { - if (PackageLess.isSystemApplication(context) || ShellLess.checkRootPermission()) { - return installSilent(context, filePath); - } - return installNormal(context, filePath) ? INSTALL_SUCCEEDED : INSTALL_FAILED_INVALID_URI; - } - - public static boolean installNormal(Context context, String filePath) { - Intent i = new Intent(Intent.ACTION_VIEW); - File file = new File(filePath); - if (file == null || !file.exists() || !file.isFile() || file.length() <= 0) { - 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; - } - - public static int installSilent(Context context, String filePath) { - return installSilent(context, filePath, " -r " + getInstallLocationParams()); - } - - public static int installSilent(Context context, String filePath, String pmParams) { - if (filePath == null || filePath.length() == 0) { - return INSTALL_FAILED_INVALID_URI; - } - - File file = new File(filePath); - if (file == null || file.length() <= 0 || !file.exists() || !file.isFile()) { - return INSTALL_FAILED_INVALID_URI; - } - - /** - * 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 ") - .append(pmParams == null ? "" : pmParams).append(" ").append(filePath.replace(" ", "\\ ")); - ShellLess.CommandResult commandResult = ShellLess.execCommand(command.toString(), !isSystemApplication(context), true); - if (commandResult.successMsg != null - && (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()); - 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; - } - - public static final int uninstall(Context context, String packageName) { - if (isSystemApplication(context)) { - return uninstallSilent(context, packageName); - } - return uninstallNormal(context, packageName) ? DELETE_SUCCEEDED : DELETE_FAILED_INVALID_PACKAGE; - } - - 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; - } - - public static int uninstallSilent(Context context, String packageName) { - return uninstallSilent(context, packageName, true); - } - - 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(" ", "\\ ")); - ShellLess.CommandResult commandResult = ShellLess.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; - } - - public static boolean isSystemApplication(Context context) { - if (context == null) { - return false; - } - - return isSystemApplication(context, context.getPackageName()); - } - - public static boolean isSystemApplication(Context context, String packageName) { - if (context == null) { - return false; - } - - return isSystemApplication(context.getPackageManager(), packageName); - } - - public static boolean isSystemApplication(PackageManager packageManager, String packageName) { - if (packageManager == null || packageName == null || packageName.length() == 0) { - return false; - } - - try { - ApplicationInfo app = packageManager.getApplicationInfo(packageName, 0); - return (app != null && (app.flags & ApplicationInfo.FLAG_SYSTEM) > 0); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - return false; - } - - 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 (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - } - } - return -1; - } - - public static int getInstallLocation() { - ShellLess.CommandResult commandResult = ShellLess.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; - } - - private static String getInstallLocationParams() { - int location = getInstallLocation(); - switch (location) { - case APP_INSTALL_INTERNAL: - return "-f"; - case APP_INSTALL_EXTERNAL: - return "-s"; - } - return ""; - } -} diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ResourceLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ResourceLess.java index 458d7f1..1b04425 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ResourceLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ResourceLess.java @@ -5,11 +5,21 @@ public class ResourceLess { + /** + * 根据资源名称和类型,得到资源ID + * @param context + * @param resourceName + * @param type + * @return + */ public static int $id(Context context, String resourceName, TYPE type) { Resources resources = context.getResources(); return resources.getIdentifier(resourceName, type.getString(), context.getPackageName()); } + /** + * 定义资源枚举类型 + */ public enum TYPE { ATTR("attr"), ARRAY("array"), diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SerializeLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SerializeLess.java index fbf4ff2..274d2a3 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SerializeLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SerializeLess.java @@ -6,8 +6,17 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +/** + * 序列化相关的工具类 + */ public class SerializeLess { + /** + * 序列化对象到本地文件 + * @param path + * @param object + * @param + */ public static void $se(String path, T object) { ObjectOutputStream out = null; try { @@ -27,6 +36,12 @@ public class SerializeLess { } } + /** + * 从本地文件中解析出序列化对象 + * @param path + * @param + * @return + */ public static T $de(String path) { ObjectInputStream in = null; try { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ShellLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ShellLess.java deleted file mode 100644 index 42d215d..0000000 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ShellLess.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.jayfeng.lesscode.core; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.List; - -public class ShellLess { - - 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"; - - public static boolean checkRootPermission() { - return execCommand("echo root", true, false).result == 0; - } - - public static CommandResult execCommand(String command, boolean isRoot) { - return execCommand(new String[] {command}, isRoot, true); - } - - public static CommandResult execCommand(List commands, boolean isRoot) { - return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, true); - } - - public static CommandResult execCommand(String[] commands, boolean isRoot) { - return execCommand(commands, isRoot, true); - } - - public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) { - return execCommand(new String[] {command}, isRoot, isNeedResultMsg); - } - - 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(String[] commands, boolean isRoot, boolean isNeedResultMsg) { - int result = -1; - if (commands == null || commands.length == 0) { - return new CommandResult(result, null, null); - } - - Process process = null; - BufferedReader successResult = null; - BufferedReader errorResult = null; - StringBuilder successMsg = null; - StringBuilder errorMsg = null; - - DataOutputStream os = null; - try { - process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH); - os = new DataOutputStream(process.getOutputStream()); - for (String command : commands) { - if (command == null) { - continue; - } - - // donnot use os.writeBytes(commmand), avoid chinese charset error - os.write(command.getBytes()); - os.writeBytes(COMMAND_LINE_END); - os.flush(); - } - os.writeBytes(COMMAND_EXIT); - os.flush(); - - result = process.waitFor(); - // get command result - if (isNeedResultMsg) { - successMsg = new StringBuilder(); - errorMsg = new StringBuilder(); - successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); - errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); - String s; - while ((s = successResult.readLine()) != null) { - successMsg.append(s); - } - while ((s = errorResult.readLine()) != null) { - errorMsg.append(s); - } - } - } catch (IOException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (os != null) { - os.close(); - } - if (successResult != null) { - successResult.close(); - } - if (errorResult != null) { - errorResult.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - - if (process != null) { - process.destroy(); - } - } - return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null - : errorMsg.toString()); - } - - public static class CommandResult { - - /** result of command **/ - public int result; - /** success message of command result **/ - public String successMsg; - /** error message of command result **/ - public String errorMsg; - - public CommandResult(int result) { - this.result = result; - } - - public CommandResult(int result, String successMsg, String errorMsg) { - this.result = result; - this.successMsg = successMsg; - this.errorMsg = errorMsg; - } - } -} diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/StorageLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/StorageLess.java index b0207e3..245063f 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/StorageLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/StorageLess.java @@ -13,6 +13,10 @@ import java.util.ArrayList; import java.util.List; +/** + * 手机存储相关的工具类 + * 包括:手机内存,内置存储卡(Sdcard),外置存储卡(ExtSdcard) + */ public class StorageLess { public static class Phone { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ToastLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ToastLess.java index f8867e3..3b127ef 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ToastLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ToastLess.java @@ -3,6 +3,9 @@ import android.content.Context; import android.widget.Toast; +/** + * 简化Toast的工具类 + */ public class ToastLess { public static void $(Context context, String message) { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java index 4788716..1ea4f12 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java @@ -9,6 +9,9 @@ import org.json.JSONException; import org.json.JSONObject; +/** + * 检查更新工具类 + */ public class UpdateLess { /** diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java index 812a8e0..1f62347 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java @@ -156,6 +156,11 @@ public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } + /** + * 检查apk文件是否有效(是正确下载,没有损坏的) + * @param apkFilePath + * @return + */ public boolean checkApkFile(String apkFilePath) { boolean result; try { @@ -173,6 +178,10 @@ public boolean checkApkFile(String apkFilePath) { return result; } + /** + * 调用系统Intent安装apk包 + * @param apkFile + */ private void install(File apkFile) { Uri uri = Uri.fromFile(apkFile); Intent intent = new Intent(Intent.ACTION_VIEW); diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ViewLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ViewLess.java index d8ec878..0171876 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ViewLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ViewLess.java @@ -4,8 +4,17 @@ import android.app.Dialog; import android.view.View; +/** + * View相关工具类 + */ public class ViewLess { + /** + * *********************************************************** + * findViewById的一种更优雅的写法 + * 原理:泛型的类型推断 + * *********************************************************** + */ public static T $(Activity activity, int viewId) { return (T) activity.findViewById(viewId); } From 35b5dcd8bdaaee3b7b0335f95c2ca51db64ac6d6 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Sat, 28 Nov 2015 10:47:05 +0800 Subject: [PATCH 010/106] upgrade the tools version --- lesscode-core/build.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index c2a43e9..931a900 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -5,18 +5,18 @@ apply plugin: 'com.jfrog.bintray' version = "0.6.7" // #CONFIG# // project version android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 23 + buildToolsVersion "23.0.2" resourcePrefix "less_" // #CONFIG# // please remove this if you don't known it defaultConfig { minSdkVersion 8 - targetSdkVersion 21 + targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } @@ -24,8 +24,8 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:support-v4:22.2.1' - compile 'com.android.support:recyclerview-v7:22.2.1' + compile 'com.android.support:support-v4:23.1.1' + compile 'com.android.support:recyclerview-v7:23.1.1' } def siteUrl = 'https://github.com/openproject/LessCode' // #CONFIG# // project homepage From 4fa66fdaf7a5ce6b61325a8aa8ceef35dff1aec0 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Sat, 28 Nov 2015 10:51:33 +0800 Subject: [PATCH 011/106] support custom the http header for HttpLess --- lesscode-core/build.gradle | 2 +- .../com/jayfeng/lesscode/core/HttpLess.java | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index 931a900..ebaa681 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.6.7" // #CONFIG# // project version +version = "0.6.8" // #CONFIG# // project version android { compileSdkVersion 23 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java index e4e4892..21604e9 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java @@ -1,5 +1,7 @@ package com.jayfeng.lesscode.core; +import android.content.ContentValues; + import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; @@ -32,6 +34,10 @@ public class HttpLess { private static ExecutorService mExecutorService = Executors.newFixedThreadPool(4); public static String $get(String url) { + return $get(url, new ContentValues()); + } + + public static String $get(String url, ContentValues header) { InputStream is = null; try { URL u = new URL(url); @@ -40,6 +46,11 @@ public class HttpLess { conn.setConnectTimeout($.sConnectTimeOut); conn.setReadTimeout($.sReadTimeout); conn.setRequestMethod("GET"); + for (Map.Entry entry : header.valueSet()) { + String key = entry.getKey(); + String value = entry.getValue().toString(); + conn.setRequestProperty(key, value); + } if (conn.getResponseCode() == HttpStatus.SC_OK) { is = conn.getInputStream(); return FileLess.$read(is); @@ -61,16 +72,24 @@ public class HttpLess { } public static void $get(final String url, final CallBack callBack) { + $get(url, new ContentValues(), callBack); + } + + public static void $get(final String url, final ContentValues header, final CallBack callBack) { mExecutorService.submit(new Runnable() { @Override public void run() { - String result = $get(url); + String result = $get(url, header); callBack.onFinish(result); } }); } public static String $post(String url, Map params) { + return $post(url, params, new ContentValues()); + } + + public static String $post(String url, Map params, ContentValues header) { if (params == null || params.size() == 0) { return $get(url); } @@ -86,6 +105,11 @@ public void run() { conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(data.length)); + for (Map.Entry entry : header.valueSet()) { + String key = entry.getKey(); + String value = entry.getValue().toString(); + conn.setRequestProperty(key, value); + } conn.setDoOutput(true); os = conn.getOutputStream(); os.write(data); @@ -115,10 +139,14 @@ public void run() { } public static void $post(final String url, final Map params, final CallBack callBack) { + $post(url, params, new ContentValues(), callBack); + } + + public static void $post(final String url, final Map params, final ContentValues header, final CallBack callBack) { mExecutorService.submit(new Runnable() { @Override public void run() { - String result = $post(url, params); + String result = $post(url, params, header); callBack.onFinish(result); } }); From e821149611499b42ef58b803b576aa148dbfb043 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Sat, 28 Nov 2015 12:23:37 +0800 Subject: [PATCH 012/106] refact the HttpLess and release v0.6.9 --- app-ref-lesscode-core/build.gradle | 9 +- app/build.gradle | 4 +- lesscode-core/build.gradle | 2 +- .../com/jayfeng/lesscode/core/HttpLess.java | 136 ++++++++++-------- 4 files changed, 87 insertions(+), 64 deletions(-) diff --git a/app-ref-lesscode-core/build.gradle b/app-ref-lesscode-core/build.gradle index 1100826..ec3c8a4 100644 --- a/app-ref-lesscode-core/build.gradle +++ b/app-ref-lesscode-core/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 23 + buildToolsVersion "23.0.2" defaultConfig { applicationId "com.jayfeng.lesscode.app.ref.lesscodecore" minSdkVersion 9 - targetSdkVersion 21 + targetSdkVersion 23 versionCode 1 versionName "1.0" } @@ -21,8 +21,9 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:22.1.1' + compile 'com.android.support:appcompat-v7:23.1.1' compile('com.jayfeng:lesscode-core:0.6.7') { exclude group: 'com.android.support', module: 'support-v4' + exclude group: 'com.android.support', module: 'appcompat-v7' } } diff --git a/app/build.gradle b/app/build.gradle index 513751e..084362c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 23 + buildToolsVersion "23.0.2" defaultConfig { applicationId "com.jayfeng.lesscode.app" diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index ebaa681..22d6068 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.6.8" // #CONFIG# // project version +version = "0.6.9" // #CONFIG# // project version android { compileSdkVersion 23 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java index 21604e9..68e2453 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java @@ -2,16 +2,6 @@ import android.content.ContentValues; -import org.apache.http.Header; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpParams; - import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; @@ -30,13 +20,23 @@ public class HttpLess { - private final static String QUERY_ENCODING = "UTF-8"; private static ExecutorService mExecutorService = Executors.newFixedThreadPool(4); + /** + * 同步get方式获取url内容 + * @param url + * @return + */ public static String $get(String url) { return $get(url, new ContentValues()); } + /** + * 同步get方式获取url内容,支持自定义Header + * @param url + * @param header + * @return + */ public static String $get(String url, ContentValues header) { InputStream is = null; try { @@ -46,12 +46,14 @@ public class HttpLess { conn.setConnectTimeout($.sConnectTimeOut); conn.setReadTimeout($.sReadTimeout); conn.setRequestMethod("GET"); + + // 自定义header for (Map.Entry entry : header.valueSet()) { String key = entry.getKey(); String value = entry.getValue().toString(); conn.setRequestProperty(key, value); } - if (conn.getResponseCode() == HttpStatus.SC_OK) { + if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { is = conn.getInputStream(); return FileLess.$read(is); } @@ -71,6 +73,11 @@ public class HttpLess { return null; } + /** + * 异步get方式获取url内容 + * @param url + * @param callBack 包含一个onFinish方法的回调,并带上结果result参数 + */ public static void $get(final String url, final CallBack callBack) { $get(url, new ContentValues(), callBack); } @@ -85,17 +92,36 @@ public void run() { }); } - public static String $post(String url, Map params) { + /** + * 同步post方式获取url内容 + * @param url + * @param params + * @return + */ + public static String $post(String url, ContentValues params) { return $post(url, params, new ContentValues()); } - public static String $post(String url, Map params, ContentValues header) { + public static String $post(String url, ContentValues params, ContentValues header) { if (params == null || params.size() == 0) { return $get(url); } OutputStream os = null; InputStream is = null; - StringBuffer body = joinParam(params); + StringBuffer body = new StringBuffer(); + + // 拼接参数 + for (Map.Entry entry : params.valueSet()) { + String key = entry.getKey(); + String value = entry.getValue().toString(); + body.append(key).append('=').append(value); + body.append('&'); + } + // 去掉最尾部多余的&符号 + if (body.length() > 0) { + body = body.deleteCharAt(body.length() - 1); + } + byte[] data = body.toString().getBytes(); try { URL u = new URL(url); @@ -105,6 +131,8 @@ public void run() { conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(data.length)); + + // 自定义header for (Map.Entry entry : header.valueSet()) { String key = entry.getKey(); String value = entry.getValue().toString(); @@ -113,7 +141,7 @@ public void run() { conn.setDoOutput(true); os = conn.getOutputStream(); os.write(data); - if (conn.getResponseCode() == HttpStatus.SC_OK) { + if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { is = conn.getInputStream(); return FileLess.$read(is); } @@ -138,11 +166,11 @@ public void run() { return null; } - public static void $post(final String url, final Map params, final CallBack callBack) { + public static void $post(final String url, final ContentValues params, final CallBack callBack) { $post(url, params, new ContentValues(), callBack); } - public static void $post(final String url, final Map params, final ContentValues header, final CallBack callBack) { + public static void $post(final String url, final ContentValues params, final ContentValues header, final CallBack callBack) { mExecutorService.submit(new Runnable() { @Override public void run() { @@ -153,6 +181,10 @@ public void run() { } public static long $download(String downloadUrl, File dest, boolean append, DownloadCallBack callBack) throws Exception { + return $download(downloadUrl, dest, append, new ContentValues(), callBack); + } + + public static long $download(String downloadUrl, File dest, boolean append, ContentValues header, DownloadCallBack callBack) throws Exception { int progress = 0; long remoteSize = 0; int currentSize = 0; @@ -176,26 +208,30 @@ public void run() { } } - HttpGet request = new HttpGet(downloadUrl); - - if (currentSize > 0) { - request.addHeader("RANGE", "bytes=" + currentSize + "-"); - } - - HttpParams params = new BasicHttpParams(); - HttpConnectionParams.setConnectionTimeout(params, $.sConnectTimeOut); - HttpConnectionParams.setSoTimeout(params, 40000); - HttpClient httpClient = new DefaultHttpClient(params); - InputStream is = null; FileOutputStream os = null; try { - HttpResponse response = httpClient.execute(request); - if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { - is = response.getEntity().getContent(); - remoteSize = response.getEntity().getContentLength(); - Header contentEncoding = response.getFirstHeader("Content-Encoding"); - if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) { + URL u = new URL(downloadUrl); + HttpURLConnection conn = (HttpURLConnection) u.openConnection(); + conn.setUseCaches(false); + conn.setConnectTimeout($.sConnectTimeOut); + conn.setReadTimeout($.sReadTimeout); + conn.setRequestMethod("GET"); + // 设置断点续传的起始位置 + if (currentSize > 0) { + conn.setRequestProperty("RANGE", "bytes=" + currentSize + "-"); + } + // 自定义header + for (Map.Entry entry : header.valueSet()) { + String key = entry.getKey(); + String value = entry.getValue().toString(); + conn.setRequestProperty(key, value); + } + if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { + is = conn.getInputStream(); + remoteSize = conn.getContentLength(); + String contentEndcoding = conn.getHeaderField("Content-Encoding"); + if (contentEndcoding != null && contentEndcoding.equalsIgnoreCase("gzip")) { is = new GZIPInputStream(is); } os = new FileOutputStream(dest, append); @@ -219,6 +255,10 @@ public void run() { totalSize = 0; } } + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); } finally { if (os != null) { os.close(); @@ -237,7 +277,6 @@ public void run() { } return totalSize; - } public static String $upload(String url, Map params, Map files) { @@ -303,8 +342,7 @@ public void run() { byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); os.write(end_data); os.flush(); - StringBuilder sb2 = new StringBuilder(); - if (conn.getResponseCode() == HttpStatus.SC_OK) { + if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream in = conn.getInputStream(); return FileLess.$read(in); } @@ -344,28 +382,12 @@ public void run() { }); } - private static StringBuffer joinParam(Map params) { - StringBuffer result = new StringBuffer(); - Iterator> iterator = params.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry param = iterator.next(); - String key = param.getKey(); - String value = param.getValue(); - result.append(key).append('=').append(value); - if (iterator.hasNext()) { - result.append('&'); - } - } - return result; - } - public interface CallBack { - public void onFinish(String result); + void onFinish(String result); } public interface DownloadCallBack { - public void onDownloading(int progress); - - public void onDownloaded(); + void onDownloading(int progress); + void onDownloaded(); } } From 8df256a33bf056864829d207820ccd62406e46fb Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Sat, 28 Nov 2015 12:32:39 +0800 Subject: [PATCH 013/106] the SharedPreferenceLess is hard to use, so mark it as Deprecated and it wil be replaced by a new class later --- .../java/com/jayfeng/lesscode/core/SharedPreferenceLess.java | 1 + 1 file changed, 1 insertion(+) diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java index 0d23499..03dea8d 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java @@ -6,6 +6,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +@Deprecated public class SharedPreferenceLess { public static final String SHARED_NAME = "shared_name"; From 31390b72ae1bb865435529b176e9d0b61bacd945 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Sat, 28 Nov 2015 12:49:06 +0800 Subject: [PATCH 014/106] fix the Recycler* spell from Recycle* and add AdapterLess all comments --- .../jayfeng/lesscode/core/AdapterLess.java | 76 ++++++++++++++++--- 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java index a8b24ca..ed73d4b 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java @@ -22,6 +22,7 @@ public class AdapterLess { /** * 创建一个RecyclerView.Adapter + * 面向: RecyclerView * 主要是: * 1. 抽象出重复代码,默认实现一些常规代码 * 2. 封装了RecyclerViewHolder @@ -30,24 +31,24 @@ public class AdapterLess { * @param list model的列表 * @param layoutId 布局xml的id * @param recycleCallBack 包含nBindViewHolder方法的回调 - * @param + * @param r * @return */ - public static RecyclerView.Adapter $recycle(final Context context, + public static RecyclerView.Adapter $recycle(final Context context, final List list, final int layoutId, - final RecycleCallBack recycleCallBack) { - RecyclerView.Adapter result = new RecyclerView.Adapter() { + final RecyclerCallBack recycleCallBack) { + RecyclerView.Adapter result = new RecyclerView.Adapter() { @Override - public RecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(context) .inflate(layoutId, viewGroup, false); - RecycleViewHolder recycleViewHolder = new RecycleViewHolder(view); - return recycleViewHolder; + RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view); + return recyclerViewHolder; } @Override - public void onBindViewHolder(RecycleViewHolder viewHolder, int position) { + public void onBindViewHolder(RecyclerViewHolder viewHolder, int position) { T t = null; if (position < list.size()) { t = list.get(position); @@ -68,6 +69,7 @@ public int getItemCount() { /** * 创建BaseAdapter + * 面向: AbsListView * 1. 抽象出重复代码,默认实现一些常规代码 * 2. 封装了ViewHolder * 3. 自动传递Model给getView @@ -127,6 +129,7 @@ public View getView(int position, View convertView, ViewGroup parent) { /** * 同上,也是创建了BaseAdapter + * 面向: AbsListView * 支持多布局,也多增加了两个回调方法,便于自定义: * 1. getViewType * 2. isEnabled @@ -201,6 +204,7 @@ public View getView(int position, View convertView, ViewGroup parent) { /** * 创建PagerAdapter + * 面向: ViewPager * 主要是: * 1. 抽象出重复代码,默认实现一些常规代码 * 2. 封装了instantiateItem @@ -244,6 +248,17 @@ public void destroyItem(ViewGroup container, int position, Object object) { return result; } + /** + * 创建了FragmentPagerAdapter + * 面向: ViewPager + * 主要是: + * 1. 抽象出重复代码,默认实现getCount方法 + * @param fragmentManager + * @param count + * @param fragmentPagerCallBack + * @param + * @return + */ public static FragmentPagerAdapter $pager(FragmentManager fragmentManager, final int count, final FragmentPagerCallBack fragmentPagerCallBack) { @@ -261,6 +276,18 @@ public int getCount() { return result; } + /** + * 同上,创建了FragmentPagerAdapter + * 面向: ViewPager + * 通过getPageTitle回调方法支持fragment标题定义 + * 主要是: + * 1. 抽象出重复代码,默认实现getCount方法 + * @param fragmentManager + * @param count + * @param fullFragmentPagerCallBack + * @param + * @return + */ public static FragmentPagerAdapter $pager(final FragmentManager fragmentManager, final int count, final FullFragmentPagerCallBack fullFragmentPagerCallBack) { @@ -283,14 +310,26 @@ public String getPageTitle(int position) { return result; } - public interface RecycleCallBack { - void onBindViewHolder(int position, RecycleViewHolder recycleViewHolder, T t); + /** + * RecyclerCallBack + * @param + */ + public interface RecyclerCallBack { + void onBindViewHolder(int position, RecyclerViewHolder recyclerViewHolder, T t); } + /** + * 简化版本的$base的CallBack + * @param + */ public interface CallBack { View getView(int position, View convertView, ViewHolder holder, T t); } + /** + * 增强版本的$base的CallBack + * @param + */ public interface FullCallBack { View getView(int position, View convertView, ViewHolder holder, T t); @@ -299,14 +338,24 @@ public interface FullCallBack { boolean isEnabled(int position); } + /** + * 简化版本的$pager的CallBack + * @param + */ public interface PageCallBack { void instantiateItem(int position, View view, T t); } + /** + * 简化版本的$pager的CallBack(针对fragment) + */ public interface FragmentPagerCallBack { Fragment getItem(int position); } + /** + * 增强版本的$pager的CallBack(针对fragment) + */ public interface FullFragmentPagerCallBack { Fragment getItem(int position); String getPageTitle(int position); @@ -339,8 +388,11 @@ public static class ViewHolder { } } - public static class RecycleViewHolder extends RecyclerView.ViewHolder { - public RecycleViewHolder(View itemView) { + /** + * 单独封装了RecyclerView的ViewHolder + */ + public static class RecyclerViewHolder extends RecyclerView.ViewHolder { + public RecyclerViewHolder(View itemView) { super(itemView); } From 90d043b5c7eef3ea878f8274f0d6117a8fc201c8 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Sat, 28 Nov 2015 13:23:16 +0800 Subject: [PATCH 015/106] refact the AppLess context params and release v0.7.0 --- lesscode-core/build.gradle | 4 +- .../com/jayfeng/lesscode/core/AppLess.java | 50 +++++++++++++------ .../com/jayfeng/lesscode/core/UpdateLess.java | 6 +-- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index 22d6068..a963954 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.6.9" // #CONFIG# // project version +version = "0.7.0" // #CONFIG# // project version android { compileSdkVersion 23 @@ -16,7 +16,7 @@ android { } buildTypes { release { - minifyEnabled true + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AppLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AppLess.java index c13fafe..367211b 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AppLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AppLess.java @@ -10,12 +10,16 @@ public class AppLess { - public static int $vercode(Context context) { + /** + * 获取app的版本数versionCode,比如38 + * @return + */ + public static int $vercode() { int result = 0; - String packageName = context.getPackageName(); + String packageName = $.sAppContext.getPackageName(); PackageInfo packageInfo; try { - packageInfo = context.getPackageManager().getPackageInfo(packageName, 0); + packageInfo = $.sAppContext.getPackageManager().getPackageInfo(packageName, 0); result = packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { throw new AssertionError(e); @@ -23,12 +27,16 @@ public class AppLess { return result; } - public static String $vername(Context context) { + /** + * 获取app的版本名versionName,比如0.6.9 + * @return + */ + public static String $vername() { String result = null; - String packageName = context.getPackageName(); + String packageName = $.sAppContext.getPackageName(); PackageInfo packageInfo; try { - packageInfo = context.getPackageManager().getPackageInfo(packageName, 0); + packageInfo = $.sAppContext.getPackageManager().getPackageInfo(packageName, 0); result = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { throw new AssertionError(e); @@ -36,12 +44,16 @@ public class AppLess { return result; } - public static String $appname(Context context) { + /** + * 获取app的名称 + * @return + */ + public static String $appname() { String result = null; - String packageName = context.getPackageName(); + String packageName = $.sAppContext.getPackageName(); ApplicationInfo applicationInfo; try { - PackageManager packageManager = context.getPackageManager(); + PackageManager packageManager = $.sAppContext.getPackageManager(); applicationInfo = packageManager.getApplicationInfo(packageName, 0); result = packageManager.getApplicationLabel(applicationInfo).toString(); } catch (PackageManager.NameNotFoundException e) { @@ -52,11 +64,16 @@ public class AppLess { return result; } - public static boolean $running(Context context, String packageName) { + /** + * 判断一个app是否在运行 + * @param packageName app的包名 + * @return 在运行则返回true,否则false + */ + public static boolean $running(String packageName) { if (packageName == null) { - packageName = context.getPackageName(); + packageName = $.sAppContext.getPackageName(); } - ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager am = (ActivityManager) $.sAppContext.getSystemService(Context.ACTIVITY_SERVICE); List infos = am.getRunningAppProcesses(); for(ActivityManager.RunningAppProcessInfo rapi : infos){ if(rapi.processName.equals(packageName)) @@ -65,8 +82,13 @@ public class AppLess { return false; } - public static boolean isTopActivy(Context context, String activityName) { - ActivityManager manager = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); + /** + * 判断一个activity是否在前台运行 + * @param activityName activity的全路径名称 + * @return 在前台则返回true,否则返回false + */ + public static boolean isTopActivy(String activityName) { + ActivityManager manager = (ActivityManager) $.sAppContext.getSystemService(Context.ACTIVITY_SERVICE); List runningTaskInfos = manager.getRunningTasks(1); String cmpNameTemp = null; diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java index 1ea4f12..998fe71 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java @@ -51,7 +51,7 @@ public class UpdateLess { final String download, String log) { - if (vercode <= AppLess.$vercode(context)) { + if (vercode <= AppLess.$vercode()) { return false; } @@ -71,8 +71,8 @@ public void onClick(DialogInterface dialog, int which) { return true; } - public static boolean $hasUpdate(Context context, int vercode) { - if (vercode <= AppLess.$vercode(context)) { + public static boolean $hasUpdate(int vercode) { + if (vercode <= AppLess.$vercode()) { return false; } return true; From 351cd99ab8da105c6dc1fbf27891d78e24b4a57d Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Sat, 28 Nov 2015 15:51:43 +0800 Subject: [PATCH 016/106] add all comments - part over --- .../java/com/jayfeng/lesscode/core/$.java | 8 ++- .../com/jayfeng/lesscode/core/DeviceLess.java | 8 +++ .../jayfeng/lesscode/core/DisplayLess.java | 34 ++++++++-- .../com/jayfeng/lesscode/core/EncodeLess.java | 5 ++ .../com/jayfeng/lesscode/core/HttpLess.java | 64 ++++++++++++++++++- .../com/jayfeng/lesscode/core/LogLess.java | 10 +++ .../jayfeng/lesscode/core/NetworkLess.java | 1 + .../jayfeng/lesscode/core/StorageLess.java | 11 ++++ .../com/jayfeng/lesscode/core/UpdateLess.java | 40 +++++++++--- .../jayfeng/lesscode/core/UpdateService.java | 8 +++ 10 files changed, 170 insertions(+), 19 deletions(-) diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/$.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/$.java index 5807d51..58abe9a 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/$.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/$.java @@ -3,9 +3,10 @@ import android.content.Context; public class $ { - + /** + * 单例 + */ private static $ instance; - public static $ getInstance() { if (instance == null) { synchronized ($.class) { @@ -17,6 +18,9 @@ public class $ { return instance; } + /** + * 名义上为build,实则是检查一些必须配置的变量 + */ public void build(){ if (sAppContext == null) { throw new RuntimeException("please config the lesscode application context"); diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DeviceLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DeviceLess.java index f94d9a4..7e48ac6 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DeviceLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DeviceLess.java @@ -8,8 +8,16 @@ import java.io.File; import java.io.FileInputStream; +/** + * 设备相关的工具类 + */ public class DeviceLess { + /** + * 获取设备的mac地址 + * 这里要特别说明一下,mac地址不是一定能获取的到的,你可能要更优先使用设备ID + * @return mac地址 + */ public static String $mac() { String result = null; diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DisplayLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DisplayLess.java index 062e00a..0c8d7db 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DisplayLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DisplayLess.java @@ -7,25 +7,47 @@ import android.graphics.Bitmap; import android.util.DisplayMetrics; +/** + * 屏幕显示相关的工具类 + */ public class DisplayLess { + /** + * 屏幕宽度 + * @param activity + * @return + */ public static int $width(Activity activity) { DisplayMetrics displayMetrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.widthPixels; } - + /** + * 屏幕高度 + * @param activity + * @return + */ public static int $height(Activity activity) { DisplayMetrics displayMetrics = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.heightPixels; } + /** + * dp转px + * @param dp + * @return + */ public static int $dp2px(float dp) { return (int) (dp * Resources.getSystem().getDisplayMetrics().density); } + /** + * 是否为平板 + * @param context + * @return + */ public static boolean $tablet(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) @@ -33,26 +55,26 @@ public class DisplayLess { Configuration.SCREENLAYOUT_SIZE_LARGE; } + /** + * **************************** + * 各大设备密度判断 + * **************************** + */ public static boolean isLdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_ldpi); } - public static boolean isMdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_mdpi); } - public static boolean isTVdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_tvdpi); } - public static boolean isHdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_hdpi); } - public static boolean isXHdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_xhdpi); } - public static boolean isXXHdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_xxhdpi); } diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/EncodeLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/EncodeLess.java index 8dd81c0..6e61682 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/EncodeLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/EncodeLess.java @@ -9,6 +9,11 @@ */ public class EncodeLess { + /** + * 通用MD5加密 + * @param string + * @return + */ public static String $md5(String string) { byte[] hash; diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java index 68e2453..f3686c2 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/HttpLess.java @@ -11,7 +11,6 @@ import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; -import java.util.Iterator; import java.util.Map; import java.util.UUID; import java.util.concurrent.ExecutorService; @@ -102,6 +101,12 @@ public void run() { return $post(url, params, new ContentValues()); } + /** + * 同步post方式获取url内容,支持自定义Header + * @param url + * @param params + * @return + */ public static String $post(String url, ContentValues params, ContentValues header) { if (params == null || params.size() == 0) { return $get(url); @@ -166,10 +171,23 @@ public void run() { return null; } + /** + * 异步post方式获取url内容 + * @param url + * @param params + * @param callBack 包含一个onFinish方法的回调,并带上结果result参数 + */ public static void $post(final String url, final ContentValues params, final CallBack callBack) { $post(url, params, new ContentValues(), callBack); } + /** + * 异步post方式获取url内容,支持自定义Header + * @param url + * @param params + * @param header + * @param callBack 包含一个onFinish方法的回调,并带上结果result参数 + */ public static void $post(final String url, final ContentValues params, final ContentValues header, final CallBack callBack) { mExecutorService.submit(new Runnable() { @Override @@ -180,10 +198,29 @@ public void run() { }); } + /** + * 异步下载文件 + * @param downloadUrl + * @param dest + * @param append + * @param callBack + * @return + * @throws Exception + */ public static long $download(String downloadUrl, File dest, boolean append, DownloadCallBack callBack) throws Exception { return $download(downloadUrl, dest, append, new ContentValues(), callBack); } + /** + * 异步下载文件,支持自定义Header + * @param downloadUrl + * @param dest + * @param append + * @param header + * @param callBack + * @return + * @throws Exception + */ public static long $download(String downloadUrl, File dest, boolean append, ContentValues header, DownloadCallBack callBack) throws Exception { int progress = 0; long remoteSize = 0; @@ -241,6 +278,7 @@ public void run() { os.write(buffer, 0, readSize); os.flush(); totalSize += readSize; + // 通知回调下载进度 if (callBack != null) { progress = (int) (totalSize * 100 / remoteSize); callBack.onDownloading(progress); @@ -272,6 +310,7 @@ public void run() { throw new Exception("Download file fail: " + downloadUrl); } + // 下载完成并通知回调 if (callBack != null) { callBack.onDownloaded(); } @@ -279,6 +318,13 @@ public void run() { return totalSize; } + /** + * 同步上传文件 + * @param url + * @param params + * @param files + * @return + */ public static String $upload(String url, Map params, Map files) { String BOUNDARY = UUID.randomUUID().toString(); String PREFIX = "--", LINEND = "\r\n"; @@ -372,6 +418,13 @@ public void run() { return null; } + /** + * 异步上传文件 + * @param url + * @param params + * @param files + * @param callBack + */ public static void $upload(final String url, final Map params, final Map files, final CallBack callBack) { mExecutorService.submit(new Runnable() { @Override @@ -382,10 +435,19 @@ public void run() { }); } + /** + * Http请求回调 + * onFinish,带结果字符串 + */ public interface CallBack { void onFinish(String result); } + /** + * 下载回调:下载进度和下载完成 + * onDownloading,带一个进度值:0~100 + * onDownloaded + */ public interface DownloadCallBack { void onDownloading(int progress); void onDownloaded(); diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java index 3b4252e..d988616 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java @@ -65,6 +65,10 @@ public static void v(String str) { } } + /** + * 自动从StackTrace中取TAG + * @return + */ private static String getTag() { StackTraceElement caller = new Throwable().fillInStackTrace().getStackTrace()[2]; if (TextUtils.isEmpty($.sTAG)) { @@ -73,6 +77,12 @@ private static String getTag() { return $.sTAG; } + /** + * 根据StackTrace生成带更多信息的log + * 文件名,方法名,行数 + * @param str + * @return + */ private static String buildLogString(String str) { StackTraceElement caller = new Throwable().fillInStackTrace().getStackTrace()[2]; StringBuilder stringBuilder = new StringBuilder(); diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java index 4436c2b..b52c0b4 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/NetworkLess.java @@ -12,6 +12,7 @@ public class NetworkLess { /** * 定义网络类型的枚举分类 + * 这里把一些一些2G,2.5G,2.7G等等按照快慢又做了一个分类,仅供参考 */ public static enum NetworkType { WIRED_FAST, WIFI_FAST, MOBILE_FAST, MOBILE_MIDDLE, MOBILE_SLOW, NONE, diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/StorageLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/StorageLess.java index 245063f..b6368fe 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/StorageLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/StorageLess.java @@ -19,6 +19,9 @@ */ public class StorageLess { + /** + * 手机内存 + */ public static class Phone { public static long $total() { File path = Environment.getDataDirectory(); @@ -47,6 +50,11 @@ public static class Phone { } + /** + * 内部存储 + * 1. 如果没有内部存储,则为外部存储 + * 2. 一般默认说的sdcard就是指这一层 + */ public static class Sdcard { public static boolean $ready() { @@ -84,6 +92,9 @@ public static class Sdcard { } } + /** + * 外部存储 + */ public static class ExtSdcard { public static File $path() { diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java index 998fe71..65dbbd7 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java @@ -11,18 +11,18 @@ /** * 检查更新工具类 + * { + * "vercode":1, + * "vername":"v1.1", + * "download":"http://www.jayfeng.com/lesscode-app.apk", + * "log":"upgrade content" + * } */ public class UpdateLess { /** - * { - * "vercode":1, - * "vername":"v1.1", - * "download":"http://www.jayfeng.com/lesscode-app.apk", - * "log":"upgrade content" - * } - * - * @return whether has a update version + * 解析json和本地信息比较,判断是否有更新 + * @return 有更新则返回true,否则返回false */ public static boolean $check(final Context context, String updateJson) { int vercode = 0; @@ -45,16 +45,26 @@ public class UpdateLess { return $check(context, vercode, vername, download, log); } + /** + * 根据解析的结果来比较是否有更新 + * @param context + * @param vercode + * @param vername + * @param download + * @param log + * @return + */ public static boolean $check(final Context context, int vercode, String vername, final String download, String log) { - - if (vercode <= AppLess.$vercode()) { + // 无更新 + if (!$hasUpdate(vercode)) { return false; } + // 有更新,则弹出对话框告知用户 new AlertDialog.Builder(context) .setTitle(context.getString(R.string.less_app_download_dialog_title) + vername) .setMessage(log) @@ -71,6 +81,11 @@ public void onClick(DialogInterface dialog, int which) { return true; } + /** + * 根据版本判断是否有更新 + * @param vercode + * @return + */ public static boolean $hasUpdate(int vercode) { if (vercode <= AppLess.$vercode()) { return false; @@ -78,6 +93,11 @@ public void onClick(DialogInterface dialog, int which) { return true; } + /** + * 启动下载服务,开始下载APK文件 + * @param context + * @param download + */ public static void $download(Context context, String download) { Intent intent = new Intent(context, UpdateService.class); intent.putExtra($.KEY_DOWNLOAD_URL, download); diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java index 1f62347..407506e 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java @@ -20,6 +20,9 @@ import java.io.File; import java.net.URLEncoder; +/** + * 检查更新后台下载服务 + */ public class UpdateService extends Service { private static final int DOWNLOAD_STATE_FAILURE = -1; @@ -151,6 +154,8 @@ public int onStartCommand(Intent intent, int flags, int startId) { } mNotificationManager.cancel(NOTIFICATION_ID); mNotificationManager.notify(NOTIFICATION_ID, mNotification); + + // 启动线程开始下载 new UpdateThread().start(); return super.onStartCommand(intent, flags, startId); @@ -207,6 +212,9 @@ public void onDestroy() { mHandler.removeCallbacksAndMessages(null); } + /** + * 下载线程 + */ class UpdateThread extends Thread { @Override From 9e94b2a8bca864394e63467237d159ba10a20c9e Mon Sep 17 00:00:00 2001 From: fengjian Date: Wed, 16 Dec 2015 18:40:28 +0800 Subject: [PATCH 017/106] add recycler fullcallback --- lesscode-core/build.gradle | 2 +- .../jayfeng/lesscode/core/AdapterLess.java | 67 +++++++++++++++++-- 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index a963954..0fbb918 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.7.0" // #CONFIG# // project version +version = "0.7.1" // #CONFIG# // project version android { compileSdkVersion 23 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java index ed73d4b..2afbc3b 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java @@ -30,17 +30,17 @@ public class AdapterLess { * @param context * @param list model的列表 * @param layoutId 布局xml的id - * @param recycleCallBack 包含nBindViewHolder方法的回调 + * @param recyclerCallBack 包含nBindViewHolder方法的回调 * @param r * @return */ public static RecyclerView.Adapter $recycle(final Context context, final List list, final int layoutId, - final RecyclerCallBack recycleCallBack) { + final RecyclerCallBack recyclerCallBack) { RecyclerView.Adapter result = new RecyclerView.Adapter() { @Override - public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(context) .inflate(layoutId, viewGroup, false); RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view); @@ -53,7 +53,7 @@ public void onBindViewHolder(RecyclerViewHolder viewHolder, int position) { if (position < list.size()) { t = list.get(position); } - recycleCallBack.onBindViewHolder(position, viewHolder, t); + recyclerCallBack.onBindViewHolder(position, viewHolder, t); } @Override @@ -67,6 +67,56 @@ public int getItemCount() { return result; } + /** + * 创建一个RecyclerView.Adapter + * 面向: RecyclerView + * 支持多布局,也多增加了两个回调方法,便于自定义: + * 1. getViewType + * @param context + * @param list model的列表 + * @param layoutIds 布局xml的id + * @param fullRecyclerCallBack 包含nBindViewHolder方法的回调 + * @param r + * @return + */ + public static RecyclerView.Adapter $recycle(final Context context, + final List list, + final int[] layoutIds, + final FullRecyclerCallBack fullRecyclerCallBack) { + RecyclerView.Adapter result = new RecyclerView.Adapter() { + @Override + public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { + View view = LayoutInflater.from(context) + .inflate(layoutIds[viewType], viewGroup, false); + RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view); + return recyclerViewHolder; + } + + @Override + public void onBindViewHolder(RecyclerViewHolder viewHolder, int position) { + T t = null; + if (position < list.size()) { + t = list.get(position); + } + fullRecyclerCallBack.onBindViewHolder(position, viewHolder, t); + } + + @Override + public int getItemCount() { + if (list != null) { + return list.size(); + } + return 0; + } + + @Override + public int getItemViewType(int position) { + return fullRecyclerCallBack.getItemViewType(position); + } + }; + return result; + } + /** * 创建BaseAdapter * 面向: AbsListView @@ -318,6 +368,15 @@ public interface RecyclerCallBack { void onBindViewHolder(int position, RecyclerViewHolder recyclerViewHolder, T t); } + /** + * RecyclerCallBack + * @param + */ + public interface FullRecyclerCallBack { + void onBindViewHolder(int position, RecyclerViewHolder recyclerViewHolder, T t); + int getItemViewType(int position); + } + /** * 简化版本的$base的CallBack * @param From a5c4ca9acb2c516b7185814c484cca26b0602909 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Fri, 8 Jan 2016 10:46:40 +0800 Subject: [PATCH 018/106] add get status bar and title bar height method for DisplayLess and release lesscode v0.7.2 --- README.md | 4 +- app-ref-lesscode-core/build.gradle | 2 +- .../lesscode/app/activity/AppActivity.java | 4 +- .../lesscode/app/activity/DeviceActivity.java | 3 ++ .../app/activity/DisplayActivity.java | 13 +++++ lesscode-core/build.gradle | 2 +- .../jayfeng/lesscode/core/DisplayLess.java | 51 +++++++++++++++++++ 7 files changed, 73 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 89292b6..320990b 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,11 @@ Features Gradle ------ ```groovy -compile('com.jayfeng:lesscode-core:0.6.6') { +compile('com.jayfeng:lesscode-core:0.7.2') { // exclusion for update the android support jar // for example, you can use the appcompat-v7 in your project exclude group: 'com.android.support', module: 'support-v4' - exclude group: 'com.android.support', module: 'recyclerview-v7' + exclude group: 'com.android.support', module: 'appcompat-v7' } ``` diff --git a/app-ref-lesscode-core/build.gradle b/app-ref-lesscode-core/build.gradle index ec3c8a4..ab48f5b 100644 --- a/app-ref-lesscode-core/build.gradle +++ b/app-ref-lesscode-core/build.gradle @@ -22,7 +22,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' - compile('com.jayfeng:lesscode-core:0.6.7') { + compile('com.jayfeng:lesscode-core:0.7.2') { exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'appcompat-v7' } diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/AppActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/AppActivity.java index bbda738..82367c6 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/AppActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/AppActivity.java @@ -14,7 +14,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_app); - ToastLess.$(this, "current package:" + AppLess.$running(this, null) - + ", else package:" + AppLess.$running(this, "com.marriage")); + ToastLess.$(this, "current package:" + AppLess.$running(getPackageName()) + + ", else package:" + AppLess.$running("com.marriage")); } } diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/DeviceActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/DeviceActivity.java index 3b71ead..d3c5894 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/DeviceActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/DeviceActivity.java @@ -2,10 +2,13 @@ import android.app.Activity; import android.os.Bundle; +import android.os.Handler; import android.widget.TextView; import com.jayfeng.lesscode.app.R; import com.jayfeng.lesscode.core.DeviceLess; +import com.jayfeng.lesscode.core.DisplayLess; +import com.jayfeng.lesscode.core.ToastLess; import com.jayfeng.lesscode.core.ViewLess; public class DeviceActivity extends Activity { diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/DisplayActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/DisplayActivity.java index 11b0261..27f0b24 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/DisplayActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/DisplayActivity.java @@ -2,8 +2,11 @@ import android.app.Activity; import android.os.Bundle; +import android.os.Handler; import com.jayfeng.lesscode.app.R; +import com.jayfeng.lesscode.core.DisplayLess; +import com.jayfeng.lesscode.core.ToastLess; public class DisplayActivity extends Activity { @@ -11,5 +14,15 @@ public class DisplayActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display); + + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + ToastLess.$(DisplayActivity.this, "status bar height:" + DisplayLess.$statusBarHeight(DisplayActivity.this) + + ", title bar height:" + DisplayLess.$titleBarHeight(DisplayActivity.this)); + } + }, 2000); + ToastLess.$(this, "status bar height with reflect:" + DisplayLess.$statusBarHeight(getResources())); } } diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index 0fbb918..f4f37a6 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.7.1" // #CONFIG# // project version +version = "0.7.2" // #CONFIG# // project version android { compileSdkVersion 23 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DisplayLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DisplayLess.java index 0c8d7db..6074771 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DisplayLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/DisplayLess.java @@ -5,7 +5,11 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Rect; import android.util.DisplayMetrics; +import android.view.Window; + +import java.lang.reflect.Field; /** * 屏幕显示相关的工具类 @@ -43,6 +47,53 @@ public class DisplayLess { return (int) (dp * Resources.getSystem().getDisplayMetrics().density); } + /** + * 获取状态栏高度 + * 注: 该方法在onCreate中获取值为0 + * @param activity + * @return + */ + public static int $statusBarHeight(Activity activity) { + Rect frame = new Rect(); + activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); + return frame.top; + } + + /** + * 获取状态栏高度 + * 注: 该方法在onCreate中获取值为0 + * @param resources + * @return + */ + public static int $statusBarHeight(Resources resources) { + Class c = null; + Object obj = null; + Field field = null; + int x = 0; + int statusBarHeight = 0; + try { + c = Class.forName("com.android.internal.R$dimen"); + obj = c.newInstance(); + field = c.getField("status_bar_height"); + x = Integer.parseInt(field.get(obj).toString()); + statusBarHeight = resources.getDimensionPixelSize(x); + } catch(Exception e) { + e.printStackTrace(); + } + return statusBarHeight; + } + + /** + * 获取标题栏高度 + * @param activity + * @return + */ + public static int $titleBarHeight(Activity activity) { + int contentTop = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); + int titleBarHeight = contentTop - $statusBarHeight(activity); + return titleBarHeight; + } + /** * 是否为平板 * @param context From 390d4c6d4da13e737c5452a68e0cdaf30810a88b Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Mon, 11 Jan 2016 11:56:08 +0800 Subject: [PATCH 019/106] add singletonless --- .../jayfeng/lesscode/app/util/Present.java | 10 ++++++++++ lesscode-core/build.gradle | 2 +- .../jayfeng/lesscode/core/SingletonLess.java | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/jayfeng/lesscode/app/util/Present.java create mode 100644 lesscode-core/src/main/java/com/jayfeng/lesscode/core/SingletonLess.java diff --git a/app/src/main/java/com/jayfeng/lesscode/app/util/Present.java b/app/src/main/java/com/jayfeng/lesscode/app/util/Present.java new file mode 100644 index 0000000..1acf90d --- /dev/null +++ b/app/src/main/java/com/jayfeng/lesscode/app/util/Present.java @@ -0,0 +1,10 @@ +package com.jayfeng.lesscode.app.util; + +import com.jayfeng.lesscode.core.SingletonLess; + +public class Present extends SingletonLess { + @Override + protected Present newInstance() { + return new Present(); + } +} diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index f4f37a6..70c7013 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.7.2" // #CONFIG# // project version +version = "0.7.3" // #CONFIG# // project version android { compileSdkVersion 23 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SingletonLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SingletonLess.java new file mode 100644 index 0000000..1419407 --- /dev/null +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SingletonLess.java @@ -0,0 +1,19 @@ +package com.jayfeng.lesscode.core; + +public abstract class SingletonLess { + + private T instance; + + protected abstract T newInstance(); + + public final T getInstance() { + if (instance == null) { + synchronized (SingletonLess.class) { + if (instance == null) { + instance = newInstance(); + } + } + } + return instance; + } +} From c379fe78c8a3fd6cebc2a25ecf0b962be30ac6a5 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Mon, 11 Jan 2016 14:48:14 +0800 Subject: [PATCH 020/106] refactor the shared preference less and upgrade the lesscode to v0.7.5 --- .../activity/SharedPreferenceActivity.java | 15 +++++++ lesscode-core/build.gradle | 2 +- .../lesscode/core/SharedPreferenceLess.java | 43 +++++++++++++++++-- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/SharedPreferenceActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/SharedPreferenceActivity.java index 266167d..d73cebe 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/SharedPreferenceActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/SharedPreferenceActivity.java @@ -4,6 +4,8 @@ import android.os.Bundle; import com.jayfeng.lesscode.app.R; +import com.jayfeng.lesscode.core.LogLess; +import com.jayfeng.lesscode.core.SharedPreferenceLess; public class SharedPreferenceActivity extends Activity { @@ -11,5 +13,18 @@ public class SharedPreferenceActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shared_preference); + + + SharedPreferenceLess.$put(this, "key1", 333); + SharedPreferenceLess.$put(this, "key2", 0.5f); + SharedPreferenceLess.$put(this, "key3", true); + SharedPreferenceLess.$put(this, "key4", 100000L); + SharedPreferenceLess.$put(this, "key5", "i am a string"); + + LogLess.$d(SharedPreferenceLess.$get(this, "key1", 0) + ""); + LogLess.$d(SharedPreferenceLess.$get(this, "key2", 0f) + ""); + LogLess.$d(SharedPreferenceLess.$get(this, "key3", false) + ""); + LogLess.$d(SharedPreferenceLess.$get(this, "key4", 0L) + ""); + LogLess.$d(SharedPreferenceLess.$get(this, "key5", "")); } } diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index 70c7013..0d900a1 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.7.3" // #CONFIG# // project version +version = "0.7.5" // #CONFIG# // project version android { compileSdkVersion 23 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java index 03dea8d..4b9adc0 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java @@ -6,25 +6,60 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -@Deprecated public class SharedPreferenceLess { public static final String SHARED_NAME = "shared_name"; - public static void $put(Context context, String key, String value) { + public static void $put(Context context, String key, T value) { SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); - editor.putString(key, value); + if (value.getClass() == Boolean.class) { + editor.putBoolean(key, (Boolean) value); + } else if (value.getClass() == Float.class) { + editor.putFloat(key, (Float) value); + } else if (value.getClass() == Integer.class) { + editor.putInt(key, (Integer) value); + } else if (value.getClass() == Long.class) { + editor.putLong(key, (Long) value); + } else if (value.getClass() == String.class) { + editor.putString(key, (String) value); + } else { + throw new RuntimeException("the put value type can't support."); + } SharedPreferencesCompat.apply(editor); } - public static Object $get(Context context, String key, String defaultValue) { + public static String $get(Context context, String key, String defaultValue) { SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, Context.MODE_PRIVATE); return sp.getString(key, defaultValue); } + public static boolean $get(Context context, String key, boolean defaultValue) { + SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, + Context.MODE_PRIVATE); + return sp.getBoolean(key, defaultValue); + } + + public static float $get(Context context, String key, float defaultValue) { + SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, + Context.MODE_PRIVATE); + return sp.getFloat(key, defaultValue); + } + + public static int $get(Context context, String key, int defaultValue) { + SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, + Context.MODE_PRIVATE); + return sp.getInt(key, defaultValue); + } + + public static long $get(Context context, String key, long defaultValue) { + SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, + Context.MODE_PRIVATE); + return sp.getLong(key, defaultValue); + } + public static void $remove(Context context, String key) { SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, Context.MODE_PRIVATE); From 252322d4726b2c6c51a021a33cf29501c393ed20 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Mon, 11 Jan 2016 14:49:59 +0800 Subject: [PATCH 021/106] delete the Singleton less --- .../jayfeng/lesscode/app/util/Present.java | 10 ---------- lesscode-core/build.gradle | 2 +- .../jayfeng/lesscode/core/SingletonLess.java | 19 ------------------- 3 files changed, 1 insertion(+), 30 deletions(-) delete mode 100644 app/src/main/java/com/jayfeng/lesscode/app/util/Present.java delete mode 100644 lesscode-core/src/main/java/com/jayfeng/lesscode/core/SingletonLess.java diff --git a/app/src/main/java/com/jayfeng/lesscode/app/util/Present.java b/app/src/main/java/com/jayfeng/lesscode/app/util/Present.java deleted file mode 100644 index 1acf90d..0000000 --- a/app/src/main/java/com/jayfeng/lesscode/app/util/Present.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.jayfeng.lesscode.app.util; - -import com.jayfeng.lesscode.core.SingletonLess; - -public class Present extends SingletonLess { - @Override - protected Present newInstance() { - return new Present(); - } -} diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index 0d900a1..50661a1 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.7.5" // #CONFIG# // project version +version = "0.7.6" // #CONFIG# // project version android { compileSdkVersion 23 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SingletonLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SingletonLess.java deleted file mode 100644 index 1419407..0000000 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SingletonLess.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.jayfeng.lesscode.core; - -public abstract class SingletonLess { - - private T instance; - - protected abstract T newInstance(); - - public final T getInstance() { - if (instance == null) { - synchronized (SingletonLess.class) { - if (instance == null) { - instance = newInstance(); - } - } - } - return instance; - } -} From 24dadffd6b303705d4d8f80423d0000a2dfce37f Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Mon, 11 Jan 2016 20:55:27 +0800 Subject: [PATCH 022/106] refactor the sharedpreference less --- .../activity/SharedPreferenceActivity.java | 1 + lesscode-core/build.gradle | 4 +-- lesscode-core/proguard-rules.pro | 6 ++-- .../lesscode/core/SharedPreferenceLess.java | 29 ++++++++++++------- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/SharedPreferenceActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/SharedPreferenceActivity.java index d73cebe..92fe23e 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/SharedPreferenceActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/SharedPreferenceActivity.java @@ -20,6 +20,7 @@ protected void onCreate(Bundle savedInstanceState) { SharedPreferenceLess.$put(this, "key3", true); SharedPreferenceLess.$put(this, "key4", 100000L); SharedPreferenceLess.$put(this, "key5", "i am a string"); + SharedPreferenceLess.$put(this, "key5", null); LogLess.$d(SharedPreferenceLess.$get(this, "key1", 0) + ""); LogLess.$d(SharedPreferenceLess.$get(this, "key2", 0f) + ""); diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index 50661a1..c4e034a 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.7.6" // #CONFIG# // project version +version = "0.7.8" // #CONFIG# // project version android { compileSdkVersion 23 @@ -16,7 +16,7 @@ android { } buildTypes { release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } diff --git a/lesscode-core/proguard-rules.pro b/lesscode-core/proguard-rules.pro index 3ffecd2..41619be 100644 --- a/lesscode-core/proguard-rules.pro +++ b/lesscode-core/proguard-rules.pro @@ -12,6 +12,6 @@ # 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 *; -#} +-keepclassmembers class com.jayfeng.lesscode.core { + public *; +} diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java index 4b9adc0..9abdb72 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/SharedPreferenceLess.java @@ -14,19 +14,26 @@ public class SharedPreferenceLess { SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); - if (value.getClass() == Boolean.class) { - editor.putBoolean(key, (Boolean) value); - } else if (value.getClass() == Float.class) { - editor.putFloat(key, (Float) value); - } else if (value.getClass() == Integer.class) { - editor.putInt(key, (Integer) value); - } else if (value.getClass() == Long.class) { - editor.putLong(key, (Long) value); - } else if (value.getClass() == String.class) { - editor.putString(key, (String) value); + + if (value == null) { + // if value is null, just handler it as a String + editor.putString(key, null); } else { - throw new RuntimeException("the put value type can't support."); + if (value.getClass() == Boolean.class) { + editor.putBoolean(key, (Boolean) value); + } else if (value.getClass() == Float.class) { + editor.putFloat(key, (Float) value); + } else if (value.getClass() == Integer.class) { + editor.putInt(key, (Integer) value); + } else if (value.getClass() == Long.class) { + editor.putLong(key, (Long) value); + } else if (value.getClass() == String.class) { + editor.putString(key, (String) value); + } else { + throw new RuntimeException("the put value type can't support."); + } } + SharedPreferencesCompat.apply(editor); } From 55e536364e08ef95dae86d03ae4a3319d8423a6e Mon Sep 17 00:00:00 2001 From: fengjian Date: Mon, 11 Jan 2016 22:13:57 +0800 Subject: [PATCH 023/106] update readme --- README.md | 5 +++-- app-ref-lesscode-core/build.gradle | 2 +- app/build.gradle | 2 +- lesscode-core/build.gradle | 2 +- lesscode-core/proguard-rules.pro | 15 +++++++++++++-- .../drawable-xhdpi/less_app_update_icon.png | Bin 14383 -> 588 bytes 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 320990b..40a7757 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ LessCode - Less Code For Android +![Logo](http://www.atool.org/placeholder.png?size=250x100&text=LessCode&bg=9bce3b&fg=fff) ================================ Less code, more efficient for android @@ -9,13 +10,13 @@ Features * support more effective methods than android * high performence * easy integration -* small size (less than 100k, only 80k+ now) +* small size (less than 50k, only 45k+ by proguard) * open source Gradle ------ ```groovy -compile('com.jayfeng:lesscode-core:0.7.2') { +compile('com.jayfeng:lesscode-core:0.7.8') { // exclusion for update the android support jar // for example, you can use the appcompat-v7 in your project exclude group: 'com.android.support', module: 'support-v4' diff --git a/app-ref-lesscode-core/build.gradle b/app-ref-lesscode-core/build.gradle index ab48f5b..f80e155 100644 --- a/app-ref-lesscode-core/build.gradle +++ b/app-ref-lesscode-core/build.gradle @@ -22,7 +22,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' - compile('com.jayfeng:lesscode-core:0.7.2') { + compile('com.jayfeng:lesscode-core:0.7.8') { exclude group: 'com.android.support', module: 'support-v4' exclude group: 'com.android.support', module: 'appcompat-v7' } diff --git a/app/build.gradle b/app/build.gradle index 084362c..f0b6b51 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,6 +20,6 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + compile fileTree(include: ['*.jar'], dir: 'libs') compile project(':lesscode-core') } diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index c4e034a..ea47b13 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -16,7 +16,7 @@ android { } buildTypes { release { - minifyEnabled true + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } diff --git a/lesscode-core/proguard-rules.pro b/lesscode-core/proguard-rules.pro index 41619be..4ee7340 100644 --- a/lesscode-core/proguard-rules.pro +++ b/lesscode-core/proguard-rules.pro @@ -12,6 +12,17 @@ # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: --keepclassmembers class com.jayfeng.lesscode.core { - public *; +#-keepattributes Exceptions,InnerClasses +# keep public class +#-dontwarn com.jayfeng.lesscode.core.* +#-keep public class com.jayfeng.lesscode.core.* +#-keep public class *$* +# keep public member +#-keepclassmembers class com.jayfeng.lesscode.core.* { +# public *; } +#-keepclassmembers class com.jayfeng.lesscode.core.*$* { +# public *; +#} +# keep and reflect +#-keepattributes Signature diff --git a/lesscode-core/src/main/res/drawable-xhdpi/less_app_update_icon.png b/lesscode-core/src/main/res/drawable-xhdpi/less_app_update_icon.png index 71c6d760f05183ef8a47c614d8d13380c8528499..cf16b95c7d481b011496e1d02824f20d85ff4600 100644 GIT binary patch literal 588 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 From 6b50978a7b2035f851203a85d958a2adc95e2d34 Mon Sep 17 00:00:00 2001 From: fengjian Date: Mon, 11 Jan 2016 22:17:50 +0800 Subject: [PATCH 024/106] update readme --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 40a7757..86494c4 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ -LessCode - Less Code For Android -![Logo](http://www.atool.org/placeholder.png?size=250x100&text=LessCode&bg=9bce3b&fg=fff) +LessCode - less code, more efficient for androi ================================ -Less code, more efficient for android +![Logo](http://www.atool.org/placeholder.png?size=250x100&text=LessCode&bg=9bce3b&fg=fff) > Author weibo:冯建V    mail:673592063@qq.com    QQ:673592063 Features ------ -* support more effective methods than android -* high performence -* easy integration -* small size (less than 50k, only 45k+ by proguard) -* open source + +> * support more effective methods than android +> * high performence +> * easy integration +> * small size (less than 50k, only 45k+ by proguard) +> * open source Gradle ------ @@ -86,4 +86,4 @@ 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. -``` +``` \ No newline at end of file From c0e0cee4ac8c338e24096d456ae42835d02bc47b Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Thu, 14 Jan 2016 10:14:08 +0800 Subject: [PATCH 025/106] support json logcat print --- .../lesscode/app/activity/LogActivity.java | 2 +- .../lesscode/app/activity/MainActivity.java | 14 ++--- lesscode-core/build.gradle | 2 +- .../com/jayfeng/lesscode/core/LogLess.java | 59 +++++++++++++++++++ 4 files changed, 66 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/LogActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/LogActivity.java index d21d7d7..40649b6 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/LogActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/LogActivity.java @@ -15,6 +15,6 @@ protected void onCreate(Bundle savedInstanceState) { LogLess.$d("xxxxxxx"); LogLess.$e("yyyyy"); - LogLess.$e("zzzzzzzzzz"); + LogLess.$json("{\"a\":\"aValue\"}", "test"); } } diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/MainActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/MainActivity.java index 3eb4691..d807e9f 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/MainActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/MainActivity.java @@ -66,15 +66,6 @@ public void onItemClick(AdapterView parent, View view, int position, long id) LogLess.$d("network:" + NetworkLess.$online() + ", type:" + NetworkLess.$type()); - SharedPreferenceLess.$put(this, "key1", "value"); - SharedPreferenceLess.$put(this, "key2", "100000022"); - ToastLess.$(MainActivity.this, - "key1:" + SharedPreferenceLess.$get(MainActivity.this, "key1", "") + - ", " + - "key2:" + SharedPreferenceLess.$get(MainActivity.this, "key2", "")); - -// LogLess.$e("hello id:" + R.id.hello + "/" + ResourceLess.$id(this, "hello", ResourceLess.TYPE.ID)); - Person person = new Person("fengj"); SerializeLess.$se(new File(getCacheDir(), "person").getAbsolutePath(), person); @@ -136,6 +127,11 @@ private void initData() { lessItem.setClassName("KeyboradActivity"); list.add(lessItem); + lessItem = new LessItem(); + lessItem.setName("LogLess的使用"); + lessItem.setClassName("LogActivity"); + list.add(lessItem); + lessItem = new LessItem(); lessItem.setName("NetworkLess的使用"); lessItem.setClassName("NetworkActivity"); diff --git a/lesscode-core/build.gradle b/lesscode-core/build.gradle index ea47b13..2f2f2b0 100644 --- a/lesscode-core/build.gradle +++ b/lesscode-core/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = "0.7.8" // #CONFIG# // project version +version = "0.7.9" // #CONFIG# // project version android { compileSdkVersion 23 diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java index d988616..e884f91 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java @@ -3,6 +3,10 @@ import android.text.TextUtils; import android.util.Log; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + /** * support for custom log printing out in case * adb shell setprop log.tag.YOUR_LOG_TAG LEVEL @@ -15,8 +19,11 @@ public class LogLess { public static final boolean DEBUG_TAG_LOG = Log.isLoggable($.sTAG, Log.VERBOSE); + private static final int JSON_INDENT = 4; + /** * verbose + * * @param str */ public static void v(String str) { @@ -27,6 +34,7 @@ public static void v(String str) { /** * debug + * * @param str */ public static void $d(String str) { @@ -37,6 +45,7 @@ public static void v(String str) { /** * info + * * @param str */ public static void $i(String str) { @@ -47,6 +56,7 @@ public static void v(String str) { /** * warning + * * @param str */ public static void $w(String str) { @@ -57,6 +67,7 @@ public static void v(String str) { /** * error + * * @param str */ public static void $e(String str) { @@ -65,8 +76,55 @@ public static void v(String str) { } } + /** + * json with a title + * + * @param str + * @param title + */ + public static void $json(String str, String title) { + if ($.sDebug || DEBUG_TAG_LOG) { + Log.d(getTag(), "|==================================================================="); + + if (!TextUtils.isEmpty(title)) { + Log.d(getTag(), "| " + title); + Log.d(getTag(), "|-------------------------------------------------------------------"); + } + + String message; + try { + if (str.startsWith("{")) { + JSONObject jsonObject = new JSONObject(str); + message = jsonObject.toString(JSON_INDENT); + } else if (str.startsWith("[")) { + JSONArray jsonArray = new JSONArray(str); + message = jsonArray.toString(JSON_INDENT); + } else { + message = str; + } + } catch (JSONException e) { + message = str; + } + + String[] lines = message.split("\n"); + for (String line : lines) { + Log.d(getTag(), line); + } + Log.d(getTag(), "===================================================================|"); + } + } + + /** + * json + * @param str + */ + public static void $json(String str) { + $json(str, null); + } + /** * 自动从StackTrace中取TAG + * * @return */ private static String getTag() { @@ -80,6 +138,7 @@ private static String getTag() { /** * 根据StackTrace生成带更多信息的log * 文件名,方法名,行数 + * * @param str * @return */ From b35e595f37a5c777963a262ca0b2a07b2b8b6ff3 Mon Sep 17 00:00:00 2001 From: Jay <673592063@qq.com> Date: Thu, 14 Jan 2016 11:14:06 +0800 Subject: [PATCH 026/106] support view throttle click listener --- .../lesscode/app/activity/ViewActivity.java | 37 +++++++++++++++++++ app/src/main/res/layout/activity_view.xml | 35 +++++++++++++----- lesscode-core/build.gradle | 2 +- .../com/jayfeng/lesscode/core/ViewLess.java | 2 + .../listener/ViewThrottleClickListener.java | 28 ++++++++++++++ 5 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 lesscode-core/src/main/java/com/jayfeng/lesscode/core/listener/ViewThrottleClickListener.java diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/ViewActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/ViewActivity.java index e16cc61..92bafde 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/ViewActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/ViewActivity.java @@ -2,14 +2,51 @@ import android.app.Activity; import android.os.Bundle; +import android.view.View; +import android.widget.Button; import com.jayfeng.lesscode.app.R; +import com.jayfeng.lesscode.core.LogLess; +import com.jayfeng.lesscode.core.ViewLess; +import com.jayfeng.lesscode.core.listener.ViewThrottleClickListener; public class ViewActivity extends Activity { + private Button normalButton; + private Button throttleButton; + private Button throttleLongButton; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view); + + normalButton = ViewLess.$(this, R.id.button_normal); + throttleButton = ViewLess.$(this, R.id.button_throttle); + throttleLongButton = ViewLess.$(this, R.id.button_throttle_long); + + normalButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + LogLess.$d("normal button click"); + } + }); + throttleButton.setOnClickListener(new ViewThrottleClickListener() { + @Override + public void throttleClick(View view) { + LogLess.$d("throttle click"); + } + }); + throttleLongButton.setOnClickListener(new ViewThrottleClickListener() { + @Override + public void throttleClick(View view) { + LogLess.$d("throttle click 3s"); + } + + @Override + public long getThrottleTime() { + return 3000; + } + }); } } diff --git a/app/src/main/res/layout/activity_view.xml b/app/src/main/res/layout/activity_view.xml index 0ee1cb1..837d7c4 100644 --- a/app/src/main/res/layout/activity_view.xml +++ b/app/src/main/res/layout/activity_view.xml @@ -1,12 +1,29 @@ - - + - +