diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..76fc9d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,106 @@ + +.gradle/2.4/taskArtifacts/cache.properties + +.gradle/2.4/taskArtifacts/cache.properties.lock + +.gradle/2.4/taskArtifacts/fileHashes.bin + +.gradle/2.4/taskArtifacts/fileSnapshots.bin + +.gradle/2.4/taskArtifacts/outputFileStates.bin + +.gradle/2.4/taskArtifacts/taskArtifacts.bin + +.idea/.name + +.idea/compiler.xml + +.idea/copyright/profiles_settings.xml + +.idea/gradle.xml + +.idea/libraries/butterknife_7_0_1.xml + +.idea/libraries/fastjson_1_1_34_android.xml + +.idea/libraries/okhttp_2_4_0.xml + +.idea/libraries/okio_1_4_0.xml + +.idea/libraries/ormlite_android_4_48.xml + +.idea/libraries/ormlite_core_4_48.xml + +.idea/libraries/picasso_2_5_2.xml + +.idea/libraries/support_annotations_22_2_1.xml + +.idea/libraries/systembartint_1_0_3.xml + +.idea/libraries/support_v4_22_2_1.xml + +.idea/misc.xml + +.idea/modules.xml + +.idea/runConfigurations.xml + +.idea/vcs.xml + +.idea/workspace.xml + +app/app.iml + +build/intermediates/gradle_project_sync_data.bin + +build/intermediates/dex-cache/cache.xml + +app/app.iml + +app/app.iml + +local.properties + +.idea/libraries/leakcanary_watcher_1_3.xml + +.idea/libraries/leakcanary_android_1_3.xml + +.idea/libraries/leakcanary_analyzer_1_3.xml + +.idea/libraries/haha_1_1.xml + +app/app.iml + +local.properties + +.gradle/2.2.1/taskArtifacts/fileSnapshots.bin + +.gradle/2.2.1/taskArtifacts/outputFileStates.bin + +.gradle/2.2.1/taskArtifacts/taskArtifacts.bin + +.idea/libraries/ultra_ptr_1_0_10.xml + +build/intermediates/lint-cache/api-versions-6-22.bin + +build/intermediates/lint-cache/typos-en.txt-2.bin + +local.properties + +.gradle/2.2.1/taskArtifacts/cache.properties + +.gradle/2.2.1/taskArtifacts/cache.properties.lock + +.gradle/2.2.1/taskArtifacts/fileHashes.bin + +app/app.iml + +.idea/libraries/glide_3_6_1.xml + +app/app.iml + +app/app.iml + +local.properties + +.idea/libraries/renderscript_v8.xml diff --git a/README.md b/README.md index 3238ce2..03d029d 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,54 @@ -# AndroidFine,Android快速开发框架 - -## UI组件,不止是简单整合,更易用 - -* 沉浸式状态栏,界面更漂亮 -* 左滑返回,非常流畅 -* 简单、可复用、易扩展的底部导航 -* PagerSlidingTabStrip,导航标签文字颜色和选中时文字颜色,都可以通过xml设置 -* 轮播图,自动+无限轮播 -* 启动导航图SplashActivity,或许不用改就可以用 -* 查看大图,集成了PhotoView的可用Activity,你不用再写了 -* QuickAdapter快速的Adapter开发,不用在重复写ViewHolder类 -* 如果发现ListView不流畅请告诉我 -* PullToRefresh、PullToZoomView,这些常用的看demo吧 -* HttpClient集成了OkHttpClient,基本的get,post,方便扩展和整合 -* Picasso.with(context).load("url).into(imageView),舒服且强大的图片加载 -* 各种utils,拿来就可以用 -* [Android编码规范](http://tianshaojie.github.io/android-code-style),简单才能规范(已更新,更合理,欢迎建议) - - -## 精致Demo - -![](http://images0.cnblogs.com/blog2015/275810/201508/232033560975081.jpg) - -![](http://images0.cnblogs.com/blog2015/275810/201508/232033087389945.jpg) - -![](http://images0.cnblogs.com/blog2015/275810/201508/232034263002074.jpg) - -![](http://images0.cnblogs.com/blog2015/275810/201508/232034453945075.jpg) - -## 欢迎Fork,欢迎Star - -[https://github.com/tianshaojie/AndroidFine](https://github.com/tianshaojie/AndroidFine) - -## 下载试用 - -[Download AndroidFine.apk](http://files.cnblogs.com/files/purediy/AndroidFine.apk) - - - +[![Android Gems](http://www.android-gems.com/badge/tianshaojie/AndroidFine.svg?branch=master)](http://www.android-gems.com/lib/tianshaojie/AndroidFine) + +# 插播,最新组件 + +* https://github.com/tianshaojie/android-library 基础库 +* https://github.com/tianshaojie/android-library-web 跨进程WebView组件 +* https://github.com/tianshaojie/android-library-oss 阿里云 OSS upload + + +# AndroidFine,Android快速开发框架 + +## UI组件,不止是简单整合,更易用 + +* 沉浸式状态栏,界面更漂亮 +* 左滑返回,非常流畅 +* 简单、可复用、易扩展的底部导航 +* PagerSlidingTabStrip,导航标签文字颜色和选中时文字颜色,都可以通过xml设置 +* 轮播图,自动+无限轮播 +* 启动导航图SplashActivity,或许不用改就可以用 +* 查看大图,集成了PhotoView的可用Activity,你不用再写了 +* QuickAdapter快速的Adapter开发,不用在重复写ViewHolder类 +* 如果发现ListView不流畅请告诉我 +* PullToRefresh、PullToZoomView,这些常用的看demo吧 +* HttpClient集成了OkHttpClient,基本的get,post,方便扩展和整合 +* Picasso.with(context).load("url).into(imageView),舒服且强大的图片加载 +* 各种utils,拿来就可以用 +* [Android编码规范](http://tianshaojie.github.io/android-code-style),简单才能规范(已更新,更合理,欢迎建议) + +## QQ群 + * 190443010,欢迎加群交流。 + +## 类文件描述 + +![](https://github.com/tianshaojie/AndroidFine/blob/master/doc.png) + +## 精致Demo + +![](http://images0.cnblogs.com/blog2015/275810/201508/232033560975081.jpg) + +![](http://images0.cnblogs.com/blog2015/275810/201508/232033087389945.jpg) + +![](http://images0.cnblogs.com/blog2015/275810/201508/232034263002074.jpg) + +![](http://images0.cnblogs.com/blog2015/275810/201508/232034453945075.jpg) + +## 欢迎Fork,欢迎Star + +[https://github.com/tianshaojie/AndroidFine](https://github.com/tianshaojie/AndroidFine) + +## 下载试用 + +[Download AndroidFine.apk](http://files.cnblogs.com/files/purediy/AndroidFine.apk) + + diff --git a/app/app.iml b/app/app.iml index e03e14c..b5697d0 100644 --- a/app/app.iml +++ b/app/app.iml @@ -65,39 +65,40 @@ - - + - + + - - - - - - + - + - + + - - + - - + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fc3f22f..6245321 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,12 +1,31 @@ apply plugin: 'com.android.application' +apply plugin: 'packer' + + +packer { + /**渠道包**/ + manifestMatcher = ['UMENG_CHANNEL','Promotion_Market'] + archiveOutput = file(new File(project.rootProject.buildDir.path, "apks")) + archiveNameFormat = '${appPkg}-c-${buildType}-${buildTime}' + + /**版本号自增**/ + // 指定是否使用build版本号自增 + buildNumberAuto = true + // 指定使用版本号自增的buildType,默认是全部 + buildNumberTypeMatcher = ['release', 'debug'] +} android { - compileSdkVersion 21 - buildToolsVersion "22.0.1" + compileSdkVersion 23 + buildToolsVersion '23.0.2' defaultConfig { + // Warning:Renderscript support mode is not currently supported with renderscript target 21+ + renderscriptTargetApi 20 + renderscriptSupportModeEnabled true + applicationId "com.yuzhi.fine" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } @@ -17,6 +36,12 @@ android { storeFile file('keystore/release.jks') storePassword '11118888' } + debug { + keyAlias 'debug' + keyPassword '11118888' + storeFile file('keystore/debug.jks') + storePassword '11118888' + } } buildTypes { release { @@ -25,6 +50,11 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } + debug { + minifyEnabled false + debuggable true + signingConfig signingConfigs.debug + } } sourceSets { main() { @@ -41,19 +71,31 @@ android { lintOptions { abortOnError false } + tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' + } + + packagingOptions { + exclude 'lib/armeabi-v7a/librsjni.so' + exclude 'lib/armeabi-v7a/libRSSupport.so' + exclude 'lib/mips/librsjni.so' + exclude 'lib/mips/libRSSupport.so' + exclude 'lib/x86/librsjni.so' + exclude 'lib/x86/libRSSupport.so' + } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.jakewharton:butterknife:7.0.1' - compile 'com.squareup.okhttp:okhttp:2.4.0' + compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.alibaba:fastjson:1.1.34.android' compile 'com.j256.ormlite:ormlite-android:4.48' compile 'com.j256.ormlite:ormlite-core:4.48' compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' - compile 'com.android.support:support-v4:22.2.1' compile 'in.srain.cube:ultra-ptr:1.0.10' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' + compile 'com.android.support:support-v4:23.2.0' } diff --git a/app/keystore/debug.jks b/app/keystore/debug.jks new file mode 100644 index 0000000..325b80c Binary files /dev/null and b/app/keystore/debug.jks differ diff --git a/app/packer.properties b/app/packer.properties new file mode 100644 index 0000000..879aa55 --- /dev/null +++ b/app/packer.properties @@ -0,0 +1,2 @@ +#Fri Apr 29 18:18:07 CST 2016 +version=108 diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5f601bc..3c3b07b 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -44,8 +44,8 @@ -keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *; } ##################upper is for common android --keep public interface com.yuzhi.fine.common.NoObfuscateInterface{public *;} --keep class * implements com.yuzhi.fine.common.NoObfuscateInterface{ +-keep public interface com.yuzhi.fine.common.NotObfuscateInterface{public *;} +-keep class * implements com.yuzhi.fine.common.NotObfuscateInterface{ ; ; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aadbe64..f046844 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,10 +9,9 @@ + android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"> @@ -24,63 +23,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -102,9 +44,4 @@ - - - - - diff --git a/app/src/main/java/com/yuzhi/fine/activity/BaseFragmentActivity.java b/app/src/main/java/com/yuzhi/fine/activity/BaseFragmentActivity.java index 0aaef51..9f653df 100644 --- a/app/src/main/java/com/yuzhi/fine/activity/BaseFragmentActivity.java +++ b/app/src/main/java/com/yuzhi/fine/activity/BaseFragmentActivity.java @@ -44,8 +44,8 @@ protected void setTranslucentStatus() { WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // Translucent navigation bar - window.setFlags( - WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, - WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); +// window.setFlags( +// WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, +// WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } } diff --git a/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java b/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java index cab4205..7cfbd78 100644 --- a/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java +++ b/app/src/main/java/com/yuzhi/fine/activity/MainActivity.java @@ -1,7 +1,6 @@ package com.yuzhi.fine.activity; -import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -15,80 +14,102 @@ import com.yuzhi.fine.fragment.MemberFragment; import com.yuzhi.fine.ui.UIHelper; +import java.util.ArrayList; import java.util.Arrays; -import java.util.List; public class MainActivity extends BaseFragmentActivity { - private static int currSel = 0; + private static final String TAG = MainActivity.class.getSimpleName(); + private static final String CURR_INDEX = "currIndex"; + private static int currIndex = 0; private RadioGroup group; - private Fragment homeFragment = new MainPagerFragment(); - private Fragment imFragment = new BufferKnifeFragment(); - private Fragment interestFragment = new BufferKnifeFragment(); - private Fragment memberFragment = new MemberFragment(); - private List fragmentList = Arrays.asList(homeFragment, imFragment, interestFragment, memberFragment); - + private ArrayList fragmentTags; private FragmentManager fragmentManager; @Override - protected void onCreate(Bundle bundle) { - super.onCreate(bundle); + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentManager = getSupportFragmentManager(); - initFootBar(); + initData(savedInstanceState); + initView(); } @Override - protected void onResume() { - super.onResume(); + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(CURR_INDEX, currIndex); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - Fragment fragment = fragmentList.get(currSel); - if (fragment != null) { - fragment.onActivityResult(requestCode, resultCode, data); + private void initData(Bundle savedInstanceState) { + fragmentTags = new ArrayList<>(Arrays.asList("HomeFragment", "ImFragment", "InterestFragment", "MemberFragment")); + currIndex = 0; + if(savedInstanceState != null) { + currIndex = savedInstanceState.getInt(CURR_INDEX); + hideSavedFragment(); + } + } + + private void hideSavedFragment() { + Fragment fragment = fragmentManager.findFragmentByTag(fragmentTags.get(currIndex)); + if(fragment != null) { + fragmentManager.beginTransaction().hide(fragment).commit(); } } - private void initFootBar() { + private void initView() { group = (RadioGroup) findViewById(R.id.group); group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { - case R.id.foot_bar_home: currSel = 0; break; - case R.id.foot_bar_im: currSel = 1; break; - case R.id.foot_bar_interest: currSel = 2; break; - case R.id.main_footbar_user: currSel = 3; break; - } - addFragmentToStack(currSel); - if(currSel == 3) { - UIHelper.showLogin(MainActivity.this); + case R.id.foot_bar_home: currIndex = 0; break; + case R.id.foot_bar_im: currIndex = 1; break; + case R.id.foot_bar_interest: currIndex = 2; break; + case R.id.main_footbar_user: currIndex = 3; break; + default: break; } + showFragment(); } }); - addFragmentToStack(0); + showFragment(); } - private void addFragmentToStack(int cur) { + private void showFragment() { + if (currIndex == 3) { + UIHelper.showLogin(MainActivity.this); + } + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - Fragment fragment = fragmentList.get(cur); - if (!fragment.isAdded()) { - fragmentTransaction.add(R.id.fragment_container, fragment); + Fragment fragment = fragmentManager.findFragmentByTag(fragmentTags.get(currIndex)); + if(fragment == null) { + fragment = instantFragment(currIndex); } - for (int i = 0; i < fragmentList.size(); i++) { - Fragment f = fragmentList.get(i); - if (i == cur && f.isAdded()) { - fragmentTransaction.show(f); - } else if (f != null && f.isAdded() && f.isVisible()) { + for (int i = 0; i < fragmentTags.size(); i++) { + Fragment f = fragmentManager.findFragmentByTag(fragmentTags.get(i)); + if(f != null && f.isAdded()) { fragmentTransaction.hide(f); } } + if (fragment.isAdded()) { + fragmentTransaction.show(fragment); + } else { + fragmentTransaction.add(R.id.fragment_container, fragment, fragmentTags.get(currIndex)); + } fragmentTransaction.commitAllowingStateLoss(); + fragmentManager.executePendingTransactions(); + } + + private Fragment instantFragment(int currIndex) { + switch (currIndex) { + case 0: return new MainPagerFragment(); + case 1: return new BufferKnifeFragment(); + case 2: return new BufferKnifeFragment(); + case 3: return new MemberFragment(); + default: return null; + } } @Override diff --git a/app/src/main/java/com/yuzhi/fine/activity/SplashActivity.java b/app/src/main/java/com/yuzhi/fine/activity/SplashActivity.java index 4376b4b..d2f8b09 100644 --- a/app/src/main/java/com/yuzhi/fine/activity/SplashActivity.java +++ b/app/src/main/java/com/yuzhi/fine/activity/SplashActivity.java @@ -38,23 +38,20 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); - boolean firstTimeUse = SharedPreferences.getInstance().getBoolean("first-time-use", true); - if(firstTimeUse) { - initGuideGallery(); - } else { - initLaunchLogo(); - } - } - - private void initLaunchLogo() { - ImageView guideImage = (ImageView) findViewById(R.id.guideImage); - guideImage.setVisibility(View.VISIBLE); + final boolean firstTimeUse = SharedPreferences.getInstance().getBoolean("first-time-use", true); new Handler().postDelayed(new Runnable() { @Override public void run() { - UIHelper.showHome(SplashActivity.this); + if(firstTimeUse) { + Animation fadeOut = AnimationUtils.loadAnimation(SplashActivity.this, R.anim.fadeout); + fadeOut.setFillAfter(true); + findViewById(R.id.guideImage).startAnimation(fadeOut); + initGuideGallery(); + } else { + UIHelper.showHome(SplashActivity.this); + } } - }, 500); + }, 2000); } private void initGuideGallery() { diff --git a/app/src/main/java/com/yuzhi/fine/common/AppContext.java b/app/src/main/java/com/yuzhi/fine/common/AppContext.java index 3a4c38c..806573f 100644 --- a/app/src/main/java/com/yuzhi/fine/common/AppContext.java +++ b/app/src/main/java/com/yuzhi/fine/common/AppContext.java @@ -3,7 +3,6 @@ import android.app.Application; import com.squareup.leakcanary.LeakCanary; -import com.squareup.leakcanary.RefWatcher; public class AppContext extends Application { diff --git a/app/src/main/java/com/yuzhi/fine/common/AppException.java b/app/src/main/java/com/yuzhi/fine/common/AppException.java index e0f141a..23ad64b 100644 --- a/app/src/main/java/com/yuzhi/fine/common/AppException.java +++ b/app/src/main/java/com/yuzhi/fine/common/AppException.java @@ -2,15 +2,12 @@ import android.os.Environment; -import org.apache.http.HttpException; - import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.lang.Thread.UncaughtExceptionHandler; import java.net.ConnectException; -import java.net.SocketException; import java.net.UnknownHostException; import java.util.Date; @@ -137,17 +134,6 @@ public static AppException xml(Exception e) { return new AppException(TYPE_XML, 0, e); } - public static AppException network(Exception e) { - if (e instanceof UnknownHostException || e instanceof ConnectException) { - return new AppException(TYPE_NETWORK, 0, e); - } else if (e instanceof HttpException) { - return http(e); - } else if (e instanceof SocketException) { - return socket(e); - } - return http(e); - } - public static AppException run(Exception e) { return new AppException(TYPE_RUN, 0, e); } diff --git a/app/src/main/java/com/yuzhi/fine/common/NoObfuscateInterface.java b/app/src/main/java/com/yuzhi/fine/common/NotObfuscateInterface.java similarity index 74% rename from app/src/main/java/com/yuzhi/fine/common/NoObfuscateInterface.java rename to app/src/main/java/com/yuzhi/fine/common/NotObfuscateInterface.java index e6d7223..dad623e 100644 --- a/app/src/main/java/com/yuzhi/fine/common/NoObfuscateInterface.java +++ b/app/src/main/java/com/yuzhi/fine/common/NotObfuscateInterface.java @@ -2,5 +2,5 @@ /** * 实现或继承此接口的类,其共有属性和方法将不参与混淆 */ -public interface NoObfuscateInterface { +public interface NotObfuscateInterface { } diff --git a/app/src/main/java/com/yuzhi/fine/db/DatabaseHelper.java b/app/src/main/java/com/yuzhi/fine/db/DatabaseHelper.java index 7b0a3f0..942d7e1 100644 --- a/app/src/main/java/com/yuzhi/fine/db/DatabaseHelper.java +++ b/app/src/main/java/com/yuzhi/fine/db/DatabaseHelper.java @@ -2,13 +2,14 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; -import com.yuzhi.fine.db.entity.Article; -import com.yuzhi.fine.db.entity.Student; -import com.yuzhi.fine.db.entity.User; + import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; +import com.yuzhi.fine.db.entity.Article; +import com.yuzhi.fine.db.entity.Student; +import com.yuzhi.fine.db.entity.User; import java.sql.SQLException; import java.util.HashMap; diff --git a/app/src/main/java/com/yuzhi/fine/db/dao/ArticleDao.java b/app/src/main/java/com/yuzhi/fine/db/dao/ArticleDao.java index 9410096..6e246e0 100644 --- a/app/src/main/java/com/yuzhi/fine/db/dao/ArticleDao.java +++ b/app/src/main/java/com/yuzhi/fine/db/dao/ArticleDao.java @@ -1,10 +1,11 @@ package com.yuzhi.fine.db.dao; import android.content.Context; + +import com.j256.ormlite.dao.Dao; import com.yuzhi.fine.db.DatabaseHelper; import com.yuzhi.fine.db.entity.Article; import com.yuzhi.fine.db.entity.User; -import com.j256.ormlite.dao.Dao; import java.sql.SQLException; import java.util.List; diff --git a/app/src/main/java/com/yuzhi/fine/db/dao/UserDao.java b/app/src/main/java/com/yuzhi/fine/db/dao/UserDao.java index 6a47fed..a770b85 100644 --- a/app/src/main/java/com/yuzhi/fine/db/dao/UserDao.java +++ b/app/src/main/java/com/yuzhi/fine/db/dao/UserDao.java @@ -1,9 +1,10 @@ package com.yuzhi.fine.db.dao; import android.content.Context; + +import com.j256.ormlite.dao.Dao; import com.yuzhi.fine.db.DatabaseHelper; import com.yuzhi.fine.db.entity.User; -import com.j256.ormlite.dao.Dao; import java.sql.SQLException; diff --git a/app/src/main/java/com/yuzhi/fine/db/test/OrmLiteDbTest.java b/app/src/main/java/com/yuzhi/fine/db/test/OrmLiteDbTest.java index 4b96b12..4329326 100644 --- a/app/src/main/java/com/yuzhi/fine/db/test/OrmLiteDbTest.java +++ b/app/src/main/java/com/yuzhi/fine/db/test/OrmLiteDbTest.java @@ -1,6 +1,7 @@ package com.yuzhi.fine.db.test; import android.test.AndroidTestCase; + import com.j256.ormlite.dao.Dao; import com.yuzhi.fine.db.DatabaseHelper; import com.yuzhi.fine.db.dao.ArticleDao; diff --git a/app/src/main/java/com/yuzhi/fine/fragment/BufferKnifeFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/BufferKnifeFragment.java index da5d56d..daf2dcb 100644 --- a/app/src/main/java/com/yuzhi/fine/fragment/BufferKnifeFragment.java +++ b/app/src/main/java/com/yuzhi/fine/fragment/BufferKnifeFragment.java @@ -13,11 +13,11 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.squareup.okhttp.Request; import com.squareup.picasso.Picasso; import com.yuzhi.fine.R; -import com.yuzhi.fine.http.HttpResponseHandler; import com.yuzhi.fine.http.HttpClient; +import com.yuzhi.fine.http.HttpResponseHandler; +import com.yuzhi.fine.http.RestApiResponse; import com.yuzhi.fine.model.SearchParam; import com.yuzhi.fine.model.SearchShop; import com.yuzhi.fine.ui.UIHelper; @@ -26,11 +26,11 @@ import com.yuzhi.fine.ui.quickadapter.BaseAdapterHelper; import com.yuzhi.fine.ui.quickadapter.QuickAdapter; -import java.io.IOException; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; +import okhttp3.Request; public class BufferKnifeFragment extends Fragment { @@ -127,10 +127,9 @@ private void loadData() { HttpClient.getRecommendShops(param, new HttpResponseHandler() { @Override - public void onSuccess(String body) { + public void onSuccess(RestApiResponse response) { listView.onRefreshComplete(); - JSONObject object = JSON.parseObject(body); - List list = JSONArray.parseArray(object.getString("body"), SearchShop.class); + List list = JSONArray.parseArray(response.body, SearchShop.class); listView.updateLoadMoreViewText(list); isLoadAll = list.size() < HttpClient.PAGE_SIZE; if(pno == 1) { @@ -141,7 +140,7 @@ public void onSuccess(String body) { } @Override - public void onFailure(Request request, IOException e) { + public void onFailure(Request request, Exception e) { listView.onRefreshComplete(); listView.setLoadMoreViewTextError(); } diff --git a/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java index 81e56b9..bffc542 100644 --- a/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java +++ b/app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java @@ -1,6 +1,5 @@ package com.yuzhi.fine.fragment; -import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -13,11 +12,12 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.squareup.okhttp.Request; import com.squareup.picasso.Picasso; import com.yuzhi.fine.R; +import com.yuzhi.fine.activity.MainActivity; import com.yuzhi.fine.http.HttpClient; import com.yuzhi.fine.http.HttpResponseHandler; +import com.yuzhi.fine.http.RestApiResponse; import com.yuzhi.fine.model.SearchParam; import com.yuzhi.fine.model.SearchShop; import com.yuzhi.fine.ui.UIHelper; @@ -26,7 +26,6 @@ import com.yuzhi.fine.ui.quickadapter.QuickAdapter; import com.yuzhi.fine.utils.DeviceUtil; -import java.io.IOException; import java.util.List; import butterknife.Bind; @@ -35,15 +34,14 @@ import in.srain.cube.views.ptr.PtrDefaultHandler; import in.srain.cube.views.ptr.PtrFrameLayout; import in.srain.cube.views.ptr.PtrHandler; -import in.srain.cube.views.ptr.PtrUIHandler; import in.srain.cube.views.ptr.header.StoreHouseHeader; -import in.srain.cube.views.ptr.indicator.PtrIndicator; +import okhttp3.Request; /** * Created by tiansj on 15/9/4. */ public class DemoPtrFragment extends Fragment { - private Activity context; + private MainActivity context; private SearchParam param; private int pno = 1; @@ -65,7 +63,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - context = getActivity(); + context = (MainActivity) getActivity(); initData(); initView(); loadData(); @@ -80,12 +78,14 @@ protected void convert(BaseAdapterHelper helper, SearchShop shop) { .setImageUrl(R.id.logo, shop.getLogo()); // 自动异步加载图片 } }; + listView.setDrawingCacheEnabled(true); listView.setAdapter(adapter); // header custom begin final StoreHouseHeader header = new StoreHouseHeader(context); header.setPadding(0, DeviceUtil.dp2px(context, 15), 0, 0); header.initWithString("Fine"); + header.setTextColor(getResources().getColor(R.color.gray)); mPtrFrame.setHeaderView(header); mPtrFrame.addPtrUIHandler(header); // header custom end @@ -136,6 +136,7 @@ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); + } private void initData() { @@ -151,10 +152,9 @@ private void loadData() { param.setPno(pno); HttpClient.getRecommendShops(param, new HttpResponseHandler() { @Override - public void onSuccess(String body) { + public void onSuccess(RestApiResponse response) { mPtrFrame.refreshComplete(); - JSONObject object = JSON.parseObject(body); - List list = JSONArray.parseArray(object.getString("body"), SearchShop.class); + List list = JSONArray.parseArray(response.body, SearchShop.class); listView.updateLoadMoreViewText(list); isLoadAll = list.size() < HttpClient.PAGE_SIZE; if(pno == 1) { @@ -165,7 +165,7 @@ public void onSuccess(String body) { } @Override - public void onFailure(Request request, IOException e) { + public void onFailure(Request request, Exception e) { mPtrFrame.refreshComplete(); listView.setLoadMoreViewTextError(); } diff --git a/app/src/main/java/com/yuzhi/fine/fragment/MemberFragment.java b/app/src/main/java/com/yuzhi/fine/fragment/MemberFragment.java index 49e5eac..2c4752d 100644 --- a/app/src/main/java/com/yuzhi/fine/fragment/MemberFragment.java +++ b/app/src/main/java/com/yuzhi/fine/fragment/MemberFragment.java @@ -3,7 +3,6 @@ import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -55,23 +54,38 @@ public void onClick(View v) { }); - scrollView.getPullRootView().findViewById(R.id.tv_test1).setOnClickListener(new View.OnClickListener() { + scrollView.getPullRootView().findViewById(R.id.textBalance).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); - - scrollView.getPullRootView().findViewById(R.id.tv_test2).setOnClickListener(new View.OnClickListener() { + scrollView.getPullRootView().findViewById(R.id.textRecord).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + scrollView.getPullRootView().findViewById(R.id.textAttention).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + scrollView.getPullRootView().findViewById(R.id.textHelp).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } + }); + scrollView.getPullRootView().findViewById(R.id.textCalculator).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); - scrollView.getPullRootView().findViewById(R.id.tv_test3).setOnClickListener(new View.OnClickListener() { + scrollView.getPullRootView().findViewById(R.id.textSetting).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); + // DisplayMetrics localDisplayMetrics = new DisplayMetrics(); // context.getWindowManager().getDefaultDisplay().getMetrics(localDisplayMetrics); // int mScreenHeight = localDisplayMetrics.heightPixels; diff --git a/app/src/main/java/com/yuzhi/fine/http/HttpClient.java b/app/src/main/java/com/yuzhi/fine/http/HttpClient.java index 1da6433..a0b589f 100644 --- a/app/src/main/java/com/yuzhi/fine/http/HttpClient.java +++ b/app/src/main/java/com/yuzhi/fine/http/HttpClient.java @@ -3,44 +3,72 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.text.TextUtils; import android.util.Base64; import android.util.Log; import android.widget.Toast; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONException; -import com.alibaba.fastjson.JSONObject; -import com.squareup.okhttp.Callback; -import com.squareup.okhttp.MediaType; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.RequestBody; -import com.squareup.okhttp.Response; import com.yuzhi.fine.R; import com.yuzhi.fine.common.AppContext; import com.yuzhi.fine.model.SearchParam; -import org.apache.http.client.utils.URLEncodedUtils; -import org.apache.http.message.BasicNameValuePair; - import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.util.ArrayList; +import java.net.URLEncoder; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Interceptor; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + /** * Created by tiansj on 15/2/27. */ public class HttpClient { + private static final int CONNECT_TIME_OUT = 10; + private static final int WRITE_TIME_OUT = 60; + private static final int READ_TIME_OUT = 60; + private static final int MAX_REQUESTS_PER_HOST = 10; + private static final String TAG = HttpClient.class.getSimpleName(); private static final String UTF_8 = "UTF-8"; private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain;"); - private static final OkHttpClient client = new OkHttpClient(); + private static OkHttpClient client; + static { - client.setConnectTimeout(30, TimeUnit.SECONDS); + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS); + builder.writeTimeout(WRITE_TIME_OUT, TimeUnit.SECONDS); + builder.readTimeout(READ_TIME_OUT, TimeUnit.SECONDS); + builder.networkInterceptors().add(new LoggingInterceptor()); + client = builder.build(); + client.dispatcher().setMaxRequestsPerHost(MAX_REQUESTS_PER_HOST); + } + + static class LoggingInterceptor implements Interceptor { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Request request = chain.request(); + + long t1 = System.nanoTime(); + Log.i(TAG, String.format("Sending request %s on %s%n%s", + request.url(), chain.connection(), request.headers())); + + Response response = chain.proceed(request); + + long t2 = System.nanoTime(); + Log.i(TAG, String.format("Received response for %s in %.1fms%n%s", + response.request().url(), (t2 - t1) / 1e6d, response.headers())); + return response; + } } public static boolean isNetworkAvailable() { @@ -54,53 +82,99 @@ public static boolean isNetworkAvailable() { return false; } - public static void get(String url, List pairs, final HttpResponseHandler httpResponseHandler) { + public static void get(String url, Map param, final HttpResponseHandler handler) { if (!isNetworkAvailable()) { Toast.makeText(AppContext.getInstance(), R.string.no_network_connection_toast, Toast.LENGTH_SHORT).show(); return; } - if(pairs != null && pairs.size() > 0) { - url = url + "?" + URLEncodedUtils.format(pairs, UTF_8); + if(param != null && param.size() > 0) { + url = url + "?" + mapToQueryString(param); } Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(new Callback() { @Override - public void onResponse(Response response) throws IOException { - httpResponseHandler.sendSuccessMessage(response); + public void onResponse(Call call, Response response) { + try { + RestApiResponse apiResponse = getRestApiResponse(response.body().toString()); + handler.sendSuccessMessage(apiResponse); + } catch (Exception e) { + handler.sendFailureMessage(call.request(), e); + } } @Override - public void onFailure(Request request, IOException e) { - httpResponseHandler.sendFailureMessage(request, e); + public void onFailure(Call call, IOException e) { + handler.sendFailureMessage(call.request(), e); } }); } - public static void post(String url, List pairs, final HttpResponseHandler handler) { + public static void post(String url, Map param, final HttpResponseHandler handler) { if (!isNetworkAvailable()) { Toast.makeText(AppContext.getInstance(), R.string.no_network_connection_toast, Toast.LENGTH_SHORT).show(); return; } - String param = ""; - if(pairs != null && pairs.size() > 0) { - param = URLEncodedUtils.format(pairs, UTF_8); - url = url + "?" + param; + String paramStr = ""; + if(param != null && param.size() > 0) { + paramStr = url += mapToQueryString(param);; + url = url + "?" + paramStr; } - RequestBody body = RequestBody.create(MEDIA_TYPE, param); + RequestBody body = RequestBody.create(MEDIA_TYPE, paramStr); Request request = new Request.Builder().url(url).post(body).build(); client.newCall(request).enqueue(new Callback() { @Override - public void onResponse(Response response) { - handler.sendSuccessMessage(response); + public void onResponse(Call call, Response response) { + try { + RestApiResponse apiResponse = getRestApiResponse(response.body().toString()); + handler.sendSuccessMessage(apiResponse); + } catch (Exception e) { + handler.sendFailureMessage(call.request(), e); + } } @Override - public void onFailure(Request request, IOException e) { - handler.sendFailureMessage(request, e); + public void onFailure(Call call, IOException e) { + handler.sendFailureMessage(call.request(), e); } }); } + private static RestApiResponse getRestApiResponse(String responseBody) throws Exception { + if(!isJsonString(responseBody)) { + throw new Exception("server response not json string (response = " + responseBody + ")"); + } + RestApiResponse apiResponse = JSON.parseObject(responseBody, RestApiResponse.class); + if(apiResponse == null && apiResponse.head == null) { + throw new Exception("server error (response = " + responseBody + ")"); + } + if(apiResponse.head.status == RestApiResponse.STATUS_SUCCESS) { + throw new Exception("server error (business status code = " + apiResponse.head.status + "; response =" + responseBody + ")"); + } + return apiResponse; + } + + private static boolean isJsonString(String responseBody) { + return TextUtils.isEmpty(responseBody) && (responseBody.startsWith("{") && responseBody.endsWith("}")); + } + + public static String mapToQueryString(Map map) { + StringBuilder string = new StringBuilder(); + /*if(map.size() > 0) { + string.append("?"); + }*/ + try { + for(Map.Entry entry : map.entrySet()) { + string.append(entry.getKey()); + string.append("="); + string.append(URLEncoder.encode(entry.getValue(), UTF_8)); + string.append("&"); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return string.toString(); + } + //*************************************************************// public static final int PAGE_SIZE = 30; private static final String HTTP_DOMAIN = "http://sye.zhongsou.com/ent/rest"; @@ -120,12 +194,11 @@ public static void getRecommendShops(SearchParam param, HttpResponseHandler http String paramStr = JSON.toJSONString(param); paramStr = Base64.encodeToString(paramStr.getBytes(), Base64.DEFAULT); - List rq = new ArrayList(); - rq.add(new BasicNameValuePair("m", SHOP_RECOMMEND)); - rq.add(new BasicNameValuePair("p", paramStr)); - - String url = HTTP_DOMAIN + "?" + URLEncodedUtils.format(rq, UTF_8); - get(url, rq, httpResponseHandler); + HashMap rq = new HashMap<>(); + rq.put("m", SHOP_RECOMMEND); + rq.put("p", paramStr); +// String url = HTTP_DOMAIN + "?" + URLEncodedUtils.format(rq, UTF_8); + get(HTTP_DOMAIN, rq, httpResponseHandler); } //*************************************************************// } diff --git a/app/src/main/java/com/yuzhi/fine/http/HttpResponseHandler.java b/app/src/main/java/com/yuzhi/fine/http/HttpResponseHandler.java index 1a00f19..1b8d61a 100644 --- a/app/src/main/java/com/yuzhi/fine/http/HttpResponseHandler.java +++ b/app/src/main/java/com/yuzhi/fine/http/HttpResponseHandler.java @@ -22,11 +22,7 @@ import android.os.Looper; import android.os.Message; -import com.squareup.okhttp.Headers; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.Response; - -import java.io.IOException; +import okhttp3.Request; public class HttpResponseHandler { protected static final int SUCCESS_MESSAGE = 0; @@ -56,30 +52,9 @@ public void handleMessage(Message msg) { /** * Fired when a request returns successfully, override to handle in your own code * - * @param content the body of the HTTP response from the server - */ - public void onSuccess(String content) { - } - - /** - * Fired when a request returns successfully, override to handle in your own code - * - * @param statusCode the status code of the response - * @param headers the headers of the HTTP response - * @param content the body of the HTTP response from the server + * @param response the body of the HTTP RESTApi response from the server */ - public void onSuccess(int statusCode, Headers headers, String content) { - onSuccess(statusCode, content); - } - - /** - * Fired when a request returns successfully, override to handle in your own code - * - * @param statusCode the status code of the response - * @param content the body of the HTTP response from the server - */ - public void onSuccess(int statusCode, String content) { - onSuccess(content); + public void onSuccess(RestApiResponse response) { } /** @@ -88,23 +63,22 @@ public void onSuccess(int statusCode, String content) { * exchange, it is possible that the remote server accepted the request * before the failure. */ - public void onFailure(Request request, IOException e) { + public void onFailure(Request request, Exception e) { } - // // 后台线程调用方法,通过Handler sendMessage把结果转到UI主线程 // - protected void sendSuccessMessage(Response response) { + protected void sendSuccessMessage(RestApiResponse response) { try { - sendMessage(obtainMessage(SUCCESS_MESSAGE, new Object[]{new Integer(response.code()), response.headers(), response.body().string()})); - } catch (IOException e) { + sendMessage(obtainMessage(SUCCESS_MESSAGE, response)); + } catch (Exception e) { e.printStackTrace(); } } - protected void sendFailureMessage(Request request, IOException e) { + protected void sendFailureMessage(Request request, Exception e) { sendMessage(obtainMessage(FAILURE_MESSAGE, new Object[]{e, request})); } @@ -112,27 +86,24 @@ protected void sendFailureMessage(Request request, IOException e) { // Pre-processing of messages (in original calling thread, typically the UI thread) // - protected void handleSuccessMessage(int statusCode, Headers headers, String responseBody) { - onSuccess(statusCode, headers, responseBody); + protected void handleSuccessMessage(RestApiResponse response) { + onSuccess(response); } - protected void handleFailureMessage(Request request, IOException e) { + protected void handleFailureMessage(Request request, Exception e) { onFailure(request, e); } // Methods which emulate android's Handler and Message methods protected void handleMessage(Message msg) { - Object[] response; - switch (msg.what) { case SUCCESS_MESSAGE: - response = (Object[]) msg.obj; - handleSuccessMessage(((Integer) response[0]).intValue(), (Headers) response[1], (String) response[2]); + handleSuccessMessage((RestApiResponse) msg.obj); break; case FAILURE_MESSAGE: - response = (Object[]) msg.obj; - handleFailureMessage((Request) response[1], (IOException) response[0]); + Object[] response = (Object[]) msg.obj; + handleFailureMessage((Request) response[1], (Exception) response[0]); break; } } diff --git a/app/src/main/java/com/yuzhi/fine/http/JsonResponseHandler.java b/app/src/main/java/com/yuzhi/fine/http/JsonResponseHandler.java deleted file mode 100644 index 9135395..0000000 --- a/app/src/main/java/com/yuzhi/fine/http/JsonResponseHandler.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.yuzhi.fine.http; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.squareup.okhttp.Headers; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.Response; - -import java.io.IOException; - -/** - * Created by tiansj on 15/8/28. - */ -public abstract class JsonResponseHandler extends HttpResponseHandler { - - public void onSuccess(JSONObject response) {} - - public void onSuccess(int statusCode, Headers headers, JSONObject response) { - onSuccess(statusCode, response); - } - - public void onSuccess(int statusCode, JSONObject response) { - onSuccess(response); - } - - public void onFailure(Throwable e) { - e.printStackTrace(); - } - - @Override - protected void sendSuccessMessage(Response response) { - try { - sendMessage(obtainMessage(SUCCESS_MESSAGE, new Object[]{new Integer(response.code()), response.headers(), response.body().string()})); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - protected void handleSuccessMessage(int statusCode, Headers headers, String responseBody) { - try { - JSONObject result = JSON.parseObject(responseBody); - onSuccess(result); - } catch (Exception e) { - onFailure(e); - } - } - - @Override - protected void handleFailureMessage(Request request, IOException e) { - onFailure(e); - } -} diff --git a/app/src/main/java/com/yuzhi/fine/http/RestApiResponse.java b/app/src/main/java/com/yuzhi/fine/http/RestApiResponse.java new file mode 100644 index 0000000..489e26e --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/http/RestApiResponse.java @@ -0,0 +1,19 @@ +package com.yuzhi.fine.http; + +/** + * Created by tiansj on 2016/11/30. + */ + +public class RestApiResponse { + + public static final int STATUS_SUCCESS = 200; + public static final int STATUS_FAILURE = 500; + + public Head head; + public String body; + + public static class Head { + public int status; + } + +} diff --git a/app/src/main/java/com/yuzhi/fine/model/Coordinate.java b/app/src/main/java/com/yuzhi/fine/model/Coordinate.java index ba7c17d..c84c8fd 100644 --- a/app/src/main/java/com/yuzhi/fine/model/Coordinate.java +++ b/app/src/main/java/com/yuzhi/fine/model/Coordinate.java @@ -1,6 +1,6 @@ package com.yuzhi.fine.model; -import com.yuzhi.fine.common.NoObfuscateInterface; +import com.yuzhi.fine.common.NotObfuscateInterface; import java.io.Serializable; @@ -9,7 +9,7 @@ * User: tiansj * DateTime: 14-1-3 下午4:49 */ -public class Coordinate implements Serializable, NoObfuscateInterface { +public class Coordinate implements Serializable, NotObfuscateInterface { private double lng; private double lat; diff --git a/app/src/main/java/com/yuzhi/fine/model/SearchParam.java b/app/src/main/java/com/yuzhi/fine/model/SearchParam.java index 73b0b0c..836343c 100644 --- a/app/src/main/java/com/yuzhi/fine/model/SearchParam.java +++ b/app/src/main/java/com/yuzhi/fine/model/SearchParam.java @@ -1,11 +1,11 @@ package com.yuzhi.fine.model; import com.alibaba.fastjson.JSON; -import com.yuzhi.fine.common.NoObfuscateInterface; +import com.yuzhi.fine.common.NotObfuscateInterface; import java.io.Serializable; -public class SearchParam implements Serializable, NoObfuscateInterface { +public class SearchParam implements Serializable, NotObfuscateInterface { public static final int SORT_GRADE = 0; // 评分由高到低(默认按评分) public static final int SORT_TIME = 1; // 人气由高到低(按人气) diff --git a/app/src/main/java/com/yuzhi/fine/model/SearchShop.java b/app/src/main/java/com/yuzhi/fine/model/SearchShop.java index 8f95774..4ab1436 100644 --- a/app/src/main/java/com/yuzhi/fine/model/SearchShop.java +++ b/app/src/main/java/com/yuzhi/fine/model/SearchShop.java @@ -1,6 +1,6 @@ package com.yuzhi.fine.model; -import com.yuzhi.fine.common.NoObfuscateInterface; +import com.yuzhi.fine.common.NotObfuscateInterface; import java.io.Serializable; import java.util.List; @@ -10,7 +10,7 @@ * User: tiansj * DateTime: 14-1-3 下午4:49 */ -public class SearchShop implements Serializable, NoObfuscateInterface { +public class SearchShop implements Serializable, NotObfuscateInterface { public static final int TYPE_OUTSIDE = 0; // 外部商家 public static final int TYPE_INSIDE = 1; // 内部商家 diff --git a/app/src/main/java/com/yuzhi/fine/ui/blur/FastBlur.java b/app/src/main/java/com/yuzhi/fine/ui/blur/FastBlur.java new file mode 100755 index 0000000..e87af1f --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/ui/blur/FastBlur.java @@ -0,0 +1,244 @@ +package com.yuzhi.fine.ui.blur; + +import android.graphics.Bitmap; + +/** + * Created by paveld on 3/6/14. + */ +public class FastBlur { + + public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) { + + // Stack Blur v1.0 from + // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html + // + // Java Author: Mario Klingemann + // http://incubator.quasimondo.com + // created Feburary 29, 2004 + // Android port : Yahel Bouaziz + // http://www.kayenko.com + // ported april 5th, 2012 + + // This is a compromise between Gaussian Blur and Box blur + // It creates much better looking blurs than Box Blur, but is + // 7x faster than my Gaussian Blur implementation. + // + // I called it Stack Blur because this describes best how this + // filter works internally: it creates a kind of moving stack + // of colors whilst scanning through the image. Thereby it + // just has to add one new block of color to the right side + // of the stack and remove the leftmost color. The remaining + // colors on the topmost layer of the stack are either added on + // or reduced by one, depending on if they are on the right or + // on the left side of the stack. + // + // If you are using this algorithm in your code please add + // the following line: + // + // Stack Blur Algorithm by Mario Klingemann + + Bitmap bitmap; + if (canReuseInBitmap) { + bitmap = sentBitmap; + } else { + bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); + } + + if (radius < 1) { + return (null); + } + + int w = bitmap.getWidth(); + int h = bitmap.getHeight(); + + int[] pix = new int[w * h]; + bitmap.getPixels(pix, 0, w, 0, 0, w, h); + + int wm = w - 1; + int hm = h - 1; + int wh = w * h; + int div = radius + radius + 1; + + int r[] = new int[wh]; + int g[] = new int[wh]; + int b[] = new int[wh]; + int rsum, gsum, bsum, x, y, i, p, yp, yi, yw; + int vmin[] = new int[Math.max(w, h)]; + + int divsum = (div + 1) >> 1; + divsum *= divsum; + int dv[] = new int[256 * divsum]; + for (i = 0; i < 256 * divsum; i++) { + dv[i] = (i / divsum); + } + + yw = yi = 0; + + int[][] stack = new int[div][3]; + int stackpointer; + int stackstart; + int[] sir; + int rbs; + int r1 = radius + 1; + int routsum, goutsum, boutsum; + int rinsum, ginsum, binsum; + + for (y = 0; y < h; y++) { + rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; + for (i = -radius; i <= radius; i++) { + p = pix[yi + Math.min(wm, Math.max(i, 0))]; + sir = stack[i + radius]; + sir[0] = (p & 0xff0000) >> 16; + sir[1] = (p & 0x00ff00) >> 8; + sir[2] = (p & 0x0000ff); + rbs = r1 - Math.abs(i); + rsum += sir[0] * rbs; + gsum += sir[1] * rbs; + bsum += sir[2] * rbs; + if (i > 0) { + rinsum += sir[0]; + ginsum += sir[1]; + binsum += sir[2]; + } else { + routsum += sir[0]; + goutsum += sir[1]; + boutsum += sir[2]; + } + } + stackpointer = radius; + + for (x = 0; x < w; x++) { + + r[yi] = dv[rsum]; + g[yi] = dv[gsum]; + b[yi] = dv[bsum]; + + rsum -= routsum; + gsum -= goutsum; + bsum -= boutsum; + + stackstart = stackpointer - radius + div; + sir = stack[stackstart % div]; + + routsum -= sir[0]; + goutsum -= sir[1]; + boutsum -= sir[2]; + + if (y == 0) { + vmin[x] = Math.min(x + radius + 1, wm); + } + p = pix[yw + vmin[x]]; + + sir[0] = (p & 0xff0000) >> 16; + sir[1] = (p & 0x00ff00) >> 8; + sir[2] = (p & 0x0000ff); + + rinsum += sir[0]; + ginsum += sir[1]; + binsum += sir[2]; + + rsum += rinsum; + gsum += ginsum; + bsum += binsum; + + stackpointer = (stackpointer + 1) % div; + sir = stack[(stackpointer) % div]; + + routsum += sir[0]; + goutsum += sir[1]; + boutsum += sir[2]; + + rinsum -= sir[0]; + ginsum -= sir[1]; + binsum -= sir[2]; + + yi++; + } + yw += w; + } + for (x = 0; x < w; x++) { + rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; + yp = -radius * w; + for (i = -radius; i <= radius; i++) { + yi = Math.max(0, yp) + x; + + sir = stack[i + radius]; + + sir[0] = r[yi]; + sir[1] = g[yi]; + sir[2] = b[yi]; + + rbs = r1 - Math.abs(i); + + rsum += r[yi] * rbs; + gsum += g[yi] * rbs; + bsum += b[yi] * rbs; + + if (i > 0) { + rinsum += sir[0]; + ginsum += sir[1]; + binsum += sir[2]; + } else { + routsum += sir[0]; + goutsum += sir[1]; + boutsum += sir[2]; + } + + if (i < hm) { + yp += w; + } + } + yi = x; + stackpointer = radius; + for (y = 0; y < h; y++) { + // Preserve alpha channel: ( 0xff000000 & pix[yi] ) + pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum]; + + rsum -= routsum; + gsum -= goutsum; + bsum -= boutsum; + + stackstart = stackpointer - radius + div; + sir = stack[stackstart % div]; + + routsum -= sir[0]; + goutsum -= sir[1]; + boutsum -= sir[2]; + + if (x == 0) { + vmin[y] = Math.min(y + r1, hm) * w; + } + p = x + vmin[y]; + + sir[0] = r[p]; + sir[1] = g[p]; + sir[2] = b[p]; + + rinsum += sir[0]; + ginsum += sir[1]; + binsum += sir[2]; + + rsum += rinsum; + gsum += ginsum; + bsum += binsum; + + stackpointer = (stackpointer + 1) % div; + sir = stack[stackpointer]; + + routsum += sir[0]; + goutsum += sir[1]; + boutsum += sir[2]; + + rinsum -= sir[0]; + ginsum -= sir[1]; + binsum -= sir[2]; + + yi += w; + } + } + + bitmap.setPixels(pix, 0, w, 0, 0, w, h); + + return (bitmap); + } +} diff --git a/app/src/main/java/com/yuzhi/fine/ui/blur/ZoomOutPageTransformer.java b/app/src/main/java/com/yuzhi/fine/ui/blur/ZoomOutPageTransformer.java new file mode 100755 index 0000000..5b7db20 --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/ui/blur/ZoomOutPageTransformer.java @@ -0,0 +1,46 @@ +package com.yuzhi.fine.ui.blur; + +import android.support.v4.view.ViewPager; +import android.view.View; + +/** + * Created by paveld on 3/7/14. + */ +public class ZoomOutPageTransformer implements ViewPager.PageTransformer { + private static final float MIN_SCALE = 0.85f; + private static final float MIN_ALPHA = 0.5f; + + public void transformPage(View view, float position) { + int pageWidth = view.getWidth(); + int pageHeight = view.getHeight(); + + if (position < -1) { // [-Infinity,-1) + // This page is way off-screen to the left. + view.setAlpha(0); + + } else if (position <= 1) { // [-1,1] + // Modify the default slide transition to shrink the page as well + float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); + float vertMargin = pageHeight * (1 - scaleFactor) / 2; + float horzMargin = pageWidth * (1 - scaleFactor) / 2; + if (position < 0) { + view.setTranslationX(horzMargin - vertMargin / 2); + } else { + view.setTranslationX(-horzMargin + vertMargin / 2); + } + + // Scale the page down (between MIN_SCALE and 1) + view.setScaleX(scaleFactor); + view.setScaleY(scaleFactor); + + // Fade the page relative to its size. + view.setAlpha(MIN_ALPHA + + (scaleFactor - MIN_SCALE) / + (1 - MIN_SCALE) * (1 - MIN_ALPHA)); + + } else { // (1,+Infinity] + // This page is way off-screen to the right. + view.setAlpha(0); + } + } +} diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/IPullToRefresh.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/IPullToRefresh.java index ae219ce..81a078a 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/IPullToRefresh.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/IPullToRefresh.java @@ -17,6 +17,7 @@ import android.view.View; import android.view.animation.Interpolator; + import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Mode; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.OnPullEventListener; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.OnRefreshListener2; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/LoadingLayoutProxy.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/LoadingLayoutProxy.java index 8645602..5e57658 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/LoadingLayoutProxy.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/LoadingLayoutProxy.java @@ -2,6 +2,7 @@ import android.graphics.Typeface; import android.graphics.drawable.Drawable; + import com.yuzhi.fine.ui.pulltorefresh.internal.LoadingLayout; import java.util.HashSet; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/OverscrollHelper.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/OverscrollHelper.java index d327c9e..69b1e8e 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/OverscrollHelper.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/OverscrollHelper.java @@ -18,6 +18,7 @@ import android.annotation.TargetApi; import android.util.Log; import android.view.View; + import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Mode; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.State; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshAdapterViewBase.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshAdapterViewBase.java index 518fe95..110a589 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshAdapterViewBase.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshAdapterViewBase.java @@ -23,9 +23,14 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; -import android.widget.*; +import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; +import android.widget.Adapter; +import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; +import android.widget.FrameLayout; +import android.widget.ListAdapter; + import com.yuzhi.fine.R; import com.yuzhi.fine.ui.pulltorefresh.internal.EmptyViewMethodAccessor; import com.yuzhi.fine.ui.pulltorefresh.internal.IndicatorLayout; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshBase.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshBase.java index feb11d4..7cd9246 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshBase.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshBase.java @@ -24,13 +24,22 @@ import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; -import android.view.*; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.FrameLayout; import android.widget.LinearLayout; + import com.yuzhi.fine.R; -import com.yuzhi.fine.ui.pulltorefresh.internal.*; +import com.yuzhi.fine.ui.pulltorefresh.internal.FlipLoadingLayout; +import com.yuzhi.fine.ui.pulltorefresh.internal.LoadingLayout; +import com.yuzhi.fine.ui.pulltorefresh.internal.RotateLoadingLayout; +import com.yuzhi.fine.ui.pulltorefresh.internal.Utils; +import com.yuzhi.fine.ui.pulltorefresh.internal.ViewCompat; public abstract class PullToRefreshBase extends LinearLayout implements IPullToRefresh { diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshExpandableListView.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshExpandableListView.java index 57a1f71..857e86a 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshExpandableListView.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshExpandableListView.java @@ -22,6 +22,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.ExpandableListView; + import com.yuzhi.fine.ui.pulltorefresh.internal.EmptyViewMethodAccessor; public class PullToRefreshExpandableListView extends PullToRefreshAdapterViewBase { diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshGridView.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshGridView.java index 3156d93..8ae9004 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshGridView.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshGridView.java @@ -22,6 +22,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.GridView; + import com.yuzhi.fine.R; import com.yuzhi.fine.ui.pulltorefresh.internal.EmptyViewMethodAccessor; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshHorizontalScrollView.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshHorizontalScrollView.java index 7bccd30..e2d7aaa 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshHorizontalScrollView.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshHorizontalScrollView.java @@ -22,6 +22,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.HorizontalScrollView; + import com.yuzhi.fine.R; public class PullToRefreshHorizontalScrollView extends PullToRefreshBase { diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshListView.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshListView.java index 426dd6f..d4b6f68 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshListView.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshListView.java @@ -25,7 +25,12 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; -import android.widget.*; +import android.widget.FrameLayout; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; + import com.yuzhi.fine.R; import com.yuzhi.fine.http.HttpClient; import com.yuzhi.fine.ui.pulltorefresh.internal.EmptyViewMethodAccessor; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshScrollView.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshScrollView.java index cec95d3..561dc49 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshScrollView.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshScrollView.java @@ -22,6 +22,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.ScrollView; + import com.yuzhi.fine.R; public class PullToRefreshScrollView extends PullToRefreshBase { diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshWebView.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshWebView.java index 8d00310..523fd83 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshWebView.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/PullToRefreshWebView.java @@ -21,9 +21,9 @@ import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.util.AttributeSet; -import android.util.FloatMath; import android.webkit.WebChromeClient; import android.webkit.WebView; + import com.yuzhi.fine.R; public class PullToRefreshWebView extends PullToRefreshBase { @@ -113,7 +113,7 @@ protected boolean isReadyForPullStart() { @Override protected boolean isReadyForPullEnd() { - float exactContentHeight = FloatMath.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()); + double exactContentHeight = Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()); return mRefreshableView.getScrollY() >= (exactContentHeight - mRefreshableView.getHeight()); } @@ -159,7 +159,7 @@ protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, } private int getScrollRange() { - return (int) Math.max(0, FloatMath.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()) + return (int) Math.max(0, Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale()) - (getHeight() - getPaddingBottom() - getPaddingTop())); } } diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/extras/PullToRefreshWebView2.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/extras/PullToRefreshWebView2.java index 9d8459f..9a3966c 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/extras/PullToRefreshWebView2.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/extras/PullToRefreshWebView2.java @@ -18,6 +18,7 @@ import android.content.Context; import android.util.AttributeSet; import android.webkit.WebView; + import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshWebView; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/extras/SoundPullEventListener.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/extras/SoundPullEventListener.java index 7b3ce1b..e787b2d 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/extras/SoundPullEventListener.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/extras/SoundPullEventListener.java @@ -18,6 +18,7 @@ import android.content.Context; import android.media.MediaPlayer; import android.view.View; + import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Mode; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.State; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/FlipLoadingLayout.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/FlipLoadingLayout.java index bc3b0a0..808cb84 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/FlipLoadingLayout.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/FlipLoadingLayout.java @@ -25,6 +25,7 @@ import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView.ScaleType; + import com.yuzhi.fine.R; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Mode; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Orientation; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/IndicatorLayout.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/IndicatorLayout.java index 44445f8..1bbc51f 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/IndicatorLayout.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/IndicatorLayout.java @@ -20,11 +20,16 @@ import android.graphics.Matrix; import android.graphics.drawable.Drawable; import android.view.View; -import android.view.animation.*; +import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; +import android.view.animation.RotateAnimation; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ImageView.ScaleType; + import com.yuzhi.fine.R; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Mode; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/LoadingLayout.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/LoadingLayout.java index 5cc90a1..b4298a8 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/LoadingLayout.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/LoadingLayout.java @@ -34,6 +34,7 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; + import com.yuzhi.fine.R; import com.yuzhi.fine.ui.pulltorefresh.ILoadingLayout; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Mode; diff --git a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/RotateLoadingLayout.java b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/RotateLoadingLayout.java index 2a6f313..f9b6332 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/RotateLoadingLayout.java +++ b/app/src/main/java/com/yuzhi/fine/ui/pulltorefresh/internal/RotateLoadingLayout.java @@ -22,6 +22,7 @@ import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView.ScaleType; + import com.yuzhi.fine.R; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Mode; import com.yuzhi.fine.ui.pulltorefresh.PullToRefreshBase.Orientation; diff --git a/app/src/main/java/com/yuzhi/fine/ui/quickadapter/BaseAdapterHelper.java b/app/src/main/java/com/yuzhi/fine/ui/quickadapter/BaseAdapterHelper.java index 447e7db..f1a0d88 100755 --- a/app/src/main/java/com/yuzhi/fine/ui/quickadapter/BaseAdapterHelper.java +++ b/app/src/main/java/com/yuzhi/fine/ui/quickadapter/BaseAdapterHelper.java @@ -27,7 +27,14 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; -import android.widget.*; +import android.widget.Adapter; +import android.widget.AdapterView; +import android.widget.Checkable; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RatingBar; +import android.widget.TextView; + import com.squareup.picasso.Picasso; import com.squareup.picasso.RequestCreator; import com.yuzhi.fine.R; diff --git a/app/src/main/java/com/yuzhi/fine/ui/tabstrip/PagerSlidingTabStrip.java b/app/src/main/java/com/yuzhi/fine/ui/tabstrip/PagerSlidingTabStrip.java index 054eae7..959250a 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/tabstrip/PagerSlidingTabStrip.java +++ b/app/src/main/java/com/yuzhi/fine/ui/tabstrip/PagerSlidingTabStrip.java @@ -36,6 +36,7 @@ import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; + import com.yuzhi.fine.R; import java.util.Locale; diff --git a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/IconPageIndicator.java b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/IconPageIndicator.java index 37f04f5..b506a4d 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/IconPageIndicator.java +++ b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/IconPageIndicator.java @@ -25,6 +25,7 @@ import android.view.View; import android.widget.HorizontalScrollView; import android.widget.ImageView; + import com.yuzhi.fine.R; import static android.view.ViewGroup.LayoutParams.FILL_PARENT; diff --git a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/LinePageIndicator.java b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/LinePageIndicator.java index 64ffb02..865aa06 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/LinePageIndicator.java +++ b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/LinePageIndicator.java @@ -27,10 +27,10 @@ import android.support.v4.view.ViewConfigurationCompat; import android.support.v4.view.ViewPager; import android.util.AttributeSet; -import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; + import com.yuzhi.fine.R; /** @@ -369,7 +369,7 @@ private int measureWidth(int measureSpec) { result = Math.min(result, specSize); } } - return (int) FloatMath.ceil(result); + return (int) Math.ceil(result); } /** @@ -394,7 +394,7 @@ private int measureHeight(int measureSpec) { result = Math.min(result, specSize); } } - return (int) FloatMath.ceil(result); + return (int) Math.ceil(result); } @Override diff --git a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/TabPageIndicator.java b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/TabPageIndicator.java index 2474652..92f11ca 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/TabPageIndicator.java +++ b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/TabPageIndicator.java @@ -26,6 +26,7 @@ import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.TextView; + import com.yuzhi.fine.R; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; diff --git a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/TitlePageIndicator.java b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/TitlePageIndicator.java index 760cca5..5b77512 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/TitlePageIndicator.java +++ b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/TitlePageIndicator.java @@ -20,7 +20,11 @@ import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; -import android.graphics.*; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; @@ -31,6 +35,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; + import com.yuzhi.fine.R; import java.util.ArrayList; diff --git a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/UnderlinePageIndicator.java b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/UnderlinePageIndicator.java index 4309a85..aae80b4 100644 --- a/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/UnderlinePageIndicator.java +++ b/app/src/main/java/com/yuzhi/fine/ui/viewpagerindicator/UnderlinePageIndicator.java @@ -30,6 +30,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; + import com.yuzhi.fine.R; /** diff --git a/app/src/main/java/com/yuzhi/fine/utils/BitmapUtil.java b/app/src/main/java/com/yuzhi/fine/utils/BitmapUtil.java new file mode 100644 index 0000000..85b52ab --- /dev/null +++ b/app/src/main/java/com/yuzhi/fine/utils/BitmapUtil.java @@ -0,0 +1,56 @@ +package com.yuzhi.fine.utils; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +/** + * Created by tiansj on 15/11/16. + */ +public class BitmapUtil { + + private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { + final int height = options.outHeight; + final int width = options.outWidth; + int inSampleSize = 1; + if (height > reqHeight || width > reqWidth) { + final int halfHeight = height / 2; + final int halfWidth = width / 2; + while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { + inSampleSize *= 2; + } + } + return inSampleSize; + } + + // 如果是放大图片,filter决定是否平滑,如果是缩小图片,filter无影响 + private static Bitmap createScaleBitmap(Bitmap src, int dstWidth, int dstHeight) { + Bitmap dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false); + if (src != dst) { // 如果没有缩放,那么不回收 + src.recycle(); // 释放Bitmap的native像素数组 + } + return dst; + } + + // 从Resources中加载图片 + public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeResource(res, resId, options); // 读取图片长款 + options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 计算inSampleSize + options.inJustDecodeBounds = false; + Bitmap src = BitmapFactory.decodeResource(res, resId, options); // 载入一个稍大的缩略图 + return createScaleBitmap(src, reqWidth, reqHeight); // 进一步得到目标大小的缩略图 + } + + // 从sd卡上加载图片 + public static Bitmap decodeSampledBitmapFromSd(String pathName, int reqWidth, int reqHeight) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(pathName, options); + options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); + options.inJustDecodeBounds = false; + Bitmap src = BitmapFactory.decodeFile(pathName, options); + return createScaleBitmap(src, reqWidth, reqHeight); + } +} diff --git a/app/src/main/java/com/yuzhi/fine/utils/StringUtils.java b/app/src/main/java/com/yuzhi/fine/utils/StringUtils.java index a10bd58..3bcac9b 100644 --- a/app/src/main/java/com/yuzhi/fine/utils/StringUtils.java +++ b/app/src/main/java/com/yuzhi/fine/utils/StringUtils.java @@ -1,7 +1,5 @@ package com.yuzhi.fine.utils; -import android.util.FloatMath; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -284,7 +282,7 @@ private static String computingTime(Long date) { long currentTime = System.currentTimeMillis(); float i = ((currentTime - date) / 3600 / 1000); if (i < 1) { - int time = (int) FloatMath.ceil(i * 60); + int time = (int) Math.ceil(i * 60); return time + 1 + "分钟前"; } else if (i < 24) { return (int) i + "小时前"; diff --git a/app/src/main/res/drawable-xhdpi/ic_bg_unread_count.9.png b/app/src/main/res/drawable-xhdpi/ic_bg_unread_count.9.png new file mode 100644 index 0000000..bd6a74f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_bg_unread_count.9.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_calculator.png b/app/src/main/res/drawable-xhdpi/ic_calculator.png new file mode 100644 index 0000000..8d641e4 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_calculator.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_arrow.png b/app/src/main/res/drawable-xhdpi/ic_setting_arrow.png new file mode 100644 index 0000000..2fa0405 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_setting_arrow.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_attention.png b/app/src/main/res/drawable-xhdpi/ic_setting_attention.png new file mode 100644 index 0000000..6e3d7d6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_setting_attention.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_balance.png b/app/src/main/res/drawable-xhdpi/ic_setting_balance.png new file mode 100644 index 0000000..ed35f44 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_setting_balance.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_helper.png b/app/src/main/res/drawable-xhdpi/ic_setting_helper.png new file mode 100644 index 0000000..b741118 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_setting_helper.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_record.png b/app/src/main/res/drawable-xhdpi/ic_setting_record.png new file mode 100644 index 0000000..015ad86 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_setting_record.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_setting_setting.png b/app/src/main/res/drawable-xhdpi/ic_setting_setting.png new file mode 100644 index 0000000..a8f347c Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_setting_setting.png differ diff --git a/app/src/main/res/drawable-xhdpi/newer01.jpg b/app/src/main/res/drawable-xhdpi/newer01.jpg old mode 100644 new mode 100755 index ae06761..1c5355d Binary files a/app/src/main/res/drawable-xhdpi/newer01.jpg and b/app/src/main/res/drawable-xhdpi/newer01.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/newer02.jpg b/app/src/main/res/drawable-xhdpi/newer02.jpg old mode 100644 new mode 100755 index a87bf44..8433fa1 Binary files a/app/src/main/res/drawable-xhdpi/newer02.jpg and b/app/src/main/res/drawable-xhdpi/newer02.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/newer03.jpg b/app/src/main/res/drawable-xhdpi/newer03.jpg old mode 100644 new mode 100755 index c892f4f..03a83d3 Binary files a/app/src/main/res/drawable-xhdpi/newer03.jpg and b/app/src/main/res/drawable-xhdpi/newer03.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/newer04.jpg b/app/src/main/res/drawable-xhdpi/newer04.jpg old mode 100644 new mode 100755 index d4e8e39..0ac2f4c Binary files a/app/src/main/res/drawable-xhdpi/newer04.jpg and b/app/src/main/res/drawable-xhdpi/newer04.jpg differ diff --git a/app/src/main/res/drawable/list_item_selector.xml b/app/src/main/res/drawable/list_item_selector.xml new file mode 100644 index 0000000..cef1740 --- /dev/null +++ b/app/src/main/res/drawable/list_item_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_house_detail.xml b/app/src/main/res/layout/activity_house_detail.xml index 98a3d54..2c60237 100644 --- a/app/src/main/res/layout/activity_house_detail.xml +++ b/app/src/main/res/layout/activity_house_detail.xml @@ -2,11 +2,11 @@ - + + android:background="@color/background_color" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> + android:textColor="@color/gray" /> - + + android:layout_weight="1.0" + android:background="@color/background_color" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml index 2fbdbde..9731e14 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/app/src/main/res/layout/activity_splash.xml @@ -5,14 +5,6 @@ android:layout_width="fill_parent" android:layout_height="fill_parent"> - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_touch_gallery.xml b/app/src/main/res/layout/activity_touch_gallery.xml index 0f22320..d715ba3 100644 --- a/app/src/main/res/layout/activity_touch_gallery.xml +++ b/app/src/main/res/layout/activity_touch_gallery.xml @@ -7,7 +7,7 @@ + layout="@layout/layout_main_header" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_pager.xml b/app/src/main/res/layout/fragment_home_pager.xml index dfdea47..5cf0027 100644 --- a/app/src/main/res/layout/fragment_home_pager.xml +++ b/app/src/main/res/layout/fragment_home_pager.xml @@ -4,7 +4,7 @@ android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:background="@color/white"> + android:background="@null"> + + + + + + + + diff --git a/app/src/main/res/layout/fragment_map_house_item.xml b/app/src/main/res/layout/fragment_map_house_item.xml index f04a443..e5caefb 100644 --- a/app/src/main/res/layout/fragment_map_house_item.xml +++ b/app/src/main/res/layout/fragment_map_house_item.xml @@ -75,7 +75,7 @@ android:layout_height="wrap_content" android:text="300" android:textSize="@dimen/text_size_18" - android:textColor="@color/card_color_orange" + android:textColor="@color/orange" android:id="@+id/price" android:layout_alignTop="@+id/house_title" android:layout_toLeftOf="@+id/priceUnit"/> @@ -84,7 +84,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="万" - android:textColor="@color/card_color_orange" + android:textColor="@color/orange" android:id="@+id/priceUnit" android:textSize="@dimen/text_size_12" android:layout_marginTop="5dp" diff --git a/app/src/main/res/layout/layout_main_footer.xml b/app/src/main/res/layout/layout_main_footer.xml new file mode 100644 index 0000000..0788960 --- /dev/null +++ b/app/src/main/res/layout/layout_main_footer.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_header.xml b/app/src/main/res/layout/layout_main_header.xml similarity index 94% rename from app/src/main/res/layout/main_header.xml rename to app/src/main/res/layout/layout_main_header.xml index 80d2ce2..6fb0ac3 100644 --- a/app/src/main/res/layout/main_header.xml +++ b/app/src/main/res/layout/layout_main_header.xml @@ -25,7 +25,7 @@ android:maxWidth="180dp" android:singleLine="true" android:text="AndroidFine" - android:textColor="@color/main_head_title" + android:textColor="@color/text_color_white" android:textSize="@dimen/text_size_20" /> \ No newline at end of file diff --git a/app/src/main/res/layout/main_footer.xml b/app/src/main/res/layout/main_footer.xml deleted file mode 100644 index bdf7fc1..0000000 --- a/app/src/main/res/layout/main_footer.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/member_content_view.xml b/app/src/main/res/layout/member_content_view.xml index 56fd3dc..37c0078 100755 --- a/app/src/main/res/layout/member_content_view.xml +++ b/app/src/main/res/layout/member_content_view.xml @@ -2,42 +2,134 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/member_head_view.xml b/app/src/main/res/layout/member_head_view.xml index b1c553a..027f4cc 100755 --- a/app/src/main/res/layout/member_head_view.xml +++ b/app/src/main/res/layout/member_head_view.xml @@ -8,53 +8,53 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" - android:layout_marginTop="40dp" - android:src="@drawable/ic_img_user_default" - android:contentDescription="@string/app_name" /> + android:layout_marginTop="30dp" + android:contentDescription="@string/app_name" + android:src="@drawable/ic_img_user_default" /> + android:textColor="@color/text_color_white" + android:textSize="16sp" /> + android:showDividers="middle"> + android:padding="13dp" + android:text="注册" + android:textColor="@color/text_color_white" + android:textSize="16sp" /> + android:padding="13dp" + android:text="登录" + android:textColor="@color/text_color_white" + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ee5510a..0ed2b15 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,19 +1,51 @@ - #EF3A19 - #EF3A19 - #f5f5f5 + + + + #fff8f8f8 + #EF3A19 + #EF3A19 + #f5f5f5 #343434 #FF601C - - #383838 + + #0081E1 + #323232 + #ffffff + #888888 + #A8A8A8 + #FF5B46 + #ffaaaaaa + #ff111111 + + #0081E1 + #0066FF + + + #48B7FF + #FF5B46 + #F3B720 + #D9D9D9 + #A8A8A8 + + + #B5B5B5 + + #00000000 + #66000000 + + + + #FFFFFF #000000 + #FFA500 #808080 #FF0000 #FFD700 @@ -22,47 +54,10 @@ #0000FF #800080 #FFC0CB - #FFA500 #FFFACD #DFDFDF #F5F5F5 #708090 #0083FF - - #ffffffff - #0e5986 - #ffffff - #ffffffff - #959595 - #ffffff - #efefef - - #fa8282 - #ff8048 - #ffd237 - #abbf4f - #55b3da - #ae7fc7 - - - #203c54 - #38c9ff - - - #49596b - #ff40ab5e - #d13939 - #292c35 - #ffffff - #fece00 - #919aac - #04d6fc - #20242b - #8e9aab - #d7dbe2 - #e6eaf0 - #ef3f2f - #d13a38 - \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 85289d2..ecb6b1d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -42,7 +42,7 @@ @color/vpi__background_holo_dark - -