diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..78a0eaa --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +language: android +android: + components: + # Uncomment the lines below if you want to + # use the latest revision of Android SDK Tools + # - platform-tools + # - tools + + # The BuildTools version used by your project + - tools + - build-tools-23.0.2 + + # The SDK version used to compile your project + - android-23 + - extra-android-m2repository diff --git a/README-cn.md b/README-cn.md index 9ec97d2..2b151f5 100644 --- a/README-cn.md +++ b/README-cn.md @@ -1,4 +1,4 @@ -# LessCode [![Jcenter Status](https://api.bintray.com/packages/openproject/maven/lesscode/images/download.svg)](https://bintray.com/openproject/maven/lesscode) +# LessCode [![Jcenter Status](https://api.bintray.com/packages/openproject/maven/lesscode/images/download.svg)](https://bintray.com/openproject/maven/lesscode) [![Build Status](https://travis-ci.org/openproject/LessCode.svg)](https://travis-ci.org/openproject/LessCode) 打造精简、高效的最好Android工具库! @@ -13,12 +13,7 @@ ## Gradle ```groovy -compile('com.jayfeng:lesscode-core:0.9.1') { - // 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: 'appcompat-v7' -} +implementation 'com.jayfeng:lesscode-core:2.4.2' ``` ## Features @@ -45,7 +40,7 @@ compile('com.jayfeng:lesscode-core:0.9.1') { |SharedPreferenceLess|简化和增强SharedPreference的操作| |StorageLess|手机存储相关,包括:手机内存,内置存储卡(Sdcard),外置存储卡(ExtSdcard)| |ToastLess|简化Toast的使用| -|UpdateLess/UpdateService|简单但完整的自动更新实现,无缝对接| +|UpdateLess/UpdateService|简单但完整的自动更新实现,无缝对接(已分离到LessCode-Update项目)| |ViewLess|简化繁琐的findViewById和强制转换| ## Usage diff --git a/README.md b/README.md index 2b92b06..c5f87c8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,10 @@ #### [中文版文档](https://github.com/openproject/LessCode/blob/master/README-cn.md) -# LessCode [![Jcenter Status](https://api.bintray.com/packages/openproject/maven/lesscode/images/download.svg)](https://bintray.com/openproject/maven/lesscode) +[![Jcenter Status](https://api.bintray.com/packages/openproject/maven/lesscode/images/download.svg)](https://bintray.com/openproject/maven/lesscode) +[![Build Status](https://travis-ci.org/openproject/LessCode.svg)](https://travis-ci.org/openproject/LessCode) +[![MethodCount][methodcount-svg]][methodcount-link] +# LessCode less code, more efficient for android, for the best android tools library! ## Overview @@ -9,18 +12,13 @@ less code, more efficient for android, for the best android tools library! > * support more effective methods than android > * high performence > * easy integration -> * small size (less than 50k, only 45k+ by proguard) +> * small size (only 45k~ by proguard) > * open source ## Gradle ```groovy -compile('com.jayfeng:lesscode-core:0.9.1') { - // 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: 'appcompat-v7' -} +implementation 'com.jayfeng:lesscode-core:2.4.2' ``` ## Features @@ -47,7 +45,7 @@ compile('com.jayfeng:lesscode-core:0.9.1') { |SharedPreferenceLess|简化和增强SharedPreference的操作| |StorageLess|手机存储相关,包括:手机内存,内置存储卡(Sdcard),外置存储卡(ExtSdcard)| |ToastLess|简化Toast的使用| -|UpdateLess/UpdateService|简单但完整的自动更新实现,无缝对接| +|UpdateLess/UpdateService|简单但完整的自动更新实现,无缝对接(已分离到LessCode-Update项目)| |ViewLess|简化繁琐的findViewById和强制转换| ## Usage @@ -128,3 +126,5 @@ 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. ``` +[methodcount-svg]: https://img.shields.io/badge/Methodscount-717-e91e63.svg +[methodcount-link]: http://www.methodscount.com/?lib=com.jayfeng%3Alesscode-core%3A0.9.6.1 diff --git a/app-ref-lesscode-core/.gitignore b/app-ref-lesscode-core/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/app-ref-lesscode-core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/app-ref-lesscode-core/build.gradle b/app-ref-lesscode-core/build.gradle deleted file mode 100644 index c26e719..0000000 --- a/app-ref-lesscode-core/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" - - defaultConfig { - applicationId "com.jayfeng.lesscode.app.ref.lesscodecore" - minSdkVersion 9 - targetSdkVersion 23 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:23.2.1' - 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-ref-lesscode-core/proguard-rules.pro b/app-ref-lesscode-core/proguard-rules.pro deleted file mode 100644 index 3ffecd2..0000000 --- a/app-ref-lesscode-core/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /home/jay/tools/android-sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/app-ref-lesscode-core/src/androidTest/java/com/jayfeng/lesscode/app/ref/lesscodecore/ApplicationTest.java b/app-ref-lesscode-core/src/androidTest/java/com/jayfeng/lesscode/app/ref/lesscodecore/ApplicationTest.java deleted file mode 100644 index 2a9b149..0000000 --- a/app-ref-lesscode-core/src/androidTest/java/com/jayfeng/lesscode/app/ref/lesscodecore/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jayfeng.lesscode.app.ref.lesscodecore; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app-ref-lesscode-core/src/main/AndroidManifest.xml b/app-ref-lesscode-core/src/main/AndroidManifest.xml deleted file mode 100644 index b52f528..0000000 --- a/app-ref-lesscode-core/src/main/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app-ref-lesscode-core/src/main/java/com/jayfeng/lesscode/app/ref/lesscodecore/MainActivity.java b/app-ref-lesscode-core/src/main/java/com/jayfeng/lesscode/app/ref/lesscodecore/MainActivity.java deleted file mode 100644 index 6fcff14..0000000 --- a/app-ref-lesscode-core/src/main/java/com/jayfeng/lesscode/app/ref/lesscodecore/MainActivity.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.jayfeng.lesscode.app.ref.lesscodecore; - -import android.app.Activity; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.TextView; - -import com.jayfeng.lesscode.core.AdapterLess; -import com.jayfeng.lesscode.core.ToastLess; -import com.jayfeng.lesscode.core.ViewLess; - -import java.util.ArrayList; -import java.util.List; - - -public class MainActivity extends Activity { - - private TextView textView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - textView = ViewLess.$(this, R.id.text); - - ToastLess.$(this, textView.getText().toString()); - - List list = new ArrayList<>(); - list.add("A"); - list.add("B"); - - - AdapterLess.$pager(this, list, R.layout.activity_main, new AdapterLess.PageCallBack() { - @Override - public void instantiateItem(int i, View view, Object o) { - - } - }); - } - - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } - - return super.onOptionsItemSelected(item); - } -} diff --git a/app-ref-lesscode-core/src/main/res/layout/activity_main.xml b/app-ref-lesscode-core/src/main/res/layout/activity_main.xml deleted file mode 100644 index cb4b9cb..0000000 --- a/app-ref-lesscode-core/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/app-ref-lesscode-core/src/main/res/menu/menu_main.xml b/app-ref-lesscode-core/src/main/res/menu/menu_main.xml deleted file mode 100644 index c24a41e..0000000 --- a/app-ref-lesscode-core/src/main/res/menu/menu_main.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/app-ref-lesscode-core/src/main/res/mipmap-hdpi/ic_launcher.png b/app-ref-lesscode-core/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index cde69bc..0000000 Binary files a/app-ref-lesscode-core/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/app-ref-lesscode-core/src/main/res/mipmap-mdpi/ic_launcher.png b/app-ref-lesscode-core/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c133a0c..0000000 Binary files a/app-ref-lesscode-core/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/app-ref-lesscode-core/src/main/res/mipmap-xhdpi/ic_launcher.png b/app-ref-lesscode-core/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index bfa42f0..0000000 Binary files a/app-ref-lesscode-core/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/app-ref-lesscode-core/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app-ref-lesscode-core/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 324e72c..0000000 Binary files a/app-ref-lesscode-core/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/app-ref-lesscode-core/src/main/res/values-w820dp/dimens.xml b/app-ref-lesscode-core/src/main/res/values-w820dp/dimens.xml deleted file mode 100644 index 63fc816..0000000 --- a/app-ref-lesscode-core/src/main/res/values-w820dp/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 64dp - diff --git a/app-ref-lesscode-core/src/main/res/values/dimens.xml b/app-ref-lesscode-core/src/main/res/values/dimens.xml deleted file mode 100644 index 47c8224..0000000 --- a/app-ref-lesscode-core/src/main/res/values/dimens.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - 16dp - 16dp - diff --git a/app-ref-lesscode-core/src/main/res/values/strings.xml b/app-ref-lesscode-core/src/main/res/values/strings.xml deleted file mode 100644 index 8878ed6..0000000 --- a/app-ref-lesscode-core/src/main/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - AppRef-LesscodeCore - - Hello world! - Settings - diff --git a/app-ref-lesscode-core/src/main/res/values/styles.xml b/app-ref-lesscode-core/src/main/res/values/styles.xml deleted file mode 100644 index 9812b28..0000000 --- a/app-ref-lesscode-core/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/app/build.gradle b/app/build.gradle index f0b6b51..3384bef 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { applicationId "com.jayfeng.lesscode.app" - minSdkVersion 9 - targetSdkVersion 21 + minSdkVersion 14 + targetSdkVersion 27 versionCode 1 versionName "1.0" } @@ -17,6 +17,10 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + lintOptions { + abortOnError false + } } dependencies { diff --git a/app/src/androidTest/java/com/jayfeng/lesscode/app/ApplicationTest.java b/app/src/androidTest/java/com/jayfeng/lesscode/app/ApplicationTest.java deleted file mode 100644 index c8260ef..0000000 --- a/app/src/androidTest/java/com/jayfeng/lesscode/app/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.jayfeng.lesscode.app; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6023813..dfbd8b5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,6 @@ @@ -25,9 +24,6 @@ - @@ -37,9 +33,6 @@ - diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/AdapterActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/AdapterActivity.java deleted file mode 100644 index b581a68..0000000 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/AdapterActivity.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.jayfeng.lesscode.app.activity; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.ListView; -import android.widget.TextView; - -import com.jayfeng.lesscode.app.R; -import com.jayfeng.lesscode.app.model.LessItem; -import com.jayfeng.lesscode.core.AdapterLess; -import com.jayfeng.lesscode.core.ViewLess; - -import java.util.ArrayList; -import java.util.List; - -public class AdapterActivity extends Activity { - - List list; - ListView listView; - BaseAdapter adapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_adapter); - - listView = ViewLess.$(this, R.id.listview); - - initData(); - - adapter = AdapterLess.$base(this, list, R.layout.activity_main_list_item, - new AdapterLess.CallBack() { - @Override - public View getView(int position, View convertView, AdapterLess.ViewHolder holder, LessItem lessItem) { - TextView nameView = holder.$view(convertView, R.id.name); - nameView.setText(lessItem.getName()); - return convertView; - } - }); - listView.setAdapter(adapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - Intent intent = new Intent(); - intent.setClassName(AdapterActivity.this, "com.jayfeng.lesscode.app.activity.adapterless." + list.get(position).getClassName()); - startActivity(intent); - } - }); - } - - private void initData() { - list = new ArrayList<>(); - - LessItem lessItem = new LessItem(); - lessItem.setName("AdapterLess.$base的使用"); - lessItem.setClassName("BaseAdapterActivity"); - list.add(lessItem); - - lessItem = new LessItem(); - lessItem.setName("AdapterLess.$pager的使用"); - lessItem.setClassName("PagerAdapterActivity"); - list.add(lessItem); - - lessItem = new LessItem(); - lessItem.setName("AdapterLess.$recycler的使用"); - lessItem.setClassName("RecyclerAdapterActivity"); - list.add(lessItem); - } - -} 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 27f0b24..6470ea4 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 @@ -15,6 +15,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display); + ToastLess.$(this, DisplayLess.$width(this) + "x" + DisplayLess.$height(this)); new Handler().postDelayed(new Runnable() { @Override diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/DrawableActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/DrawableActivity.java index 800cc86..b04f197 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/DrawableActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/DrawableActivity.java @@ -6,18 +6,13 @@ import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.v4.graphics.drawable.DrawableCompat; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; -import android.widget.BaseAdapter; -import android.widget.Button; import android.widget.ImageView; import android.widget.Spinner; import com.jayfeng.lesscode.app.R; -import com.jayfeng.lesscode.core.AdapterLess; -import com.jayfeng.lesscode.core.AppLess; import com.jayfeng.lesscode.core.DrawableLess; import com.jayfeng.lesscode.core.ToastLess; import com.jayfeng.lesscode.core.ViewLess; 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 b341140..8e12900 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 @@ -1,27 +1,21 @@ package com.jayfeng.lesscode.app.activity; import android.app.Activity; -import android.content.Intent; import android.os.Bundle; -import android.view.View; -import android.widget.AdapterView; +import android.os.Environment; import android.widget.BaseAdapter; import android.widget.ListView; -import android.widget.TextView; import com.jayfeng.lesscode.app.R; import com.jayfeng.lesscode.app.model.LessItem; -import com.jayfeng.lesscode.app.model.Person; import com.jayfeng.lesscode.core.ActivityLess; -import com.jayfeng.lesscode.core.AdapterLess; +import com.jayfeng.lesscode.core.HttpLess; import com.jayfeng.lesscode.core.LogLess; -import com.jayfeng.lesscode.core.NetworkLess; -import com.jayfeng.lesscode.core.SerializeLess; -import com.jayfeng.lesscode.core.SharedPreferenceLess; import com.jayfeng.lesscode.core.ToastLess; import com.jayfeng.lesscode.core.ViewLess; import java.io.File; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; @@ -43,32 +37,63 @@ protected void onCreate(Bundle savedInstanceState) { initData(); - adapter = AdapterLess.$base(this, list, R.layout.activity_main_list_item, - new AdapterLess.CallBack() { - @Override - public View getView(int position, View convertView, AdapterLess.ViewHolder holder, LessItem lessItem) { - TextView nameView = holder.$view(convertView, R.id.name); - nameView.setText(lessItem.getName()); - return convertView; - } - }); - listView.setAdapter(adapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + final File mDestDir = new File(Environment.getExternalStorageDirectory().getPath() + "/lesscode-download"); + if (mDestDir.exists() && !mDestDir.isDirectory()) { + mDestDir.delete(); + } + if (mDestDir.exists() || mDestDir.mkdirs()) { + + } + final File mDestFile = new File(mDestDir.getPath() + "/" + URLEncoder.encode("http://www.vpngo.com/download/vpngo-release-v1.3.1-46.apk")); + new Thread() { @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - Intent intent = new Intent(); - intent.setClassName(MainActivity.this, "com.jayfeng.lesscode.app.activity." + list.get(position).getClassName()); - startActivity(intent); + public void run() { + try { + HttpLess.$download("http://www.vpngo.com/download/vpngo-release-v1.3.1-46.apk", mDestFile, false, new HttpLess.DownloadCallBack() { + @Override + public void onDownloading(int progress) { + + } + + @Override + public void onDownloaded() { + LogLess.$d("下载完成"); + } + }); + } catch (Exception e) { + e.printStackTrace(); + LogLess.$d(e.getMessage()); + } } - }); - - LogLess.$d("network: %s, type: %s", NetworkLess.$online(), NetworkLess.$type()); - - Person person = new Person("fengj"); - SerializeLess.$se(new File(getCacheDir(), "person").getAbsolutePath(), person); - - Person person1 = SerializeLess.$de(new File(getCacheDir(), "person").getAbsolutePath()); - ToastLess.$(this, person1.getName()); + }.start(); + + +// adapter = AdapterLess.$base(this, list, R.layout.activity_main_list_item, +// new AdapterLess.CallBack() { +// @Override +// public View getView(int position, View convertView, AdapterLess.ViewHolder holder, LessItem lessItem) { +// TextView nameView = holder.$view(convertView, R.id.name); +// nameView.setText(lessItem.getName()); +// return convertView; +// } +// }); +// listView.setAdapter(adapter); +// listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { +// @Override +// public void onItemClick(AdapterView parent, View view, int position, long id) { +// Intent intent = new Intent(); +// intent.setClassName(MainActivity.this, "com.jayfeng.lesscode.app.activity." + list.get(position).getClassName()); +// startActivity(intent); +// } +// }); +// +// LogLess.$d("network: %s, type: %s", NetworkLess.$online(), NetworkLess.$type()); +// +// Person person = new Person("fengj"); +// SerializeLess.$se(new File(getCacheDir(), "person").getAbsolutePath(), person); +// +// Person person1 = SerializeLess.$de(new File(getCacheDir(), "person").getAbsolutePath()); +// ToastLess.$(this, person1.getName()); } @@ -80,11 +105,6 @@ private void initData() { lessItem.setClassName("ActivityActivity"); list.add(lessItem); - lessItem = new LessItem(); - lessItem.setName("AdapterLess的使用"); - lessItem.setClassName("AdapterActivity"); - list.add(lessItem); - lessItem = new LessItem(); lessItem.setName("AppLess的使用"); lessItem.setClassName("AppActivity"); @@ -165,11 +185,6 @@ private void initData() { lessItem.setClassName("ToastActivity"); list.add(lessItem); - lessItem = new LessItem(); - lessItem.setName("UpdateLess的使用"); - lessItem.setClassName("UpdateActivity"); - list.add(lessItem); - lessItem = new LessItem(); lessItem.setName("ViewLess的使用"); lessItem.setClassName("ViewActivity"); 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 92fe23e..7156472 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 @@ -15,17 +15,17 @@ protected void onCreate(Bundle 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"); - SharedPreferenceLess.$put(this, "key5", null); + SharedPreferenceLess.$put("key1", 333); + SharedPreferenceLess.$put("key2", 0.5f); + SharedPreferenceLess.$put("key3", true); + SharedPreferenceLess.$put("key4", 100000L); + SharedPreferenceLess.$put("key5", "i am a string"); + SharedPreferenceLess.$put("key5", null); - 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", "")); + LogLess.$d(SharedPreferenceLess.$get("key1", 0) + ""); + LogLess.$d(SharedPreferenceLess.$get("key2", 0f) + ""); + LogLess.$d(SharedPreferenceLess.$get("key3", false) + ""); + LogLess.$d(SharedPreferenceLess.$get("key4", 0L) + ""); + LogLess.$d(SharedPreferenceLess.$get("key5", "")); } } diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/ToastActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/ToastActivity.java index e830192..71721b8 100644 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/ToastActivity.java +++ b/app/src/main/java/com/jayfeng/lesscode/app/activity/ToastActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import com.jayfeng.lesscode.app.R; +import com.jayfeng.lesscode.core.ToastLess; public class ToastActivity extends Activity { @@ -11,5 +12,8 @@ public class ToastActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_toast); + + + ToastLess.$("xxxxx"); } } diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/UpdateActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/UpdateActivity.java deleted file mode 100644 index 3dbb731..0000000 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/UpdateActivity.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jayfeng.lesscode.app.activity; - -import android.app.Activity; -import android.os.Bundle; - -import com.jayfeng.lesscode.app.R; -import com.jayfeng.lesscode.core.UpdateLess; - -public class UpdateActivity extends Activity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_update); - - String updateJson = "{\n" + - " \"vercode\":112,\n" + - " \"vername\":\"V1.1\",\n" + - " \"download\":\"http://www.apk.anzhi.com/data3/apk/201506/09/3a978f27369b4a8bf6de1270da9871ec_86281300.apk\",\n" + - " \"log\":\"upgrade content\"\n" + - " }"; - UpdateLess.$check(this, updateJson); - } -} diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/BaseAdapterActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/BaseAdapterActivity.java deleted file mode 100644 index d4deedd..0000000 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/BaseAdapterActivity.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.jayfeng.lesscode.app.activity.adapterless; - -import android.app.Activity; -import android.os.Bundle; -import android.view.View; -import android.widget.BaseAdapter; -import android.widget.ListView; -import android.widget.TextView; - -import com.jayfeng.lesscode.app.R; -import com.jayfeng.lesscode.app.model.Person; -import com.jayfeng.lesscode.core.AdapterLess; -import com.jayfeng.lesscode.core.ViewLess; - -import java.util.ArrayList; -import java.util.List; - -public class BaseAdapterActivity extends Activity { - - List list; - ListView listView; - BaseAdapter adapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_adapter_base); - listView = ViewLess.$(this, R.id.listview); - initData(); - - // simple callback - /* - adapter = AdapterLess.$base(this, list, R.layout.activity_main_list_item, - new AdapterLess.CallBack() { - @Override - public View getView(int position, View convertView, AdapterLess.ViewHolder holder, Person person) { - TextView nameView = holder.$view(convertView, R.id.name); - nameView.setText(person.getName()); - return convertView; - } - }); - */ - adapter = AdapterLess.$base(this, list, - new int[] { R.layout.activity_main_list_item, R.layout.adapter_list_item_header}, - new AdapterLess.FullCallBack() { - @Override - public View getView(int position, View convertView, AdapterLess.ViewHolder holder, Person person) { - TextView nameView = holder.$view(convertView, R.id.name); - nameView.setText(person.getName()); - return convertView; - } - - @Override - public int getItemViewType(int position) { - Person person = list.get(position); - if ("header".equals(person.getName())) { - return 1; - } else { - return 0; - } - } - - @Override - public boolean isEnabled(int position) { - Person person = list.get(position); - if ("header".equals(person.getName())) { - return false; - } - return true; - } - }); - // full callback - - listView.setAdapter(adapter); - } - - private void initData() { - list = new ArrayList<>(); - list.add(new Person("header")); - list.add(new Person("jay")); - list.add(new Person("bee")); - list.add(new Person("header")); - list.add(new Person("chras")); - list.add(new Person("nichid")); - } - -} diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/PagerAdapterActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/PagerAdapterActivity.java deleted file mode 100644 index ea3ca7a..0000000 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/PagerAdapterActivity.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.jayfeng.lesscode.app.activity.adapterless; - -import android.app.Activity; -import android.os.Bundle; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; -import android.view.View; -import android.widget.BaseAdapter; -import android.widget.ListView; -import android.widget.TextView; - -import com.jayfeng.lesscode.app.R; -import com.jayfeng.lesscode.app.model.Person; -import com.jayfeng.lesscode.core.AdapterLess; -import com.jayfeng.lesscode.core.ViewLess; - -import java.util.ArrayList; -import java.util.List; - -public class PagerAdapterActivity extends Activity { - - List list; - ViewPager viewPager; - PagerAdapter adapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_adapter_pager); - viewPager = ViewLess.$(this, R.id.viewpager); - initData(); - - adapter = AdapterLess.$pager(this, list, - R.layout.activity_main_list_item, - new AdapterLess.PageCallBack() { - @Override - public void instantiateItem(int position, View view, Person person) { - TextView nameView = ViewLess.$(view, R.id.name); - nameView.setText("page " + position + ":" + person.getName()); - } - }); - - viewPager.setAdapter(adapter); - } - - private void initData() { - list = new ArrayList<>(); - list.add(new Person("header")); - list.add(new Person("jay")); - list.add(new Person("bee")); - list.add(new Person("header")); - list.add(new Person("chras")); - list.add(new Person("nichid")); - } - -} diff --git a/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/RecyclerAdapterActivity.java b/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/RecyclerAdapterActivity.java deleted file mode 100644 index 8362bbd..0000000 --- a/app/src/main/java/com/jayfeng/lesscode/app/activity/adapterless/RecyclerAdapterActivity.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.jayfeng.lesscode.app.activity.adapterless; - -import android.app.Activity; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.GradientDrawable; -import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.widget.TextView; - -import com.jayfeng.lesscode.app.R; -import com.jayfeng.lesscode.app.model.Person; -import com.jayfeng.lesscode.core.AdapterLess; -import com.jayfeng.lesscode.core.DisplayLess; -import com.jayfeng.lesscode.core.ViewLess; -import com.jayfeng.lesscode.core.other.DividerItemDecoration; - -import java.util.ArrayList; -import java.util.List; - -public class RecyclerAdapterActivity extends Activity { - - List list; - RecyclerView recyclerView; - RecyclerView.LayoutManager layoutManager; - RecyclerView.Adapter adapter; - DividerItemDecoration dividerItemDecoration; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_adapter_recycler); - recyclerView = ViewLess.$(this, R.id.recycler); - - layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); - recyclerView.setLayoutManager(layoutManager); - dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL_LIST, getResources().getDrawable(R.drawable.list_divider)); - dividerItemDecoration.setWidth(DisplayLess.$dp2px(16) + 1); - - initData(); - - adapter = AdapterLess.$recycler(this, list, - R.layout.activity_main_list_item, - new AdapterLess.RecyclerCallBack() { - - @Override - public void onBindViewHolder(int position, AdapterLess.RecyclerViewHolder recyclerViewHolder, Person person) { - TextView nameView = recyclerViewHolder.$view(R.id.name); - nameView.setText(person.getName()); - } - }); - - recyclerView.setAdapter(adapter); - - recyclerView.addItemDecoration(dividerItemDecoration); - } - - private void initData() { - list = new ArrayList<>(); - list.add(new Person("header")); - list.add(new Person("jay")); - list.add(new Person("bee")); - list.add(new Person("header")); - list.add(new Person("chras")); - list.add(new Person("nichid")); - } - -} diff --git a/app/src/main/res/layout/activity_main_list_item.xml b/app/src/main/res/layout/activity_main_list_item.xml index ca83f07..847d0ee 100644 --- a/app/src/main/res/layout/activity_main_list_item.xml +++ b/app/src/main/res/layout/activity_main_list_item.xml @@ -1,5 +1,5 @@ Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/lesscode-core/src/main/AndroidManifest.xml b/lesscode-core/src/main/AndroidManifest.xml index a015d3a..25dc021 100644 --- a/lesscode-core/src/main/AndroidManifest.xml +++ b/lesscode-core/src/main/AndroidManifest.xml @@ -8,9 +8,6 @@ - - - - + 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 deleted file mode 100644 index b13271a..0000000 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/AdapterLess.java +++ /dev/null @@ -1,462 +0,0 @@ -package com.jayfeng.lesscode.core; - -import android.content.Context; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.PagerAdapter; -import android.support.v7.widget.RecyclerView; -import android.util.SparseArray; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; - -import java.util.List; - -/** - * 适配器简化相关的工具类 - * 常用于:ListView,ViewPager,RecyclerView - */ -public final class AdapterLess { - - /** - * 创建一个RecyclerView.Adapter - * 面向: RecyclerView - * 主要是: - * 1. 抽象出重复代码,默认实现一些常规代码 - * 2. 封装了RecyclerViewHolder - * 3. 自动传递Model给getView - * @param context - * @param list model的列表 - * @param layoutId 布局xml的id - * @param recyclerCallBack 包含nBindViewHolder方法的回调 - * @param r - * @return - */ - public static RecyclerView.Adapter $recycler(final Context context, - final List list, - final int layoutId, - final RecyclerCallBack recyclerCallBack) { - RecyclerView.Adapter result = new RecyclerView.Adapter() { - @Override - public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { - View view = LayoutInflater.from(context) - .inflate(layoutId, 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); - } - recyclerCallBack.onBindViewHolder(position, viewHolder, t); - } - - @Override - public int getItemCount() { - if (list != null) { - return list.size(); - } - return 0; - } - }; - 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 $recycler(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 - * 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, - final CallBack callBack) { - - BaseAdapter result = new BaseAdapter() { - - @Override - public int getCount() { - if (list != null) { - return list.size(); - } - return 0; - } - - @Override - public T getItem(int position) { - return list.get(position); - } - - @Override - public long getItemId(int position) { - return 0; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - ViewHolder holder; - if (null == convertView) { - holder = new ViewHolder(); - convertView = LayoutInflater.from(context).inflate(layoutId, null); - convertView.setTag(holder); - } else { - holder = (ViewHolder) convertView.getTag(); - } - T t = null; - if (position < list.size()) { - t = getItem(position); - } - return callBack.getView(position, convertView, holder, t); - } - - }; - return result; - } - - - /** - * 同上,也是创建了BaseAdapter - * 面向: AbsListView - * 支持多布局,也多增加了两个回调方法,便于自定义: - * 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, - final FullCallBack fullCallBack) { - - BaseAdapter result = new BaseAdapter() { - - @Override - public int getCount() { - if (list != null) { - return list.size(); - } - return 0; - } - - @Override - public T getItem(int position) { - return list.get(position); - } - - @Override - public long getItemId(int position) { - return 0; - } - - @Override - public int getItemViewType(int position) { - return fullCallBack.getItemViewType(position); - } - - @Override - public int getViewTypeCount() { - return layoutIds.length; - } - - @Override - public boolean isEnabled(int position) { - return fullCallBack.isEnabled(position); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - ViewHolder[] holders = new ViewHolder[layoutIds.length]; - int i = getItemViewType(position); - if (null == convertView) { - holders[i] = new ViewHolder(); - convertView = LayoutInflater.from(context).inflate(layoutIds[i], null); - convertView.setTag(holders[i]); - } else { - holders[i] = (ViewHolder) convertView.getTag(); - } - T t = null; - if (position < list.size()) { - t = getItem(position); - } - return fullCallBack.getView(position, convertView, holders[i], t); - } - - }; - return result; - } - - /** - * 创建PagerAdapter - * 面向: ViewPager - * 主要是: - * 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, - final PageCallBack pageCallBack) { - PagerAdapter result = new PagerAdapter() { - - @Override - public int getCount() { - return list.size(); - } - - @Override - public boolean isViewFromObject(View view, Object object) { - return view == object; - } - - @Override - public Object instantiateItem(ViewGroup container, int position) { - View view = LayoutInflater.from(context).inflate(layoutId, null); - container.addView(view); - pageCallBack.instantiateItem(position, view, list.get(position)); - return view; - } - - @Override - public void destroyItem(ViewGroup container, int position, Object object) { - container.removeView((View) 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) { - FragmentPagerAdapter result = new FragmentPagerAdapter(fragmentManager) { - @Override - public Fragment getItem(int position) { - return fragmentPagerCallBack.getItem(position); - } - - @Override - public int getCount() { - return count; - } - }; - 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) { - FragmentPagerAdapter result = new FragmentPagerAdapter(fragmentManager) { - @Override - public Fragment getItem(int position) { - return fullFragmentPagerCallBack.getItem(position); - } - - @Override - public int getCount() { - return count; - } - - @Override - public String getPageTitle(int position) { - return fullFragmentPagerCallBack.getPageTitle(position); - } - }; - return result; - } - - /** - * RecyclerCallBack - * @param - */ - 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 - */ - 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); - - int getItemViewType(int position); - - 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); - } - - - /** - * ViewHolder类相当于一个享元模式的工厂类 - * 主要用了以下优化点: - * 1. 缓存了findViewById的view,如果已经创建,则直接返回,提高了性能 - * 2. 用SparseArray代替HashMap优化性能 - */ - public static class ViewHolder { - 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) { - v = ViewLess.$(convertView, viewId); - views.put(viewId, v); - } - return (T) v; - } - } - - /** - * 单独封装了RecyclerView的ViewHolder - */ - public static class RecyclerViewHolder extends RecyclerView.ViewHolder { - public RecyclerViewHolder(View itemView) { - super(itemView); - } - - public T $view(int viewId) { - return ViewLess.$(itemView, viewId); - } - } -} diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ApplicationLess.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ApplicationLess.java new file mode 100644 index 0000000..4a521bb --- /dev/null +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/ApplicationLess.java @@ -0,0 +1,29 @@ +package com.jayfeng.lesscode.core; + +import android.app.ActivityManager; +import android.content.Context; +import android.os.Process; + +import java.util.List; + +public final class ApplicationLess { + + /** + * 根据进程名称判断第一次真正的初始化 + * + * @param context + * @return + */ + public static boolean $init(Context context) { + ActivityManager am = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)); + List processInfos = am.getRunningAppProcesses(); + String mainProcessName = context.getPackageName(); + int myPid = Process.myPid(); + for (ActivityManager.RunningAppProcessInfo info : processInfos) { + if (info.pid == myPid && mainProcessName.equals(info.processName)) { + return true; + } + } + return false; + } +} 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 b99a9ba..c226f7e 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 @@ -7,6 +7,7 @@ import java.io.File; import java.io.FileInputStream; +import java.io.IOException; /** * 设备相关的工具类 @@ -24,21 +25,41 @@ public final class DeviceLess { try { String path = "sys/class/net/wlan0/address"; if ((new File(path)).exists()) { - FileInputStream fis = new FileInputStream(path); - byte[] buffer = new byte[8192]; - int byteCount = fis.read(buffer); - if (byteCount > 0) { - result = new String(buffer, 0, byteCount, "utf-8"); + FileInputStream fis = null; + try { + fis = new FileInputStream(path); + byte[] buffer = new byte[8192]; + int byteCount = fis.read(buffer); + if (byteCount > 0) { + result = new String(buffer, 0, byteCount, "utf-8"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fis != null) { + fis.close(); + } } + } if (TextUtils.isEmpty(result)) { path = "sys/class/net/eth0/address"; - FileInputStream fis_name = new FileInputStream(path); - byte[] buffer_name = new byte[8192]; - int byteCount_name = fis_name.read(buffer_name); - if (byteCount_name > 0) { - result = new String(buffer_name, 0, byteCount_name, "utf-8"); + FileInputStream fis_name = null; + try { + fis_name = new FileInputStream(path); + byte[] buffer_name = new byte[8192]; + int byteCount_name = fis_name.read(buffer_name); + if (byteCount_name > 0) { + result = new String(buffer_name, 0, byteCount_name, "utf-8"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fis_name != null) { + fis_name.close(); + } } + } if (TextUtils.isEmpty(result)) { 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 ba73365..561a340 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 @@ -8,6 +8,7 @@ import android.graphics.Rect; import android.util.DisplayMetrics; import android.view.Window; +import android.view.WindowManager; import java.lang.reflect.Field; @@ -18,28 +19,33 @@ public final class DisplayLess { /** * 屏幕宽度 - * @param activity + * + * @param context * @return */ - public static int $width(Activity activity) { + public static int $width(Context context) { DisplayMetrics displayMetrics = new DisplayMetrics(); - activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + windowManager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.widthPixels; } /** * 屏幕高度 - * @param activity + * + * @param context * @return */ - public static int $height(Activity activity) { + public static int $height(Context context) { DisplayMetrics displayMetrics = new DisplayMetrics(); - activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + windowManager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.heightPixels; } /** * dp转px + * * @param dp * @return */ @@ -47,9 +53,21 @@ public final class DisplayLess { return (int) (dp * Resources.getSystem().getDisplayMetrics().density); } + /** + * sp转px + * + * @param sp + * @return + */ + public static int $sp2px(float sp) { + float scale = Resources.getSystem().getDisplayMetrics().scaledDensity; + return (int) (sp * scale + 0.5f); + } + /** * 获取状态栏高度 * 注: 该方法在onCreate中获取值为0 + * * @param activity * @return */ @@ -62,6 +80,7 @@ public final class DisplayLess { /** * 获取状态栏高度 * 注: 该方法在onCreate中获取值为0 + * * @param resources * @return */ @@ -77,7 +96,7 @@ public final class DisplayLess { field = c.getField("status_bar_height"); x = Integer.parseInt(field.get(obj).toString()); statusBarHeight = resources.getDimensionPixelSize(x); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } return statusBarHeight; @@ -85,6 +104,7 @@ public final class DisplayLess { /** * 获取标题栏高度 + * * @param activity * @return */ @@ -96,6 +116,7 @@ public final class DisplayLess { /** * 是否为平板 + * * @param context * @return */ @@ -111,22 +132,31 @@ public final class DisplayLess { * 各大设备密度判断 * **************************** */ - public static boolean isLdpi() { + public static boolean $ldpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_ldpi); } - public static boolean isMdpi() { + + public static boolean $mdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_mdpi); } - public static boolean isTVdpi() { + + public static boolean $tvdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_tvdpi); } - public static boolean isHdpi() { + + public static boolean $hdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_hdpi); } - public static boolean isXHdpi() { + + public static boolean $xhdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_xhdpi); } - public static boolean isXXHdpi() { + + public static boolean $xxhdpi() { return $.sAppContext.getResources().getBoolean(R.bool.less_xxhdpi); } + + public static boolean $xxxhdpi() { + return $.sAppContext.getResources().getBoolean(R.bool.less_xxxhdpi); + } } 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 f0759ac..d0936f3 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 @@ -52,7 +52,12 @@ public final class HttpLess { String value = entry.getValue().toString(); conn.setRequestProperty(key, value); } - if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { + if (conn.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM + || conn.getResponseCode()== HttpURLConnection.HTTP_MOVED_TEMP) { + // 重定向地址下载 + String redirectDownloadUrl = conn.getHeaderField("location"); + return $get(redirectDownloadUrl, header); + } else if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { is = conn.getInputStream(); return FileLess.$read(is); } @@ -264,7 +269,12 @@ public void run() { String value = entry.getValue().toString(); conn.setRequestProperty(key, value); } - if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { + if (conn.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM + || conn.getResponseCode()== HttpURLConnection.HTTP_MOVED_TEMP) { + // 重定向地址下载 + String redirectDownloadUrl = conn.getHeaderField("location"); + return $download(redirectDownloadUrl, dest, append, header, callBack); + } else if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { is = conn.getInputStream(); remoteSize = conn.getContentLength(); String contentEndcoding = conn.getHeaderField("Content-Encoding"); @@ -293,10 +303,8 @@ public void run() { totalSize = 0; } } - } catch (IOException e) { - e.printStackTrace(); } catch (Exception e) { - e.printStackTrace(); + throw e; } finally { if (os != null) { os.close(); 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 7024c49..c532f5a 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 @@ -60,6 +60,7 @@ public static enum NetworkType { if (type == ConnectivityManager.TYPE_MOBILE) { switch (subType) { case TelephonyManager.NETWORK_TYPE_GPRS: + case TelephonyManager.NETWORK_TYPE_GSM: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_1xRTT: @@ -75,10 +76,15 @@ public static enum NetworkType { case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EHRPD: case TelephonyManager.NETWORK_TYPE_HSPAP: + case TelephonyManager.NETWORK_TYPE_TD_SCDMA: return NetworkType.MOBILE_MIDDLE;// 3G case TelephonyManager.NETWORK_TYPE_LTE: + case TelephonyManager.NETWORK_TYPE_IWLAN: + case 19: // TelephonyManager.NETWORK_TYPE_LTE_CA return NetworkType.MOBILE_FAST; // 4G + default: // we think the network will be more and more better + return NetworkType.MOBILE_FAST; } } 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 f110fff..88f75b1 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 @@ -10,8 +10,8 @@ public final class SharedPreferenceLess { public static final String SHARED_NAME = "shared_name"; - public static void $put(Context context, String key, T value) { - SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, + public static void $put(String key, T value) { + SharedPreferences sp = $.sAppContext.getSharedPreferences(SHARED_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); @@ -37,46 +37,46 @@ public final class SharedPreferenceLess { SharedPreferencesCompat.apply(editor); } - public static String $get(Context context, String key, String defaultValue) { - SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, + public static String $get(String key, String defaultValue) { + SharedPreferences sp = $.sAppContext.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, + public static boolean $get(String key, boolean defaultValue) { + SharedPreferences sp = $.sAppContext.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, + public static float $get(String key, float defaultValue) { + SharedPreferences sp = $.sAppContext.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, + public static int $get(String key, int defaultValue) { + SharedPreferences sp = $.sAppContext.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, + public static long $get(String key, long defaultValue) { + SharedPreferences sp = $.sAppContext.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, + public static void $remove(String key) { + SharedPreferences sp = $.sAppContext.getSharedPreferences(SHARED_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.remove(key); SharedPreferencesCompat.apply(editor); } - public static void $clear(Context context) { - SharedPreferences sp = context.getSharedPreferences(SHARED_NAME, + public static void $clear() { + SharedPreferences sp = $.sAppContext.getSharedPreferences(SHARED_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.clear(); 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 8b046e9..d881dc2 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 @@ -186,17 +186,29 @@ public static class ExtSdcard { } private static long total(File path) { - StatFs stat = new StatFs(path.getPath()); - long blockSize = stat.getBlockSize(); - long totalBlocks = stat.getBlockCount(); - return blockSize * totalBlocks; + try { + StatFs stat = new StatFs(path.getPath()); + long blockSize = stat.getBlockSize(); + long totalBlocks = stat.getBlockCount(); + return blockSize * totalBlocks; + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; } private static long free(File path) { - StatFs stat = new StatFs(path.getPath()); - long blockSize = stat.getBlockSize(); - long freeBlocks = stat.getAvailableBlocks(); - return blockSize * freeBlocks; + try { + StatFs stat = new StatFs(path.getPath()); + long blockSize = stat.getBlockSize(); + long freeBlocks = stat.getAvailableBlocks(); + return blockSize * freeBlocks; + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; } private static long used(File path) { 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 31e5005..c28d5b9 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 @@ -8,12 +8,21 @@ */ public final class ToastLess { + @Deprecated public static void $(Context context, String message) { Toast.makeText(context.getApplicationContext(), message, Toast.LENGTH_SHORT).show(); } + @Deprecated public static void $(Context context, int stringId) { Toast.makeText(context.getApplicationContext(), stringId, Toast.LENGTH_SHORT).show(); } + public static void $(String message) { + Toast.makeText($.sAppContext, message, Toast.LENGTH_SHORT).show(); + } + + public static void $(int stringId) { + Toast.makeText($.sAppContext, stringId, Toast.LENGTH_SHORT).show(); + } } 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 deleted file mode 100644 index 467426a..0000000 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateLess.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.jayfeng.lesscode.core; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; - -import org.json.JSONException; -import org.json.JSONObject; - -/** - * 检查更新工具类 - * { - * "vercode":1, - * "vername":"v1.1", - * "download":"http://www.jayfeng.com/lesscode-app.apk", - * "log":"upgrade content" - * } - */ -public final class UpdateLess { - - /** - * 解析json和本地信息比较,判断是否有更新 - * @return 有更新则返回true,否则返回false - */ - public static boolean $check(final Context context, String updateJson) { - int vercode = 0; - String vername = ""; - String log = ""; - String download; - - JSONObject jsonObject; - try { - jsonObject = new JSONObject(updateJson); - vercode = jsonObject.optInt("vercode"); - vername = jsonObject.optString("vername"); - download = jsonObject.optString("download"); - log = jsonObject.optString("log"); - } catch (JSONException e) { - e.printStackTrace(); - return false; - } - - 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 (!$hasUpdate(vercode)) { - return false; - } - - // 有更新,则弹出对话框告知用户 - new AlertDialog.Builder(context) - .setTitle(context.getString(R.string.less_app_download_dialog_title) + vername) - .setMessage(log) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(context, UpdateService.class); - intent.putExtra($.KEY_DOWNLOAD_URL, download); - context.startService(intent); - } - }).show(); - - return true; - } - - /** - * 根据版本判断是否有更新 - * @param vercode - * @return - */ - public static boolean $hasUpdate(int vercode) { - if (vercode <= AppLess.$vercode()) { - return false; - } - 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); - context.startService(intent); - } -} 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 deleted file mode 100644 index 97da256..0000000 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/UpdateService.java +++ /dev/null @@ -1,268 +0,0 @@ -package com.jayfeng.lesscode.core; - -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.app.Service; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Environment; -import android.os.Handler; -import android.os.IBinder; -import android.os.Message; -import android.text.TextUtils; -import android.view.View; -import android.widget.RemoteViews; -import android.widget.Toast; - -import java.io.File; -import java.net.URLEncoder; - -/** - * 检查更新后台下载服务 - */ -public class UpdateService extends Service { - - private static final int DOWNLOAD_STATE_FAILURE = -1; - private static final int DOWNLOAD_STATE_SUCCESS = 0; - 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; - private Notification mNotification = null; - private PendingIntent mPendingIntent = null; - - private String mDownloadSDPath; - private String mDownloadUrl; - private File mDestDir; - private File mDestFile; - - private boolean mIsDownloading = false; - - private Handler.Callback mHandlerCallBack = new Handler.Callback() { - @Override - public boolean handleMessage(Message msg) { - switch (msg.what) { - case DOWNLOAD_STATE_SUCCESS: - Toast.makeText(getApplicationContext(), R.string.less_app_download_success, Toast.LENGTH_LONG).show(); - install(mDestFile); - break; - case DOWNLOAD_STATE_FAILURE: - Toast.makeText(getApplicationContext(), R.string.less_app_download_failure, Toast.LENGTH_LONG).show(); - mNotificationManager.cancel(NOTIFICATION_ID); - break; - case DOWNLOAD_STATE_START: - Toast.makeText(getApplicationContext(), R.string.less_app_download_start, Toast.LENGTH_LONG).show(); - break; - case DOWNLOAD_STATE_INSTALL: - Toast.makeText(getApplicationContext(), R.string.less_app_download_install, Toast.LENGTH_LONG).show(); - break; - 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; - } - return true; - } - }; - private Handler mHandler = new Handler(mHandlerCallBack); - - private HttpLess.DownloadCallBack mDownloadCallBack = new HttpLess.DownloadCallBack() { - - @Override - public void onDownloading(int progress) { - if (progress % $.sNotificationFrequent == 0 || progress == 1 || progress == 100) { - mNotification.contentView.setProgressBar(R.id.less_app_update_progressbar, 100, progress, false); - mNotification.contentView.setTextViewText(R.id.less_app_update_progress_text, progress + "%"); - mNotificationManager.notify(NOTIFICATION_ID, mNotification); - } - } - - @Override - public void onDownloaded() { - mNotification.contentView.setViewVisibility(R.id.less_app_update_progress_block, View.GONE); - mNotification.defaults = Notification.DEFAULT_SOUND; - mNotification.contentIntent = mPendingIntent; - mNotification.contentView.setTextViewText(R.id.less_app_update_progress_text, getText(R.string.less_app_download_notification_success)); - mNotificationManager.notify(NOTIFICATION_ID, mNotification); - if (mDestFile.exists() && mDestFile.isFile() && checkApkFile(mDestFile.getPath())) { - Message msg = mHandler.obtainMessage(); - msg.what = DOWNLOAD_STATE_SUCCESS; - mHandler.sendMessage(msg); - } - mNotificationManager.cancel(NOTIFICATION_ID); - } - }; - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - - // check downloading state - if (mIsDownloading) { - ToastLess.$(this, R.string.less_app_download_downloading); - return super.onStartCommand(intent, flags, startId); - } - - mDownloadUrl = intent.getStringExtra($.KEY_DOWNLOAD_URL); - if (TextUtils.isEmpty($.sDownloadSDPath)) { - mDownloadSDPath = getPackageName() + "/download"; - } else { - 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); - if (mDestDir.exists()) { - File destFile = new File(mDestDir.getPath() + "/" + URLEncoder.encode(mDownloadUrl)); - if (destFile.exists() && destFile.isFile() && checkApkFile(destFile.getPath())) { - - sendMessage(DOWNLOAD_STATE_INSTALL); - install(destFile); - stopSelf(); - return super.onStartCommand(intent, flags, startId); - } - } - } else { - sendMessage(DOWNLOAD_STATE_ERROR_SDCARD); - return super.onStartCommand(intent, flags, startId); - } - - mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - mNotification = new Notification(); - - mNotification.contentView = new RemoteViews(getApplication().getPackageName(), R.layout.less_app_update_notification); - - Intent completingIntent = new Intent(); - completingIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - completingIntent.setClass(getApplicationContext(), UpdateService.class); - - mPendingIntent = PendingIntent.getActivity(UpdateService.this, R.string.less_app_name, completingIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - mNotification.icon = $.sUpdateIcon != 0 ? $.sUpdateIcon : R.drawable.less_app_update_icon; - mNotification.tickerText = getText(R.string.less_app_download_notification_start); - mNotification.contentIntent = mPendingIntent; - mNotification.contentView.setProgressBar(R.id.less_app_update_progressbar, 100, 0, false); - mNotification.contentView.setTextViewText(R.id.less_app_update_progress_text, "0%"); - if ($.sUpdateIcon != 0) { - mNotification.contentView.setImageViewResource(R.id.less_app_update_progress_icon, $.sUpdateIcon); - } - mNotificationManager.cancel(NOTIFICATION_ID); - mNotificationManager.notify(NOTIFICATION_ID, mNotification); - - // 启动线程开始下载 - new UpdateThread().start(); - - return super.onStartCommand(intent, flags, startId); - } - - /** - * 检查apk文件是否有效(是正确下载,没有损坏的) - * @param apkFilePath - * @return - */ - public boolean checkApkFile(String apkFilePath) { - boolean result; - try { - PackageManager pManager = getPackageManager(); - PackageInfo pInfo = pManager.getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES); - if (pInfo == null) { - result = false; - } else { - result = true; - } - } catch (Exception e) { - result = false; - e.printStackTrace(); - } - return result; - } - - /** - * 调用系统Intent安装apk包 - * @param apkFile - */ - private void install(File apkFile) { - Uri uri = Uri.fromFile(apkFile); - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.setDataAndType(uri, "application/vnd.android.package-archive"); - startActivity(intent); - } - - private void sendMessage(int what) { - Message msg = mHandler.obtainMessage(); - msg.what = what; - mHandler.sendMessage(msg); - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - @Override - public void onDestroy() { - super.onDestroy(); - mHandler.removeCallbacksAndMessages(null); - } - - /** - * 下载线程 - */ - class UpdateThread extends Thread { - - @Override - public void run() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - if (mDestDir == null) { - mDestDir = new File(Environment.getExternalStorageDirectory().getPath() - + "/" + mDownloadSDPath); - } - - if (mDestDir.exists() && !mDestDir.isDirectory()) { - mDestDir.delete(); - } - - if (mDestDir.exists() || mDestDir.mkdirs()) { - mDestFile = new File(mDestDir.getPath() - + "/" + URLEncoder.encode(mDownloadUrl)); - - if (mDestFile.exists() - && mDestFile.isFile() - && checkApkFile(mDestFile.getPath())) { - sendMessage(DOWNLOAD_STATE_INSTALL); - install(mDestFile); - } else { - try { - sendMessage(DOWNLOAD_STATE_START); - mIsDownloading = true; - HttpLess.$download(mDownloadUrl, mDestFile, false, mDownloadCallBack); - } catch (Exception e) { - sendMessage(DOWNLOAD_STATE_FAILURE); - e.printStackTrace(); - } - } - } - } else { - sendMessage(DOWNLOAD_STATE_ERROR_SDCARD); - } - mIsDownloading = false; - stopSelf(); - } - } -} diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/DividerItemDecoration.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/DividerItemDecoration.java index 04755ca..dd6ff88 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/DividerItemDecoration.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/DividerItemDecoration.java @@ -6,6 +6,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v4.view.ViewCompat; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; @@ -16,6 +17,7 @@ * 2. 支持自定义Drawable类型 * 3. 支持水平和垂直方向 * 4. 修复了官方垂直Divider显示的bug + * 5. 增加支持GRID_LIST的分割线, 但仅支持空视图分割(如果嫌弃左右上下多余的padding, 可以在RecyclerView中设置padding为负值解决) * 扩展自官方android sdk下的Support7Demos下的DividerItemDecoration */ public class DividerItemDecoration extends RecyclerView.ItemDecoration { @@ -25,8 +27,8 @@ public class DividerItemDecoration extends RecyclerView.ItemDecoration { }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; - public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; + public static final int GRID_LIST = LinearLayoutManager.VERTICAL + 1; private Drawable mDivider; private int mWidth; @@ -54,7 +56,9 @@ public DividerItemDecoration(Context context, int orientation, Drawable dividerD } public void setOrientation(int orientation) { - if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { + if (orientation != HORIZONTAL_LIST + && orientation != VERTICAL_LIST + && orientation != GRID_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; @@ -62,6 +66,7 @@ public void setOrientation(int orientation) { /** * 新增:支持手动为无高宽的drawable制定宽度 + * * @param width */ public void setWidth(int width) { @@ -70,6 +75,7 @@ public void setWidth(int width) { /** * 新增:支持手动为无高宽的drawable制定高度 + * * @param height */ public void setHeight(int height) { @@ -80,51 +86,56 @@ public void setHeight(int height) { public void onDraw(Canvas c, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); - } else { + } else if (mOrientation == HORIZONTAL_LIST) { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { - final int left = parent.getPaddingLeft(); - final int right = parent.getWidth() - parent.getPaddingRight(); + int left = parent.getPaddingLeft(); + int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); - final int top = child.getBottom() + params.bottomMargin + + int top = child.getBottom() + params.bottomMargin + Math.round(ViewCompat.getTranslationY(child)); - final int bottom = top + getDividerHeight(); + int bottom = top + getDividerHeight(); + + mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { - final int top = parent.getPaddingTop(); - final int bottom = parent.getHeight() - parent.getPaddingBottom(); + int top = parent.getPaddingTop(); + int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); - final int left = child.getRight() + params.rightMargin + + int left = child.getRight() + params.rightMargin + Math.round(ViewCompat.getTranslationX(child)); - final int right = left + getDividerWidth(); + int right = left + getDividerWidth(); + mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override - public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, getDividerHeight()); - } else { + } else if (mOrientation == HORIZONTAL_LIST) { outRect.set(0, 0, getDividerWidth(), 0); + } else if (mOrientation == GRID_LIST) { + outRect.set(getDividerWidth(), getDividerHeight(), getDividerWidth(), getDividerHeight()); } } diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/SpaceDividerView.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/SpaceDividerView.java index 589d83d..6a3492c 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/SpaceDividerView.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/SpaceDividerView.java @@ -63,4 +63,29 @@ protected void onDraw(Canvas canvas) { canvas.drawRect(0, getMeasuredHeight() - mSpaceBottom, getMeasuredWidth(), getMeasuredHeight(), mPaint); } } + + public void setSpaceLeft(int spaceLeft) { + this.mSpaceLeft = spaceLeft; + invalidate(); + } + + public void setSpaceTop(int spaceTop) { + this.mSpaceTop = spaceTop; + invalidate(); + } + + public void setSpaceRight(int spaceRight) { + this.mSpaceRight = spaceRight; + invalidate(); + } + + public void setSpaceBottom(int spaceBottom) { + this.mSpaceBottom = spaceBottom; + invalidate(); + } + + public void setSpaceColor(int spaceColor) { + this.mSpaceColor = spaceColor; + invalidate(); + } } diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/ViewThrottleClickListener.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/ViewThrottleClickListener.java index 0f838b3..98a1cb9 100644 --- a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/ViewThrottleClickListener.java +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/ViewThrottleClickListener.java @@ -9,20 +9,23 @@ */ public abstract class ViewThrottleClickListener implements View.OnClickListener { private static final int THROTTLE_TIME_DEFAULT = 1000; // 1s - public long lastClickTime = 0; + private long mLastClickTime = 0; public long getThrottleTime() { return THROTTLE_TIME_DEFAULT; } + public void discardClick() {} public abstract void throttleClick(View view); @Override public void onClick(View v) { long currentTime = Calendar.getInstance().getTimeInMillis(); - if (currentTime - lastClickTime > getThrottleTime()) { - lastClickTime = currentTime; + if (currentTime - mLastClickTime > getThrottleTime()) { + mLastClickTime = currentTime; throttleClick(v); + } else { + discardClick(); } } } diff --git a/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/WeakHandler.java b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/WeakHandler.java new file mode 100644 index 0000000..8256131 --- /dev/null +++ b/lesscode-core/src/main/java/com/jayfeng/lesscode/core/other/WeakHandler.java @@ -0,0 +1,17 @@ +package com.jayfeng.lesscode.core.other; + +import android.os.Handler; + +import java.lang.ref.WeakReference; + +public abstract class WeakHandler extends Handler { + private WeakReference mOwner; + + public WeakHandler(T owner) { + mOwner = new WeakReference<>(owner); + } + + public T getOwner() { + return mOwner.get(); + } +} 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 deleted file mode 100644 index cf16b95..0000000 Binary files a/lesscode-core/src/main/res/drawable-xhdpi/less_app_update_icon.png and /dev/null differ diff --git a/lesscode-core/src/main/res/layout/less_app_update_notification.xml b/lesscode-core/src/main/res/layout/less_app_update_notification.xml deleted file mode 100755 index 53ba61c..0000000 --- a/lesscode-core/src/main/res/layout/less_app_update_notification.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/lesscode-core/src/main/res/values-hdpi/bools.xml b/lesscode-core/src/main/res/values-hdpi/bools.xml index 9ee1bad..15e7bf1 100644 --- a/lesscode-core/src/main/res/values-hdpi/bools.xml +++ b/lesscode-core/src/main/res/values-hdpi/bools.xml @@ -6,4 +6,5 @@ true false false + false \ No newline at end of file diff --git a/lesscode-core/src/main/res/values-ldpi/bools.xml b/lesscode-core/src/main/res/values-ldpi/bools.xml index 9d45f0e..af66e2a 100644 --- a/lesscode-core/src/main/res/values-ldpi/bools.xml +++ b/lesscode-core/src/main/res/values-ldpi/bools.xml @@ -6,4 +6,5 @@ false false false + false \ No newline at end of file diff --git a/lesscode-core/src/main/res/values-mdpi/bools.xml b/lesscode-core/src/main/res/values-mdpi/bools.xml index e5d0e67..b6e468c 100644 --- a/lesscode-core/src/main/res/values-mdpi/bools.xml +++ b/lesscode-core/src/main/res/values-mdpi/bools.xml @@ -6,4 +6,5 @@ false false false + false \ No newline at end of file diff --git a/lesscode-core/src/main/res/values-tvdpi/bools.xml b/lesscode-core/src/main/res/values-tvdpi/bools.xml index 9214cf2..8bb3bf4 100644 --- a/lesscode-core/src/main/res/values-tvdpi/bools.xml +++ b/lesscode-core/src/main/res/values-tvdpi/bools.xml @@ -6,4 +6,5 @@ false false false + false \ No newline at end of file diff --git a/lesscode-core/src/main/res/values-xhdpi/bools.xml b/lesscode-core/src/main/res/values-xhdpi/bools.xml index f74fff0..2071961 100644 --- a/lesscode-core/src/main/res/values-xhdpi/bools.xml +++ b/lesscode-core/src/main/res/values-xhdpi/bools.xml @@ -6,4 +6,5 @@ false true false + false \ No newline at end of file diff --git a/lesscode-core/src/main/res/values-xxhdpi/bools.xml b/lesscode-core/src/main/res/values-xxhdpi/bools.xml index 1eb0eb7..7696bba 100644 --- a/lesscode-core/src/main/res/values-xxhdpi/bools.xml +++ b/lesscode-core/src/main/res/values-xxhdpi/bools.xml @@ -6,4 +6,5 @@ false false true + false \ No newline at end of file diff --git a/lesscode-core/src/main/res/values-xxxhdpi/bools.xml b/lesscode-core/src/main/res/values-xxxhdpi/bools.xml new file mode 100644 index 0000000..c6c675c --- /dev/null +++ b/lesscode-core/src/main/res/values-xxxhdpi/bools.xml @@ -0,0 +1,10 @@ + + + false + false + false + false + false + false + true + \ No newline at end of file diff --git a/lesscode-core/src/main/res/values/strings.xml b/lesscode-core/src/main/res/values/strings.xml index f22b5d3..26de80e 100644 --- a/lesscode-core/src/main/res/values/strings.xml +++ b/lesscode-core/src/main/res/values/strings.xml @@ -1,14 +1,3 @@ LessCode Core - - 发现新版本: - 开始下载 - 下载完成。 - 新版本下载成功,开始安装。 - 新版本下载失败,请稍后再试。 - 已经在下载中 - 开始下载 - 准备安装 - 未找到SD卡,无法下载。 - 下载地址错误,无法下载。 \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 174e218..e414997 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':lesscode-core', ':app-ref-lesscode-core' +include ':app', ':lesscode-core'