diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 00000000..6d2313c0 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,8 @@ +kind: pipeline +name: default + +steps: +- name: check + image: runmymind/docker-android-sdk + commands: + - ./gradlew clean check diff --git a/.gitignore b/.gitignore index c3494e32..6396f9f9 100644 --- a/.gitignore +++ b/.gitignore @@ -40,13 +40,5 @@ captures/ # Keystore files *.jks -app/src/androidTest/ -app/src/test/ -app/src/testDebug/ -test/libs/ -/test/ -app/src/main/java/com/gank/gankly/ui/baisi/video/ -app/src/main/res/drawable-hdpi/ -app/src/main/res/drawable-mdpi/ -app/src/main/res/drawable-xhdpi/ projectFilesBackup/ + diff --git a/app/build.gradle b/app/build.gradle index 82490418..5ce985e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,30 +1,28 @@ apply plugin: 'com.android.application' -//需要配置符号表时,使用bugly插件 -apply plugin: 'bugly' -bugly { - appId = '900039150' - appKey = 'WbIvNJ77rAjdcEK1' -} -//rolambda -apply plugin: 'me.tatarka.retrolambda' -//findbugs -apply plugin: "findbugs" android { - compileSdkVersion 25 - buildToolsVersion "25.0.3" + compileSdkVersion rootProject.compileSdkVersion defaultConfig { applicationId "com.gank.gankly" - minSdkVersion 21 - targetSdkVersion 25 + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion versionCode 4 versionName "2.1.1" - // 4 2.1.1 multiDexEnabled true ndk { // 设置支持的SO库架构 abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' } + + buildConfigField("String", "GANK_SERVER_ULR", "\"${gank_server_url}\"") + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + testOptions.unitTests.includeAndroidResources = true + } + + testOptions { + unitTests { + includeAndroidResources = true + } } //执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关闭 @@ -60,82 +58,62 @@ android { exclude 'META-INF/services/javax.annotation.processing.Processor' exclude 'META-INF/rxjava.properties' } - - dataBinding { - enabled true - } - - apply plugin: 'findbugs' - task findbugs(type: FindBugs) { - ignoreFailures = false - effort = "default" - reportLevel = "medium" - excludeFilter = new File("${project.rootDir}/findbugs/findbugs-filter.xml") - classes = files("${project.rootDir}/app/build/intermediates/classes") - source = fileTree('src/main/java/') - classpath = files() - reports { - xml.enabled = true - html.enabled = true - xml { - destination "$project.buildDir/findbugs/findbugs-output.xml" - } - html { - destination "$project.buildDir/findbugs/findbugs-output.html" - } - } - } } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - testCompile 'junit:junit:4.12' - compile project(':superplayerlibrary') - compile "com.android.support:appcompat-v7:${supportVersion}" - compile "com.android.support:design:${supportVersion}" - compile "com.android.support:cardview-v7:${supportVersion}" - compile "com.android.support:recyclerview-v7:${supportVersion}" - compile "com.android.support:support-v4:${supportVersion}" - //Log - compile "com.github.zhaokaiqiang.klog:library:${klogVersion}" - //butterknife 注解控件 - compile 'com.jakewharton:butterknife:8.5.1' - annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' - //retrofit - compile 'com.squareup.retrofit2:retrofit:2.3.0' - compile 'com.squareup.retrofit2:retrofit-converters:2.3.0' - compile 'com.squareup.retrofit2:retrofit-adapters:2.3.0' - compile 'com.squareup.retrofit2:converter-gson:2.3.0' - compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' - //Glide - compile 'com.github.bumptech.glide:glide:4.0.0' - compile 'com.github.bumptech.glide:okhttp3-integration:4.0.0' - annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + testImplementation 'junit:junit:4.12' + // + implementation project(':support-coding-business') + implementation project(':support-coding-rxbus') + implementation project(':superplayerlibrary') + implementation project(':support-coding-ui') + implementation project(':support-coding-jsoup') + implementation "androidx.appcompat:appcompat:${supportVersion}" + implementation "com.google.android.material:material:${supportVersion}" + implementation "androidx.cardview:cardview:${supportVersion}" + implementation "androidx.recyclerview:recyclerview:${supportVersion}" + implementation "com.github.zhaokaiqiang.klog:library:${klogVersion}" + implementation "com.jakewharton:butterknife:${butterknife}" + annotationProcessor "com.jakewharton:butterknife-compiler:${butterknife}" + implementation "com.squareup.retrofit2:retrofit:${retrofitVersion}" + implementation "com.squareup.retrofit2:retrofit-converters:${retrofitConverters}" + implementation "com.squareup.retrofit2:retrofit-adapters:${retrofitAdapters}" + implementation "com.squareup.retrofit2:converter-gson:${converterGson}" + implementation "com.squareup.retrofit2:adapter-rxjava2:${adapterRxjava2}" + implementation "com.squareup.okhttp3:okhttp:${okhttp}" + implementation "com.squareup.okhttp3:logging-interceptor:${okhttp}" + debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakcanaryandroid}" + releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:${leakcanaryandroid}" + implementation "com.github.bumptech.glide:glide:${glide}" + implementation "com.github.bumptech.glide:annotations:${glide}" + implementation "com.github.bumptech.glide:okhttp3-integration:${glide}" + annotationProcessor "com.github.bumptech.glide:compiler:${glide}" + //greendao 数据库 - compile 'de.greenrobot:greendao:2.1.0' - compile 'de.greenrobot:greendao-generator:2.1.0' + implementation "de.greenrobot:greendao:${greendao}" + implementation "de.greenrobot:greendao-generator:${greendao}" + //chrome stetho 数据库查看 - compile 'com.facebook.stetho:stetho:1.5.0' - compile 'com.facebook.stetho:stetho-okhttp3:1.5.0' + implementation "com.facebook.stetho:stetho:${stethoVersion}" + implementation "com.facebook.stetho:stetho-okhttp3:${stethoOkhttp3}" + // recyclerview-animators - compile 'jp.wasabeef:recyclerview-animators:2.2.3' - //jsoup - compile 'org.jsoup:jsoup:1.10.3' - //Bugly - // compile 'com.tencent.bugly:crashreport:2.1.9' - compile 'com.tencent.bugly:crashreport_upgrade:1.2.5' - //底部导航 - compile 'com.roughike:bottom-bar:2.3.1' - //视频库 - compile 'com.supercwn.superrecycleview:superlibrary:1.2.0' +// implementation 'jp.wasabeef:recyclerview-animators:2.2.3' + + //底部导航 https://github.com/roughike/BottomBar + implementation ("com.roughike:bottom-bar:${bottomBar}"){ + exclude group: 'com.android.support' + } + //大图库 - compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0' - //rxjava2 - compile 'io.reactivex.rxjava2:rxjava:2.0.3' - compile 'io.reactivex.rxjava2:rxandroid:2.0.1' - //okhttp3 - compile 'com.squareup.okhttp3:okhttp:3.9.0' - //leakcanary 内存泄漏监测 - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' + implementation("com.davemorrissey.labs:subsampling-scale-image-view:${subsamplingVersion}") { + exclude group: 'com.android.support' + } + + //rxjava2 https://github.com/ReactiveX/RxJava + implementation "io.reactivex.rxjava2:rxjava:${rxjava}" + implementation "io.reactivex.rxjava2:rxandroid:${rxandroid}" + implementation "com.tencent.bugly:crashreport_upgrade:${crashreportUpgrade}" + implementation "androidx.constraintlayout:constraintlayout:${constraintLayout}" } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 7d58ee68..0ad9d7cd 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -58,8 +58,8 @@ } #################### Glide #################### --keep class com.bumptech.glide.integration.okhttp3.OkHttpGlideModule -keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; diff --git a/app/src/androidTest/java/com/gank/gankly/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/gank/gankly/ExampleInstrumentedTest.java new file mode 100644 index 00000000..8cfb541b --- /dev/null +++ b/app/src/androidTest/java/com/gank/gankly/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.gank.gankly; + +import android.support.test.runner.AndroidJUnit4; + +import org.junit.After; +import org.junit.Before; +import org.junit.runner.RunWith; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + } + +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b59b4097..ccd882ad 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -7,86 +8,87 @@ - + - + + android:theme="@style/AppTheme.light"> + - + android:screenOrientation="portrait" + android:theme="@style/AppTheme.Black" /> - - + + @@ -94,22 +96,6 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/App.java b/app/src/main/java/com/gank/gankly/App.java deleted file mode 100644 index eaa5ed02..00000000 --- a/app/src/main/java/com/gank/gankly/App.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.gank.gankly; - -import android.app.Application; -import android.content.Context; -import android.content.res.Resources; -import android.database.sqlite.SQLiteDatabase; - -import com.gank.gankly.config.Preferences; -import com.gank.gankly.data.DaoMaster; -import com.gank.gankly.data.DaoSession; -import com.gank.gankly.ui.base.InitializeService; -import com.gank.gankly.ui.more.SettingFragment; -import com.gank.gankly.utils.GanklyPreferences; -import com.gank.gankly.utils.NetworkUtils; -import com.squareup.leakcanary.LeakCanary; -import com.squareup.leakcanary.RefWatcher; - -import static de.greenrobot.dao.test.DbTest.DB_NAME; - -/** - * Create by LingYan on 2016-04-01 - * Email:137387869@qq.com - */ -public class App extends Application { - private static final int PREFERENCES_VERSION = 1; - private static Context mContext; - private static DaoSession daoSession; - private static boolean isNight; - - private RefWatcher mRefWatcher; - - public App() { - } - - @Override - public void onCreate() { - super.onCreate(); - - mContext = this; - // leakCanary -- start - if (LeakCanary.isInAnalyzerProcess(this)) { - // This process is dedicated to LeakCanary for heap analysis. - // You should not init your app in this process. - return; - } - mRefWatcher = LeakCanary.install(this); - // leakCanary -- end - - initPreferences(); - - InitializeService.start(getApplicationContext()); - - // GreenDao -- start - DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(getApplicationContext(), DB_NAME, null); - SQLiteDatabase db = helper.getWritableDatabase(); - DaoMaster daoMaster = new DaoMaster(db); - daoSession = daoMaster.newSession(); - // GreenDao -- end - } - - private void initPreferences() { - int version = GanklyPreferences.getInt(Preferences.APP_VERSION, 1); - - if (version < PREFERENCES_VERSION) { - GanklyPreferences.clear(); - GanklyPreferences.putInt(Preferences.APP_VERSION, PREFERENCES_VERSION); - } - - isNight = GanklyPreferences.getBoolean(SettingFragment.IS_NIGHT, false); - } - - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); - } - - public static Context getGankContext() { - return mContext.getApplicationContext(); - } - - public static Resources getAppResources() { - return getGankContext().getResources(); - } - - public static int getAppColor(int id) { - return getAppResources().getColor(id); - } - - public static String getAppString(int res) { - return getAppResources().getString(res); - } - - public static DaoSession getDaoSession() { - return daoSession; - } - - public static boolean isNight() { - return isNight; - } - - public static void setIsNight(boolean isNight) { - App.isNight = isNight; - } - - public static boolean isNetConnect() { - return NetworkUtils.isNetworkAvailable(); - } - - public RefWatcher getRefWatcher() { - return mRefWatcher; - } -} diff --git a/app/src/main/java/com/gank/gankly/AppConfig.java b/app/src/main/java/com/gank/gankly/AppConfig.java new file mode 100644 index 00000000..9d589736 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/AppConfig.java @@ -0,0 +1,82 @@ +package com.gank.gankly; + +import android.app.Application; +import android.ly.business.api.GankServerHelper; +import android.util.Log; + +import com.facebook.stetho.Stetho; +import com.gank.gankly.config.Constants; +import com.gank.gankly.config.HttpUrlConfig; +import com.squareup.leakcanary.LeakCanary; +import com.tencent.bugly.Bugly; +import com.tencent.bugly.beta.Beta; +import com.tencent.smtt.sdk.QbSdk; + +import okhttp3.logging.HttpLoggingInterceptor; + +/** + * Create by LingYan on 2016-04-01 + */ +public class AppConfig extends Application { + + public AppConfig() { + } + + @Override + public void onCreate() { + super.onCreate(); + setupStetho(); + setupX5WebView(); + + GankServerHelper.init(AppConfig.this) + .baseUrl(HttpUrlConfig.GANK_URL) + .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)); + + } + + /** + * 数据库Chrome上调试 + */ + private void setupStetho() { + Stetho.initializeWithDefaults(AppConfig.this); + } + + /** + * Bugly 测试 + */ + private void setupBugly() { + Beta.autoDownloadOnWifi = true; +// Beta.autoCheckUpgrade = GanklyPreferences.getBoolean(Preferences.SETTING_AUTO_CHECK, true); + Bugly.init(AppConfig.this, Constants.CRASH_LOG_ID, false); + } + + /** + * x5 搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。 + */ + private void setupX5WebView() { + QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() { + + @Override + public void onViewInitFinished(boolean arg0) { + //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。 + Log.e("app", " onViewInitFinished is " + arg0); + } + + @Override + public void onCoreInitFinished() { + } + }; + //x5内核初始化接口 + QbSdk.initX5Environment(AppConfig.this, cb); + } + + /** + * 内存监视 + */ + private void setupLeakCanary() { + if (LeakCanary.isInAnalyzerProcess(this)) { + return; + } + LeakCanary.install(this); + } +} diff --git a/app/src/main/java/com/gank/gankly/bean/BaiSiBean.java b/app/src/main/java/com/gank/gankly/bean/BaiSiBean.java index 94b3172b..b7b09a56 100644 --- a/app/src/main/java/com/gank/gankly/bean/BaiSiBean.java +++ b/app/src/main/java/com/gank/gankly/bean/BaiSiBean.java @@ -4,7 +4,6 @@ /** * Create by LingYan on 2016-11-30 - * Email:137387869@qq.com */ public class BaiSiBean { diff --git a/app/src/main/java/com/gank/gankly/bean/BaseResult.java b/app/src/main/java/com/gank/gankly/bean/BaseResult.java index b1acd364..e40a48af 100644 --- a/app/src/main/java/com/gank/gankly/bean/BaseResult.java +++ b/app/src/main/java/com/gank/gankly/bean/BaseResult.java @@ -1,13 +1,5 @@ package com.gank.gankly.bean; public class BaseResult { - private boolean error; - - public boolean isError() { - return error; - } - - public void setError(boolean error) { - this.error = error; - } + public boolean error; } \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/bean/BuDeJieBean.java b/app/src/main/java/com/gank/gankly/bean/BuDeJieBean.java index bfd2cefd..f9efd7e6 100644 --- a/app/src/main/java/com/gank/gankly/bean/BuDeJieBean.java +++ b/app/src/main/java/com/gank/gankly/bean/BuDeJieBean.java @@ -4,7 +4,6 @@ /** * Create by LingYan on 2016-12-07 - * Email:137387869@qq.com */ public class BuDeJieBean { diff --git a/app/src/main/java/com/gank/gankly/bean/BuDeJieVideo.java b/app/src/main/java/com/gank/gankly/bean/BuDeJieVideo.java index 9ec7b1cf..36d49050 100644 --- a/app/src/main/java/com/gank/gankly/bean/BuDeJieVideo.java +++ b/app/src/main/java/com/gank/gankly/bean/BuDeJieVideo.java @@ -4,7 +4,6 @@ /** * Create by LingYan on 2016-12-13 - * Email:137387869@qq.com */ public class BuDeJieVideo { diff --git a/app/src/main/java/com/gank/gankly/bean/DailyMeiziBean.java b/app/src/main/java/com/gank/gankly/bean/DailyMeiziBean.java deleted file mode 100644 index a8bd91ef..00000000 --- a/app/src/main/java/com/gank/gankly/bean/DailyMeiziBean.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gank.gankly.bean; - -/** - * Create by LingYan on 2016-07-05 - */ -public class DailyMeiziBean { - private String month; - private String day; - private String url; - private String title; - - public DailyMeiziBean(String month, String day, String url, String title) { - this.month = month; - this.day = day; - this.url = url; - this.title = title; - } - - public DailyMeiziBean(String url, String title) { - this.url = url; - this.title = title; - } - - public String getMonth() { - return month; - } - - public void setMonth(String month) { - this.month = month; - } - - public String getDay() { - return day; - } - - public void setDay(String day) { - this.day = day; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } -} diff --git a/app/src/main/java/com/gank/gankly/bean/GallerySize.java b/app/src/main/java/com/gank/gankly/bean/GallerySize.java index 094247fd..b5bb70a7 100644 --- a/app/src/main/java/com/gank/gankly/bean/GallerySize.java +++ b/app/src/main/java/com/gank/gankly/bean/GallerySize.java @@ -2,7 +2,6 @@ /** * Create by LingYan on 2016-12-12 - * Email:137387869@qq.com */ public class GallerySize { diff --git a/app/src/main/java/com/gank/gankly/bean/GankResult.java b/app/src/main/java/com/gank/gankly/bean/GankResult.java index d3006b40..e4d5e98c 100644 --- a/app/src/main/java/com/gank/gankly/bean/GankResult.java +++ b/app/src/main/java/com/gank/gankly/bean/GankResult.java @@ -1,58 +1,32 @@ package com.gank.gankly.bean; -import android.os.Parcel; -import android.os.Parcelable; +import android.ly.business.domain.Gank; import com.gank.gankly.utils.ListUtils; +import java.io.Serializable; import java.util.List; /** * Create by LingYan on 2016-04-06 */ -public class GankResult extends BaseResult implements Parcelable { +public class GankResult extends BaseResult implements Serializable { - private List results; + private List results; - public GankResult(List results) { + public GankResult(List results) { this.results = results; } - protected GankResult(Parcel in) { - results = in.createTypedArrayList(ResultsBean.CREATOR); - } - - public static final Creator CREATOR = new Creator() { - @Override - public GankResult createFromParcel(Parcel in) { - return new GankResult(in); - } - - @Override - public GankResult[] newArray(int size) { - return new GankResult[size]; - } - }; - - public List getResults() { + public List getResults() { return results; } public boolean isEmpty() { - return ListUtils.isListEmpty(results); + return ListUtils.isEmpty(results); } public int getSize() { - return ListUtils.getListSize(results); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeTypedList(results); + return ListUtils.getSize(results); } } diff --git a/app/src/main/java/com/gank/gankly/bean/GiftBean.java b/app/src/main/java/com/gank/gankly/bean/GiftBean.java deleted file mode 100644 index 6413c4f2..00000000 --- a/app/src/main/java/com/gank/gankly/bean/GiftBean.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.gank.gankly.bean; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * Create by LingYan on 2016-05-18 - */ -public class GiftBean implements Parcelable { - private String imgUrl; - private String url; - private String time; - private String views; - private String title; - - public GiftBean(String imgUrl) { - this.imgUrl = imgUrl; - } - - public GiftBean(String imgUrl, String url, String time, String views, String title) { - this.imgUrl = imgUrl; - this.url = url; - this.time = time; - this.views = views; - this.title = title; - } - - protected GiftBean(Parcel in) { - imgUrl = in.readString(); - url = in.readString(); - time = in.readString(); - views = in.readString(); - title = in.readString(); - } - - public static final Creator CREATOR = new Creator() { - @Override - public GiftBean createFromParcel(Parcel in) { - return new GiftBean(in); - } - - @Override - public GiftBean[] newArray(int size) { - return new GiftBean[size]; - } - }; - - public String getTime() { - return time; - } - - public void setTime(String time) { - this.time = time; - } - - public String getViews() { - return views; - } - - public void setViews(String views) { - this.views = views; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getImgUrl() { - return imgUrl; - } - - public void setImgUrl(String imgUrl) { - this.imgUrl = imgUrl; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(imgUrl); - dest.writeString(url); - dest.writeString(time); - dest.writeString(views); - dest.writeString(title); - } -} diff --git a/app/src/main/java/com/gank/gankly/bean/GiftResult.java b/app/src/main/java/com/gank/gankly/bean/GiftResult.java index 6cf98faf..8d6006b7 100644 --- a/app/src/main/java/com/gank/gankly/bean/GiftResult.java +++ b/app/src/main/java/com/gank/gankly/bean/GiftResult.java @@ -1,6 +1,6 @@ package com.gank.gankly.bean; -import com.gank.gankly.utils.ListUtils; +import android.ly.business.domain.Gift; import java.util.List; @@ -9,30 +9,10 @@ */ public class GiftResult { private int num; - private List mList; + private List mList; - public GiftResult(int num, List list) { + public GiftResult(int num, List list) { this.num = num; mList = list; } - - public List getList() { - return mList; - } - - public void setList(List list) { - mList = list; - } - - public int getNum() { - return num; - } - - public void setNum(int num) { - this.num = num; - } - - public int getSize() { - return ListUtils.getListSize(mList); - } } diff --git a/app/src/main/java/com/gank/gankly/bean/JianDanBean.java b/app/src/main/java/com/gank/gankly/bean/JianDanBean.java index b3405968..eb657ae1 100644 --- a/app/src/main/java/com/gank/gankly/bean/JianDanBean.java +++ b/app/src/main/java/com/gank/gankly/bean/JianDanBean.java @@ -2,7 +2,6 @@ /** * Create by LingYan on 2016-11-21 - * Email:137387869@qq.com */ public class JianDanBean { diff --git a/app/src/main/java/com/gank/gankly/bean/JianDanResult.java b/app/src/main/java/com/gank/gankly/bean/JianDanResult.java index a15bc4eb..00ae290d 100644 --- a/app/src/main/java/com/gank/gankly/bean/JianDanResult.java +++ b/app/src/main/java/com/gank/gankly/bean/JianDanResult.java @@ -4,7 +4,6 @@ /** * Create by LingYan on 2016-07-20 - * Email:137387869@qq.com */ public class JianDanResult { private String status; diff --git a/app/src/main/java/com/gank/gankly/bean/ResultsBean.java b/app/src/main/java/com/gank/gankly/bean/ResultsBean.java deleted file mode 100644 index 3e856ae8..00000000 --- a/app/src/main/java/com/gank/gankly/bean/ResultsBean.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.gank.gankly.bean; - -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; - -public class ResultsBean implements Parcelable { - private String _id; - private String _ns; - private String createdAt; - private String desc; - private String publishedAt; - private String source; - private String type; - private String url; - private boolean used; - private String who; - private boolean isLoad; - - protected ResultsBean(Parcel in) { - _id = in.readString(); - _ns = in.readString(); - createdAt = in.readString(); - desc = in.readString(); - publishedAt = in.readString(); - source = in.readString(); - type = in.readString(); - url = in.readString(); - used = in.readByte() != 0; - who = in.readString(); - isLoad = in.readByte() != 0; - } - - public static final Creator CREATOR = new Creator() { - @Override - public ResultsBean createFromParcel(Parcel in) { - return new ResultsBean(in); - } - - @Override - public ResultsBean[] newArray(int size) { - return new ResultsBean[size]; - } - }; - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public String get_ns() { - return _ns; - } - - public void set_ns(String _ns) { - this._ns = _ns; - } - - public String getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public String getPublishedAt() { - return publishedAt; - } - - public void setPublishedAt(String publishedAt) { - this.publishedAt = publishedAt; - } - - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public boolean isUsed() { - return used; - } - - public void setUsed(boolean used) { - this.used = used; - } - - public String getWho() { - if (TextUtils.isEmpty(who)) { - return "网页"; - } - return who; - } - - public void setWho(String who) { - this.who = who; - } - - public boolean isLoad() { - return isLoad; - } - - public void setLoad(boolean load) { - isLoad = load; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(_id); - dest.writeString(_ns); - dest.writeString(createdAt); - dest.writeString(desc); - dest.writeString(publishedAt); - dest.writeString(source); - dest.writeString(type); - dest.writeString(url); - dest.writeByte((byte) (used ? 1 : 0)); - dest.writeString(who); - dest.writeByte((byte) (isLoad ? 1 : 0)); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/butterknife/BasicHolder.java b/app/src/main/java/com/gank/gankly/butterknife/BasicHolder.java new file mode 100644 index 00000000..f358edab --- /dev/null +++ b/app/src/main/java/com/gank/gankly/butterknife/BasicHolder.java @@ -0,0 +1,15 @@ +package com.gank.gankly.butterknife; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.LayoutRes; +import androidx.recyclerview.widget.RecyclerView; + +public abstract class BasicHolder extends RecyclerView.ViewHolder { + public BasicHolder(ViewGroup parent, @LayoutRes int layout) { + super(LayoutInflater.from(parent.getContext()).inflate(layout, parent, false)); + } + + public abstract void bindHolder(II item); +} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/butterknife/BindViewHolder.java b/app/src/main/java/com/gank/gankly/butterknife/BindViewHolder.java new file mode 100644 index 00000000..f1e28198 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/butterknife/BindViewHolder.java @@ -0,0 +1,17 @@ +package com.gank.gankly.butterknife; + +import androidx.annotation.LayoutRes; +import android.view.ViewGroup; + +import butterknife.ButterKnife; + +/** + * Create by LingYan on 2017-10-13 + */ + +public abstract class BindViewHolder extends BasicHolder { + public BindViewHolder(ViewGroup parent, @LayoutRes int layout) { + super(parent, layout); + ButterKnife.bind(this, itemView); + } +} diff --git a/app/src/main/java/com/gank/gankly/butterknife/ButterKnifeFragment.java b/app/src/main/java/com/gank/gankly/butterknife/ButterKnifeFragment.java new file mode 100644 index 00000000..ad522381 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/butterknife/ButterKnifeFragment.java @@ -0,0 +1,43 @@ +package com.gank.gankly.butterknife; + +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import android.lectcoding.ui.base.BaseFragment; + +import butterknife.ButterKnife; +import butterknife.Unbinder; + +/** + * Create by LingYan on 2017-09-28 + */ + +public abstract class ButterKnifeFragment extends BaseFragment { + protected Unbinder unBinder; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(getLayoutId(), container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + unBinder = ButterKnife.bind(this, view); + } + + protected abstract int getLayoutId(); + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (unBinder != null) { + unBinder.unbind(); + } + } +} diff --git a/app/src/main/java/com/gank/gankly/butterknife/ItemModel.java b/app/src/main/java/com/gank/gankly/butterknife/ItemModel.java new file mode 100644 index 00000000..ed867a42 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/butterknife/ItemModel.java @@ -0,0 +1,24 @@ +package com.gank.gankly.butterknife; + +import com.gank.gankly.ui.base.adapter.ItemComparator; + +/** + * Create by LingYan on 2018-11-12 + */ +public abstract class ItemModel implements ItemComparator { + public abstract int getViewType(); + + public int getSpanSize(int size, int position) { + return size; + } + + @Override + public boolean isItemSame(ItemComparator itemComparator) { + return false; + } + + @Override + public boolean isContentEqual(ItemComparator itemComparator) { + return false; + } +} diff --git a/app/src/main/java/com/gank/gankly/config/Constants.java b/app/src/main/java/com/gank/gankly/config/Constants.java index 97b1b1a4..40d7cf01 100644 --- a/app/src/main/java/com/gank/gankly/config/Constants.java +++ b/app/src/main/java/com/gank/gankly/config/Constants.java @@ -2,7 +2,6 @@ /** * Create by LingYan on 2016-04-06 - * Email:137387869@qq.com */ public class Constants { //title diff --git a/app/src/main/java/com/gank/gankly/config/HttpUrlConfig.java b/app/src/main/java/com/gank/gankly/config/HttpUrlConfig.java new file mode 100644 index 00000000..35de4130 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/config/HttpUrlConfig.java @@ -0,0 +1,10 @@ +package com.gank.gankly.config; + +/** + * Create by LingYan on 2018-09-14 + */ + +public class HttpUrlConfig { + // 干货 + public static final String GANK_URL = "http://gank.io/api/data/"; +} diff --git a/app/src/main/java/com/gank/gankly/config/MeiziArrayList.java b/app/src/main/java/com/gank/gankly/config/MeiziArrayList.java index a078995b..03192036 100644 --- a/app/src/main/java/com/gank/gankly/config/MeiziArrayList.java +++ b/app/src/main/java/com/gank/gankly/config/MeiziArrayList.java @@ -1,6 +1,7 @@ package com.gank.gankly.config; -import com.gank.gankly.bean.ResultsBean; +import android.ly.business.domain.Gank; + import com.gank.gankly.utils.ListUtils; import java.util.ArrayList; @@ -11,8 +12,8 @@ */ public class MeiziArrayList { private static MeiziArrayList sMeiziArrayList; - private List mOneItemsList; - private List mMeiziList; + private List mOneItemsList; + private List mMeiziList; private int mPage = 0; private MeiziArrayList() { @@ -27,37 +28,37 @@ public static MeiziArrayList getInstance() { return sMeiziArrayList; } - public void refillOneItems(List list) { - if (ListUtils.isListEmpty(mOneItemsList)) { + public void refillOneItems(List list) { + if (ListUtils.isEmpty(mOneItemsList)) { mOneItemsList.addAll(list); } } - public void addImages(List list, int page) { + public void addImages(List list, int page) { if (mPage < page) { mMeiziList.addAll(list); mPage = page; } } - public List getImagesList() { + public List getImagesList() { return mMeiziList; } - public List getOneItemsList() { + public List getOneItemsList() { return mOneItemsList; } public boolean isOneItemsEmpty() { - return ListUtils.getListSize(mOneItemsList) <= 0; + return ListUtils.getSize(mOneItemsList) <= 0; } public int getPage() { return mPage; } - public ResultsBean getResultBean(int position) { - if (ListUtils.isListEmpty(mMeiziList)) { + public Gank getResultBean(int position) { + if (ListUtils.isEmpty(mMeiziList)) { return null; } return mMeiziList.get(position); diff --git a/app/src/main/java/com/gank/gankly/config/glide/GlideRoundTransform.java b/app/src/main/java/com/gank/gankly/config/glide/GlideRoundTransform.java index 8a64e764..978f1560 100644 --- a/app/src/main/java/com/gank/gankly/config/glide/GlideRoundTransform.java +++ b/app/src/main/java/com/gank/gankly/config/glide/GlideRoundTransform.java @@ -22,7 +22,6 @@ public GlideRoundTransform(Context context) { } public GlideRoundTransform(Context context, int dp) { - super(context); radius = Resources.getSystem().getDisplayMetrics().density * dp; } diff --git a/app/src/main/java/com/gank/gankly/config/glide/MyGlideModule.java b/app/src/main/java/com/gank/gankly/config/glide/MyGlideModule.java index 117aadaf..c2926ca2 100644 --- a/app/src/main/java/com/gank/gankly/config/glide/MyGlideModule.java +++ b/app/src/main/java/com/gank/gankly/config/glide/MyGlideModule.java @@ -1,6 +1,7 @@ package com.gank.gankly.config.glide; import android.content.Context; +import android.util.Log; import com.bumptech.glide.Glide; import com.bumptech.glide.GlideBuilder; @@ -15,11 +16,12 @@ import com.gank.gankly.utils.gilde.WifiOnlyLoader; import java.io.InputStream; + @GlideModule public class MyGlideModule extends AppGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { - registry.append(GlideUrl.class, InputStream.class, new WifiOnlyLoader.Factory()); + registry.append(GlideUrl.class, InputStream.class, new WifiOnlyLoader.Factory(context)); } @Override @@ -27,10 +29,10 @@ public void applyOptions(Context context, GlideBuilder builder) { super.applyOptions(context, builder); String diskCache = FileUtils.getGlideDefaultPath(context); builder.setDiskCache(new DiskLruCacheFactory(diskCache, 100 * 1024 * 1024)); -// builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); builder.setDefaultRequestOptions(new RequestOptions() - .format(DecodeFormat.PREFER_ARGB_8888) + .format(DecodeFormat.PREFER_ARGB_8888) ); + builder.setLogLevel(Log.DEBUG); } @Override diff --git a/app/src/main/java/com/gank/gankly/config/glide/MyOkHttpStreamFetcher.java b/app/src/main/java/com/gank/gankly/config/glide/MyOkHttpStreamFetcher.java index 523d935e..39123efa 100644 --- a/app/src/main/java/com/gank/gankly/config/glide/MyOkHttpStreamFetcher.java +++ b/app/src/main/java/com/gank/gankly/config/glide/MyOkHttpStreamFetcher.java @@ -10,7 +10,6 @@ /** * Create by LingYan on 2017-08-23 - * Email:137387869@qq.com */ public class MyOkHttpStreamFetcher extends OkHttpStreamFetcher { diff --git a/app/src/main/java/com/gank/gankly/config/glide/MyOkHttpUrlLoader.java b/app/src/main/java/com/gank/gankly/config/glide/MyOkHttpUrlLoader.java index 04865af2..876e1a12 100644 --- a/app/src/main/java/com/gank/gankly/config/glide/MyOkHttpUrlLoader.java +++ b/app/src/main/java/com/gank/gankly/config/glide/MyOkHttpUrlLoader.java @@ -1,7 +1,5 @@ package com.gank.gankly.config.glide; -import android.support.annotation.Nullable; - import com.bumptech.glide.load.Options; import com.bumptech.glide.load.data.DataFetcher; import com.bumptech.glide.load.model.GlideUrl; @@ -11,6 +9,7 @@ import java.io.InputStream; +import androidx.annotation.Nullable; import okhttp3.OkHttpClient; /** diff --git a/app/src/main/java/com/gank/gankly/config/glide/OkHttpProgressGlideModule.java b/app/src/main/java/com/gank/gankly/config/glide/OkHttpProgressGlideModule.java index b1525e1f..674b5269 100644 --- a/app/src/main/java/com/gank/gankly/config/glide/OkHttpProgressGlideModule.java +++ b/app/src/main/java/com/gank/gankly/config/glide/OkHttpProgressGlideModule.java @@ -7,6 +7,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.Registry; +import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.module.LibraryGlideModule; @@ -39,8 +40,8 @@ import okio.Source; // TODO add -// TODO add -// or not use 'okhttp@aar' in Gradle depdendencies +// TODO add { + + private final Call.Factory client; + + public OkHttpUrlLoader(Call.Factory client) { + this.client = client; + } + + @Override + public boolean handles(GlideUrl url) { + return true; + } + + @Override + public LoadData buildLoadData(GlideUrl model, int width, int height, + Options options) { + return new LoadData<>(model, new OkHttpStreamFetcher(client, model)); + } + + /** + * The default factory for {@link OkHttpUrlLoader}s. + */ + public static class Factory implements ModelLoaderFactory { + private static volatile Call.Factory internalClient; + private Call.Factory client; + private Context mContext; + + private static Call.Factory getInternalClient() { + if (internalClient == null) { + synchronized (Factory.class) { + if (internalClient == null) { + internalClient = new OkHttpClient(); + } + } + } + return internalClient; + } + + /** + * Constructor for a new Factory that runs requests using a static singleton client. + */ + public Factory(Context context) { + this(getInternalClient()); + } + + /** + * Constructor for a new Factory that runs requests using given client. + * + * @param client this is typically an instance of {@code OkHttpClient}. + */ + public Factory(Call.Factory client) { + this.client = client; + } + + @Override + public ModelLoader build(MultiModelLoaderFactory multiFactory) { + return new OkHttpUrlLoader(client); + } + + @Override + public void teardown() { + // Do nothing, this instance doesn't own the client. + } + } +} diff --git a/app/src/main/java/com/gank/gankly/config/glide/ProgressTarget.java b/app/src/main/java/com/gank/gankly/config/glide/ProgressTarget.java index a692b248..e8f29930 100644 --- a/app/src/main/java/com/gank/gankly/config/glide/ProgressTarget.java +++ b/app/src/main/java/com/gank/gankly/config/glide/ProgressTarget.java @@ -1,12 +1,10 @@ package com.gank.gankly.config.glide; import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; -import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.transition.Transition; -import com.gank.gankly.App; public abstract class ProgressTarget extends WrappingTarget implements OkHttpProgressGlideModule.UIProgressListener { private T model; @@ -26,7 +24,6 @@ public final T getModel() { } public final void setModel(T model) { - Glide.get(App.getGankContext()).clearMemory(); this.model = model; } diff --git a/app/src/main/java/com/gank/gankly/config/glide/WrappingTarget.java b/app/src/main/java/com/gank/gankly/config/glide/WrappingTarget.java index b6962ecb..b656c089 100644 --- a/app/src/main/java/com/gank/gankly/config/glide/WrappingTarget.java +++ b/app/src/main/java/com/gank/gankly/config/glide/WrappingTarget.java @@ -1,7 +1,7 @@ package com.gank.gankly.config.glide; import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.bumptech.glide.request.Request; import com.bumptech.glide.request.target.SizeReadyCallback; diff --git a/app/src/main/java/com/gank/gankly/diff/DiffCallback.java b/app/src/main/java/com/gank/gankly/diff/DiffCallback.java new file mode 100644 index 00000000..3f1cb6ef --- /dev/null +++ b/app/src/main/java/com/gank/gankly/diff/DiffCallback.java @@ -0,0 +1,44 @@ +package com.gank.gankly.diff; + +import androidx.recyclerview.widget.DiffUtil; + +import com.gank.gankly.ui.base.adapter.ItemComparator; + +import java.util.List; + +/** + * Create by LingYan on 2018-11-12 + */ +public class DiffCallback extends DiffUtil.Callback { + private List oldList; + private List newList; + + public DiffCallback(List oldList, List newList) { + this.oldList = (List) oldList; + this.newList = (List) newList; + } + + @Override + public int getOldListSize() { + return oldList == null ? 0 : oldList.size(); + } + + @Override + public int getNewListSize() { + return newList == null ? 0 : newList.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + ItemComparator oldItem = oldList.get(oldItemPosition); + ItemComparator newItem = newList.get(newItemPosition); + return newItem.isItemSame(oldItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + ItemComparator oldItem = oldList.get(oldItemPosition); + ItemComparator newItem = newList.get(newItemPosition); + return newItem.isContentEqual(oldItem); + } +} diff --git a/app/src/main/java/com/gank/gankly/listener/DialogOnClick.java b/app/src/main/java/com/gank/gankly/listener/DialogOnClick.java index f075d587..53b2ccf4 100644 --- a/app/src/main/java/com/gank/gankly/listener/DialogOnClick.java +++ b/app/src/main/java/com/gank/gankly/listener/DialogOnClick.java @@ -2,7 +2,6 @@ /** * Create by LingYan on 2016-09-09 - * Email:137387869@qq.com */ public interface DialogOnClick { void cancel(); diff --git a/app/src/main/java/com/gank/gankly/listener/ItemCallBack.java b/app/src/main/java/com/gank/gankly/listener/ItemCallBack.java new file mode 100644 index 00000000..97723084 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/listener/ItemCallBack.java @@ -0,0 +1,7 @@ +package com.gank.gankly.listener; + +import android.view.View; + +public interface ItemCallBack { + void onClick(View view, int position, Object object); +} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/listener/RecyclerOnClick.java b/app/src/main/java/com/gank/gankly/listener/RecyclerOnClick.java deleted file mode 100644 index 0aab4312..00000000 --- a/app/src/main/java/com/gank/gankly/listener/RecyclerOnClick.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.gank.gankly.listener; - -import android.view.View; - -import com.gank.gankly.bean.ResultsBean; - -public interface RecyclerOnClick { - void onClick(View view, ResultsBean bean); -} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/mvp/BaseModel.java b/app/src/main/java/com/gank/gankly/mvp/BaseModel.java index 04e1803a..e2552484 100644 --- a/app/src/main/java/com/gank/gankly/mvp/BaseModel.java +++ b/app/src/main/java/com/gank/gankly/mvp/BaseModel.java @@ -6,7 +6,6 @@ /** * Create by LingYan on 2016-10-24 - * Email:137387869@qq.com */ public class BaseModel { diff --git a/app/src/main/java/com/gank/gankly/mvp/BasePresenter.java b/app/src/main/java/com/gank/gankly/mvp/BasePresenter.java deleted file mode 100644 index 7faba448..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/BasePresenter.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gank.gankly.mvp; - - -/** - * Create by LingYan on 2016-10-21 - * Email:137387869@qq.com - */ - -public abstract class BasePresenter { - -} diff --git a/app/src/main/java/com/gank/gankly/mvp/FetchPresenter.java b/app/src/main/java/com/gank/gankly/mvp/FetchPresenter.java deleted file mode 100644 index f54037dd..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/FetchPresenter.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.gank.gankly.mvp; - -import com.gank.gankly.App; -import com.gank.gankly.R; -import com.gank.gankly.bean.GankResult; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.utils.ListUtils; - -import java.util.List; - -/** - * Create by LingYan on 2016-10-25 - * Email:137387869@qq.com - */ - -public abstract class FetchPresenter extends BasePresenter { - private int fetchLimit = 20; - private int fetchPage = 1; - private boolean hasMore = true; - private int offSetPage = 0; - - public int getOffSet() { - return offSetPage * fetchLimit; - } - - public void setOffSetPage(int page) { - this.offSetPage = page; - } - - public int getOffSetPage() { - return offSetPage; - } - - public int getInitPage() { - return fetchPage = 1; - } - - public boolean hasMore() { - return hasMore; - } - - public void setHasMore(boolean hasMore) { - this.hasMore = hasMore; - } - - public int getFetchLimit() { - return fetchLimit; - } - - public void setFetchLimit(int fetchLimit) { - this.fetchLimit = fetchLimit; - } - - public void setFetchPage(int fetchPage) { - this.fetchPage = fetchPage; - } - - public int getFetchPage() { - return fetchPage; - } - - public List filterData(GankResult gankResult, IFetchView view) { - view.hideRefresh(); - if (gankResult != null) { - int size = gankResult.getSize(); - if (size > 0) { - if (size >= fetchLimit) { - view.showContent(); - } else { - view.hasNoMoreDate(); - } - return gankResult.getResults(); - } else { - if (fetchPage == 1) { - view.showEmpty(); - } else { - view.hasNoMoreDate(); - } - } - } else { - if (fetchPage > 1) { - view.showRefreshError(App.getAppString(R.string.loading_error)); - } else { - view.showError(); - } - } - return null; - } - - public List filterData(List t, IFetchView view) { - view.hideRefresh(); - if (t != null) { - int size = ListUtils.getListSize(t); - if (size > 0) { - if (size >= fetchLimit) { - view.showContent(); - } else { - hasMore = false; - view.hasNoMoreDate(); - } - return t; - } else { - if (fetchPage == 1) { - view.showEmpty(); - } else { - hasMore = false; - view.hasNoMoreDate(); - } - } - } else { - if (fetchPage > 1) { - view.showRefreshError(App.getAppString(R.string.loading_error)); - } else { - view.showError(); - } - } - return null; - } - - /** - * 过滤数据,数据加载完、空数据、显示数据 - * - * @param t 集合 - * @param view IFetch 视图 - * @param 实体类 - * @return 最后返回数据集合 - */ - public List filterDataBase(List t, IFetchView view) { - if (t != null) { - int size = ListUtils.getListSize(t); - if (size > 0) { - if (size >= fetchLimit) { - view.showContent(); - } else { - hasMore = false; - view.hasNoMoreDate(); - } - return t; - } else { - if (offSetPage == 0) { - view.showEmpty(); - } else { - hasMore = false; - view.hasNoMoreDate(); - } - } - } else { - if (offSetPage > 0) { - view.showRefreshError(App.getAppString(R.string.loading_error)); - } else { - view.showError(); - } - } - return null; - } - - /** - * 解析请求失败,显示网络错误、服务器问题 - * - * @param view IFetch 视图 - */ - public void parseError(IFetchView view) { - view.hideRefresh(); - if (App.isNetConnect()) { - if (fetchPage > 1) { - view.showRefreshError(App.getAppString(R.string.loading_error)); - } else { - view.showError(); - } - } else { - if (fetchPage > 1) { - view.showRefreshError(App.getAppString(R.string.loading_network_failure)); - } else { - view.showDisNetWork(); - } - } - } -} diff --git a/app/src/main/java/com/gank/gankly/mvp/IBasePresenter.java b/app/src/main/java/com/gank/gankly/mvp/IBasePresenter.java deleted file mode 100644 index c71aa806..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/IBasePresenter.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gank.gankly.mvp; - -/** - * Create by LingYan on 2016-10-25 - * Email:137387869@qq.com - */ - -public interface IBasePresenter { - void subscribe(); - - void unSubscribe(); -} diff --git a/app/src/main/java/com/gank/gankly/mvp/IBaseView.java b/app/src/main/java/com/gank/gankly/mvp/IBaseView.java deleted file mode 100644 index 494edda4..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/IBaseView.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.gank.gankly.mvp; - -/** - * Create by LingYan on 2016-10-20 - * Email:137387869@qq.com - */ - -public interface IBaseView { -} diff --git a/app/src/main/java/com/gank/gankly/mvp/IFetchView.java b/app/src/main/java/com/gank/gankly/mvp/IFetchView.java deleted file mode 100644 index a3d8134b..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/IFetchView.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gank.gankly.mvp; - -/** - * Create by LingYan on 2016-10-20 - * Email:137387869@qq.com - */ - -public interface IFetchView extends IBaseView { - void showRefresh(); - - void hideRefresh(); - - void hasNoMoreDate(); - - void showContent(); - - void showEmpty(); - - void showDisNetWork(); - - void showError(); - - void showLoading(); - - void showRefreshError(String errorStr); -} diff --git a/app/src/main/java/com/gank/gankly/mvp/IFetchPresenter.java b/app/src/main/java/com/gank/gankly/mvp/ILoadMorePresenter.java similarity index 59% rename from app/src/main/java/com/gank/gankly/mvp/IFetchPresenter.java rename to app/src/main/java/com/gank/gankly/mvp/ILoadMorePresenter.java index f069b5d4..1b3e4e89 100644 --- a/app/src/main/java/com/gank/gankly/mvp/IFetchPresenter.java +++ b/app/src/main/java/com/gank/gankly/mvp/ILoadMorePresenter.java @@ -3,10 +3,9 @@ /** * Create by LingYan on 2016-10-21 - * Email:137387869@qq.com */ -public interface IFetchPresenter extends IBasePresenter{ +public interface ILoadMorePresenter{ void fetchNew(); void fetchMore(); diff --git a/app/src/main/java/com/gank/gankly/mvp/SubscribePresenter.java b/app/src/main/java/com/gank/gankly/mvp/SubscribePresenter.java new file mode 100644 index 00000000..250b56bb --- /dev/null +++ b/app/src/main/java/com/gank/gankly/mvp/SubscribePresenter.java @@ -0,0 +1,23 @@ +package com.gank.gankly.mvp; + +import android.content.Context; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.BasePresenter; +import android.lectcoding.ui.base.BaseView; + +/** + * Create by LingYan on 2017-10-05 + */ + +public class SubscribePresenter extends BasePresenter { + + public SubscribePresenter(@NonNull Context context, @NonNull E view) { + super(context, view); + } + + @Override + protected void onDestroy() { + + } +} diff --git a/app/src/main/java/com/gank/gankly/mvp/base/BasePresenter.java b/app/src/main/java/com/gank/gankly/mvp/base/BasePresenter.java new file mode 100644 index 00000000..978947bc --- /dev/null +++ b/app/src/main/java/com/gank/gankly/mvp/base/BasePresenter.java @@ -0,0 +1,60 @@ +package com.gank.gankly.mvp.base; + +import android.content.Context; +import android.lectcoding.ui.base.BaseContract; +import android.lectcoding.ui.base.BaseView; + +import com.gank.gankly.R; + +import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Create by LingYan on 2016-05-12 + */ +public abstract class BasePresenter extends BaseContract.Presenter { + protected E view; + protected Context context; + protected String requestTag = UUID.randomUUID().toString(); + private AtomicBoolean isDestroy = new AtomicBoolean(false); + private String errorTip; + + public BasePresenter(Context context, E view) { + this.view = view; + this.context = context; + errorTip = context.getString(R.string.loading_error); + } + + public void destroy() { + onDestroy(); + isDestroy.set(true); + view = null; + context = null; + } + + protected void showProgress() { + showProgress(true); + } + + protected void showProgress(boolean useProgress) { + if (useProgress && view != null) { + view.showProgress(); + } + } + + protected void hideProgress() { + if (view != null) { + view.hideProgress(); + } + } + + protected boolean isViewLife() { + return view != null; + } + + protected abstract void onDestroy(); + + protected boolean isDestroy() { + return isDestroy.get(); + } +} diff --git a/app/src/main/java/com/gank/gankly/mvp/base/FetchFragment.java b/app/src/main/java/com/gank/gankly/mvp/base/FetchFragment.java deleted file mode 100644 index a414badf..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/base/FetchFragment.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gank.gankly.mvp.base; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.view.View; - -/** - * Create by LingYan on 2016-10-21 - * Email:137387869@qq.com - */ - -public abstract class FetchFragment extends ThemeFragment { - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - initPresenter(); - super.onViewCreated(view, savedInstanceState); - } - - protected abstract void initPresenter(); -} diff --git a/app/src/main/java/com/gank/gankly/mvp/base/LoadMorePresenter.java b/app/src/main/java/com/gank/gankly/mvp/base/LoadMorePresenter.java new file mode 100644 index 00000000..f7cc6ed9 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/mvp/base/LoadMorePresenter.java @@ -0,0 +1,16 @@ +package com.gank.gankly.mvp.base; + +import android.content.Context; +import android.lectcoding.ui.base.BaseView; +import androidx.annotation.NonNull; + +/** + * Create by LingYan on 2017-10-12 + */ + +public abstract class LoadMorePresenter extends BasePresenter { + + public LoadMorePresenter(@NonNull Context context, E view) { + super(context, view); + } +} diff --git a/app/src/main/java/com/gank/gankly/mvp/base/PageView.java b/app/src/main/java/com/gank/gankly/mvp/base/PageView.java new file mode 100644 index 00000000..52f85e3d --- /dev/null +++ b/app/src/main/java/com/gank/gankly/mvp/base/PageView.java @@ -0,0 +1,17 @@ +package com.gank.gankly.mvp.base; + +import java.util.List; + +/** + * Create by LingYan on 2016-10-20 + */ + +public interface PageView extends SupportView { + void refreshSuccess(List list); + + void refreshFailure(String msg); + + void appendSuccess(List list); + + void appendFailure(String msg); +} diff --git a/app/src/main/java/com/gank/gankly/mvp/base/SupportView.java b/app/src/main/java/com/gank/gankly/mvp/base/SupportView.java new file mode 100644 index 00000000..fc7e34af --- /dev/null +++ b/app/src/main/java/com/gank/gankly/mvp/base/SupportView.java @@ -0,0 +1,19 @@ +package com.gank.gankly.mvp.base; + +import android.lectcoding.ui.base.BaseView; + +/** + * Create by LingYan on 2016-10-20 + */ + +public interface SupportView extends BaseView { + void hasNoMoreDate(); + + void showContent(); + + void showEmpty(); + + void showDisNetWork(); + + void showError(); +} diff --git a/app/src/main/java/com/gank/gankly/mvp/base/ThemeFragment.java b/app/src/main/java/com/gank/gankly/mvp/base/ThemeFragment.java deleted file mode 100644 index b4ef7557..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/base/ThemeFragment.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.gank.gankly.mvp.base; - -import android.content.res.TypedArray; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.widget.SwipeRefreshLayout; -import android.view.View; - -import com.gank.gankly.R; -import com.gank.gankly.ui.base.BaseFragment; -import com.gank.gankly.utils.ListUtils; -import com.gank.gankly.utils.StyleUtils; -import com.gank.gankly.widget.LYRelativeLayoutRipple; - -import java.util.List; - -import butterknife.ButterKnife; - -/** - * Create by LingYan on 2016-10-21 - * Email:137387869@qq.com - */ - -public abstract class ThemeFragment extends BaseFragment { - private SwipeRefreshLayout mSwipeRefreshLayout; - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - } - - @Override - public void changeThemes() { - super.changeThemes(); - if (mSwipeRefreshLayout != null) { - StyleUtils.changeSwipeRefreshLayout(mSwipeRefreshLayout); - } - } - - public void setSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayout) { - this.mSwipeRefreshLayout = swipeRefreshLayout; - } - - public void setItemSelectBackground(@NonNull List list) { - if (!ListUtils.isListEmpty(list)) { - int[] attrs = new int[]{R.attr.selectableItemBackground}; - TypedArray typedArray = getActivity().obtainStyledAttributes(attrs); - final int backgroundResource = typedArray.getResourceId(0, 0); - - ButterKnife.apply(list, new ButterKnife.Action() { - @Override - public void apply(@NonNull View view, int index) { - view.setBackgroundResource(backgroundResource); - } - }); - } - } - - public void setItemBackground(@NonNull List list) { - if (!ListUtils.isListEmpty(list)) { - final int backgroundResource = R.attr.lyItemSelectBackground; - ButterKnife.apply(list, new ButterKnife.Action() { - @Override - public void apply(@NonNull LYRelativeLayoutRipple view, int index) { - view.setCustomBackgroundResource(backgroundResource); - } - }); - } - } -} diff --git a/app/src/main/java/com/gank/gankly/mvp/observer/BaseObserver.java b/app/src/main/java/com/gank/gankly/mvp/observer/BaseObserver.java new file mode 100644 index 00000000..507ffdbc --- /dev/null +++ b/app/src/main/java/com/gank/gankly/mvp/observer/BaseObserver.java @@ -0,0 +1,31 @@ +package com.gank.gankly.mvp.observer; + +import android.lectcoding.ui.logcat.Logcat; + +import com.leftcoding.rxbus.RxApiManager; + +import io.reactivex.Observer; +import io.reactivex.annotations.NonNull; +import io.reactivex.disposables.Disposable; + +/** + * Create by LingYan on 2017-10-15 + */ + +public abstract class BaseObserver implements Observer { + private String observerTag; + + BaseObserver(String requestTag) { + this.observerTag = requestTag; + } + + @Override + public void onSubscribe(@NonNull Disposable d) { + RxApiManager.get().add(observerTag, d); + } + + @Override + public void onError(Throwable e) { + Logcat.e(e); + } +} diff --git a/app/src/main/java/com/gank/gankly/mvp/observer/RefreshOnObserver.java b/app/src/main/java/com/gank/gankly/mvp/observer/RefreshOnObserver.java new file mode 100644 index 00000000..f1d96aab --- /dev/null +++ b/app/src/main/java/com/gank/gankly/mvp/observer/RefreshOnObserver.java @@ -0,0 +1,33 @@ +package com.gank.gankly.mvp.observer; + +import android.ly.business.domain.BaseEntity; + +/** + * Create by LingYan on 2017-11-19 + */ + +public abstract class RefreshOnObserver extends BaseObserver { + + public RefreshOnObserver(String requestTag) { + super(requestTag); + } + + protected abstract void onSuccess(T t); + + protected abstract void onFailure(); + + @Override + public void onNext(T t) { + onSuccess(t); + } + + @Override + public void onError(Throwable e) { + onFailure(); + } + + @Override + public void onComplete() { + // nothing + } +} diff --git a/app/src/main/java/com/gank/gankly/mvp/source/BaseDataSourceModel.java b/app/src/main/java/com/gank/gankly/mvp/source/BaseDataSourceModel.java deleted file mode 100644 index 990b05fb..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/source/BaseDataSourceModel.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.gank.gankly.mvp.source; - -import com.gank.gankly.utils.CrashUtils; -import com.socks.library.KLog; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; - -import java.io.IOException; -import java.util.Map; - -import io.reactivex.Flowable; -import io.reactivex.Observable; -import io.reactivex.ObservableEmitter; -import io.reactivex.ObservableOnSubscribe; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; - -/** - * Create by LingYan on 2016-10-26 - * Email:137387869@qq.com - */ - -public class BaseDataSourceModel { - protected static final int TIME_OUT = 50 * 1000; - protected static final String USERAGENT = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36"; - protected static final String DESKTOP_USERAGENT = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; Desktop) AppleWebKit/534.13 (KHTML, like Gecko) UCBrowser/8.9.0.25"; - - protected Observable toObservable(Observable o) { - return o.retry(3) - .subscribeOn(Schedulers.io()) - .unsubscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); - } - - public Observable jsoupUrlData(final String url) { - return Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter subscriber) throws Exception { - Document doc ; - try { - doc = Jsoup.connect(url) - .userAgent(USERAGENT) - .timeout(TIME_OUT) - .get(); - subscriber.onNext(doc); - } catch (IOException e) { - KLog.e(e); - CrashUtils.crashReport(e); - subscriber.onError(new Throwable("error")); - } - subscriber.onComplete(); - } - }); - } - - public Observable jsoupUrlData(final String url, final Map strings) { - return Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter subscriber) throws Exception { - Document doc; - try { - doc = Jsoup.connect(url) - .userAgent(USERAGENT) - .timeout(TIME_OUT) - .data(strings) - .get(); - if (doc != null) { - subscriber.onNext(doc); - } else { - subscriber.onError(new Throwable("service error")); - } - } catch (IOException e) { - KLog.e(e); - CrashUtils.crashReport(e); - subscriber.onError(e); - } - subscriber.onComplete(); - } - }); - } - - protected Flowable toObservable(Flowable o) { - return o.retry(3) - .subscribeOn(Schedulers.io()) - .unsubscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); - } -} diff --git a/app/src/main/java/com/gank/gankly/mvp/source/LocalDataSource.java b/app/src/main/java/com/gank/gankly/mvp/source/LocalDataSource.java index cd7c3181..a447b39a 100644 --- a/app/src/main/java/com/gank/gankly/mvp/source/LocalDataSource.java +++ b/app/src/main/java/com/gank/gankly/mvp/source/LocalDataSource.java @@ -1,8 +1,7 @@ package com.gank.gankly.mvp.source; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; -import com.gank.gankly.App; import com.gank.gankly.data.entity.ReadHistory; import com.gank.gankly.data.entity.ReadHistoryDao; import com.gank.gankly.data.entity.UrlCollect; @@ -22,7 +21,6 @@ /** * 本地数据库 * Create by LingYan on 2016-10-24 - * Email:137387869@qq.com */ public class LocalDataSource extends BaseModel { @@ -46,8 +44,8 @@ public static LocalDataSource getInstance() { } private LocalDataSource() { - mUrlCollectDao = App.getDaoSession().getUrlCollectDao(); - mReadHistoryDao = App.getDaoSession().getReadHistoryDao(); +// mUrlCollectDao = AppConfig.getDaoSession().getUrlCollectDao(); +// mReadHistoryDao = AppConfig.getDaoSession().getReadHistoryDao(); } public Observable> getCollect(final int offset, final int limit) { @@ -118,7 +116,7 @@ public void subscribe(ObservableEmitter subscriber) throws Exception { String url = history.getUrl(); QueryBuilder query = mReadHistoryDao.queryBuilder(); List list = query.where(ReadHistoryDao.Properties.Url.eq(url)).list(); - boolean isNull = ListUtils.getListSize(list) <= 0; + boolean isNull = ListUtils.getSize(list) <= 0; long rasId = 0; if (isNull) { rasId = mReadHistoryDao.insert(history); diff --git a/app/src/main/java/com/gank/gankly/mvp/source/remote/BuDeJieDataSource.java b/app/src/main/java/com/gank/gankly/mvp/source/remote/BuDeJieDataSource.java index 0ebde989..fd3545c4 100644 --- a/app/src/main/java/com/gank/gankly/mvp/source/remote/BuDeJieDataSource.java +++ b/app/src/main/java/com/gank/gankly/mvp/source/remote/BuDeJieDataSource.java @@ -2,7 +2,6 @@ import com.gank.gankly.bean.BuDeJieBean; import com.gank.gankly.bean.BuDeJieVideo; -import com.gank.gankly.mvp.source.BaseDataSourceModel; import com.gank.gankly.network.api.ApiManager; import com.gank.gankly.network.service.BaiSiService; @@ -10,10 +9,9 @@ /** * Create by LingYan on 2016-11-30 - * Email:137387869@qq.com */ -public class BuDeJieDataSource extends BaseDataSourceModel { +public class BuDeJieDataSource { private static final String BASE_URL = "http://s.budejie.com/"; private volatile static BuDeJieDataSource INSTANCE = null; @@ -35,10 +33,10 @@ public static BuDeJieDataSource getInstance() { } public Observable fetchImage(int np) { - return toObservable(mGankService.fetchImage(np, "xiaomi", "6.6.1", "", "6.0.1", "baisibudejie", "android", "866333021430895", "02:00:00:00:00:00", "MI 4LTE", "移动", "1080", "1920", "CN")); + return mGankService.fetchImage(np, "xiaomi", "6.6.1", "", "6.0.1", "baisibudejie", "android", "866333021430895", "02:00:00:00:00:00", "MI 4LTE", "移动", "1080", "1920", "CN"); } public Observable fetchVideo(int np) { - return toObservable(mGankService.fetchVideo(np)); + return mGankService.fetchVideo(np); } } diff --git a/app/src/main/java/com/gank/gankly/mvp/source/remote/GankDataSource.java b/app/src/main/java/com/gank/gankly/mvp/source/remote/GankDataSource.java index 07890c1e..42e300e0 100644 --- a/app/src/main/java/com/gank/gankly/mvp/source/remote/GankDataSource.java +++ b/app/src/main/java/com/gank/gankly/mvp/source/remote/GankDataSource.java @@ -2,7 +2,6 @@ import com.gank.gankly.bean.GankResult; import com.gank.gankly.config.MeiziArrayList; -import com.gank.gankly.mvp.source.BaseDataSourceModel; import com.gank.gankly.network.api.ApiManager; import com.gank.gankly.network.service.GankService; @@ -11,10 +10,9 @@ /** * 干货远程请求 * Create by LingYan on 2016-10-25 - * Email:137387869@qq.com */ -public class GankDataSource extends BaseDataSourceModel { +public class GankDataSource { private static final String BASE_URL = "http://gank.io/api/data/"; private GankService mGankService; @@ -46,33 +44,33 @@ public Observable fetchAndroidAndImages(final int page, final int li final Observable androidGoods = mGankService.fetchAndroid(limit, page); final Observable images = mGankService.fetchImages(limit, page); - return toObservable(Observable.zip(androidGoods, images, (androidGoods1, images1) -> { + return Observable.zip(androidGoods, images, (androidGoods1, images1) -> { MeiziArrayList.getInstance().refillOneItems(images1.getResults()); return androidGoods1; - })); + }); } public Observable fetchAndroid(final int page, final int limit) { - return toObservable(mGankService.fetchAndroid(limit, page)); + return mGankService.fetchAndroid(limit, page); } public Observable fetchIos(final int page, final int limit) { - return toObservable(mGankService.fetchIosGoods(limit, page)); + return mGankService.fetchIosGoods(limit, page); } /** * 干货图片 */ public Observable fetchWelfare(final int page, final int limit) { - return toObservable(mGankService.fetchImages(limit, page)); + return mGankService.fetchImages(limit, page); } /** * 视频 */ public Observable fetchVideo(final int page, final int limit) { - return toObservable(mGankService.fetchVideo(limit, page)); + return mGankService.fetchVideo(limit, page); } /** @@ -82,9 +80,9 @@ public Observable fetchVideoAndImages(final int page, final int limi final Observable androidGoods = mGankService.fetchVideo(limit, page); final Observable images = mGankService.fetchImages(limit, page); - return toObservable(Observable.zip(androidGoods, images, (androidGoods1, images1) -> { + return Observable.zip(androidGoods, images, (androidGoods1, images1) -> { MeiziArrayList.getInstance().refillOneItems(images1.getResults()); return androidGoods1; - })); + }); } } diff --git a/app/src/main/java/com/gank/gankly/mvp/source/remote/JiandanDataSource.java b/app/src/main/java/com/gank/gankly/mvp/source/remote/JiandanDataSource.java deleted file mode 100644 index 8ee8d9c4..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/source/remote/JiandanDataSource.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.gank.gankly.mvp.source.remote; - -import com.gank.gankly.mvp.source.BaseDataSourceModel; -import com.gank.gankly.utils.CrashUtils; -import com.socks.library.KLog; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; - -import java.io.IOException; - -import io.reactivex.Observable; -import io.reactivex.ObservableEmitter; -import io.reactivex.ObservableOnSubscribe; - -/** - * Create by LingYan on 2016-11-21 - * Email:137387869@qq.com - */ - -public class JiandanDataSource extends BaseDataSourceModel { - - private volatile static JiandanDataSource mInstance = null; - - public static JiandanDataSource getInstance() { - if (mInstance == null) { - synchronized (JiandanDataSource.class) { - if (mInstance == null) { - mInstance = new JiandanDataSource(); - } - } - } - return mInstance; - } - - /** - * 获取煎蛋数据网址 - * - * @param url 请求地址 - * @return - */ - public Observable jsoupUrlData(final String url) { - return Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter subscriber) throws Exception { - Document doc = null; - try { - doc = Jsoup.connect(url) - .userAgent(USERAGENT) - .timeout(TIME_OUT) - .get(); - } catch (IOException e) { - KLog.e(e); - CrashUtils.crashReport(e); - } - subscriber.onNext(doc); - subscriber.onComplete(); - } - }); - } -} diff --git a/app/src/main/java/com/gank/gankly/mvp/source/remote/MeiZiTuDataSource.java b/app/src/main/java/com/gank/gankly/mvp/source/remote/MeiZiTuDataSource.java index 1ad67f25..f68cb430 100644 --- a/app/src/main/java/com/gank/gankly/mvp/source/remote/MeiZiTuDataSource.java +++ b/app/src/main/java/com/gank/gankly/mvp/source/remote/MeiZiTuDataSource.java @@ -1,25 +1,12 @@ package com.gank.gankly.mvp.source.remote; -import android.support.annotation.Nullable; - -import com.gank.gankly.mvp.source.BaseDataSourceModel; -import com.gank.gankly.utils.CrashUtils; -import com.socks.library.KLog; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; - -import java.io.IOException; - -import io.reactivex.Observable; -import io.reactivex.ObservableOnSubscribe; +import androidx.annotation.Nullable; /** * Create by LingYan on 2016-10-26 - * Email:137387869@qq.com */ -public class MeiZiTuDataSource extends BaseDataSourceModel { +public class MeiZiTuDataSource { @Nullable private static MeiZiTuDataSource mInstance = null; @@ -33,24 +20,5 @@ public static MeiZiTuDataSource getInstance() { } return mInstance; } - - /** - * meizitu 清纯照片 - */ - public Observable fetchQingChun(final String url) { - return toObservable(Observable.create((ObservableOnSubscribe) subscriber -> { - try { - Document doc = Jsoup.connect(url) - .userAgent(DESKTOP_USERAGENT) - .timeout(TIME_OUT) - .get(); - subscriber.onNext(doc); - } catch (IOException e) { - KLog.e(e); - CrashUtils.crashReport(e); - } - subscriber.onComplete(); - })); - } } diff --git a/app/src/main/java/com/gank/gankly/mvp/source/remote/MeiziDataSource.java b/app/src/main/java/com/gank/gankly/mvp/source/remote/MeiziDataSource.java deleted file mode 100644 index 561bb165..00000000 --- a/app/src/main/java/com/gank/gankly/mvp/source/remote/MeiziDataSource.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.gank.gankly.mvp.source.remote; - -import com.gank.gankly.mvp.source.BaseDataSourceModel; -import com.gank.gankly.utils.CrashUtils; -import com.socks.library.KLog; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; - -import java.io.IOException; - -import io.reactivex.Observable; -import io.reactivex.ObservableOnSubscribe; - -/** - * Create by LingYan on 2016-10-26 - * Email:137387869@qq.com - */ - -public class MeiziDataSource extends BaseDataSourceModel { - private volatile static MeiziDataSource mInstance; - - public static MeiziDataSource getInstance() { - if (mInstance == null) { - synchronized (MeiziDataSource.class) { - if (mInstance == null) { - mInstance = new MeiziDataSource(); - } - } - } - return mInstance; - } - - /** - * 清纯妹子页面数据 - */ - public Observable fetchPure(final String url) { - return toObservable(Observable.create((ObservableOnSubscribe) subscriber -> { - try { - Document doc = Jsoup.connect(url) - .userAgent(DESKTOP_USERAGENT) - .timeout(TIME_OUT) - .get(); - subscriber.onNext(doc); - } catch (IOException e) { - KLog.e(e); - CrashUtils.crashReport(e); - } - subscriber.onComplete(); - })); - } - - /** - * 获取每日更新妹子天数 - */ - public Observable fetchDaily(final String url) { - return toObservable(Observable.create((ObservableOnSubscribe) subscriber -> { - try { - Document doc = Jsoup.connect(url) - .ignoreContentType(true) - .userAgent(USERAGENT) - .timeout(TIME_OUT) - .get(); - subscriber.onNext(doc); - } catch (IOException e) { - KLog.e(e); - CrashUtils.crashReport(e); - } - subscriber.onComplete(); - })); - } - - /** - * 获取每日更新妹子当天所有图片 - * - * @param url 每日更新页面的连接 - */ - public Observable fetchDailyDays(final String url) { - return toObservable(Observable.create((ObservableOnSubscribe) subscriber -> { - try { - Document doc = Jsoup.connect(url) - .userAgent(USERAGENT) - .timeout(TIME_OUT) - .get(); - subscriber.onNext(doc); - } catch (IOException e) { - KLog.e(e); - CrashUtils.crashReport(e); - } - subscriber.onComplete(); - })); - } - - public Observable fetchDailyDetailUrls(final String imageUrl) { - return toObservable(Observable.create((ObservableOnSubscribe) subscribe -> { - Document doc = null; - try { - doc = Jsoup.connect(imageUrl) - .userAgent(USERAGENT) - .timeout(TIME_OUT) - .get(); - } catch (IOException e) { - KLog.e(e); - CrashUtils.crashReport(e); - } - subscribe.onNext(doc); - subscribe.onComplete(); - })); - } -} - diff --git a/app/src/main/java/com/gank/gankly/mvp/source/remote/TeamBlogDataSource.java b/app/src/main/java/com/gank/gankly/mvp/source/remote/TeamBlogDataSource.java index db37a83b..988cf311 100644 --- a/app/src/main/java/com/gank/gankly/mvp/source/remote/TeamBlogDataSource.java +++ b/app/src/main/java/com/gank/gankly/mvp/source/remote/TeamBlogDataSource.java @@ -1,17 +1,10 @@ package com.gank.gankly.mvp.source.remote; -import com.gank.gankly.mvp.source.BaseDataSourceModel; - -import org.jsoup.nodes.Document; - -import io.reactivex.Observable; - /** * Create by LingYan on 2016-11-23 - * Email:1373878q.com */ -public class TeamBlogDataSource extends BaseDataSourceModel { +public class TeamBlogDataSource { private static final String BASE_URL = "http://gank.io/xiandu/teamblog/page/"; private volatile static TeamBlogDataSource mInstance; @@ -27,8 +20,4 @@ public static TeamBlogDataSource getInstance() { return mInstance; } - public Observable fetchData(int page) { - String url = BASE_URL + page; - return toObservable(jsoupUrlData(url)); - } } diff --git a/app/src/main/java/com/gank/gankly/mvp/source/remote/TechnologyDataSource.java b/app/src/main/java/com/gank/gankly/mvp/source/remote/TechnologyDataSource.java index 69ab0170..3e39af9d 100644 --- a/app/src/main/java/com/gank/gankly/mvp/source/remote/TechnologyDataSource.java +++ b/app/src/main/java/com/gank/gankly/mvp/source/remote/TechnologyDataSource.java @@ -1,17 +1,10 @@ package com.gank.gankly.mvp.source.remote; -import com.gank.gankly.mvp.source.BaseDataSourceModel; - -import org.jsoup.nodes.Document; - -import io.reactivex.Observable; - /** * Create by LingYan on 2016-11-23 - * Email:1373878q.com */ -public class TechnologyDataSource extends BaseDataSourceModel { +public class TechnologyDataSource { private static final String BASE_URL = "http://gank.io/xiandu/wow/page/"; private volatile static TechnologyDataSource mInstance; @@ -26,9 +19,4 @@ public static TechnologyDataSource getInstance() { } return mInstance; } - - public Observable fetchData(int page) { - String url = BASE_URL + page; - return toObservable(jsoupUrlData(url)); - } } diff --git a/app/src/main/java/com/gank/gankly/mvp/subseribe/PageSubscribe.java b/app/src/main/java/com/gank/gankly/mvp/subseribe/PageSubscribe.java new file mode 100644 index 00000000..a56dc487 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/mvp/subseribe/PageSubscribe.java @@ -0,0 +1,26 @@ +package com.gank.gankly.mvp.subseribe; + +import android.ly.business.domain.Gank; +import android.ly.business.domain.PageEntity; + +import com.gank.gankly.mvp.observer.RefreshOnObserver; + +/** + * Create by LingYan on 2018-03-22 + */ + +public class PageSubscribe extends RefreshOnObserver> { + public PageSubscribe(String requestTag) { + super(requestTag); + } + + @Override + protected void onSuccess(PageEntity gankPageEntity) { + + } + + @Override + protected void onFailure() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/network/LoggingInterceptor.java b/app/src/main/java/com/gank/gankly/network/LoggingInterceptor.java deleted file mode 100644 index 67028910..00000000 --- a/app/src/main/java/com/gank/gankly/network/LoggingInterceptor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gank.gankly.network; - -import com.socks.library.KLog; - -import java.io.IOException; - -import okhttp3.Interceptor; -import okhttp3.Request; -import okhttp3.Response; - -/** - * 打印Retrofit 请求日志 - * Create by LingYan on 2016年4月13日 - */ -public class LoggingInterceptor implements Interceptor { - @Override - public Response intercept(Chain chain) throws IOException { - Request request = chain.request(); - - long t1 = System.nanoTime(); - KLog.d("OkHttp", String.format("Sending request %s on %s%n%s", - request.url(), chain.connection(), request.headers())); - - Response response = chain.proceed(request); - - long t2 = System.nanoTime(); - KLog.d("OkHttp", String.format("Received response for %s in %.1fms%n%s", - response.request().url(), (t2 - t1) / 1e6d, response.headers())); - return response; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/network/api/ApiManager.java b/app/src/main/java/com/gank/gankly/network/api/ApiManager.java index 7f69aed9..a9717f64 100644 --- a/app/src/main/java/com/gank/gankly/network/api/ApiManager.java +++ b/app/src/main/java/com/gank/gankly/network/api/ApiManager.java @@ -1,19 +1,22 @@ package com.gank.gankly.network.api; +import androidx.annotation.NonNull; + import com.facebook.stetho.okhttp3.StethoInterceptor; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.socks.library.KLog; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Create by LingYan on 2016-12-20 - * Email:137387869@qq.com */ public class ApiManager { @@ -35,6 +38,16 @@ private ApiManager(String url) { OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(DEFAULT_OUT_TIME, TimeUnit.SECONDS); //手动创建一个OkHttpClient并设置超时时间 builder.addNetworkInterceptor(new StethoInterceptor()); //chrome test databases + HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { + @Override + public void log(@NonNull String message) { + KLog.d(message); + } + }); +// logging.setLevel(HttpLoggingInterceptor.Level.BASIC); + logging.setLevel(HttpLoggingInterceptor.Level.BODY); + + builder.addInterceptor(logging); // builder.interceptors().add(new LoggingInterceptor()); //打印请求log // builder.addInterceptor(new Interceptor() { // @Override diff --git a/app/src/main/java/com/gank/gankly/network/api/DownloadApi.java b/app/src/main/java/com/gank/gankly/network/api/DownloadApi.java index 8d3c2e07..d93f5dbb 100644 --- a/app/src/main/java/com/gank/gankly/network/api/DownloadApi.java +++ b/app/src/main/java/com/gank/gankly/network/api/DownloadApi.java @@ -23,7 +23,6 @@ /** * Create by LingYan on 2016-05-30 - * Email:137387869@qq.com */ public class DownloadApi { private static final int DEFAULT_OUT_TIME = 30; diff --git a/app/src/main/java/com/gank/gankly/network/service/BaiSiService.java b/app/src/main/java/com/gank/gankly/network/service/BaiSiService.java index 943b0b40..8afebcef 100644 --- a/app/src/main/java/com/gank/gankly/network/service/BaiSiService.java +++ b/app/src/main/java/com/gank/gankly/network/service/BaiSiService.java @@ -10,7 +10,6 @@ /** * Create by LingYan on 2016-11-30 - * Email:137387869@qq.com */ public interface BaiSiService { diff --git a/app/src/main/java/com/gank/gankly/presenter/BasePresenter.java b/app/src/main/java/com/gank/gankly/presenter/BasePresenter.java deleted file mode 100644 index 98c44686..00000000 --- a/app/src/main/java/com/gank/gankly/presenter/BasePresenter.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gank.gankly.presenter; - -import android.app.Activity; -import android.content.Context; - -/** - * Create by LingYan on 2016-05-12 - */ -public abstract class BasePresenter { - protected E mIView; - protected Context mActivity; - - public BasePresenter(Activity mActivity, E view) { - this.mIView = view; - this.mActivity = mActivity; - } - - public Context getActivity() { - return mActivity; - } -} diff --git a/app/src/main/java/com/gank/gankly/rxjava/RxBus_.java b/app/src/main/java/com/gank/gankly/rxjava/RxBus_.java index 9720b918..a0038547 100644 --- a/app/src/main/java/com/gank/gankly/rxjava/RxBus_.java +++ b/app/src/main/java/com/gank/gankly/rxjava/RxBus_.java @@ -12,7 +12,6 @@ /** * Create by LingYan on 2016-12-15 - * Email:137387869@qq.com */ public class RxBus_ { diff --git a/app/src/main/java/com/gank/gankly/rxjava/rxclick/Rxbunding.java b/app/src/main/java/com/gank/gankly/rxjava/rxclick/Rxbunding.java index 4d9d424e..87360280 100644 --- a/app/src/main/java/com/gank/gankly/rxjava/rxclick/Rxbunding.java +++ b/app/src/main/java/com/gank/gankly/rxjava/rxclick/Rxbunding.java @@ -1,13 +1,12 @@ package com.gank.gankly.rxjava.rxclick; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.view.View; import io.reactivex.Observable; /** * Created by Lingyan on 2017/4/1 0001. - * Email:137387869@qq.com */ public class Rxbunding { diff --git a/app/src/main/java/com/gank/gankly/rxjava/rxclick/ViewClickSubscribe.java b/app/src/main/java/com/gank/gankly/rxjava/rxclick/ViewClickSubscribe.java index 1e569c42..441654e2 100644 --- a/app/src/main/java/com/gank/gankly/rxjava/rxclick/ViewClickSubscribe.java +++ b/app/src/main/java/com/gank/gankly/rxjava/rxclick/ViewClickSubscribe.java @@ -8,7 +8,6 @@ /** * Created by Lingyan on 2017/4/1 0001. - * Email:137387869@qq.com */ public final class ViewClickSubscribe implements ObservableOnSubscribe { diff --git a/app/src/main/java/com/gank/gankly/rxjava/theme/ThemeEvent.java b/app/src/main/java/com/gank/gankly/rxjava/theme/ThemeEvent.java index d666a20e..583908f1 100644 --- a/app/src/main/java/com/gank/gankly/rxjava/theme/ThemeEvent.java +++ b/app/src/main/java/com/gank/gankly/rxjava/theme/ThemeEvent.java @@ -2,7 +2,6 @@ /** * Create by LingYan on 2016-09-02 - * Email:137387869@qq.com */ public class ThemeEvent { private boolean isRefreshUi; diff --git a/app/src/main/java/com/gank/gankly/ui/main/MainActivity.java b/app/src/main/java/com/gank/gankly/ui/MainActivity.java similarity index 85% rename from app/src/main/java/com/gank/gankly/ui/main/MainActivity.java rename to app/src/main/java/com/gank/gankly/ui/MainActivity.java index 18d83603..9f9d21f4 100644 --- a/app/src/main/java/com/gank/gankly/ui/main/MainActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/MainActivity.java @@ -1,19 +1,20 @@ -package com.gank.gankly.ui.main; +package com.gank.gankly.ui; import android.content.res.Resources; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.util.TypedValue; import android.view.KeyEvent; import com.gank.gankly.R; import com.gank.gankly.rxjava.RxBus_; import com.gank.gankly.rxjava.theme.ThemeEvent; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.BaseActivity; import com.gank.gankly.ui.discovered.DiscoveredFragment; import com.gank.gankly.ui.girls.GirlsFragment; +import com.gank.gankly.ui.main.IndexFragment; import com.gank.gankly.ui.mine.MineFragment; import com.gank.gankly.utils.AppUtils; import com.gank.gankly.utils.ToastUtils; @@ -28,9 +29,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers; /** - * 首页 * Create by LingYan on 2016-6-13 - * Email:137387869@qq.com */ public class MainActivity extends BaseActivity { @BindView(R.id.bottomBar) @@ -49,8 +48,15 @@ protected int getContentId() { return R.layout.fragment_main_bottom_navigation; } + @Override - protected void initViews() { + protected void onCreate(@Nullable Bundle savedInstanceState) { + if (savedInstanceState != null) { + isRestore = savedInstanceState.getBoolean("isRestore"); + mIndex = savedInstanceState.getInt("index"); + } + super.onCreate(savedInstanceState); + PermissionUtils.requestAllPermissions(this); if (mFragmentList == null) { @@ -62,21 +68,18 @@ protected void initViews() { RxBus_.getInstance().toObservable(ThemeEvent.class) .subscribe(themeEvent -> changeBottomBar()); - } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - } - - @Override - protected void bindListener() { mBottomBar.setOnTabSelectListener(tabId -> { mIndex = getFragmentIndex(tabId); openFragment(mIndex); }); } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + private int getFragmentIndex(int tabId) { int index; switch (tabId) { @@ -114,25 +117,15 @@ private void openFragment(int index) { } } - @Override - protected void initValues() { - } - - @Override - protected void initPresenter() { - super.initPresenter(); - } - private List getFragmentList() { List fragments = new ArrayList<>(); - fragments.add(new MainFragment()); + fragments.add(new IndexFragment()); fragments.add(new DiscoveredFragment()); fragments.add(new GirlsFragment()); fragments.add(new MineFragment()); return fragments; } - public void changeBottomBar() { TypedValue typedValue = new TypedValue(); Resources.Theme theme = getTheme(); @@ -153,7 +146,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { return false; } else if ((System.currentTimeMillis() - mKeyDownTime) > 2000) { mKeyDownTime = System.currentTimeMillis(); - ToastUtils.shortBottom(R.string.app_again_out); + ToastUtils.shortBottom(getBaseContext(), R.string.app_again_out); return false; } else { finish(); @@ -169,22 +162,6 @@ protected void onDestroy() { RxBus_.getInstance().removeAllStickyEvents();// 移除所有Sticky事件 } - @Override - protected void onStart() { - //防止底部导航栏会下移 -// getWindow(). -// getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); - super.onStart(); - } - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - if (savedInstanceState != null) { - isRestore = savedInstanceState.getBoolean("isRestore"); - mIndex = savedInstanceState.getInt("index"); - } - super.onCreate(savedInstanceState); - } @Override protected void onSaveInstanceState(Bundle outState) { diff --git a/app/src/main/java/com/gank/gankly/ui/android/AndroidAdapter.java b/app/src/main/java/com/gank/gankly/ui/android/AndroidAdapter.java new file mode 100644 index 00000000..bccd1e64 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/android/AndroidAdapter.java @@ -0,0 +1,189 @@ +package com.gank.gankly.ui.android; + +import android.content.Context; +import android.lectcoding.ui.adapter.BaseAdapter; +import android.ly.business.domain.Gank; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.gank.gankly.R; +import com.gank.gankly.butterknife.BindViewHolder; +import com.gank.gankly.butterknife.ItemModel; +import com.gank.gankly.utils.DateUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import butterknife.BindView; + + +/** + * Create by LingYan on 2016-04-25 + */ +class AndroidAdapter extends BaseAdapter { + private ItemCallback itemCallback; + private Context context; + + private final List resultsBeans = new ArrayList<>(); + private final List viewItemList = new ArrayList<>(); + + AndroidAdapter(@NonNull Context context) { + this.context = context; + setHasStableIds(true); + registerAdapterDataObserver(dataObserver); + } + + private final RecyclerView.AdapterDataObserver dataObserver = new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + super.onChanged(); + viewItemList.clear(); + if (!resultsBeans.isEmpty()) { + for (Gank resultsBean : resultsBeans) { + if (resultsBean != null) { + viewItemList.add(new TextViewItem(resultsBean)); + } + } + } + } + }; + + @Override + public int getItemViewType(int position) { + if (!viewItemList.isEmpty()) { + return viewItemList.get(position).getViewType(); + } + return RecyclerView.INVALID_TYPE; + } + + @Override + public BindViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + BindViewHolder defaultHolder; + switch (viewType) { + case NormalViewHolder.LAYOUT: + defaultHolder = new NormalViewHolder(parent, itemCallback); + break; + default: + defaultHolder = null; + break; + } + return defaultHolder; + } + + @Override + public void onBindViewHolder(BindViewHolder holder, int position) { + final ItemModel viewItem = viewItemList.get(position); + switch (holder.getItemViewType()) { + case NormalViewHolder.LAYOUT: + ((NormalViewHolder) holder).bindHolder((TextViewItem) viewItem); + break; + } + } + + @Override + public void onViewRecycled(BindViewHolder holder) { + super.onViewRecycled(holder); + Glide.get(context).clearMemory(); + } + + @Override + public int getItemCount() { + return resultsBeans.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + void fillItems(List results) { + resultsBeans.clear(); + appendItems(results); + } + + public void appendItems(List results) { + resultsBeans.addAll(results); + } + + public void setOnItemClickListener(ItemCallback itemCallBack) { + this.itemCallback = itemCallBack; + } + + @Override + public void destroy() { + if (viewItemList != null) { + viewItemList.clear(); + } + + if (resultsBeans != null) { + resultsBeans.clear(); + } + + unregisterAdapterDataObserver(dataObserver); + } + + private static class TextViewItem extends ItemModel { + private Gank resultsBean; + + TextViewItem(Gank resultsBean) { + this.resultsBean = resultsBean; + } + + Gank getResultsBean() { + return resultsBean; + } + + public String getTime() { + Date date = DateUtils.formatToDate(resultsBean.publishedAt); + return DateUtils.formatString(date, DateUtils.MM_DD); + } + + @Override + public int getViewType() { + return NormalViewHolder.LAYOUT; + } + } + + static class NormalViewHolder extends BindViewHolder { + static final int LAYOUT = R.layout.adapter_android; + + @BindView(R.id.author_name) + TextView authorName; + + @BindView(R.id.time) + TextView time; + + @BindView(R.id.title) + TextView title; + + private Gank resultsBean; + + NormalViewHolder(ViewGroup parent, final ItemCallback itemCallBack) { + super(parent, R.layout.adapter_android); + itemView.setOnClickListener(v -> { + if (itemCallBack != null && resultsBean != null) { + itemCallBack.onItemClick(v, resultsBean); + } + }); + } + + @Override + public void bindHolder(TextViewItem item) { + final Gank resultsBean = item.getResultsBean(); + this.resultsBean = resultsBean; + + time.setText(item.getTime()); + title.setText(resultsBean.desc); + authorName.setText(resultsBean.who); + } + } + + public interface ItemCallback { + void onItemClick(View view, Gank gank); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/android/AndroidContract.java b/app/src/main/java/com/gank/gankly/ui/android/AndroidContract.java new file mode 100644 index 00000000..4ecd50f0 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/android/AndroidContract.java @@ -0,0 +1,26 @@ +package com.gank.gankly.ui.android; + +import android.content.Context; +import android.ly.business.domain.Gank; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.PageView; + +/** + * Create by LingYan on 2016-10-25 + */ + +public interface AndroidContract { + interface View extends PageView { + } + + abstract class Presenter extends LoadMorePresenter { + + public Presenter(@NonNull Context context, @NonNull View view) { + super(context, view); + } + + public abstract void loadAndroid(int page); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/android/AndroidFragment.java b/app/src/main/java/com/gank/gankly/ui/android/AndroidFragment.java new file mode 100644 index 00000000..5b3ce990 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/android/AndroidFragment.java @@ -0,0 +1,233 @@ +package com.gank.gankly.ui.android; + +import android.content.Context; +import android.content.Intent; +import android.ly.business.domain.Gank; +import android.ly.business.domain.PageConfig; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.snackbar.Snackbar; +import androidx.recyclerview.widget.LinearLayoutManager; +import android.view.View; + +import com.gank.gankly.R; +import com.gank.gankly.config.Constants; +import com.gank.gankly.ui.MainActivity; +import com.gank.gankly.ui.base.LazyFragment; +import com.gank.gankly.ui.web.normal.WebActivity; +import com.gank.gankly.utils.CircularAnimUtils; +import com.gank.gankly.widget.LySwipeRefreshLayout; +import com.gank.gankly.widget.MultipleStatusView; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import butterknife.BindView; + +/** + * Create by LingYan on 2016-4-26 + */ +public class AndroidFragment extends LazyFragment implements AndroidContract.View { + @BindView(R.id.multiple_status_view) + MultipleStatusView multipleStatusView; + + @BindView(R.id.swipe_refresh) + LySwipeRefreshLayout swipeRefreshLayout; + + private Context context; + private AndroidAdapter androidAdapter; + private AndroidContract.Presenter androidPresenter; + + private AtomicBoolean isFirst = new AtomicBoolean(true); + private PageConfig pageConfig; + + @Override + protected int getLayoutId() { + return R.layout.layout_swipe_normal; + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + this.context = context; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initRecycler(); + + androidAdapter.setOnItemClickListener(itemCallBack); + multipleStatusView.setListener(onMultipleClick); + } + + @Override + public void onLazyActivityCreate() { + androidPresenter = new AndroidPresenter(context, this); + loadAndroid(PageConfig.starPage()); + } + + private void initRecycler() { + androidAdapter = new AndroidAdapter(context); + swipeRefreshLayout.setAdapter(androidAdapter); + swipeRefreshLayout.setLayoutManager(new LinearLayoutManager(getContext())); + swipeRefreshLayout.setOnScrollListener(onRefreshListener); + } + + private final AndroidAdapter.ItemCallback itemCallBack = new AndroidAdapter.ItemCallback() { + @Override + public void onItemClick(View view, Gank gank) { + Bundle bundle = new Bundle(); + bundle.putString(WebActivity.TITLE, gank.desc); + bundle.putString(WebActivity.URL, gank.url); + bundle.putString(WebActivity.TYPE, Constants.ANDROID); + bundle.putString(WebActivity.AUTHOR, gank.who); + Intent intent = new Intent(context, WebActivity.class); + intent.putExtras(bundle); + CircularAnimUtils.startActivity((MainActivity) context, intent, view, R.color.white_half); + } + }; + + private final LySwipeRefreshLayout.OnSwipeRefreshListener onRefreshListener = new LySwipeRefreshLayout.OnSwipeRefreshListener() { + @Override + public void onRefresh() { + loadAndroid(PageConfig.starPage()); + } + + @Override + public void onLoadMore() { + if (pageConfig != null) { + loadAndroid(pageConfig.getNextPage()); + } + } + }; + + private final MultipleStatusView.OnMultipleClick onMultipleClick = v -> { + showLoading(); + loadAndroid(PageConfig.starPage()); + }; + + private void loadAndroid(int page) { + androidPresenter.loadAndroid(page); + } + + @Override + public void refreshSuccess(List list) { + showContent(); + + if (isFirst.compareAndSet(true, false)) { + if (list == null || list.isEmpty()) { + showEmpty(); + return; + } + } + + if (androidAdapter != null) { + androidAdapter.fillItems(list); + androidAdapter.notifyDataSetChanged(); + } + } + + @Override + public void refreshFailure(String msg) { + shortToast(msg); + } + + @Override + public void appendSuccess(List list) { + if (androidAdapter != null) { + androidAdapter.appendItems(list); + androidAdapter.notifyDataSetChanged(); + } + } + + @Override + public void appendFailure(String msg) { + shortToast(msg); + } + + @Override + public void showProgress() { + if (isFirst.get()) { + if (swipeRefreshLayout != null && !swipeRefreshLayout.isRefreshing()) { + showLoading(); + return; + } + } + + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setRefreshing(true); + } + } + + @Override + public void hideProgress() { + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setRefreshing(false); + } + } + + @Override + public void hasNoMoreDate() { + Snackbar.make(swipeRefreshLayout, R.string.loading_all_over, Snackbar.LENGTH_SHORT).show(); + } + + @Override + public void showContent() { + if (multipleStatusView != null) { + multipleStatusView.showContent(); + } + } + + @Override + public void showEmpty() { + if (multipleStatusView != null) { + multipleStatusView.showEmpty(); + } + } + + @Override + public void showDisNetWork() { + if (multipleStatusView != null) { + multipleStatusView.showDisNetwork(); + } + } + + @Override + public void showError() { + if (multipleStatusView != null) { + multipleStatusView.showError(); + } + } + + private void showLoading() { + if (multipleStatusView != null) { + multipleStatusView.showLoading(); + } + } + + public static AndroidFragment newInstance() { + AndroidFragment fragment = new AndroidFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (androidAdapter != null) { + androidAdapter.destroy(); + } + + if (androidPresenter != null) { + androidPresenter.destroy(); + } + } + + @Override + public void shortToast(String string) { + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/android/AndroidPresenter.java b/app/src/main/java/com/gank/gankly/ui/android/AndroidPresenter.java new file mode 100644 index 00000000..8f46d3e5 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/android/AndroidPresenter.java @@ -0,0 +1,77 @@ +package com.gank.gankly.ui.android; + +import android.content.Context; +import android.ly.business.api.GankServer; +import android.ly.business.domain.Gank; +import android.ly.business.domain.PageEntity; + +import com.gank.gankly.mvp.observer.RefreshOnObserver; +import com.gank.gankly.ui.android.AndroidContract.Presenter; +import com.leftcoding.rxbus.RxApiManager; + +/** + * Create by LingYan on 2016-10-25 + */ +class AndroidPresenter extends Presenter { + // 请求个数 + private static final int INIT_LIMIT = 20; + + AndroidPresenter(Context context, AndroidContract.View view) { + super(context, view); + } + + @Override + public void loadAndroid(int page) { + if (isDestroy()) { + return; + } + + GankServer.with(context) + .androids(page, INIT_LIMIT) + .doOnSubscribe(disposable -> { + if (isViewLife()) { + view.showProgress(); + } + }) + .doFinally(() -> { + if (isViewLife()) { + view.hideProgress(); + } + }) + .subscribe(new RefreshOnObserver>(requestTag) { + @Override + protected void onSuccess(PageEntity entity) { + if (isViewLife()) { + if (entity != null) { + view.refreshSuccess(entity.results); + return; + } + view.refreshFailure(""); + } + } + + @Override + protected void onFailure() { + if (isViewLife()) { + view.refreshFailure(""); + } + } + }); + } + + @Override + public void destroy() { + super.destroy(); + RxApiManager.get().clear(requestTag); + } + + @Override + protected void onDestroy() { + + } + + private void fetchAndroid() { + + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiActivity.java b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiActivity.java index c7bb3ecb..1895a57a 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiActivity.java @@ -1,12 +1,14 @@ package com.gank.gankly.ui.baisi; +import android.os.Bundle; +import androidx.annotation.Nullable; + import com.gank.gankly.R; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.BaseActivity; /** * 百思不得姐 * Create by LingYan on 2016-11-29 - * Email:137387869@qq.com */ public class BaiSiActivity extends BaseActivity { @@ -18,7 +20,8 @@ protected int getContentId() { } @Override - protected void initValues() { + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); if (mBaiSiMainFragment == null) { mBaiSiMainFragment = new BaiSiMainFragment(); getSupportFragmentManager().beginTransaction() @@ -27,16 +30,6 @@ protected void initValues() { } } - @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { - - } - @Override public void onBackPressed() { int count = getSupportFragmentManager().getBackStackEntryCount(); diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiMainFragment.java b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiMainFragment.java index 4ee910c6..e8d9be38 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiMainFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiMainFragment.java @@ -3,17 +3,18 @@ import android.content.Context; import android.content.res.Resources; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.TabLayout; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.Toolbar; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.tabs.TabLayout; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; import android.util.TypedValue; +import android.view.View; -import com.gank.gankly.App; import com.gank.gankly.R; +import com.gank.gankly.butterknife.ButterKnifeFragment; import com.gank.gankly.ui.baisi.image.BaiSiImageFragment; -import com.gank.gankly.ui.base.BaseSwipeRefreshFragment; import com.gank.gankly.ui.base.LazyFragment; import com.gank.gankly.ui.main.GankPagerAdapter; @@ -25,9 +26,8 @@ /** * 百思不得姐 * Create by LingYan on 2016-04-22 - * Email:137387869@qq.com */ -public class BaiSiMainFragment extends BaseSwipeRefreshFragment implements ViewPager.OnPageChangeListener { +public class BaiSiMainFragment extends ButterKnifeFragment implements ViewPager.OnPageChangeListener { private static final String TYPE_VIDEO = "视频"; private static final String TYPE_IMAGE = "图片"; @@ -57,27 +57,21 @@ public void onAttach(Context context) { } @Override - protected void initPresenter() { - } - - @Override - protected void initViews() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); mToolbar.setTitle(R.string.baisi_leisure_time); mActivity.setSupportActionBar(mToolbar); ActionBar bar = mActivity.getSupportActionBar(); if (bar != null) { bar.setDisplayHomeAsUpEnabled(true); } - mToolbar.setNavigationOnClickListener(view -> mActivity.finish()); - } - - @Override - protected void bindListener() { - changeThemeBackground(); - } + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mActivity.finish(); + } + }); - @Override - protected void initValues() { List mList = new ArrayList<>(); mList.add(new BaiSiVideoFragment()); mList.add(new BaiSiImageFragment()); @@ -93,6 +87,8 @@ protected void initValues() { mViewPager.addOnPageChangeListener(this); initTabLayout(); + + changeThemeBackground(); } private void initTabLayout() { @@ -102,7 +98,7 @@ private void initTabLayout() { mTabLayout.setupWithViewPager(mViewPager); mTabLayout.setTabMode(TabLayout.MODE_FIXED); - mTabLayout.setSelectedTabIndicatorColor(App.getAppColor(R.color.white)); + mTabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.white)); } /** @@ -134,9 +130,4 @@ public void onPageScrollStateChanged(int state) { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } - - @Override - protected void callBackRefreshUi() { - - } } diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoAdapter.java b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoAdapter.java index 0d252b03..a94df548 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoAdapter.java @@ -1,8 +1,8 @@ package com.gank.gankly.ui.baisi; import android.content.Context; -import android.support.v4.util.ArrayMap; -import android.support.v7.widget.RecyclerView; +import androidx.collection.ArrayMap; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoContract.java b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoContract.java index 4074f5f7..335306ff 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoContract.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoContract.java @@ -1,24 +1,23 @@ package com.gank.gankly.ui.baisi; import com.gank.gankly.bean.BuDeJieVideo; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import com.gank.gankly.mvp.ILoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2016-11-30 - * Email:137387869@qq.com */ public interface BaiSiVideoContract { - interface View extends IFetchView { + interface View extends SupportView { void refillData(List list); void appendData(List list); } - interface Presenter extends IFetchPresenter { + interface Presenter extends ILoadMorePresenter { } } diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoFragment.java b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoFragment.java index 2924baf6..2ef401a0 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoFragment.java @@ -2,7 +2,11 @@ import android.content.Context; import android.content.Intent; -import android.support.v7.widget.LinearLayoutManager; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import android.view.View; import com.gank.gankly.R; import com.gank.gankly.bean.BuDeJieVideo; @@ -20,7 +24,6 @@ /** * Create by LingYan on 2016-11-30 - * Email:137387869@qq.com */ public class BaiSiVideoFragment extends LazyFragment implements BaiSiVideoContract.View { @@ -33,38 +36,36 @@ public class BaiSiVideoFragment extends LazyFragment implements BaiSiVideoContra private BaiSiVideoContract.Presenter mPresenter; private BaiSiActivity mActivity; - @Override - public void onAttach(Context context) { - super.onAttach(context); - mActivity = (BaiSiActivity) context; - } - @Override protected int getLayoutId() { return R.layout.layout_swipe_normal; } @Override - protected void initData() { + public void onAttach(Context context) { + super.onAttach(context); + mActivity = (BaiSiActivity) context; } @Override - protected void initPresenter() { - mPresenter = new BaiSiVideoPresenter(BuDeJieDataSource.getInstance(), this); + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initViews(); } @Override - protected void callBackRefreshUi() { - + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mPresenter = new BaiSiVideoPresenter(BuDeJieDataSource.getInstance(), this); + mPresenter.fetchNew(); } @Override - protected void initValues() { - mPresenter.fetchNew(); + public void onLazyActivityCreate() { + } - @Override - protected void initViews() { + private void initViews() { mBaiSiVideoAdapter = new BaiSiVideoAdapter(mActivity); mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(getActivity())); mSwipeRefreshLayout.setAdapter(mBaiSiVideoAdapter); @@ -72,10 +73,10 @@ protected void initViews() { int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.recycler_view_space); mSwipeRefreshLayout.getRecyclerView().addItemDecoration(new SpaceItemDecoration(spacingInPixels)); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { + mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { @Override public void onLoadMore() { - showRefresh(); + showProgress(); mPresenter.fetchMore(); } @@ -100,19 +101,13 @@ private void startActivity(GallerySize gs) { mActivity.overridePendingTransition(0, 0); } - @Override - protected void bindListener() { - - } - - @Override - public void showRefresh() { + public void showProgress() { mSwipeRefreshLayout.setRefreshing(true); } @Override - public void hideRefresh() { + public void hideProgress() { mSwipeRefreshLayout.setRefreshing(false); } @@ -141,16 +136,6 @@ public void showError() { } - @Override - public void showLoading() { - - } - - @Override - public void showRefreshError(String errorStr) { - - } - @Override public void refillData(List list) { mBaiSiVideoAdapter.updateItems(list); @@ -175,4 +160,9 @@ public void onResume() { public void onDestroy() { super.onDestroy(); } + + @Override + public void shortToast(String string) { + + } } diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoPreViewActivity.java b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoPreViewActivity.java index e84a5266..9141012b 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoPreViewActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoPreViewActivity.java @@ -1,8 +1,10 @@ package com.gank.gankly.ui.baisi; import android.content.res.Configuration; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.Toolbar; +import android.os.Bundle; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -11,7 +13,7 @@ import com.gank.gankly.R; import com.gank.gankly.bean.GallerySize; import com.gank.gankly.rxjava.RxBus_; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.BaseActivity; import com.gank.gankly.utils.ShareUtils; import com.superplayer.library.SuperPlayer; @@ -20,7 +22,6 @@ /** * Create by LingYan on 2016-12-14 - * Email:137387869@qq.com */ public class BaiSiVideoPreViewActivity extends BaseActivity implements SuperPlayer.OnNetChangeListener { @@ -49,7 +50,8 @@ protected int getContentId() { } @Override - protected void initValues() { + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); mDisposable = RxBus_.getInstance() .toObservableSticky(GallerySize.class) .subscribe(gallerySize -> { @@ -62,10 +64,7 @@ protected void initValues() { mFrom = gallerySize.getFrom(); } }); - } - @Override - protected void initViews() { setSupportActionBar(mToolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -74,10 +73,7 @@ protected void initViews() { } mToolbar.setNavigationOnClickListener(v -> finish()); - } - @Override - protected void bindListener() { mSuperPlayer.setLive(false); mSuperPlayer.setOnNetChangeListener(this);//实现网络变化的回调 mSuperPlayer.play(mUrl); diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoPresenter.java b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoPresenter.java index 21969c59..6db3a5a5 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/BaiSiVideoPresenter.java @@ -1,7 +1,6 @@ package com.gank.gankly.ui.baisi; import com.gank.gankly.bean.BuDeJieVideo; -import com.gank.gankly.mvp.FetchPresenter; import com.gank.gankly.mvp.source.remote.BuDeJieDataSource; import com.gank.gankly.utils.ListUtils; import com.socks.library.KLog; @@ -13,10 +12,9 @@ /** * Create by LingYan on 2016-11-30 - * Email:137387869@qq.com */ -public class BaiSiVideoPresenter extends FetchPresenter implements BaiSiVideoContract.Presenter { +public class BaiSiVideoPresenter implements BaiSiVideoContract.Presenter { private final BuDeJieDataSource mTask; private final BaiSiVideoContract.View mView; private int mNextPage; @@ -41,14 +39,13 @@ private void fetchData(int page) { mTask.fetchVideo(page).subscribe(new Observer() { @Override public void onError(Throwable e) { - mView.hideRefresh(); + mView.hideProgress(); KLog.e(e); } @Override public void onComplete() { - mView.hideRefresh(); - setFetchPage(getFetchPage() + 1); + mView.hideProgress(); } @Override @@ -59,7 +56,7 @@ public void onSubscribe(Disposable d) { @Override public void onNext(BuDeJieVideo baiSiBean) { List list = baiSiBean.getList(); - if (!ListUtils.isListEmpty(list)) { + if (!ListUtils.isEmpty(list)) { if (mNextPage == 0) { mView.refillData(list); } else { @@ -70,14 +67,4 @@ public void onNext(BuDeJieVideo baiSiBean) { } }); } - - @Override - public void subscribe() { - - } - - @Override - public void unSubscribe() { - - } } diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiGalleryFragment.java b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiGalleryFragment.java index 58c8a897..0a360ce2 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiGalleryFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiGalleryFragment.java @@ -15,19 +15,20 @@ import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.gank.gankly.R; import com.gank.gankly.bean.GallerySize; -import com.gank.gankly.ui.base.BaseFragment; +import com.gank.gankly.ui.base.fragment.SupportFragment; import com.socks.library.KLog; import java.io.File; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import butterknife.BindView; /** * Create by LingYan on 2016-12-05 - * Email:137387869@qq.com */ -public class BaiSiGalleryFragment extends BaseFragment { +public class BaiSiGalleryFragment extends SupportFragment { private static final String IMAGE_GIF = ".gif"; public static final String URL = "BaiSi_Url"; public static final String SIZE_HEIGHT = "Height"; @@ -58,7 +59,8 @@ protected int getLayoutId() { } @Override - protected void initValues() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); sliderIv.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP); sliderIv.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER); Bundle bundle = getArguments(); @@ -71,11 +73,16 @@ protected void initValues() { loadImageBitmap(mUrl); } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + } + public void loadImageBitmap(final String url) { if (url.endsWith(IMAGE_GIF)) { sliderIv.setVisibility(View.GONE); mImageView.setVisibility(View.VISIBLE); - Glide.with(this) + Glide.with(getContext()) .asGif() .load(mUrl) // .diskCacheStrategy(DiskCacheStrategy.RESOURCE) @@ -85,7 +92,7 @@ public void loadImageBitmap(final String url) { layoutParams.width = 1080; sliderIv.setLayoutParams(layoutParams); - Glide.with(this).load(mUrl).downloadOnly(new SimpleTarget() { + Glide.with(getContext()).load(mUrl).downloadOnly(new SimpleTarget() { @Override public void onResourceReady(File resource, Transition transition) { //设置图片初始化状态 = 从顶部开始加载 @@ -101,14 +108,4 @@ public void onResourceReady(File resource, Transition transition) }); } } - - @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { - - } } diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageAdapter.java b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageAdapter.java index cc0bf648..86d6c16f 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageAdapter.java @@ -1,8 +1,8 @@ package com.gank.gankly.ui.baisi.image; import android.content.Context; -import android.support.v4.util.ArrayMap; -import android.support.v7.widget.RecyclerView; +import androidx.collection.ArrayMap; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageContract.java b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageContract.java index 0510022a..b8de73da 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageContract.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageContract.java @@ -1,27 +1,29 @@ package com.gank.gankly.ui.baisi.image; +import android.content.Context; +import androidx.annotation.NonNull; + import com.gank.gankly.bean.BuDeJieBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2016-12-05 - * Email:137387869@qq.com */ public interface BaiSiImageContract { - interface View extends IFetchView { - // void refillData(List list); -// -// void appendData(List list); + interface View extends SupportView { void refillData(List list); void appendData(List list); } - interface Presenter extends IFetchPresenter { + abstract class Presenter extends LoadMorePresenter { + public Presenter(@NonNull Context context, View view) { + super(context, view); + } } } diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageFragment.java b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageFragment.java index 8b511005..e0b210fc 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImageFragment.java @@ -1,16 +1,19 @@ package com.gank.gankly.ui.baisi.image; import android.content.Context; -import android.support.v7.widget.LinearLayoutManager; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import android.view.View; import com.gank.gankly.R; import com.gank.gankly.bean.BuDeJieBean; -import com.gank.gankly.mvp.source.remote.BuDeJieDataSource; import com.gank.gankly.ui.baisi.BaiSiActivity; import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.widget.SpaceItemDecoration; import com.gank.gankly.widget.LySwipeRefreshLayout; import com.gank.gankly.widget.MultipleStatusView; +import com.gank.gankly.widget.SpaceItemDecoration; import java.util.List; @@ -18,7 +21,6 @@ /** * Create by LingYan on 2016-12-05 - * Email:137387869@qq.com */ public class BaiSiImageFragment extends LazyFragment implements BaiSiImageContract.View { @@ -38,28 +40,11 @@ public void onAttach(Context context) { } @Override - protected void initData() { - mSwipeRefreshLayout.setRefreshing(true); - mPresenter.fetchNew(); - } - - @Override - protected void initPresenter() { - mPresenter = new BaiSiImagePresenter(BuDeJieDataSource.getInstance(), this); - } - - @Override - protected void callBackRefreshUi() { - - } - - @Override - protected int getLayoutId() { - return R.layout.layout_swipe_normal; - } + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.recycler_view_space); + mSwipeRefreshLayout.getRecyclerView().addItemDecoration(new SpaceItemDecoration(spacingInPixels)); - @Override - protected void initValues() { mAdapter = new BaiSiImageAdapter(mActivity); mAdapter.setPlayClick(gallerySize -> mActivity.getSupportFragmentManager().beginTransaction() .addToBackStack("BaiSiGalleryFragment") @@ -67,39 +52,42 @@ protected void initValues() { .commitAllowingStateLoss()); mSwipeRefreshLayout.setAdapter(mAdapter); mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { + mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { @Override public void onRefresh() { - mPresenter.fetchNew(); +// mPresenter.fetchNew(); } @Override public void onLoadMore() { - mPresenter.fetchMore(); +// mPresenter.fetchMore(); } }); } @Override - protected void initViews() { - setSwipeRefreshLayout(mSwipeRefreshLayout); - - int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.recycler_view_space); - mSwipeRefreshLayout.getRecyclerView().addItemDecoration(new SpaceItemDecoration(spacingInPixels)); + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); +// mPresenter = new BaiSiImagePresenter(BuDeJieDataSource.getInstance(), this); } @Override - protected void bindListener() { + public void onLazyActivityCreate() { + mSwipeRefreshLayout.setRefreshing(true); + } + @Override + protected int getLayoutId() { + return R.layout.layout_swipe_normal; } @Override - public void showRefresh() { + public void showProgress() { mSwipeRefreshLayout.setRefreshing(true); } @Override - public void hideRefresh() { + public void hideProgress() { mSwipeRefreshLayout.setRefreshing(false); } @@ -128,16 +116,6 @@ public void showError() { } - @Override - public void showLoading() { - - } - - @Override - public void showRefreshError(String errorStr) { - - } - @Override public void refillData(List list) { mAdapter.refillItems(list); @@ -147,4 +125,9 @@ public void refillData(List list) { public void appendData(List list) { mAdapter.appendItems(list); } + + @Override + public void shortToast(String string) { + + } } diff --git a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImagePresenter.java b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImagePresenter.java index 9f98f463..e9e8770c 100644 --- a/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImagePresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/baisi/image/BaiSiImagePresenter.java @@ -1,7 +1,8 @@ package com.gank.gankly.ui.baisi.image; +import android.content.Context; + import com.gank.gankly.bean.BuDeJieBean; -import com.gank.gankly.mvp.FetchPresenter; import com.gank.gankly.mvp.source.remote.BuDeJieDataSource; import com.socks.library.KLog; @@ -10,42 +11,29 @@ /** * Create by LingYan on 2016-12-05 - * Email:137387869@qq.com */ -public class BaiSiImagePresenter extends FetchPresenter implements BaiSiImageContract.Presenter { - private final BuDeJieDataSource mTask; - private final BaiSiImageContract.View mView; +public class BaiSiImagePresenter extends BaiSiImageContract.Presenter { + private BuDeJieDataSource mTask; + private BaiSiImageContract.View mView; private int np; + private Context context; - public BaiSiImagePresenter(BuDeJieDataSource task, BaiSiImageContract.View view) { - mTask = task; - mView = view; - } - - @Override - public void fetchNew() { - np = 0; - fetchData(); - } - - @Override - public void fetchMore() { - mView.showRefresh(); - fetchData(); + public BaiSiImagePresenter(Context context, BaiSiImageContract.View view) { + super(context, view); } private void fetchData() { mTask.fetchImage(np).subscribe(new Observer() { @Override public void onError(Throwable e) { - mView.hideRefresh(); + mView.hideProgress(); KLog.e(e); } @Override public void onComplete() { - mView.hideRefresh(); + mView.hideProgress(); } @Override @@ -55,10 +43,8 @@ public void onSubscribe(Disposable d) { @Override public void onNext(BuDeJieBean buDeJieBean) { - KLog.d("buDeJieBean:" + buDeJieBean); if (buDeJieBean != null) { np = buDeJieBean.getInfo().getNp(); - KLog.d("np:" + np); if (np == 0) { mView.refillData(buDeJieBean.getList()); } else { @@ -70,12 +56,12 @@ public void onNext(BuDeJieBean buDeJieBean) { } @Override - public void subscribe() { + public void destroy() { } @Override - public void unSubscribe() { + protected void onDestroy() { } } diff --git a/app/src/main/java/com/gank/gankly/ui/base/BaseFragment.java b/app/src/main/java/com/gank/gankly/ui/base/BaseFragment.java deleted file mode 100644 index 8d949611..00000000 --- a/app/src/main/java/com/gank/gankly/ui/base/BaseFragment.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.gank.gankly.ui.base; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.gank.gankly.App; - -import butterknife.ButterKnife; -import butterknife.Unbinder; - - -/** - * Create by LingYan on 2016-04-05 - * Email:137387869@qq.com - */ -public abstract class BaseFragment extends Fragment { - protected Unbinder unBinder; - private View mView; - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - if (mView == null) { - mView = inflater.inflate(getLayoutId(), container, false); - } - return mView; - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - unBinder = ButterKnife.bind(this, view); - initValues(); - initViews(); - bindListener(); - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - changeThemes(); - } - - protected abstract int getLayoutId(); - - protected abstract void initValues(); - - protected abstract void initViews(); - - protected abstract void bindListener(); - - public void changeThemes() { - - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - ((App) getActivity().getApplication()).getRefWatcher().watch(this); - - if (unBinder != null) { - unBinder.unbind(); - unBinder = null; - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/base/BaseHolder.java b/app/src/main/java/com/gank/gankly/ui/base/BaseHolder.java index b93ba2c5..a57cd942 100644 --- a/app/src/main/java/com/gank/gankly/ui/base/BaseHolder.java +++ b/app/src/main/java/com/gank/gankly/ui/base/BaseHolder.java @@ -1,11 +1,10 @@ package com.gank.gankly.ui.base; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; /** * Create by LingYan on 2016-11-10 - * Email:137387869@qq.com */ public abstract class BaseHolder extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/gank/gankly/ui/base/BaseJiandanActivity.java b/app/src/main/java/com/gank/gankly/ui/base/BaseJiandanActivity.java index 0b34b7ed..94b30b10 100644 --- a/app/src/main/java/com/gank/gankly/ui/base/BaseJiandanActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/base/BaseJiandanActivity.java @@ -1,10 +1,10 @@ package com.gank.gankly.ui.base; +import com.gank.gankly.ui.base.activity.BaseActivity; import com.gank.gankly.view.ISwipeRefreshView; /** * Create by LingYan on 2016-07-20 - * Email:137387869@qq.com */ public abstract class BaseJiandanActivity extends BaseActivity implements ISwipeRefreshView { @Override @@ -12,21 +12,6 @@ protected int getContentId() { return 0; } - @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { - - } - - @Override - protected void initValues() { - - } - @Override public void hideRefresh() { diff --git a/app/src/main/java/com/gank/gankly/ui/base/BaseSwipeRefreshFragment.java b/app/src/main/java/com/gank/gankly/ui/base/BaseSwipeRefreshFragment.java index a700bf01..fb689b73 100644 --- a/app/src/main/java/com/gank/gankly/ui/base/BaseSwipeRefreshFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/base/BaseSwipeRefreshFragment.java @@ -1,18 +1,18 @@ package com.gank.gankly.ui.base; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.View; /** * Create by LingYan on 2016-04-05 - * Email:137387869@qq.com */ public abstract class BaseSwipeRefreshFragment extends BaseThemeFragment { @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { initPresenter(); super.onViewCreated(view, savedInstanceState); } diff --git a/app/src/main/java/com/gank/gankly/ui/base/BaseThemeFragment.java b/app/src/main/java/com/gank/gankly/ui/base/BaseThemeFragment.java index f5ba32b5..3b09e414 100644 --- a/app/src/main/java/com/gank/gankly/ui/base/BaseThemeFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/base/BaseThemeFragment.java @@ -2,34 +2,32 @@ import android.content.res.TypedArray; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.widget.SwipeRefreshLayout; import android.view.View; import com.gank.gankly.R; +import com.gank.gankly.butterknife.ButterKnifeFragment; import com.gank.gankly.rxjava.RxBus_; import com.gank.gankly.rxjava.theme.ThemeEvent; import com.gank.gankly.utils.ListUtils; -import com.gank.gankly.utils.StyleUtils; import com.gank.gankly.widget.LYRelativeLayoutRipple; import java.util.List; -import butterknife.ButterKnife; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import io.reactivex.disposables.Disposable; /** * Create by LingYan on 2016-09-13 - * Email:137387869@qq.com */ -public abstract class BaseThemeFragment extends BaseFragment { +public abstract class BaseThemeFragment extends ButterKnifeFragment { @NonNull private SwipeRefreshLayout mSwipeRefreshLayout; private Disposable mDisposable; @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mDisposable = RxBus_.getInstance().toObservable(ThemeEvent.class) .subscribe(themeEvent -> callBackRefreshUi()); @@ -37,43 +35,43 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { protected abstract void callBackRefreshUi(); - @Override - public void changeThemes() { - super.changeThemes(); - if (mSwipeRefreshLayout != null) { - StyleUtils.changeSwipeRefreshLayout(mSwipeRefreshLayout); - } - } +// @Override +// public void changeThemes() { +// super.changeThemes(); +// if (mSwipeRefreshLayout != null) { +// StyleUtils.changeSwipeRefreshLayout(mSwipeRefreshLayout); +// } +// } public void setSwipeRefreshLayout(@NonNull SwipeRefreshLayout swipeRefreshLayout) { this.mSwipeRefreshLayout = swipeRefreshLayout; } public void setItemSelectBackground(@NonNull List list) { - if (!ListUtils.isListEmpty(list)) { + if (!ListUtils.isEmpty(list)) { int[] attrs = new int[]{R.attr.selectableItemBackground}; TypedArray typedArray = getActivity().obtainStyledAttributes(attrs); final int backgroundResource = typedArray.getResourceId(0, 0); - ButterKnife.apply(list, new ButterKnife.Action() { - @Override - public void apply(@NonNull View view, int index) { - view.setBackgroundResource(backgroundResource); - } - }); +// ButterKnife.apply(list, new ButterKnife.Action() { +// @Override +// public void apply(@NonNull View view, int index) { +// view.setBackgroundResource(backgroundResource); +// } +// }); typedArray.recycle(); } } public void setItemBackground(@NonNull List list) { - if (!ListUtils.isListEmpty(list)) { + if (!ListUtils.isEmpty(list)) { final int backgroundResource = R.attr.lyItemSelectBackground; - ButterKnife.apply(list, new ButterKnife.Action() { - @Override - public void apply(@NonNull LYRelativeLayoutRipple view, int index) { - view.setCustomBackgroundResource(backgroundResource); - } - }); +// ButterKnife.apply(list, new ButterKnife.Action() { +// @Override +// public void apply(@NonNull LYRelativeLayoutRipple view, int index) { +// view.setCustomBackgroundResource(backgroundResource); +// } +// }); } } diff --git a/app/src/main/java/com/gank/gankly/ui/base/BaseViewHolder.java b/app/src/main/java/com/gank/gankly/ui/base/BaseViewHolder.java index a9e18af6..9592ebc1 100644 --- a/app/src/main/java/com/gank/gankly/ui/base/BaseViewHolder.java +++ b/app/src/main/java/com/gank/gankly/ui/base/BaseViewHolder.java @@ -1,12 +1,10 @@ package com.gank.gankly.ui.base; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; public abstract class BaseViewHolder extends RecyclerView.ViewHolder { public BaseViewHolder(View itemView) { super(itemView); } - - public abstract void setDataOnView(int position); } \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/ui/base/DiffAdapter.java b/app/src/main/java/com/gank/gankly/ui/base/DiffAdapter.java new file mode 100644 index 00000000..8d1c12d5 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/DiffAdapter.java @@ -0,0 +1,72 @@ +package com.gank.gankly.ui.base; + +import android.content.Context; +import android.lectcoding.ui.adapter.BaseAdapter; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListUpdateCallback; +import androidx.recyclerview.widget.RecyclerView; + +import com.gank.gankly.butterknife.ItemModel; +import com.gank.gankly.diff.DiffCallback; + +import java.util.List; + +/** + * Create by LingYan on 2018-11-13 + */ +public abstract class DiffAdapter extends BaseAdapter { + private RecyclerView.Adapter adapter; + private List curItemModels; + + public DiffAdapter(Context context) { + setHasStableIds(true); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + adapter = recyclerView.getAdapter(); + } + + /** + * 插入时更新数据源 + */ + protected void updateAdapter(List oldModels, List newModels) { + DiffCallback diffCallback = new DiffCallback(oldModels, newModels); + final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); +// 更新数据有bug +// diffResult.dispatchUpdatesTo(this); + diffResult.dispatchUpdatesTo(listUpdateCallback); + curItemModels = newModels; + oldModels.clear(); + oldModels.addAll(newModels); + } + + private final ListUpdateCallback listUpdateCallback = new ListUpdateCallback() { + @Override + public void onInserted(int position, int count) { + // notifyItemRangeChanged 替换 notifyItemInserted + adapter.notifyItemInserted(position); + } + + @Override + public void onRemoved(int position, int count) { + adapter.notifyItemRangeRemoved(position, count); + } + + @Override + public void onMoved(int fromPosition, int toPosition) { + adapter.notifyItemMoved(fromPosition, toPosition); + } + + @Override + public void onChanged(int position, int count, Object payload) { + adapter.notifyItemRangeChanged(position, count, payload); + } + }; + + @Override + public long getItemId(int position) { + return curItemModels.get(position).hashCode(); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/ISwipeRefresh.java b/app/src/main/java/com/gank/gankly/ui/base/ISwipeRefresh.java index 8224143c..19bf4a10 100644 --- a/app/src/main/java/com/gank/gankly/ui/base/ISwipeRefresh.java +++ b/app/src/main/java/com/gank/gankly/ui/base/ISwipeRefresh.java @@ -1,10 +1,9 @@ package com.gank.gankly.ui.base; -import android.support.v4.widget.SwipeRefreshLayout; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; /** * Create by LingYan on 2016-09-13 - * Email:137387869@qq.com */ public interface ISwipeRefresh { void setSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayout); diff --git a/app/src/main/java/com/gank/gankly/ui/base/InitializeService.java b/app/src/main/java/com/gank/gankly/ui/base/InitializeService.java deleted file mode 100644 index a1914f62..00000000 --- a/app/src/main/java/com/gank/gankly/ui/base/InitializeService.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.gank.gankly.ui.base; - -import android.app.IntentService; -import android.content.Context; -import android.content.Intent; -import android.util.Log; - -import com.facebook.stetho.Stetho; -import com.gank.gankly.config.Constants; -import com.gank.gankly.config.Preferences; -import com.gank.gankly.utils.GanklyPreferences; -import com.tencent.bugly.Bugly; -import com.tencent.bugly.beta.Beta; -import com.tencent.smtt.sdk.QbSdk; - -/** - * Create by LingYan on 2016-09-18 - * Email:137387869@qq.com - */ -public class InitializeService extends IntentService { - public static final String SERVICE_ACTION = "com.gank.gankly.ui.base.InitializeService"; - private static final String DB_NAME = "gank.db"; - private Context mContext; - - public InitializeService() { - this(SERVICE_ACTION); - } - - public InitializeService(String name) { - super(name); - } - - @Override - protected void onHandleIntent(Intent intent) { - if (intent != null && SERVICE_ACTION.equals(intent.getAction())) { - initStart(); - } - } - - public static void start(Context context) { - Intent intent = new Intent(context, InitializeService.class); - intent.setAction(SERVICE_ACTION); - context.startService(intent); - } - - private void initStart() { - //数据库Chrome上调试 -- start - Stetho.initializeWithDefaults(getApplicationContext()); - //stetho -- end - - //Bugly 测试:true -- start - Beta.autoDownloadOnWifi = true; - Beta.autoCheckUpgrade = GanklyPreferences.getBoolean(Preferences.SETTING_AUTO_CHECK, true); - Bugly.init(getApplicationContext(), Constants.CRASH_LOG_ID, false); - //Bugly -- end - - //x5 -- start - //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。 - QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() { - - @Override - public void onViewInitFinished(boolean arg0) { - //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。 - Log.d("app", " onViewInitFinished is " + arg0); - } - - @Override - public void onCoreInitFinished() { - } - }; - //x5内核初始化接口 - QbSdk.initX5Environment(getApplicationContext(), cb); - //x5 -- end - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/base/LazyFragment.java b/app/src/main/java/com/gank/gankly/ui/base/LazyFragment.java index cd07bfb5..dbf565eb 100644 --- a/app/src/main/java/com/gank/gankly/ui/base/LazyFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/base/LazyFragment.java @@ -1,41 +1,70 @@ package com.gank.gankly.ui.base; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.view.View; + +import com.gank.gankly.butterknife.ButterKnifeFragment; + /** - * Create by LingYan on 2016-5-12 + * Create by LingYan on 2018-08-24 */ -public abstract class LazyFragment extends BaseSwipeRefreshFragment { - private boolean isVisible = false; //是否可见 - private boolean isView = false; //是否建立视图关系 - private boolean isFirstLoad = true; //是否第一次加载 + +public abstract class LazyFragment extends ButterKnifeFragment { + // 视图是否已创建,第一次,系统默认调用 setUserVisibleHint + private boolean isVisibleView; + + // 视图是否已经加载过 + private boolean isPrepared; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + isVisibleView = false; + isPrepared = false; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + isVisibleView = true; + } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - isView = true; - lazyLoadData(); + if (!isPrepared && getUserVisibleHint()) { + onLazyCreate(); + } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { - if (isVisibleToUser) { - isVisible = true; - lazyLoadData(); - } else { - isVisible = false; - } super.setUserVisibleHint(isVisibleToUser); + if (!isVisibleView) { + return; + } + if (!isPrepared && isVisibleToUser) { + onLazyCreate(); + } } - protected abstract void initData(); + @Override + public void onDestroyView() { + super.onDestroyView(); + isPrepared = false; + isVisibleView = false; + } - private void lazyLoadData() { - if (!isVisible || !isFirstLoad || !isView) { - return; - } - initData(); - isFirstLoad = false; + private void onLazyCreate() { + isPrepared = true; + onLazyActivityCreate(); } + + /** + * 实现懒加载,代替原来的onActivityCreated方法,把原来逻辑,转移到这里 + */ + public abstract void onLazyActivityCreate(); } diff --git a/app/src/main/java/com/gank/gankly/ui/base/BaseActivity.java b/app/src/main/java/com/gank/gankly/ui/base/activity/BaseActivity.java similarity index 67% rename from app/src/main/java/com/gank/gankly/ui/base/BaseActivity.java rename to app/src/main/java/com/gank/gankly/ui/base/activity/BaseActivity.java index d4736a7d..465e11fe 100644 --- a/app/src/main/java/com/gank/gankly/ui/base/BaseActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/base/activity/BaseActivity.java @@ -1,51 +1,40 @@ -package com.gank.gankly.ui.base; +package com.gank.gankly.ui.base.activity; import android.app.Activity; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; -import android.transition.Transition; -import android.transition.TransitionInflater; import android.util.Pair; import android.view.View; import android.widget.TextView; -import com.gank.gankly.App; import com.gank.gankly.R; -import com.gank.gankly.presenter.BasePresenter; +import com.google.android.material.snackbar.Snackbar; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; import butterknife.ButterKnife; import butterknife.Unbinder; /** * Create by LingYan on 2016-04-05 - * Email:137387869@qq.com */ -public abstract class BaseActivity

extends AppCompatActivity { - private static final int contentAreaId = R.id.main_frame_layout; +public abstract class BaseActivity extends AppCompatActivity { + private static final int contentResId = R.id.main_frame_layout; private long mLastTime; - protected P mPresenter; protected Unbinder mUnBinder; - FragmentTransaction mFragmentTransaction; + protected FragmentTransaction mFragmentTransaction; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { - initTheme(); super.onCreate(savedInstanceState); setContentView(getContentId()); - initPresenter(); mUnBinder = ButterKnife.bind(this); - initValues(); - initViews(); - bindListener(); changeThemes(); mFragmentTransaction = getSupportFragmentManager() .beginTransaction(); @@ -60,7 +49,7 @@ public void addMainFragment(Fragment fragment) { } public void addHideFragment(Fragment from, Fragment to) { - addHideFragment(from, to, contentAreaId, null, "", false); + addHideFragment(from, to, contentResId, null, "", false); } public void addHideFragment(Fragment from, Fragment to, String Tag, int contentAreaId) { @@ -68,40 +57,11 @@ public void addHideFragment(Fragment from, Fragment to, String Tag, int contentA } public void addAnimFragment(Fragment from, Fragment to, boolean isAnim) { - addHideFragment(from, to, contentAreaId, null, "", isAnim); + addHideFragment(from, to, contentResId, null, "", isAnim); } public void addAnimFragment(Fragment from, Fragment to, String tag, boolean isAnim) { - addHideFragment(from, to, contentAreaId, null, tag, isAnim); - } - - public void transitionHideFragment(Fragment from, Fragment to, int contentAreaId, - Bundle bundle, String tag, Pair transitionViews) { - if (isOpenMore()) { - return; - } - - from = checkNull(from); - to = checkNull(to); - transitionViews = checkNull(transitionViews); - - Transition imageTransition = TransitionInflater.from(this).inflateTransition(R.transition.image_transfom); - mFragmentTransaction.addSharedElement(transitionViews.first, transitionViews.second); - to.setSharedElementEnterTransition(imageTransition); - to.setSharedElementReturnTransition(imageTransition); - - if (bundle != null) { - to.setArguments(bundle); - } - - if (!TextUtils.isEmpty(tag)) { - mFragmentTransaction.addToBackStack(tag); - } - - mFragmentTransaction - .hide(from) - .add(contentAreaId, to, tag) - .commitAllowingStateLoss(); + addHideFragment(from, to, contentResId, null, tag, isAnim); } public void addHideFragment(Fragment from, Fragment to, int contentAreaId, @@ -181,29 +141,13 @@ private void addFragment(Fragment fragment, Bundle bundle, String tag) { } if (!fragment.isAdded()) { - mFragmentTransaction.add(contentAreaId, fragment); + mFragmentTransaction.add(contentResId, fragment); } mFragmentTransaction.commitAllowingStateLoss(); } protected abstract int getContentId(); - protected abstract void initValues(); - - protected abstract void initViews(); - - protected abstract void bindListener(); - - protected void initPresenter() {} - - protected void initTheme() { - if (App.isNight()) { - setTheme(R.style.AppTheme_Night); - } else { - setTheme(R.style.AppTheme_light); - } - } - public void gotoActivity(Class cls, boolean isFinish) { Intent intent = new Intent(this, cls); startActivity(intent); @@ -226,7 +170,7 @@ public void showSnackbar(View view, int rexText, int resColor) { // Changing action button text color View sbView = snackbar.getView(); - TextView textView = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text); + TextView textView = (TextView) sbView.findViewById(R.id.snackbar_text); textView.setTextColor(resColor); snackbar.show(); } @@ -234,7 +178,6 @@ public void showSnackbar(View view, int rexText, int resColor) { @Override protected void onDestroy() { super.onDestroy(); - ((App) this.getApplication()).getRefWatcher().watch(this); if (mUnBinder != null) { mUnBinder.unbind(); mUnBinder = null; diff --git a/app/src/main/java/com/gank/gankly/ui/base/activity/SupportActivity.java b/app/src/main/java/com/gank/gankly/ui/base/activity/SupportActivity.java new file mode 100644 index 00000000..7827707e --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/activity/SupportActivity.java @@ -0,0 +1,54 @@ +package com.gank.gankly.ui.base.activity; + +import com.gank.gankly.mvp.base.SupportView; + +/** + * Create by LingYan on 2017-10-03 + */ + +public abstract class SupportActivity extends BaseActivity implements SupportView { + @Override + public void hasNoMoreDate() { + + } + + @Override + public void showContent() { + + } + + @Override + public void shortToast(String msg) { + + } + + @Override + public void showProgress() { + + } + + @Override + public void hideProgress() { + + } + + @Override + public void showEmpty() { + + } + + @Override + public void showDisNetWork() { + + } + + @Override + public void showError() { + + } + + @Override + protected int getContentId() { + return 0; + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseAdapter.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseAdapter.java new file mode 100644 index 00000000..f53182be --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseAdapter.java @@ -0,0 +1,76 @@ +package com.gank.gankly.ui.base.adapter; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +/** + * Create by LingYan on 2018-09-25 + */ + +public abstract class BaseAdapter extends RecyclerView.Adapter { + private static final int DEFAULT_SPAN_COUNT = 1; + private List viewModels = new ArrayList<>(); + + @Override + public VH onCreateViewHolder(ViewGroup parent, int viewType) { + ViewModel viewModel = getViewModel(viewType); + return viewModel.createViewHolder(parent); + } + + @Override + public void onBindViewHolder(VH holder, int position) { + ViewModel viewModel = getViewModelForPosition(position); + viewModel.bindView(holder); + } + + @Override + public int getItemCount() { + return viewModels.size(); + } + + @Override + public int getItemViewType(int position) { + return viewModels.get(position).getViewType(); + } + + @Override + public long getItemId(int position) { + return super.getItemId(position); + } + + public void setViewManager(ViewManager viewManager) { + viewManager.setAdapter(this); + } + + void setViewModels(List viewModels) { + this.viewModels = viewModels; + } + + private ViewModel getViewModelForPosition(int position) { + return viewModels.get(position); + } + + private ViewModel getViewModel(int viewType) { + for (ViewModel viewModel : viewModels) { + if (viewModel.getViewType() == viewType) { + return viewModel; + } + } + throw new RuntimeException("can't found viewType"); + } + + public final GridLayoutManager.SpanSizeLookup spanSizeLookup = new GridLayoutManager.SpanSizeLookup() { + @Override + public int getSpanSize(int position) { + try { + return viewModels.get(position).getSpanSize(DEFAULT_SPAN_COUNT, position); + } catch (Exception e) { + return DEFAULT_SPAN_COUNT; + } + } + }; +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseHolder.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseHolder.java new file mode 100644 index 00000000..7e15dfe4 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseHolder.java @@ -0,0 +1,13 @@ +package com.gank.gankly.ui.base.adapter; + +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; + +/** + * Create by LingYan on 2018-09-26 + */ +public class BaseHolder extends RecyclerView.ViewHolder { + public BaseHolder(View view) { + super(view); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseViewManager.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseViewManager.java new file mode 100644 index 00000000..fcd10e84 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseViewManager.java @@ -0,0 +1,19 @@ +package com.gank.gankly.ui.base.adapter; + +/** + * Create by LingYan on 2018-09-26 + */ +public abstract class BaseViewManager extends ViewManager { + protected BaseAdapter baseAdapter; + + @Override + public void setAdapter(BaseAdapter baseAdapter) { + this.baseAdapter = baseAdapter; + } + + @Override + public void notifyDataSetChanged() { + baseAdapter.setViewModels(getModels()); + baseAdapter.notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseViewModel.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseViewModel.java new file mode 100644 index 00000000..daf752d4 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/BaseViewModel.java @@ -0,0 +1,49 @@ +package com.gank.gankly.ui.base.adapter; + +import android.content.Context; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.List; + +/** + * Create by LingYan on 2018-09-26 + */ +public abstract class BaseViewModel extends ViewModel { + protected Context context; + + @Override + public void bindView(VH holder, int position, List payloads) { + } + + @Override + public void bindView(VH holder) { + context = holder.itemView.getContext(); + } + + @Override + public int getSpanSize(int size, int position) { + return size; + } + + @Override + public boolean isItemSame(ItemComparator itemComparator) { + return false; + } + + @Override + public boolean isContentEqual(ItemComparator itemComparator) { + return false; + } + + @Override + public int getViewType() { + return getLayoutRes(); + } + + protected View createView(ViewGroup viewGroup) { + return LayoutInflater.from(viewGroup.getContext()).inflate(getLayoutRes(), viewGroup, false); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/ButterKnifeHolder.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/ButterKnifeHolder.java new file mode 100644 index 00000000..d95bdaa5 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/ButterKnifeHolder.java @@ -0,0 +1,15 @@ +package com.gank.gankly.ui.base.adapter; + +import android.view.View; + +import butterknife.ButterKnife; + +/** + * Create by LingYan on 2018-09-26 + */ +public class ButterKnifeHolder extends BaseHolder { + public ButterKnifeHolder(View view) { + super(view); + ButterKnife.bind(this, itemView); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/ItemComparator.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/ItemComparator.java new file mode 100644 index 00000000..1d50f11d --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/ItemComparator.java @@ -0,0 +1,10 @@ +package com.gank.gankly.ui.base.adapter; + +/** + * Create by LingYan on 2018-09-26 + */ +public interface ItemComparator { + boolean isItemSame(ItemComparator itemComparator); + + boolean isContentEqual(ItemComparator itemComparator); +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewManager.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewManager.java new file mode 100644 index 00000000..1438e3a7 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewManager.java @@ -0,0 +1,14 @@ +package com.gank.gankly.ui.base.adapter; + +import java.util.List; + +/** + * Create by LingYan on 2018-09-26 + */ +public abstract class ViewManager { + public abstract void setAdapter(BaseAdapter baseAdapter); + + public abstract List getModels(); + + public abstract void notifyDataSetChanged(); +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewModel.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewModel.java new file mode 100644 index 00000000..030d78de --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewModel.java @@ -0,0 +1,23 @@ +package com.gank.gankly.ui.base.adapter; + +import androidx.recyclerview.widget.RecyclerView; +import android.view.ViewGroup; + +import java.util.List; + +/** + * Create by LingYan on 2018-09-26 + */ +public abstract class ViewModel implements ItemComparator { + public abstract int getViewType(); + + public abstract int getSpanSize(int size, int position); + + public abstract VH createViewHolder(ViewGroup parent); + + public abstract void bindView(VH holder); + + public abstract void bindView(VH holder, int position, List payloads); + + public abstract int getLayoutRes(); +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewModelAdapter.java b/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewModelAdapter.java new file mode 100644 index 00000000..eb993e28 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/adapter/ViewModelAdapter.java @@ -0,0 +1,11 @@ +package com.gank.gankly.ui.base.adapter; + +import com.gank.gankly.ui.base.BaseViewHolder; + +/** + * Create by LingYan on 2018-09-26 + */ +public class ViewModelAdapter extends BaseAdapter { + + +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/fragment/SupportFragment.java b/app/src/main/java/com/gank/gankly/ui/base/fragment/SupportFragment.java new file mode 100644 index 00000000..8a7c0b4e --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/fragment/SupportFragment.java @@ -0,0 +1,69 @@ +package com.gank.gankly.ui.base.fragment; + +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.text.TextUtils; +import android.view.View; + +import com.gank.gankly.butterknife.ButterKnifeFragment; +import com.gank.gankly.mvp.base.SupportView; +import com.gank.gankly.utils.ToastUtils; + +/** + * Create by LingYan on 2017-09-28 + */ + +public abstract class SupportFragment extends ButterKnifeFragment implements SupportView { + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + } + + @Override + public void showProgress() { + + } + + @Override + public void hideProgress() { + + } + + @Override + public void hasNoMoreDate() { + + } + + @Override + public void showContent() { + + } + + @Override + public void showEmpty() { + + } + + @Override + public void showDisNetWork() { + + } + + @Override + public void showError() { + + } + + @Override + public void shortToast(String str) { + if (!TextUtils.isEmpty(str)) { + ToastUtils.showToast(getContext(), str); + } + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/base/fragment/ThemeFragment.java b/app/src/main/java/com/gank/gankly/ui/base/fragment/ThemeFragment.java new file mode 100644 index 00000000..66609bfc --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/base/fragment/ThemeFragment.java @@ -0,0 +1,68 @@ +package com.gank.gankly.ui.base.fragment; + +import android.content.res.TypedArray; +import android.os.Bundle; +import android.view.View; + +import com.gank.gankly.R; +import com.gank.gankly.butterknife.ButterKnifeFragment; +import com.gank.gankly.utils.ListUtils; +import com.gank.gankly.widget.LYRelativeLayoutRipple; + +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +/** + * Create by LingYan on 2016-10-21 + */ + +public abstract class ThemeFragment extends ButterKnifeFragment { + private SwipeRefreshLayout mSwipeRefreshLayout; + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + +// @Override +// public void changeThemes() { +// super.changeThemes(); +// if (mSwipeRefreshLayout != null) { +// StyleUtils.changeSwipeRefreshLayout(mSwipeRefreshLayout); +// } +// } + + public void setSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayout) { + this.mSwipeRefreshLayout = swipeRefreshLayout; + } + + public void setItemSelectBackground(@NonNull List list) { + if (!ListUtils.isEmpty(list)) { + int[] attrs = new int[]{R.attr.selectableItemBackground}; + TypedArray typedArray = getActivity().obtainStyledAttributes(attrs); + final int backgroundResource = typedArray.getResourceId(0, 0); + +// ButterKnife.apply(list, new ButterKnife.Action() { +// @Override +// public void apply(@NonNull View view, int index) { +// view.setBackgroundResource(backgroundResource); +// } +// }); + } + } + + public void setItemBackground(@NonNull List list) { + if (!ListUtils.isEmpty(list)) { + final int backgroundResource = R.attr.lyItemSelectBackground; +// ButterKnife.apply(list, new ButterKnife.Action() { +// @Override +// public void apply(@NonNull LYRelativeLayoutRipple view, int index) { +// view.setCustomBackgroundResource(backgroundResource); +// } +// }); + } + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/collect/CollectAdapter.java b/app/src/main/java/com/gank/gankly/ui/collect/CollectAdapter.java index b3d4b152..22b26e1e 100644 --- a/app/src/main/java/com/gank/gankly/ui/collect/CollectAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/collect/CollectAdapter.java @@ -1,7 +1,6 @@ package com.gank.gankly.ui.collect; import android.content.Context; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -20,6 +19,7 @@ import java.util.Date; import java.util.List; +import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; @@ -51,7 +51,7 @@ public void onBindViewHolder(CollectHolderView holder, int position) { holder.title.setText(urlCollect.getComment()); Date date = urlCollect.getDate(); - holder.time.setText(DateUtils.getFormatDate(date, DateUtils.YY_MM_DD_)); + holder.time.setText(DateUtils.formatString(date, DateUtils.YY_MM_DD_HORIZONTAL)); holder.type.setText(urlCollect.getG_type()); holder.author.setText(urlCollect.getG_author()); diff --git a/app/src/main/java/com/gank/gankly/ui/collect/CollectContract.java b/app/src/main/java/com/gank/gankly/ui/collect/CollectContract.java index 2323b48a..499fea23 100644 --- a/app/src/main/java/com/gank/gankly/ui/collect/CollectContract.java +++ b/app/src/main/java/com/gank/gankly/ui/collect/CollectContract.java @@ -1,19 +1,18 @@ package com.gank.gankly.ui.collect; import com.gank.gankly.data.entity.UrlCollect; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import com.gank.gankly.mvp.ILoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2016-10-20 - * Email:137387869@qq.com */ public interface CollectContract { - interface View extends IFetchView { + interface View extends SupportView { void setAdapterList(List list); void appendAdapter(List list); @@ -25,9 +24,9 @@ interface View extends IFetchView { void revokeCollect(); } - interface Presenter extends IFetchPresenter { - void cancelCollect(long position); + abstract class Presenter implements ILoadMorePresenter { + abstract void cancelCollect(long position); - void insertCollect(UrlCollect collect); + abstract void insertCollect(UrlCollect collect); } } diff --git a/app/src/main/java/com/gank/gankly/ui/collect/CollectFragment.java b/app/src/main/java/com/gank/gankly/ui/collect/CollectFragment.java index 1ab64296..9969df73 100644 --- a/app/src/main/java/com/gank/gankly/ui/collect/CollectFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/collect/CollectFragment.java @@ -2,38 +2,38 @@ import android.content.Context; import android.os.Bundle; -import android.support.design.widget.CoordinatorLayout; -import android.support.design.widget.Snackbar; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.view.animation.OvershootInterpolator; +import android.view.View; import com.gank.gankly.R; import com.gank.gankly.bean.RxCollect; import com.gank.gankly.data.entity.UrlCollect; -import com.gank.gankly.mvp.base.FetchFragment; import com.gank.gankly.mvp.source.LocalDataSource; import com.gank.gankly.rxjava.RxBus_; +import com.gank.gankly.ui.base.fragment.SupportFragment; import com.gank.gankly.ui.more.MoreActivity; import com.gank.gankly.ui.web.normal.WebActivity; import com.gank.gankly.widget.LyRecyclerView; import com.gank.gankly.widget.LySwipeRefreshLayout; import com.gank.gankly.widget.MultipleStatusView; +import com.google.android.material.snackbar.Snackbar; import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import io.reactivex.disposables.Disposable; -import jp.wasabeef.recyclerview.animators.FadeInUpAnimator; /** * 收藏 * Create by LingYan on 2016-4-25 - * Email:137387869@qq.com */ -public class CollectFragment extends FetchFragment implements CollectContract.View { +public class CollectFragment extends SupportFragment implements CollectContract.View { @BindView(R.id.coordinator) CoordinatorLayout mCoordinatorLayout; @BindView(R.id.multiple_status_view) @@ -61,12 +61,8 @@ public void onAttach(Context context) { } @Override - protected void initPresenter() { - mPresenter = new CollectPresenter(LocalDataSource.getInstance(), this); - } - - @Override - protected void initValues() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); mToolbar.setTitle(R.string.mine_my_collect); mActivity.setSupportActionBar(mToolbar); ActionBar bar = mActivity.getSupportActionBar(); @@ -82,16 +78,31 @@ protected void initValues() { onDelete(); } }); - } - @Override - protected void initViews() { - setSwipeRefreshLayout(mSwipeRefreshLayout); + mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { + @Override + public void onRefresh() { + showProgress(); + mPresenter.fetchNew(); + } + + @Override + public void onLoadMore() { + mPresenter.fetchMore(); + } + }); + initAdapter(); setRecyclerView(); initRefresh(); } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mPresenter = new CollectPresenter(LocalDataSource.getInstance(), this); + } + private void setRecyclerView() { mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); mSwipeRefreshLayout.setAdapter(mCollectAdapter); @@ -125,7 +136,7 @@ public void onClick(int position) { mRecyclerView = mSwipeRefreshLayout.getRecyclerView(); // mRecyclerView.addItemDecoration(new RecycleViewDivider(mActivity, R.drawable.shape_item_divider)); - mRecyclerView.setItemAnimator(new FadeInUpAnimator(new OvershootInterpolator(1f))); +// mRecyclerView.setItemAnimator(new FadeInUpAnimator(new OvershootInterpolator(1f))); mRecyclerView.getItemAnimator().setAddDuration(150); mRecyclerView.getItemAnimator().setRemoveDuration(150); } @@ -134,22 +145,6 @@ private void initAdapter() { mCollectAdapter = new CollectAdapter(mActivity); } - @Override - protected void bindListener() { - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { - @Override - public void onRefresh() { - showRefresh(); - mPresenter.fetchNew(); - } - - @Override - public void onLoadMore() { - mPresenter.fetchMore(); - } - }); - } - private void initRefresh() { mMultipleStatusView.showLoading(); mPresenter.fetchNew(); @@ -216,13 +211,10 @@ public void showError() { mMultipleStatusView.showError(); } - @Override - public void showLoading() { - mMultipleStatusView.showLoading(); - } - - @Override - public void showRefreshError(String errorStr) { + private void showLoading() { + if (mMultipleStatusView != null) { + mMultipleStatusView.showLoading(); + } } @Override @@ -231,12 +223,12 @@ public void showContent() { } @Override - public void showRefresh() { + public void showProgress() { mSwipeRefreshLayout.setRefreshing(true); } @Override - public void hideRefresh() { + public void hideProgress() { mSwipeRefreshLayout.setRefreshing(false); } diff --git a/app/src/main/java/com/gank/gankly/ui/collect/CollectPresenter.java b/app/src/main/java/com/gank/gankly/ui/collect/CollectPresenter.java index f4e1e69d..d635954b 100644 --- a/app/src/main/java/com/gank/gankly/ui/collect/CollectPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/collect/CollectPresenter.java @@ -1,9 +1,8 @@ package com.gank.gankly.ui.collect; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.gank.gankly.data.entity.UrlCollect; -import com.gank.gankly.mvp.BasePresenter; import com.gank.gankly.mvp.source.LocalDataSource; import com.gank.gankly.utils.ListUtils; import com.socks.library.KLog; @@ -19,7 +18,7 @@ /** * Create by LingYan on 2016-05-12 */ -public class CollectPresenter extends BasePresenter implements CollectContract.Presenter { +public class CollectPresenter extends CollectContract.Presenter { private static final int LIMIT = 10; @NonNull @@ -36,7 +35,7 @@ public CollectPresenter(@NonNull LocalDataSource task, @NonNull CollectContract. } private void parseData(List list) { - int size = ListUtils.getListSize(list); + int size = ListUtils.getSize(list); if (size > 0) { if (mPage == 0) { mModelView.setAdapterList(list); @@ -69,7 +68,7 @@ public void fetchNew() { @Override public void fetchMore() { if (!isNoMore) { - mModelView.showRefresh(); + mModelView.showProgress(); int offset = getOffset(); getCollects(offset); } @@ -91,7 +90,7 @@ public void onError(Throwable e) { @Override public void onComplete() { - mModelView.hideRefresh(); + mModelView.hideProgress(); mPage = mPage + 1; } @@ -109,7 +108,7 @@ public void onNext(List urlCollects) { @Override public void cancelCollect(final long position) { - mTask.cancelCollect(position) + mTask.cancelCollect(position) // .delaySubscription(4, TimeUnit.SECONDS) .subscribe(s -> { @@ -145,13 +144,7 @@ public void onComplete() { }); } - @Override - public void subscribe() { - - } - - @Override - public void unSubscribe() { + public void destroy() { } } diff --git a/app/src/main/java/com/gank/gankly/ui/cure/CureAdapter.java b/app/src/main/java/com/gank/gankly/ui/cure/CureAdapter.java new file mode 100644 index 00000000..7911198b --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/cure/CureAdapter.java @@ -0,0 +1,169 @@ +package com.gank.gankly.ui.cure; + +import android.lectcoding.ui.adapter.BaseAdapter; +import android.ly.business.domain.Gift; +import androidx.annotation.IntDef; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.gank.gankly.R; +import com.gank.gankly.butterknife.BindViewHolder; +import com.gank.gankly.butterknife.ItemModel; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +import static com.gank.gankly.ui.cure.CureAdapter.ViewType.VIEW_TYPE_CURE; + +/** + * Create by LingYan on 2016-07-05 + */ +public class CureAdapter extends BaseAdapter { + private ItemCallback itemCallback; + private List gifts = new ArrayList<>(); + private final List items = new ArrayList<>(); + + CureAdapter() { + setHasStableIds(true); + } + + @Override + public CureAdapter.NormalViewHolder onCreateViewHolder(ViewGroup parent, @ViewType.CureViewType int viewType) { + NormalViewHolder viewHolder; + switch (viewType) { + case VIEW_TYPE_CURE: + viewHolder = new CureHolder(parent); + break; + default: + viewHolder = null; + break; + } + return viewHolder; + } + + @Override + public void onBindViewHolder(NormalViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case VIEW_TYPE_CURE: + ((CureHolder) holder).bindHolder(items.get(position), itemCallback); + break; + } + } + + public void setOnItemClickListener(ItemCallback itemCallback) { + this.itemCallback = itemCallback; + } + + @Override + public int getItemViewType(int position) { + if (!items.isEmpty()) { + return items.get(position).getViewType(); + } + return super.getItemViewType(position); + } + + @Override + public int getItemCount() { + return gifts.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + void refillItem(List dailyGirlList) { + gifts.clear(); + appendItem(dailyGirlList); + } + + public void appendItem(List dailyGirlList) { + int startIndex = items.size(); + gifts.addAll(dailyGirlList); + changeItems(startIndex); + } + + private void changeItems(int startIndex) { + for (int i = startIndex, size = gifts.size(); i < size; i++) { + final Gift gift = gifts.get(i); + if (gift != null) { + items.add(new CureItem(gift)); + } + } + } + + @Override + public void destroy() { + items.clear(); + gifts.clear(); + itemCallback = null; + } + + static class CureHolder extends NormalViewHolder { + @BindView(R.id.title) + TextView title; + + CureHolder(ViewGroup parent) { + super(parent, R.layout.adapter_daily_girl); + } + + @Override + void bindHolder(CureItem item, ItemCallback callback) { + super.bindHolder(item, callback); + final Gift gift = item.gift; + title.setText(gift.title); + + itemView.setOnClickListener(v -> { + if (callback != null) { + callback.onItemClick(gift.url); + } + }); + } + } + + static class CureItem extends ItemModel { + final Gift gift; + + CureItem(Gift gift) { + this.gift = gift; + } + + @Override + public int getViewType() { + return VIEW_TYPE_CURE; + } + } + + interface ItemCallback { + void onItemClick(String url); + } + + abstract static class NormalViewHolder extends BindViewHolder { + + NormalViewHolder(ViewGroup parent, int layoutRes) { + super(parent, layoutRes); + } + + void bindHolder(TT item, ItemCallback callback) { + + } + + @Override + public void bindHolder(TT item) { + + } + } + + interface ViewType { + int VIEW_TYPE_CURE = 1; + + @IntDef(VIEW_TYPE_CURE) + @Retention(RetentionPolicy.SOURCE) + @interface CureViewType { + } + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/cure/CureContract.java b/app/src/main/java/com/gank/gankly/ui/cure/CureContract.java new file mode 100644 index 00000000..64a988a6 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/cure/CureContract.java @@ -0,0 +1,36 @@ +package com.gank.gankly.ui.cure; + +import android.content.Context; +import android.ly.business.domain.Gift; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.PageView; + +import java.util.ArrayList; + +/** + * Create by LingYan on 2016-10-26 + */ + +public interface CureContract { + interface View extends PageView { + void setMaxProgress(int value); + + void disProgressDialog(); + + void openBrowseActivity(ArrayList list); + } + + abstract class Presenter extends LoadMorePresenter { + public Presenter(@NonNull Context context, View view) { + super(context, view); + } + + abstract void refreshGirls(); + + abstract void appendGirls(); + + abstract void loadImages(String url); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/cure/CureFragment.java b/app/src/main/java/com/gank/gankly/ui/cure/CureFragment.java new file mode 100644 index 00000000..6b42b25b --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/cure/CureFragment.java @@ -0,0 +1,218 @@ +package com.gank.gankly.ui.cure; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.ly.business.domain.Gift; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import android.text.TextUtils; +import android.view.View; + +import com.gank.gankly.R; +import com.gank.gankly.ui.base.LazyFragment; +import com.gank.gankly.ui.gallery.GalleryActivity; +import com.gank.gankly.widget.LySwipeRefreshLayout; +import com.gank.gankly.widget.MultipleStatusView; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * 妹子 - 清纯 + * Create by LingYan on 2016-07-01 + */ +public class CureFragment extends LazyFragment implements CureContract.View { + @BindView(R.id.multiple_status_view) + MultipleStatusView multipleStatusView; + + @BindView(R.id.swipe_refresh) + LySwipeRefreshLayout swipeRefresh; + + private CureAdapter cureAdapter; + private CureContract.Presenter curePresenter; + + private ProgressDialog progressDialog; + + @Override + protected int getLayoutId() { + return R.layout.fragment_gift; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + cureAdapter = new CureAdapter(); + cureAdapter.setOnItemClickListener(cureCallback); + swipeRefresh.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + swipeRefresh.setAdapter(cureAdapter); + + swipeRefresh.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { + @Override + public void onRefresh() { + initCureRefresh(); + } + + @Override + public void onLoadMore() { + curePresenter.appendGirls(); + } + }); + } + + private void initCureRefresh() { + if (curePresenter != null) { + curePresenter.refreshGirls(); + } + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + curePresenter = new CurePresenter(getContext(), this); + } + + private final CureAdapter.ItemCallback cureCallback = new CureAdapter.ItemCallback() { + @Override + public void onItemClick(final String url) { + if (!TextUtils.isEmpty(url)) { + showLoadingDialog(); + curePresenter.loadImages(url); + } + } + }; + + private void showLoadingDialog() { + if (progressDialog == null) { + progressDialog = new ProgressDialog(getContext()); + progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); + progressDialog.setMessage(getContext().getString(R.string.loading_meizi_images)); + progressDialog.setIndeterminate(true); + progressDialog.setCanceledOnTouchOutside(true); + progressDialog.setOnCancelListener(dialog -> curePresenter.destroy()); + } + + if (!progressDialog.isShowing()) { + progressDialog.show(); + } + } + + @Override + public void openBrowseActivity(@NonNull ArrayList list) { + Bundle bundle = new Bundle(); + Intent intent = new Intent(getContext(), GalleryActivity.class); + bundle.putString(GalleryActivity.EXTRA_MODEL, GalleryActivity.EXTRA_DAILY); + intent.putExtra(GalleryActivity.EXTRA_LIST, list); + intent.putExtras(bundle); + getContext().startActivity(intent); + } + + @Override + public void hideProgress() { + if (swipeRefresh != null && swipeRefresh.isRefreshing()) { + swipeRefresh.setRefreshing(false); + } + } + + @Override + public void hasNoMoreDate() { + + } + + @Override + public void showProgress() { + if (swipeRefresh != null && !swipeRefresh.isRefreshing()) { + swipeRefresh.setRefreshing(true); + } + } + + @Override + public void showContent() { + if (multipleStatusView != null) { + multipleStatusView.showContent(); + } + } + + @Override + public void showEmpty() { + + } + + @Override + public void showDisNetWork() { + + } + + @Override + public void showError() { + + } + + @Override + public void setMaxProgress(int value) { + if (progressDialog != null) { + progressDialog.setMax(value); + } + } + + @Override + public void disProgressDialog() { + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (cureAdapter != null) { + cureAdapter.destroy(); + } + if (curePresenter != null) { + curePresenter.destroy(); + } + } + + @Override + public void onLazyActivityCreate() { + initCureRefresh(); + } + + @Override + public void refreshSuccess(List list) { + if (list != null) { + if (cureAdapter != null) { + cureAdapter.refillItem(list); + cureAdapter.notifyDataSetChanged(); + } + } + } + + @Override + public void refreshFailure(String msg) { + shortToast(msg); + } + + @Override + public void appendSuccess(List list) { + if (cureAdapter != null) { + if (list != null) { + cureAdapter.appendItem(list); + cureAdapter.notifyDataSetChanged(); + } + } + } + + @Override + public void appendFailure(String msg) { + shortToast(msg); + } + + @Override + public void shortToast(String string) { + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/cure/CurePresenter.java b/app/src/main/java/com/gank/gankly/ui/cure/CurePresenter.java new file mode 100644 index 00000000..479ae9d7 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/cure/CurePresenter.java @@ -0,0 +1,193 @@ +package com.gank.gankly.ui.cure; + +import android.content.Context; +import android.lectcoding.ui.logcat.Logcat; +import android.ly.business.domain.Gift; +import android.ly.business.domain.PageConfig; +import android.ly.jsoup.JsoupServer; +import android.text.TextUtils; + +import com.gank.gankly.utils.CrashUtils; +import com.gank.gankly.utils.StringUtils; +import com.leftcoding.rxbus.RxApiManager; + +import org.jsoup.nodes.Document; +import org.jsoup.select.Elements; + +import java.util.ArrayList; +import java.util.IllegalFormatException; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import io.reactivex.disposables.Disposable; + +/** + * Create by LingYan on 2016-10-26 + */ + +class CurePresenter extends CureContract.Presenter { + private static final String BASE_URL = "http://www.mzitu.com/xinggan/"; + + private final ArrayList imagesList = new ArrayList<>(); + private final AtomicBoolean destroyFlag = new AtomicBoolean(false); + private int maxPageNumber; + private PageConfig pageConfig = new PageConfig(); + + CurePresenter(Context context, CureContract.View view) { + super(context, view); + pageConfig.limit = 24; + } + + @Override + void refreshGirls() { + fetchData(getUrl(pageConfig.getCurPage())); + } + + @Override + void appendGirls() { + if (maxPageNumber >= pageConfig.getCurPage()) { + fetchData(getUrl(pageConfig.getCurPage())); + } + } + + @Override + void loadImages(String url) { + Disposable disposable = JsoupServer.rxConnect(url).build() + .doFinally(() -> { + if (view != null) { + view.disProgressDialog(); + } + }) + .subscribe(document -> { + getDetailMaxPage(document); + getImagesList(document); + }, Logcat::e); + RxApiManager.get().add(requestTag, disposable); + } + + private void fetchData(String url) { + if (destroyFlag.get()) { + return; + } + + Disposable disposable = JsoupServer.rxConnect(url).build() + .doOnSubscribe(dis -> { + if (view != null) { + view.showProgress(); + } + }) + .doFinally(() -> { + if (view != null) { + view.hideProgress(); + } + }) + .subscribe(document -> { + maxPageNumber = getMaxPageNum(document); + List gifts = getPageLists(document); + if (gifts != null) { + if (view != null) { + if (pageConfig.isFirst()) { + view.refreshSuccess(gifts); + } else { + view.appendSuccess(gifts); + } + } + } + }, Logcat::e); + RxApiManager.get().add(requestTag, disposable); + } + + /** + * 解析每面,封面入口地址 + */ + private List getPageLists(Document doc) { + List list = new ArrayList<>(); + if (doc == null) { + return null; + } + Elements href = doc.select("#pins > li > a"); + Elements img = doc.select("#pins a img"); + Elements times = doc.select(".time"); + Elements views = doc.select(".view"); + + final int countSize = href.size(); + final int imgSize = img.size(); + final int size = countSize > imgSize ? imgSize : countSize; + + if (size > 0) { + for (int i = 0; i < size; i++) { + String imgUrl = img.get(i).attr("data-original"); + String title = img.get(i).attr("alt"); + String url = href.get(i).attr("href"); + String time = times.get(i).text(); + String view = views.get(i).text(); + if (!TextUtils.isEmpty(imgUrl) && !TextUtils.isEmpty(url)) { + list.add(new Gift(imgUrl, url, time, view, title)); + } + } + } + return list; + } + + private int getMaxPageNum(Document doc) { + int p = 0; + if (doc != null) { + Elements count = doc.select(".nav-links a[href]"); + int size = count.size(); + if (size > 0) { + for (int i = size - 1; i >= 0; i--) { + String num = count.get(i).text(); + if (StringUtils.isNumeric(num)) { + try { + return Integer.parseInt(num); + } catch (IllegalFormatException e) { + Logcat.e(e); + CrashUtils.crashReport(e); + } + } + } + } + } + return p; + } + + private int getDetailMaxPage(Document doc) { + if (doc != null) { + Elements pages = doc.select(".pagenavi span"); + if (pages != null && !pages.isEmpty()) { + + } + } + return 0; + } + + private void getImagesList(Document doc) { + imagesList.clear(); + if (doc != null) { + Elements imgs = doc.select(".main-image a img"); + if (imgs != null && imgs.size() > 0) { + for (int i = 0; i < imgs.size(); i++) { + String src = imgs.get(i).attr("src"); + imagesList.add(new Gift(src)); + } + } + } + } + + private String getUrl(int page) { + return page == pageConfig.initPage ? BASE_URL : BASE_URL + "page/" + page; + } + + @Override + public void destroy() { + if (destroyFlag.compareAndSet(false, true)) { + RxApiManager.get().clear(requestTag); + } + super.destroy(); + } + + @Override + protected void onDestroy() { + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlAdapter.java b/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlAdapter.java new file mode 100644 index 00000000..334b8f8f --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlAdapter.java @@ -0,0 +1,115 @@ +package com.gank.gankly.ui.daily; + +import android.lectcoding.ui.adapter.BaseAdapter; +import android.ly.business.domain.Girl; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.gank.gankly.R; +import com.gank.gankly.butterknife.BindViewHolder; +import com.gank.gankly.butterknife.ItemModel; +import com.gank.gankly.listener.ItemClick; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * Create by LingYan on 2016-07-05 + */ +public class DailyGirlAdapter extends BaseAdapter { + private ItemClick mMeiZiOnClick; + private List mGirlList = new ArrayList<>(); + + DailyGirlAdapter() { + setHasStableIds(true); + } + + @Override + public DailyGirlAdapter.NormalViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new DailyGirlHolder(parent); + } + + @Override + public void onBindViewHolder(NormalViewHolder holder, int position) { + + } + + public void setOnItemClickListener(ItemClick onItemClickListener) { + mMeiZiOnClick = onItemClickListener; + } + + @Override + public int getItemCount() { + return mGirlList.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + void refillItem(List girlList) { + int size = mGirlList.size(); + mGirlList.clear(); + notifyItemRangeRemoved(0, size); + appendItem(girlList); + } + + public void appendItem(List girlList) { + mGirlList.addAll(girlList); + notifyItemRangeInserted(getItemCount(), girlList.size()); + } + + @Override + public void destroy() { + + } + + public static class DailyGirlHolder extends NormalViewHolder implements View.OnClickListener { + static final int LAYOUT = R.layout.adapter_daily_girl; + + @BindView(R.id.title) + TextView txtTitle; + + Girl girl; + + public DailyGirlHolder(ViewGroup parent) { + super(parent, LAYOUT); + } + + @Override + public void onClick(View v) { + } + + @Override + public void bindHolder(NormalItem item) { + + } + } + + static class NormalItem extends ItemModel { + + @Override + public int getViewType() { + return 0; + } + } + + abstract static class NormalViewHolder extends BindViewHolder { + + public NormalViewHolder(ViewGroup parent, int layoutRes) { + super(parent, layoutRes); + } + + void bindHolder(TT item, ItemCallback callback) { + + } + } + + interface ItemCallback { + void onItemClick(Girl girl); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlContract.java b/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlContract.java new file mode 100644 index 00000000..83c89b42 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlContract.java @@ -0,0 +1,38 @@ +package com.gank.gankly.ui.daily; + +import android.content.Context; +import android.ly.business.domain.Gift; +import androidx.annotation.NonNull; + +import android.ly.business.domain.Girl; +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; + +import java.util.ArrayList; +import java.util.List; + +/** + * Create by LingYan on 2016-10-26 + */ + +public interface DailyGirlContract { + interface View extends SupportView { + void refillData(List list); + + void appendItem(List list); + + void setMaxProgress(int value); + + void disProgressDialog(); + + void openBrowseActivity(ArrayList list); + } + + abstract class Presenter extends LoadMorePresenter { + public Presenter(@NonNull Context context, View view) { + super(context, view); + } + + abstract void girlsImages(String url); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlFragment.java b/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlFragment.java new file mode 100644 index 00000000..95f58eb5 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlFragment.java @@ -0,0 +1,193 @@ +package com.gank.gankly.ui.daily; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.ly.business.domain.Gift; +import android.ly.business.domain.Girl; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import android.view.View; + +import com.gank.gankly.R; +import com.gank.gankly.listener.ItemClick; +import com.gank.gankly.ui.base.LazyFragment; +import com.gank.gankly.ui.gallery.GalleryActivity; +import com.gank.gankly.widget.LySwipeRefreshLayout; +import com.gank.gankly.widget.MultipleStatusView; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * 妹子 - 每日更新 + * Create by LingYan on 2016-07-01 + */ +public class DailyGirlFragment extends LazyFragment implements DailyGirlContract.View { + @BindView(R.id.multiple_status_view) + MultipleStatusView multipleStatusView; + + @BindView(R.id.swipe_refresh) + LySwipeRefreshLayout swipeRefresh; + + private DailyGirlAdapter dailyGirlAdapter; + private DailyGirlPresenter dailyPresenter; + + private ProgressDialog mDialog; + + @Override + protected int getLayoutId() { + return R.layout.fragment_gift; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + dailyGirlAdapter = new DailyGirlAdapter(); + swipeRefresh.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + swipeRefresh.setAdapter(dailyGirlAdapter); + + swipeRefresh.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { + @Override + public void onRefresh() { + dailyPresenter.fetchNew(); + } + + @Override + public void onLoadMore() { + } + }); + + dailyGirlAdapter.setOnItemClickListener(new ItemClick() { + @Override + public void onClick(int position, Object object) { + + } + }); + + } + + private void showLoadingDialog() { + if (mDialog == null) { + mDialog = new ProgressDialog(getContext()); + } + + mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); + mDialog.setMessage(getContext().getString(R.string.loading_meizi_images)); + mDialog.setIndeterminate(true); + mDialog.setCanceledOnTouchOutside(true); + mDialog.setOnCancelListener(dialog -> dailyPresenter.destroy()); + + if (!mDialog.isShowing()) { + mDialog.show(); + } + } + + @Override + public void openBrowseActivity(@NonNull ArrayList list) { + Bundle bundle = new Bundle(); + Intent intent = new Intent(getContext(), GalleryActivity.class); + bundle.putString(GalleryActivity.EXTRA_MODEL, GalleryActivity.EXTRA_DAILY); + intent.putExtra(GalleryActivity.EXTRA_LIST, list); + intent.putExtras(bundle); + getContext().startActivity(intent); + } + + @Override + public void hideProgress() { + swipeRefresh.setRefreshing(false); + } + + @Override + public void hasNoMoreDate() { + + } + + @Override + public void showProgress() { + + } + + @Override + public void showContent() { + multipleStatusView.showContent(); + } + + @Override + public void showEmpty() { + + } + + @Override + public void showDisNetWork() { + + } + + @Override + public void showError() { + + } + + private void showLoading() { + if (swipeRefresh != null) { + swipeRefresh.setRefreshing(true); + } + } + +// @Override + public void onClick(int position, Object object) { +// DailyGirl dailyGirl = (DailyGirl) object; +// String url = dailyGirl.getUrl(); +// if (!TextUtils.isEmpty(url)) { +// showLoadingDialog(); +// dailyPresenter.girlsImages(url); +// } + } + + @Override + public void refillData(List list) { + dailyGirlAdapter.refillItem(list); + } + + @Override + public void appendItem(List list) { + dailyGirlAdapter.appendItem(list); + } + + @Override + public void setMaxProgress(int value) { + if (mDialog != null) { + mDialog.setMax(value); + } + } + + @Override + public void disProgressDialog() { + if (mDialog != null && mDialog.isShowing()) { + mDialog.dismiss(); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (dailyGirlAdapter != null) { + dailyGirlAdapter.destroy(); + } + } + + @Override + public void onLazyActivityCreate() { + dailyPresenter = new DailyGirlPresenter(getContext(), this); + multipleStatusView.showLoading(); + dailyPresenter.fetchNew(); + } + + @Override + public void shortToast(String string) { + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziPresenter.java b/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlPresenter.java similarity index 81% rename from app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziPresenter.java rename to app/src/main/java/com/gank/gankly/ui/daily/DailyGirlPresenter.java index 3c6ca381..ebd567b4 100644 --- a/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/daily/DailyGirlPresenter.java @@ -1,9 +1,10 @@ -package com.gank.gankly.ui.girls.dailymeizi; +package com.gank.gankly.ui.daily; -import com.gank.gankly.bean.DailyMeiziBean; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.mvp.FetchPresenter; -import com.gank.gankly.mvp.source.remote.MeiziDataSource; +import android.content.Context; +import android.ly.business.domain.Gift; +import android.ly.jsoup.JsoupServer; + +import android.ly.business.domain.Girl; import com.gank.gankly.utils.ListUtils; import com.socks.library.KLog; @@ -18,46 +19,44 @@ /** * Create by LingYan on 2016-10-26 - * Email:137387869@qq.com */ -public class DailyMeiziPresenter extends FetchPresenter implements DailyMeiziContract.Presenter { +public class DailyGirlPresenter extends DailyGirlContract.Presenter { private static final String MEIZI_FIRST_URL = "http://m.mzitu.com/all"; - private final MeiziDataSource mTask; - private final DailyMeiziContract.View mModelView; - private ArrayList imagesList; + private final DailyGirlContract.View mModelView; + private ArrayList imagesList; private int max; - public DailyMeiziPresenter(MeiziDataSource task, DailyMeiziContract.View view) { - mTask = task; + public DailyGirlPresenter(Context context, DailyGirlContract.View view) { + super(context, view); mModelView = view; } - @Override +// @Override public void fetchNew() { - setFetchLimit(24); +// setFetchLimit(24); fetchData(MEIZI_FIRST_URL); } - @Override +// @Override public void fetchMore() { //empty } private void fetchData(String url) { - mTask.fetchDaily(url) + JsoupServer.rxConnect(url).build() .subscribe(new Observer() { @Override public void onComplete() { - setFetchPage(getFetchPage() + 1); +// setFetchPage(getFetchPage() + 1); mModelView.showContent(); - mModelView.hideRefresh(); + mModelView.hideProgress(); } @Override public void onError(Throwable e) { KLog.e(e); - parseError(mModelView); +// parseError(mModelView); } @Override @@ -73,18 +72,18 @@ public void onNext(Document document) { } @Override - public void subscribe() { + public void destroy() { //empty } @Override - public void unSubscribe() { - //empty + protected void onDestroy() { + } @Override public void girlsImages(final String url) { - mTask.fetchDailyDays(url) + JsoupServer.rxConnect(url).build() .map(document -> { max = getImageUrlsMax(document); if (max > 0) { @@ -117,7 +116,7 @@ public void onNext(String url) { } private void getImages(String url) { - mTask.fetchDailyDetailUrls(url) + JsoupServer.rxConnect(url).build() .map(document -> getImageCountList(document)) .subscribe(new Observer() { @Override @@ -166,7 +165,7 @@ public void onNext(String url) { number = String.valueOf(i); } lastUrl = baseUrl + name + number + endType; - imagesList.add(new GiftBean(lastUrl)); + imagesList.add(new Gift(lastUrl)); } } }); @@ -174,9 +173,9 @@ public void onNext(String url) { private void parseDocument(Document document) { if (document != null) { - List list = getDays(document); - list = filterData(list, mModelView); - if (ListUtils.getListSize(list) > 0) { + List list = getDays(document); +// list = filterData(list, mModelView); + if (ListUtils.getSize(list) > 0) { mModelView.refillData(list); } } @@ -185,13 +184,13 @@ private void parseDocument(Document document) { /** * 筛选过滤得到月份集合 */ - private List getDays(Document doc) { - List list = new ArrayList<>(); + private List getDays(Document doc) { + List list = new ArrayList<>(); if (doc != null) { Elements times = doc.select(".post-content .archive-brick"); Elements a_href = doc.select(".post-content .archive-brick a"); for (int i = 0; i < a_href.size(); i++) { - list.add(new DailyMeiziBean(a_href.get(i).attr("href"), times.get(i).text())); + list.add(new Girl(a_href.get(i).attr("href"), times.get(i).text())); } } return list; diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/DiscoveredFragment.java b/app/src/main/java/com/gank/gankly/ui/discovered/DiscoveredFragment.java index f29e7914..30ee08cb 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/DiscoveredFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/DiscoveredFragment.java @@ -2,15 +2,19 @@ import android.content.Context; import android.content.res.Resources; -import android.support.design.widget.TabLayout; -import android.support.v4.view.ViewPager; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.tabs.TabLayout; +import androidx.viewpager.widget.ViewPager; import android.util.TypedValue; +import android.view.View; -import com.gank.gankly.App; import com.gank.gankly.R; +import com.gank.gankly.butterknife.ButterKnifeFragment; import com.gank.gankly.rxjava.RxBus_; import com.gank.gankly.rxjava.theme.ThemeEvent; -import com.gank.gankly.ui.base.BaseSwipeRefreshFragment; +import com.gank.gankly.ui.MainActivity; import com.gank.gankly.ui.base.LazyFragment; import com.gank.gankly.ui.discovered.jiandan.JiandanFragment; import com.gank.gankly.ui.discovered.more.DiscoveredAdapter; @@ -18,7 +22,6 @@ import com.gank.gankly.ui.discovered.teamBlog.TeamBlogFragment; import com.gank.gankly.ui.discovered.technology.TechnologyFragment; import com.gank.gankly.ui.discovered.video.VideoFragment; -import com.gank.gankly.ui.main.MainActivity; import java.util.ArrayList; import java.util.List; @@ -29,9 +32,8 @@ /** * 发现 * Create by LingYan on 2016-07-01 - * Email:137387869@qq.com */ -public class DiscoveredFragment extends BaseSwipeRefreshFragment implements ViewPager.OnPageChangeListener { +public class DiscoveredFragment extends ButterKnifeFragment implements ViewPager.OnPageChangeListener { private static final String TYPE_VIDEO = "视频"; private static final String TYPE_JIANDAN = "新鲜事"; private static final String TYPE_THCHNOLOGY = "科技资讯"; @@ -54,20 +56,13 @@ protected int getLayoutId() { } @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); mDisposable = RxBus_.getInstance().toObservable(ThemeEvent.class) .subscribe(themeEvent -> { refreshUi(); }); - } - @Override - protected void initValues() { List mList = new ArrayList<>(); mList.add(new VideoFragment()); mList.add(new JiandanFragment()); @@ -98,7 +93,7 @@ private void initTabLayout() { mTabLayout.setupWithViewPager(mViewPager); mTabLayout.setTabMode(TabLayout.MODE_FIXED); - mTabLayout.setSelectedTabIndicatorColor(App.getAppColor(R.color.white)); + mTabLayout.setSelectedTabIndicatorColor(getContext().getResources().getColor(R.color.white)); } private void refreshUi() { @@ -127,21 +122,6 @@ public void onAttach(Context context) { mActivity = (MainActivity) context; } - @Override - public void onResume() { - super.onResume(); - } - - @Override - protected void initPresenter() { - - } - - @Override - protected void callBackRefreshUi() { - - } - @Override public void onDestroyView() { super.onDestroyView(); diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanAdapter.java b/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanAdapter.java index 2898e681..6f1c9c86 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanAdapter.java @@ -1,7 +1,7 @@ package com.gank.gankly.ui.discovered.jiandan; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -21,14 +21,13 @@ /** * Create by LingYan on 2016-07-20 - * Email:137387869@qq.com */ public class JiandanAdapter extends RecyclerView.Adapter { private final List mList; private ItemClick mMeiZiOnClick; private Context mContext; - public JiandanAdapter() { + JiandanAdapter() { mList = new ArrayList<>(); } @@ -55,7 +54,7 @@ public void setListener(ItemClick mMeiZiOnClick) { this.mMeiZiOnClick = mMeiZiOnClick; } - public void updateItem(List list) { + void updateItem(List list) { mList.clear(); appendItem(list); } @@ -86,7 +85,7 @@ public class JiandanHolder extends RecyclerView.ViewHolder implements View.OnCli private JianDanBean bean; - public JiandanHolder(View itemView) { + JiandanHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); itemView.setOnClickListener(this); diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanContract.java b/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanContract.java index 1866c1ef..279394a9 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanContract.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanContract.java @@ -1,24 +1,29 @@ package com.gank.gankly.ui.discovered.jiandan; +import android.content.Context; +import androidx.annotation.NonNull; + import com.gank.gankly.bean.JianDanBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2016-11-21 - * Email:137387869@qq.com */ public interface JiandanContract { - interface View extends IFetchView { + interface View extends SupportView { void refillData(List list); void appendMoreDate(List list); } - interface Presenter extends IFetchPresenter { + abstract class Presenter extends LoadMorePresenter { + public Presenter(@NonNull Context context, View view) { + super(context, view); + } } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanFragment.java b/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanFragment.java index b576f933..ccef7657 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanFragment.java @@ -3,8 +3,10 @@ import android.content.Context; import android.content.res.Resources; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; @@ -14,9 +16,8 @@ import com.gank.gankly.bean.JianDanBean; import com.gank.gankly.config.Constants; import com.gank.gankly.listener.ItemClick; -import com.gank.gankly.mvp.source.remote.JiandanDataSource; +import com.gank.gankly.ui.MainActivity; import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.main.MainActivity; import com.gank.gankly.ui.web.JiandanWebActivity; import com.gank.gankly.utils.StyleUtils; import com.gank.gankly.widget.LySwipeRefreshLayout; @@ -30,7 +31,6 @@ /** * 新鲜事 * Create by LingYan on 2016-11-18 - * Email:137387869@qq.com */ public class JiandanFragment extends LazyFragment implements JiandanContract.View, ItemClick { @@ -57,18 +57,8 @@ protected int getLayoutId() { } @Override - protected void initData() { - mMultipleStatusView.showLoading(); - mPresenter.fetchNew(); - } - - @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); mAdapter = new JiandanAdapter(); mAdapter.setListener(this); mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); @@ -77,30 +67,30 @@ protected void bindListener() { mSwipeRefreshLayout.getRecyclerView().setHasFixedSize(true); mSwipeRefreshLayout.getRecyclerView().addItemDecoration(new MyDecoration(mActivity, LinearLayoutManager.HORIZONTAL)); // mSwipeRefreshLayout.setColorSchemeColors(App.getAppColor(R.color.colorPrimary)); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { + mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { @Override public void onRefresh() { - mPresenter.fetchNew(); +// mPresenter.fetchNew(); } @Override public void onLoadMore() { - mPresenter.fetchMore(); +// mPresenter.fetchMore(); } }); } @Override - protected void initValues() { - setSwipeRefreshLayout(mSwipeRefreshLayout); + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); +// mPresenter = new JiandanPresenter(JiandanDataSource.getInstance(), this); } @Override - protected void initPresenter() { - mPresenter = new JiandanPresenter(JiandanDataSource.getInstance(), this); + public void onLazyActivityCreate() { + } - @Override protected void callBackRefreshUi() { Resources.Theme theme = mActivity.getTheme(); TypedValue typedValue = new TypedValue(); @@ -141,7 +131,7 @@ public void appendMoreDate(List list) { } @Override - public void showRefresh() { + public void showProgress() { mSwipeRefreshLayout.setRefreshing(true); } @@ -151,15 +141,10 @@ public void hasNoMoreDate() { } @Override - public void hideRefresh() { + public void hideProgress() { mSwipeRefreshLayout.setRefreshing(false); } - @Override - public void showRefreshError(String errorStr) { - - } - @Override public void showContent() { mMultipleStatusView.showContent(); @@ -180,9 +165,10 @@ public void showError() { mMultipleStatusView.showError(); } - @Override - public void showLoading() { - mMultipleStatusView.showLoading(); + private void showLoading() { + if (mMultipleStatusView != null) { + mMultipleStatusView.showLoading(); + } } @Override @@ -195,4 +181,9 @@ public void onClick(int position, Object object) { bundle.putString(JiandanWebActivity.AUTHOR, bean.getType()); JiandanWebActivity.startWebActivity(mActivity, bundle); } + + @Override + public void shortToast(String string) { + + } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanPresenter.java b/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanPresenter.java index a77e8efc..8406a7bf 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/jiandan/JiandanPresenter.java @@ -1,9 +1,9 @@ package com.gank.gankly.ui.discovered.jiandan; +import android.content.Context; +import android.ly.jsoup.JsoupServer; + import com.gank.gankly.bean.JianDanBean; -import com.gank.gankly.mvp.FetchPresenter; -import com.gank.gankly.mvp.source.remote.JiandanDataSource; -import com.gank.gankly.utils.ListUtils; import com.socks.library.KLog; import org.jsoup.nodes.Document; @@ -13,45 +13,36 @@ import java.util.List; import io.reactivex.Observer; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; -import io.reactivex.schedulers.Schedulers; /** * Create by LingYan on 2016-11-21 - * Email:137387869@qq.com */ -public class JiandanPresenter extends FetchPresenter implements JiandanContract.Presenter { +public class JiandanPresenter extends JiandanContract.Presenter { private static final String BASE_URL = "http://i.jandan.net/page/"; private static final int LIMIT = 24; - private JiandanDataSource mJiandanDataSource; private JiandanContract.View mView; - public JiandanPresenter(JiandanDataSource jiandanDataSource, JiandanContract.View view) { - mJiandanDataSource = jiandanDataSource; - mView = view; - setFetchLimit(LIMIT); + public JiandanPresenter(Context context, JiandanContract.View view) { + super(context, view); } @Override - public void subscribe() { + public void destroy() { } @Override - public void unSubscribe() { + protected void onDestroy() { } public void fetchData(int page) { String url = BASE_URL + page; - mJiandanDataSource.jsoupUrlData(url) - .subscribeOn(Schedulers.io()) - .unsubscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + JsoupServer.rxConnect(url).build() .map(document -> mapResult(document)) .subscribe(new Observer>() { @Override @@ -62,8 +53,8 @@ public void onError(Throwable e) { @Override public void onComplete() { mView.showContent(); - int nextPage = getFetchPage() + 1; - setFetchPage(nextPage); +// int nextPage = getFetchPage() + 1; +// setFetchPage(nextPage); } @Override @@ -73,14 +64,14 @@ public void onSubscribe(Disposable d) { @Override public void onNext(List list) { - list = filterData(list, mView); - if (ListUtils.getListSize(list) > 0) { - if (getFetchPage() > 1) { - mView.appendMoreDate(list); - } else { - mView.refillData(list); - } - } +// list = filterData(list, mView); +// if (ListUtils.getSize(list) > 0) { +// if (getFetchPage() > 1) { +// mView.appendMoreDate(list); +// } else { +// mView.refillData(list); +// } +// } } }); } @@ -112,16 +103,16 @@ private List mapResult(Document doc) { return list; } - @Override - public void fetchNew() { - fetchData(getInitPage()); - } - - @Override - public void fetchMore() { - if (hasMore()) { - mView.showRefresh(); - fetchData(getFetchPage()); - } - } +// @Override +// public void fetchNew() { +// fetchData(getInitPage()); +// } +// +// @Override +// public void fetchMore() { +// if (hasMore()) { +// mView.showProgress(); +// fetchData(getFetchPage()); +// } +// } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/more/DiscoveredAdapter.java b/app/src/main/java/com/gank/gankly/ui/discovered/more/DiscoveredAdapter.java index b117fc85..65471750 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/more/DiscoveredAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/more/DiscoveredAdapter.java @@ -1,8 +1,8 @@ package com.gank.gankly.ui.discovered.more; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; import android.view.ViewGroup; import com.gank.gankly.ui.base.LazyFragment; diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/more/DiscoveredMoreFragment.java b/app/src/main/java/com/gank/gankly/ui/discovered/more/DiscoveredMoreFragment.java index e1a11cbc..2e449f42 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/more/DiscoveredMoreFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/more/DiscoveredMoreFragment.java @@ -5,9 +5,9 @@ import android.widget.LinearLayout; import com.gank.gankly.R; +import com.gank.gankly.ui.MainActivity; import com.gank.gankly.ui.baisi.BaiSiActivity; import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.main.MainActivity; import com.gank.gankly.utils.theme.ThemeColor; import butterknife.BindView; @@ -15,7 +15,6 @@ /** * Create by LingYan on 2016-12-02 - * Email:137387869@qq.com */ public class DiscoveredMoreFragment extends LazyFragment { @@ -30,17 +29,6 @@ public void onAttach(Context context) { mActivity = (MainActivity) context; } - @Override - protected void initData() { - - } - - @Override - protected void initPresenter() { - - } - - @Override protected void callBackRefreshUi() { ThemeColor color = new ThemeColor(this); color.setBackgroundResource(R.attr.themeBackground, mLinearLayout); @@ -52,24 +40,14 @@ protected int getLayoutId() { return R.layout.fragment_discovered_more; } - @Override - protected void initValues() { - - } - - @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { - - } - @OnClick(R.id.discovered_rl_budejie) void onClickBuDeJie() { mActivity.startActivity(new Intent(mActivity, BaiSiActivity.class)); mActivity.overridePendingTransition(0, 0); } + + @Override + public void onLazyActivityCreate() { + + } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogAdapter.java b/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogAdapter.java index 8a858ffb..9f4f6a82 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogAdapter.java @@ -1,7 +1,7 @@ package com.gank.gankly.ui.discovered.teamBlog; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -21,7 +21,6 @@ /** * Create by LingYan on 2016-07-20 - * Email:137387869@qq.com */ public class TeamBlogAdapter extends RecyclerView.Adapter { private final List mList; diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogContract.java b/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogContract.java index f574cec3..062894e7 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogContract.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogContract.java @@ -1,24 +1,23 @@ package com.gank.gankly.ui.discovered.teamBlog; import com.gank.gankly.bean.JianDanBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import com.gank.gankly.mvp.ILoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2016-11-23 - * Email:137387869@qq.com */ public interface TeamBlogContract { - interface View extends IFetchView { + interface View extends SupportView { void refillData(List list); void appendData(List list); } - interface Presenter extends IFetchPresenter { + interface Presenter extends ILoadMorePresenter { } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogFragment.java b/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogFragment.java index f2ed847a..48ff5001 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogFragment.java @@ -3,17 +3,19 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; import com.gank.gankly.R; import com.gank.gankly.bean.JianDanBean; import com.gank.gankly.config.Constants; import com.gank.gankly.listener.ItemClick; -import com.gank.gankly.mvp.source.remote.TeamBlogDataSource; +import com.gank.gankly.ui.MainActivity; import com.gank.gankly.ui.base.LazyFragment; import com.gank.gankly.ui.discovered.technology.TechnologyContract; -import com.gank.gankly.ui.main.MainActivity; import com.gank.gankly.ui.web.JiandanWebActivity; import com.gank.gankly.ui.web.normal.WebActivity; import com.gank.gankly.utils.theme.RecyclerViewColor; @@ -27,7 +29,6 @@ /** * Create by LingYan on 2016-11-23 - * Email:137387869@qq.com */ public class TeamBlogFragment extends LazyFragment implements TechnologyContract.View, ItemClick { @@ -48,14 +49,20 @@ public void onAttach(Context context) { } @Override - protected void initData() { - showRefresh(); - mPresenter.fetchNew(); + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initValues(); } @Override - protected void initPresenter() { - mPresenter = new TeamBlogPresenter(TeamBlogDataSource.getInstance(), this); + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); +// mPresenter = new TeamBlogPresenter(TeamBlogDataSource.getInstance(), this); + } + + @Override + public void onLazyActivityCreate() { + } @Override @@ -63,47 +70,33 @@ protected int getLayoutId() { return R.layout.layout_swipe_normal; } - @Override protected void initValues() { - setSwipeRefreshLayout(mSwipeRefreshLayout); -// setMultipleStatusView(mMultipleStatusView); - mAdapter = new TeamBlogAdapter(); mAdapter.setListener(this); mSwipeRefreshLayout.setAdapter(mAdapter); mRecyclerView = mSwipeRefreshLayout.getRecyclerView(); mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { + mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { @Override public void onRefresh() { - mPresenter.fetchNew(); +// mPresenter.fetchNew(); } @Override public void onLoadMore() { - mPresenter.fetchMore(); +// mPresenter.fetchMore(); } }); } @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { - - } - - @Override - public void showRefresh() { + public void showProgress() { mSwipeRefreshLayout.setRefreshing(true); } @Override - public void hideRefresh() { + public void hideProgress() { mSwipeRefreshLayout.setRefreshing(false); } @@ -132,16 +125,6 @@ public void showError() { } - @Override - public void showLoading() { - - } - - @Override - public void showRefreshError(String errorStr) { - - } - @Override public void refillData(List list) { mAdapter.updateItem(list); @@ -165,7 +148,6 @@ public void onClick(int position, Object object) { JiandanWebActivity.startWebActivity(mActivity, bundle); } - @Override protected void callBackRefreshUi() { RecyclerViewColor recyclerViewColor = new RecyclerViewColor(mRecyclerView); recyclerViewColor.setItemBackgroundColor(R.id.team_ll_body, R.attr.lyItemSelectBackground); @@ -177,4 +159,9 @@ protected void callBackRefreshUi() { themeColor.recyclerViewColor(recyclerViewColor); themeColor.start(); } + + @Override + public void shortToast(String string) { + + } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogPresenter.java b/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogPresenter.java index 856e9602..7709a1a1 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/teamBlog/TeamBlogPresenter.java @@ -1,7 +1,9 @@ package com.gank.gankly.ui.discovered.teamBlog; +import android.content.Context; +import android.ly.jsoup.JsoupServer; + import com.gank.gankly.bean.JianDanBean; -import com.gank.gankly.mvp.FetchPresenter; import com.gank.gankly.mvp.source.remote.TeamBlogDataSource; import com.gank.gankly.ui.discovered.technology.TechnologyContract; import com.socks.library.KLog; @@ -17,36 +19,28 @@ /** * Create by LingYan on 2016-11-23 - * Email:137387869@qq.com */ -public class TeamBlogPresenter extends FetchPresenter implements TechnologyContract.Presenter { +public class TeamBlogPresenter extends TechnologyContract.Presenter { private TeamBlogDataSource mTask; private TechnologyContract.View mView; - public TeamBlogPresenter(TeamBlogDataSource task, TechnologyContract.View view) { - mTask = task; - mView = view; - } - - @Override - public void fetchNew() { - fetchData(getInitPage()); + TeamBlogPresenter(Context context, TechnologyContract.View view) { + super(context, view); } private void fetchData(int page) { - mTask.fetchData(page).subscribe(new Observer() { + String url = ""; + JsoupServer.rxConnect(url).build().subscribe(new Observer() { @Override public void onComplete() { mView.showContent(); - mView.hideRefresh(); - int nextPage = getFetchPage() + 1; - setFetchPage(nextPage); + mView.hideProgress(); } @Override public void onError(Throwable e) { - mView.hideRefresh(); + mView.hideProgress(); KLog.e(e); } @@ -58,13 +52,6 @@ public void onSubscribe(Disposable d) { @Override public void onNext(Document document) { List list = parseDocument(document); - if (list.size() > 0) { - if (getFetchPage() > 1) { - mView.appendData(list); - } else { - mView.refillData(list); - } - } } }); } @@ -92,20 +79,12 @@ private List parseDocument(Document document) { } @Override - public void fetchMore() { - if (hasMore()) { - mView.showRefresh(); - fetchData(getFetchPage()); - } - } - - @Override - public void subscribe() { + public void destroy() { } @Override - public void unSubscribe() { + protected void onDestroy() { } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyAdapter.java b/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyAdapter.java index d1ec4168..2cc71d97 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyAdapter.java @@ -1,7 +1,7 @@ package com.gank.gankly.ui.discovered.technology; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -21,7 +21,6 @@ /** * Create by LingYan on 2016-07-20 - * Email:137387869@qq.com */ public class TechnologyAdapter extends RecyclerView.Adapter { private final List mList; diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyContract.java b/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyContract.java index 6b505957..76fc0823 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyContract.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyContract.java @@ -1,24 +1,29 @@ package com.gank.gankly.ui.discovered.technology; +import android.content.Context; +import androidx.annotation.NonNull; + import com.gank.gankly.bean.JianDanBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2016-11-23 - * Email:137387869@qq.com */ public interface TechnologyContract { - interface View extends IFetchView { + interface View extends SupportView { void refillData(List list); void appendData(List list); } - interface Presenter extends IFetchPresenter { + abstract class Presenter extends LoadMorePresenter { + public Presenter(@NonNull Context context, View view) { + super(context, view); + } } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyFragment.java b/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyFragment.java index 6d85101c..352846f7 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyFragment.java @@ -3,16 +3,18 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; import com.gank.gankly.R; import com.gank.gankly.bean.JianDanBean; import com.gank.gankly.config.Constants; import com.gank.gankly.listener.ItemClick; -import com.gank.gankly.mvp.source.remote.TechnologyDataSource; +import com.gank.gankly.ui.MainActivity; import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.main.MainActivity; import com.gank.gankly.ui.web.normal.WebActivity; import com.gank.gankly.utils.theme.RecyclerViewColor; import com.gank.gankly.utils.theme.ThemeColor; @@ -25,7 +27,6 @@ /** * Create by LingYan on 2016-11-23 - * Email:137387869@qq.com */ public class TechnologyFragment extends LazyFragment implements TechnologyContract.View, ItemClick { @@ -39,6 +40,11 @@ public class TechnologyFragment extends LazyFragment implements TechnologyContra private TechnologyContract.Presenter mPresenter; + @Override + protected int getLayoutId() { + return R.layout.layout_swipe_normal; + } + @Override public void onAttach(Context context) { super.onAttach(context); @@ -46,62 +52,49 @@ public void onAttach(Context context) { } @Override - protected void initData() { - showRefresh(); - mPresenter.fetchNew(); + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initValues(); } @Override - protected void initPresenter() { - mPresenter = new TechnologyPresenter(TechnologyDataSource.getInstance(), this); + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); +// mPresenter = new TechnologyPresenter(TechnologyDataSource.getInstance(), this); } @Override - protected int getLayoutId() { - return R.layout.layout_swipe_normal; - } + public void onLazyActivityCreate() { - @Override - protected void initValues() { - setSwipeRefreshLayout(mSwipeRefreshLayout); -// setMultipleStatusView(mMultipleStatusView); + } + private void initValues() { mAdapter = new TechnologyAdapter(); mAdapter.setListener(this); mSwipeRefreshLayout.setAdapter(mAdapter); mRecyclerView = mSwipeRefreshLayout.getRecyclerView(); mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { + mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { @Override public void onRefresh() { - mPresenter.fetchNew(); +// mPresenter.fetchNew(); } @Override public void onLoadMore() { - mPresenter.fetchMore(); +// mPresenter.fetchMore(); } }); } @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { - - } - - @Override - public void showRefresh() { + public void showProgress() { mSwipeRefreshLayout.setRefreshing(true); } @Override - public void hideRefresh() { + public void hideProgress() { mSwipeRefreshLayout.setRefreshing(false); } @@ -130,16 +123,6 @@ public void showError() { } - @Override - public void showLoading() { - - } - - @Override - public void showRefreshError(String errorStr) { - - } - @Override public void refillData(List list) { mAdapter.updateItem(list); @@ -164,7 +147,6 @@ public void onClick(int position, Object object) { mActivity.overridePendingTransition(0, 0); } - @Override protected void callBackRefreshUi() { RecyclerViewColor recyclerViewColor = new RecyclerViewColor(mRecyclerView); recyclerViewColor.setItemBackgroundColor(R.id.technology_rl_body, R.attr.lyItemSelectBackground); @@ -176,4 +158,9 @@ protected void callBackRefreshUi() { themeColor.recyclerViewColor(recyclerViewColor); themeColor.start(); } + + @Override + public void shortToast(String string) { + + } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyPresenter.java b/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyPresenter.java index ee4c0bfd..1b0c6e4b 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/technology/TechnologyPresenter.java @@ -1,7 +1,9 @@ package com.gank.gankly.ui.discovered.technology; +import android.content.Context; +import android.ly.jsoup.JsoupServer; + import com.gank.gankly.bean.JianDanBean; -import com.gank.gankly.mvp.FetchPresenter; import com.gank.gankly.mvp.source.remote.TechnologyDataSource; import com.socks.library.KLog; @@ -16,56 +18,57 @@ /** * Create by LingYan on 2016-11-23 - * Email:137387869@qq.com */ -public class TechnologyPresenter extends FetchPresenter implements TechnologyContract.Presenter { +public class TechnologyPresenter extends TechnologyContract.Presenter { private TechnologyDataSource mTask; private TechnologyContract.View mView; - public TechnologyPresenter(TechnologyDataSource task, TechnologyContract.View view) { - mTask = task; - mView = view; + public TechnologyPresenter(Context context, TechnologyContract.View view) { + super(context, view); } - @Override - public void fetchNew() { - fetchData(getInitPage()); - } +// @Override +// public void fetchNew() { +// fetchData(getInitPage()); +// } private void fetchData(int page) { - mTask.fetchData(page).subscribe(new Observer() { - @Override - public void onError(Throwable e) { - mView.hideRefresh(); - KLog.e(e); - } + JsoupServer + .rxConnect("") + .build() + .subscribe(new Observer() { + @Override + public void onError(Throwable e) { + mView.hideProgress(); + KLog.e(e); + } - @Override - public void onComplete() { - mView.showContent(); - mView.hideRefresh(); - int nextPage = getFetchPage() + 1; - setFetchPage(nextPage); - } + @Override + public void onComplete() { + mView.showContent(); + mView.hideProgress(); +// int nextPage = getFetchPage() + 1; +// setFetchPage(nextPage); + } - @Override - public void onSubscribe(Disposable d) { + @Override + public void onSubscribe(Disposable d) { - } + } - @Override - public void onNext(Document document) { - List list = parseDocument(document); - if (list.size() > 0) { - if (getFetchPage() > 1) { - mView.appendData(list); - } else { - mView.refillData(list); + @Override + public void onNext(Document document) { +// List list = parseDocument(document); +// if (list.size() > 0) { +// if (getFetchPage() > 1) { +// mView.appendData(list); +// } else { +// mView.refillData(list); +// } +// } } - } - } - }); + }); } private List parseDocument(Document document) { @@ -90,21 +93,21 @@ private List parseDocument(Document document) { return jiandanBeen; } - @Override - public void fetchMore() { - if (hasMore()) { - mView.showRefresh(); - fetchData(getFetchPage()); - } - } +// @Override +// public void fetchMore() { +// if (hasMore()) { +// mView.showProgress(); +// fetchData(getFetchPage()); +// } +// } @Override - public void subscribe() { + public void destroy() { } @Override - public void unSubscribe() { + protected void onDestroy() { } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoAdapter.java b/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoAdapter.java index 8e36d1df..913ab33f 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoAdapter.java @@ -1,7 +1,8 @@ package com.gank.gankly.ui.discovered.video; import android.content.Context; -import android.support.v7.widget.RecyclerView; +import android.ly.business.domain.Gank; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,7 +12,6 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.gank.gankly.R; -import com.gank.gankly.bean.ResultsBean; import com.gank.gankly.config.MeiziArrayList; import com.gank.gankly.listener.MeiziOnClick; @@ -25,11 +25,10 @@ /** * 视频 * Create by LingYan on 2016-04-25 - * Email:137387869@qq.com */ public class VideoAdapter extends RecyclerView.Adapter { - private List mResults; - private List mImagesList; + private List mResults; + private List mImagesList; private MeiziOnClick mMeiZiOnClick; private Context mContext; @@ -47,9 +46,9 @@ public GankViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @Override public void onBindViewHolder(GankViewHolder holder, int position) { - ResultsBean bean = mResults.get(position); - holder.txtDesc.setText(bean.getDesc()); - holder.txtAuthor.setText(bean.getWho()); + Gank bean = mResults.get(position); + holder.txtDesc.setText(bean.desc); + holder.txtAuthor.setText(bean.who); int size = MeiziArrayList.getInstance().getOneItemsList().size(); if (position > size && size > 0) { @@ -58,7 +57,7 @@ public void onBindViewHolder(GankViewHolder holder, int position) { if (position < size && mImagesList != null) { Glide.with(mContext) .asBitmap() - .load(mImagesList.get(position).getUrl()) + .load(mImagesList.get(position).url) .apply(new RequestOptions() .fitCenter() ) @@ -83,14 +82,14 @@ public int getItemCount() { return mResults.size(); } - public void refillItems(List getResults) { + public void refillItems(List getResults) { int size = mResults.size(); mResults.clear(); notifyItemRangeRemoved(0, size); appendItems(getResults); } - public void appendItems(List getResults) { + public void appendItems(List getResults) { setImages(); mResults.addAll(getResults); @@ -98,12 +97,12 @@ public void appendItems(List getResults) { } private void setImages() { - List list = MeiziArrayList.getInstance().getOneItemsList(); + List list = MeiziArrayList.getInstance().getOneItemsList(); mImagesList = new ArrayList<>(list); Collections.shuffle(mImagesList); } - public List getResults() { + public List getResults() { return mResults; } @@ -112,11 +111,11 @@ public void setOnItemClickListener(MeiziOnClick onItemClickListener) { } class GankViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - @BindView(R.id.goods_txt_title) + @BindView(R.id.title) TextView txtDesc; - @BindView(R.id.goods_img_bg) + @BindView(R.id.goods_background) ImageView mImageView; - @BindView(R.id.video_txt_author) + @BindView(R.id.author) TextView txtAuthor; public GankViewHolder(View itemView) { diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoContract.java b/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoContract.java index 332c7bd7..6f01a5a9 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoContract.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoContract.java @@ -1,25 +1,30 @@ package com.gank.gankly.ui.discovered.video; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import android.content.Context; +import android.ly.business.domain.Gank; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2017-01-03 - * Email:137387869@qq.com */ public interface VideoContract { - interface View extends IFetchView { - void refillData(List list); + interface View extends SupportView { + void refillData(List list); - void appendData(List list); + void appendData(List list); } - interface Presenter extends IFetchPresenter { + abstract class Presenter extends LoadMorePresenter { + public Presenter(@NonNull Context context, View view) { + super(context, view); + } } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoFragment.java b/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoFragment.java index c9e48d0a..c257a1c8 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoFragment.java @@ -2,22 +2,23 @@ import android.content.Context; import android.content.res.Resources; +import android.ly.business.domain.Gank; import android.os.Bundle; -import android.support.design.widget.Snackbar; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.snackbar.Snackbar; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.gank.gankly.R; -import com.gank.gankly.bean.ResultsBean; import com.gank.gankly.listener.MeiziOnClick; -import com.gank.gankly.mvp.source.remote.GankDataSource; +import com.gank.gankly.ui.MainActivity; import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.main.MainActivity; import com.gank.gankly.ui.web.WebVideoViewActivity; import com.gank.gankly.utils.StyleUtils; import com.gank.gankly.widget.LySwipeRefreshLayout; @@ -30,10 +31,9 @@ /** * 休息视频 * Create by LingYan on 2016-04-25 - * Email:137387869@qq.com */ -public class VideoFragment extends LazyFragment implements MeiziOnClick, - SwipeRefreshLayout.OnRefreshListener, VideoContract.View { +public class VideoFragment extends LazyFragment implements MeiziOnClick, SwipeRefreshLayout.OnRefreshListener, + VideoContract.View { @BindView(R.id.multiple_status_view) MultipleStatusView mMultipleStatusView; @BindView(R.id.swipe_refresh) @@ -56,22 +56,10 @@ public void onAttach(Context context) { } @Override - protected void initPresenter() { - mPresenter = new VideoPresenter(GankDataSource.getInstance(), this); - } - - @Override - protected void initValues() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); mSwipeRefreshLayout.setRefreshing(true); - } - - private void onLoading() { - mPresenter.fetchNew(); - } - - @Override - protected void initViews() { - setSwipeRefreshLayout(mSwipeRefreshLayout); + // setSwipeRefreshLayout(mSwipeRefreshLayout); mMultipleStatusView.setListener(v -> onLoading()); @@ -81,24 +69,34 @@ protected void initViews() { mRecyclerView = mSwipeRefreshLayout.getRecyclerView(); mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { + mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { @Override public void onRefresh() { - mPresenter.fetchNew(); +// mPresenter.fetchNew(); } @Override public void onLoadMore() { - mPresenter.fetchMore(); +// mPresenter.fetchMore(); } }); } @Override - protected void bindListener() { + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); +// mPresenter = new VideoPresenter(GankDataSource.getInstance(), this); } @Override + public void onLazyActivityCreate() { + + } + + private void onLoading() { +// mPresenter.fetchNew(); + } + protected void callBackRefreshUi() { Resources.Theme theme = mActivity.getTheme(); TypedValue typedValue = new TypedValue(); @@ -114,7 +112,7 @@ protected void callBackRefreshUi() { for (int childIndex = 0; childIndex < childCount; childIndex++) { ViewGroup childView = (ViewGroup) mRecyclerView.getChildAt(childIndex); View view = childView.findViewById(R.id.goods_rl_title); - TextView title = (TextView) childView.findViewById(R.id.goods_txt_title); + TextView title = (TextView) childView.findViewById(R.id.title); view.setBackgroundResource(background); title.setTextColor(textColor); } @@ -125,9 +123,9 @@ protected void callBackRefreshUi() { @Override public void onClick(View view, int position) { Bundle bundle = new Bundle(); - List list = mAdapter.getResults(); - bundle.putString(WebVideoViewActivity.TITLE, list.get(position).getDesc()); - bundle.putString(WebVideoViewActivity.URL, list.get(position).getUrl()); + List list = mAdapter.getResults(); + bundle.putString(WebVideoViewActivity.TITLE, list.get(position).desc); + bundle.putString(WebVideoViewActivity.URL, list.get(position).url); WebVideoViewActivity.startWebActivity(mActivity, bundle); } @@ -137,27 +135,22 @@ public void onRefresh() { } @Override - protected void initData() { - mPresenter.fetchNew(); - } - - @Override - public void refillData(List list) { + public void refillData(List list) { mAdapter.refillItems(list); } @Override - public void appendData(List list) { + public void appendData(List list) { mAdapter.appendItems(list); } @Override - public void showRefresh() { + public void showProgress() { mSwipeRefreshLayout.setRefreshing(true); } @Override - public void hideRefresh() { + public void hideProgress() { mSwipeRefreshLayout.setRefreshing(false); } @@ -186,13 +179,14 @@ public void showError() { mMultipleStatusView.showError(); } - @Override - public void showLoading() { - mMultipleStatusView.showLoading(); + private void showLoading() { + if (mMultipleStatusView != null) { + mMultipleStatusView.showLoading(); + } } @Override - public void showRefreshError(String errorStr) { - Snackbar.make(mRecyclerView, errorStr, Snackbar.LENGTH_LONG).show(); + public void shortToast(String string) { + } } diff --git a/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoPresenter.java b/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoPresenter.java index 497e8962..3019fdf3 100644 --- a/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/discovered/video/VideoPresenter.java @@ -1,9 +1,10 @@ package com.gank.gankly.ui.discovered.video; +import android.content.Context; +import android.ly.business.domain.Gank; + import com.gank.gankly.bean.GankResult; -import com.gank.gankly.bean.ResultsBean; import com.gank.gankly.config.MeiziArrayList; -import com.gank.gankly.mvp.FetchPresenter; import com.gank.gankly.mvp.source.remote.GankDataSource; import com.socks.library.KLog; @@ -15,34 +16,22 @@ /** * Create by LingYan on 2017-01-03 - * Email:137387869@qq.com */ -public class VideoPresenter extends FetchPresenter implements VideoContract.Presenter { +public class VideoPresenter extends VideoContract.Presenter { private GankDataSource mTask; private VideoContract.View mModelView; - public VideoPresenter(GankDataSource task, VideoContract.View view) { - mTask = task; - mModelView = view; - } - - @Override - public void fetchNew() { - fetchData(getInitPage()); - } - - @Override - public void fetchMore() { - fetchData(getFetchPage()); + VideoPresenter(Context context, VideoContract.View view) { + super(context, view); } private void fetchData(int page) { Observable observable; if (MeiziArrayList.getInstance().isOneItemsEmpty()) { - observable = mTask.fetchVideoAndImages(page, getFetchLimit()); + observable = mTask.fetchVideoAndImages(page, 20); } else { - observable = mTask.fetchVideo(page, getFetchLimit()); + observable = mTask.fetchVideo(page, 20); } observable.subscribe(new Observer() { @@ -53,36 +42,27 @@ public void onSubscribe(Disposable d) { @Override public void onNext(GankResult gankResult) { - List list = filterData(gankResult.getResults(), mModelView); - if (list != null) { - if (page == 1) { - mModelView.refillData(list); - } else { - mModelView.appendData(list); - } - } + List list = gankResult.getResults(), mModelView; } @Override public void onError(Throwable e) { KLog.e(e); - parseError(mModelView); } @Override public void onComplete() { - setFetchPage(page + 1); } }); } @Override - public void subscribe() { + public void destroy() { } @Override - public void unSubscribe() { + protected void onDestroy() { } } diff --git a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryActivity.java b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryActivity.java index 941230d3..f551dfcb 100644 --- a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryActivity.java @@ -1,34 +1,24 @@ package com.gank.gankly.ui.gallery; -import android.animation.Animator; import android.app.WallpaperManager; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.ly.business.domain.Gank; +import android.ly.business.domain.Gift; import android.net.Uri; import android.os.Bundle; import android.os.Environment; -import android.support.design.widget.Snackbar; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.content.ContextCompat; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.Toolbar; +import androidx.annotation.Nullable; +import com.google.android.material.snackbar.Snackbar; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AlertDialog; import android.text.TextUtils; -import android.transition.Transition; -import android.transition.TransitionInflater; -import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.animation.DecelerateInterpolator; -import android.view.animation.LinearInterpolator; import android.widget.ImageView; -import android.widget.RelativeLayout; import android.widget.TextView; import com.bumptech.glide.Glide; @@ -38,11 +28,8 @@ import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.Target; import com.gank.gankly.R; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.bean.ResultsBean; import com.gank.gankly.config.MeiziArrayList; -import com.gank.gankly.mvp.source.remote.GankDataSource; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.SupportActivity; import com.gank.gankly.utils.CrashUtils; import com.gank.gankly.utils.ListUtils; import com.gank.gankly.utils.RxSaveImage; @@ -50,13 +37,10 @@ import com.gank.gankly.utils.StringHtml; import com.gank.gankly.utils.ToastUtils; import com.gank.gankly.widget.WheelView; -import com.gank.gankly.widget.transforms.FixedSpeedScroller; -import com.gank.gankly.widget.transforms.ZoomOutSlideTransformer; import com.socks.library.KLog; import java.io.File; import java.io.IOException; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; @@ -75,59 +59,41 @@ /** * 相册 * Create by LingYan on 2016-4-25 - * Email:137387869@qq.com */ -public class GalleryActivity extends BaseActivity implements ViewPager.OnPageChangeListener, - GalleryContract.View { - private static final int SYSTEM_UI_BASE_VISIBILITY = View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; +public class GalleryActivity extends SupportActivity { + private static final String FILE_PATH = "GankLy_pic"; + private static final int INTERVALS = 3000; + private static final int INITIAL_DELAY = 1000; - private static final int SYSTEM_UI_IMMERSIVE = View.SYSTEM_UI_FLAG_IMMERSIVE - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_FULLSCREEN; + public static final int TYPE_INDEX = 1; - public static final String TAG = "BrowseActivity"; - private static final String FILE_PATH = "GankLy_pic"; + public static final String TYPE = "Type"; public static final String EXTRA_GANK = "Gank"; public static final String EXTRA_GIFT = "Gift"; public static final String EXTRA_DAILY = "Daily"; public static final String EXTRA_MODEL = "Model"; public static final String EXTRA_POSITION = "Position"; public static final String EXTRA_LIST = "Extra_List"; - - public static final String TYPE = "Type"; - // 转场动画 - public static final int TYPE_TRANSITION = 1; private static final String NUMBER_COLOR = "#8b0000"; - @BindView(R.id.progress_txt_page) - TextView txtLimit; - @BindView(R.id.toolbar) - Toolbar mToolbar; - @BindView(R.id.pager) - ViewPager mViewPager; - @BindView(R.id.browse_rl) - RelativeLayout mRelativeLayout; - @BindView(R.id.brose_img_auto) - ImageView imgAuto; - @BindView(R.id.browse_txt_auto_tip) - TextView txtAutoTip; - - private GalleryContract.Presenter mPresenter; - private PagerAdapter mPagerAdapter; - private WallpaperManager myWallpaperManager; + @BindView(R.id.progress_page) + TextView progressPage; + + @BindView(R.id.view_pager) + ViewPager viewPager; + + @BindView(R.id.browse_auto) + ImageView browseAuto; + + private GalleryPagerAdapter pagerAdapter; + private WallpaperManager wallpaperManager; private Disposable subscription; - private Disposable autoTipable; - private List mGiftList; - private Bitmap mBitmap; - private String mViewsModel = EXTRA_GANK; + private List gifts; + private Bitmap bitmap; + private String browseModel = EXTRA_GANK; private boolean isCanPlay = true; - private int mPosition; - private int curItem = -1; - private int transition_code; - private int getTipWidth; + private int position; @Override protected int getContentId() { @@ -135,203 +101,84 @@ protected int getContentId() { } @Override - protected void initTheme() { - super.initTheme(); - setTheme(R.style.BrowseThemeBase); - mPresenter = new GalleryPresenter(GankDataSource.getInstance(), this); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - } - - @Override - public void onPageSelected(int position) { - if (EXTRA_GANK.equals(mViewsModel)) { - boolean isFetch = isFetch(); - if (isFetch) { - mPresenter.fetchMore(); - } - } + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + parseBundle(); + gifts = getGiftList(); + setupPageNumber(position); - mPosition = position; - setNumberText(position); + pagerAdapter = new GalleryPagerAdapter(getSupportFragmentManager()); + pagerAdapter.setGifts(gifts); + viewPager.setAdapter(pagerAdapter); + viewPager.setCurrentItem(position); + viewPager.addOnPageChangeListener(onPageChangeListener); + pagerAdapter.notifyDataSetChanged(); } - @Override - public void onPageScrollStateChanged(int state) { - if (state == ViewPager.SCROLL_STATE_DRAGGING) { - hideSystemUi(); - stopBrowse(); + private final ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int i, float v, int i1) { - if (isPositionEnd()) { - showSnackbar(mRelativeLayout, R.string.loading_all_over, ContextCompat.getColor(this, R.color.white)); - } } - } - private void setNumberText(int position) { - int size = getAapterCount(); - String imgSize = String.valueOf(size); - String p = String.valueOf(position + 1); - txtLimit.setText(StringHtml.getStringSize(p, imgSize, "/", NUMBER_COLOR, 22)); - } + @Override + public void onPageSelected(int _position) { + position = _position; + setupPageNumber(position); + } - @Override - protected void initValues() { - parseBundle(); - activityAnimation(); - getGiftList(); - } + @Override + public void onPageScrollStateChanged(int state) { + if (state == ViewPager.SCROLL_STATE_DRAGGING) { + stopBrowse(); - private void getGiftList() { - mGiftList = new ArrayList<>(); - if (EXTRA_GANK.equals(mViewsModel)) { - List giftBeen = MeiziArrayList.getInstance().getImagesList(); - mGiftList = changeImageList(giftBeen); - int size = ListUtils.getListSize(giftBeen); - if (size > 5) { - int point = size - 5; - if (mPosition >= point) { - mPresenter.fetchMore(); + if (isPositionEnd()) { + shortToast(getString(R.string.loading_all_over)); } } - } else { - mGiftList = getIntent().getParcelableArrayListExtra(EXTRA_LIST); } - } + }; - private void activityAnimation() { - Transition transition = null; - switch (transition_code) { - case TYPE_TRANSITION: - transition = TransitionInflater.from(this).inflateTransition(R.transition.gallery_mid); - break; - default: - break; - } + private void setupPageNumber(int position) { + int size = gifts == null ? 0 : gifts.size(); + String giftSize = String.valueOf(size); + String index = String.valueOf(position + 1); + progressPage.setText(StringHtml.getStringSize(index, giftSize, getString(R.string.page_format_mark), NUMBER_COLOR, 22)); + } - if (transition != null) { - getWindow().setEnterTransition(transition); - getWindow().setExitTransition(transition); + private List getGiftList() { + List gifts; + if (EXTRA_GANK.equals(browseModel)) { + List giftBeen = MeiziArrayList.getInstance().getImagesList(); + gifts = changeImageList(giftBeen); + } else { + gifts = getIntent().getParcelableArrayListExtra(EXTRA_LIST); } + return gifts == null ? new ArrayList<>() : gifts; } private void parseBundle() { Bundle bundle = getIntent().getExtras(); if (bundle != null) { - mPosition = bundle.getInt(EXTRA_POSITION, 0); - mViewsModel = bundle.getString(EXTRA_MODEL, EXTRA_GANK); - transition_code = bundle.getInt(TYPE, -1); - } - } - - @Override - protected void initViews() { - mPagerAdapter = new PagerAdapter(); - mViewPager.setAdapter(mPagerAdapter); - - mToolbar.setTitle(R.string.app_name); - setSupportActionBar(mToolbar); - ActionBar bar = getSupportActionBar(); - if (bar != null) { - bar.setDisplayHomeAsUpEnabled(true); //显示返回箭头 + position = bundle.getInt(EXTRA_POSITION, 0); + browseModel = bundle.getString(EXTRA_MODEL, EXTRA_GANK); } - - setNumberText(mPosition); - - mViewPager.setPageTransformer(true, new ZoomOutSlideTransformer()); - mViewPager.setOffscreenPageLimit(1); - mViewPager.setCurrentItem(mPosition); - mViewPager.addOnPageChangeListener(this); - mPagerAdapter.notifyDataSetChanged(); - - try { - Field mScroller = ViewPager.class.getDeclaredField("mScroller"); - mScroller.setAccessible(true); - FixedSpeedScroller scroller = new FixedSpeedScroller(mViewPager.getContext(), new LinearInterpolator()); - // scroller.setFixedDuration(5000); - mScroller.set(mViewPager, scroller); - } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) { - KLog.e(e); - } - } - - @Override - protected void bindListener() { - mToolbar.setNavigationOnClickListener(v -> onBackPressed()); } - private List changeImageList(List resultsBeen) { - List list = new ArrayList<>(); - if (!ListUtils.isListEmpty(resultsBeen)) { - ResultsBean resultsBean; + private List changeImageList(List resultsBeen) { + List list = new ArrayList<>(); + if (!ListUtils.isEmpty(resultsBeen)) { + Gank resultsBean; String url; for (int i = 0; i < resultsBeen.size(); i++) { resultsBean = resultsBeen.get(i); - url = resultsBean.getUrl(); - list.add(new GiftBean(url)); + url = resultsBean.url; + list.add(new Gift(url)); } } return list; } - @Override - public void appendData(List list) { - mGiftList.addAll(changeImageList(list)); - mPagerAdapter.notifyDataSetChanged(); - } - - @Override - public void sysNumText() { - setNumberText(mPosition); - } - - @Override - public void showRefresh() { - - } - - @Override - public void hideRefresh() { - - } - - @Override - public void hasNoMoreDate() { - - } - - @Override - public void showContent() { - - } - - @Override - public void showEmpty() { - - } - - @Override - public void showDisNetWork() { - - } - - @Override - public void showError() { - - } - - @Override - public void showLoading() { - - } - - @Override - public void showRefreshError(String errorStr) { - - } - @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.meizi_menu, menu); @@ -356,20 +203,17 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - @OnClick(R.id.brose_img_auto) + @OnClick(R.id.browse_auto) void onBrowseAuto() { changeBrowse(); } private void changeBrowse() { - disposeAutoTips(); - if (isCanPlay) { isCanPlay = false; - hideSystemUi(); if (!isPositionEnd()) { - imgAuto.setImageDrawable(getResources().getDrawable(R.drawable.ic_gallery_stop, getTheme())); + browseAuto.setImageDrawable(getResources().getDrawable(R.drawable.ic_gallery_stop, getTheme())); timerBrowse(); } else { stopBrowse(); @@ -377,96 +221,27 @@ private void changeBrowse() { } else { stopBrowse(); } - - delayShowAutoTips(isCanPlay); - } - - private void disposeAutoTips() { - if (autoTipable != null && !autoTipable.isDisposed()) { - autoTipable.dispose(); - } - } - - private void delayShowAutoTips(boolean isCanPlay) { - autoTipable = Observable.create((ObservableOnSubscribe) e -> { - e.onNext(""); - e.onComplete(); - }) - .delay(800, TimeUnit.MILLISECONDS) - .subscribeOn(AndroidSchedulers.mainThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(s -> { - if (!isCanPlay) { - animAutoTips(); - } - }); - } - - private void animAutoTips() { - txtAutoTip.animate().translationX(-getTipWidth).setDuration(800).setListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { - txtAutoTip.setAlpha(1); - } - - @Override - public void onAnimationEnd(Animator animation) { - txtAutoTip.animate().alpha(0).translationX(0).setDuration(800).setListener(new Animator.AnimatorListener() { - @Override - public void onAnimationStart(Animator animation) { - - } - - @Override - public void onAnimationEnd(Animator animation) { - - } - - @Override - public void onAnimationCancel(Animator animation) { - - } - - @Override - public void onAnimationRepeat(Animator animation) { - - } - }).setStartDelay(1500).start(); - } - - @Override - public void onAnimationCancel(Animator animation) { - - } - - @Override - public void onAnimationRepeat(Animator animation) { - - } - }).start(); } private void stopBrowse() { isCanPlay = true; - imgAuto.setImageDrawable(getResources().getDrawable(R.drawable.ic_gallery_play, getTheme())); + browseAuto.setImageDrawable(getResources().getDrawable(R.drawable.ic_gallery_play)); unSubscribeTime(); } - @OnClick(R.id.progress_txt_page) + @OnClick(R.id.progress_page) void onPageClick() { + stopBrowse(); ArrayList list = getSelectList(); if (list != null) { - stopBrowse(); - curItem = mPosition; - View outerView = LayoutInflater.from(this).inflate(R.layout.view_wheel, mRelativeLayout, false); - WheelView wv = (WheelView) outerView.findViewById(R.id.wheel_view_wv); - wv.setOffset(1); + View outerView = View.inflate(this, R.layout.view_wheel, null); + final WheelView wv = outerView.findViewById(R.id.wheel_view_wv); wv.setItems(list); - wv.setSeletion(curItem); + wv.setSeletion(position); wv.setOnWheelViewListener(new WheelView.OnWheelViewListener() { @Override public void onSelected(int selectedIndex, String item) { - curItem = selectedIndex - 1; + position = selectedIndex - 1; } }); @@ -474,22 +249,16 @@ public void onSelected(int selectedIndex, String item) { dialog.setTitle(R.string.gallery_page_select); dialog.setView(outerView); dialog.setPositiveButton(R.string.dialog_ok, (dialog1, which) -> { - mViewPager.setCurrentItem(curItem); dialog1.dismiss(); + viewPager.setCurrentItem(position); }); dialog.show(); } } - private boolean isFetch() { - int curPosition = mViewPager.getCurrentItem() + 1; - int p = getGiftSize() - curPosition; - return p <= 5; - } - private ArrayList getSelectList() { ArrayList list = null; - if (!isEmpty()) { + if (!ListUtils.isEmpty(gifts)) { list = new ArrayList<>(); for (int i = 0; i < getGiftSize(); i++) { list.add(i, String.valueOf(i + 1)); @@ -499,47 +268,27 @@ private ArrayList getSelectList() { } private int getGiftSize() { - return mGiftList == null ? 0 : mGiftList.size(); - } - - private boolean isEmpty() { - return ListUtils.isListEmpty(mGiftList); + return gifts == null ? 0 : gifts.size(); } - private class PagerAdapter extends FragmentStatePagerAdapter { - - public PagerAdapter() { - super(getSupportFragmentManager()); - } - - @Override - public int getCount() { - return getGiftSize(); - } - - @Override - public Fragment getItem(int position) { - return GalleryFragment.newInstance(mGiftList.get(position).getImgUrl()); - } - } - private int getAapterCount() { - return mPagerAdapter == null ? 0 : mPagerAdapter.getCount(); + private int getAdapterCount() { + return pagerAdapter == null ? 0 : pagerAdapter.getCount(); } private boolean isPositionEnd() { - return getAapterCount() == mPosition + 1; + return getAdapterCount() == position + 1; } private void timerBrowse() { - subscription = Observable.interval(1000, 2000, TimeUnit.MILLISECONDS) + subscription = Observable.interval(INITIAL_DELAY, INTERVALS, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(aLong -> { - if (aLong >= getAapterCount()) { + if (aLong >= getAdapterCount()) { stopBrowse(); } else { - int next = mPosition + 1; - mViewPager.setCurrentItem(next, true); + int next = position + 1; + viewPager.setCurrentItem(next, true); } if (isPositionEnd()) { stopBrowse(); @@ -575,7 +324,7 @@ private void setWallPaper(final String url, final FragmentActivity activity) { .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .skipMemoryCache(true) ) - .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) + .submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) .get(); } catch (InterruptedException | ExecutionException e) { KLog.e(e); @@ -589,7 +338,7 @@ private void setWallPaper(final String url, final FragmentActivity activity) { .subscribe(new Observer() { @Override public void onError(Throwable e) { - ToastUtils.showToast(R.string.meizi_wallpaper_failure); + ToastUtils.showToast(getBaseContext(), R.string.meizi_wallpaper_failure); KLog.e(e); CrashUtils.crashReport(e); } @@ -606,12 +355,12 @@ public void onSubscribe(Disposable d) { @Override public void onNext(Bitmap bitmap) { - myWallpaperManager = WallpaperManager + wallpaperManager = WallpaperManager .getInstance(getApplicationContext()); try { - Drawable wallpaperDrawable = myWallpaperManager.getDrawable(); - mBitmap = ((BitmapDrawable) wallpaperDrawable).getBitmap(); - myWallpaperManager.setBitmap(bitmap); + Drawable wallpaperDrawable = wallpaperManager.getDrawable(); + GalleryActivity.this.bitmap = ((BitmapDrawable) wallpaperDrawable).getBitmap(); + wallpaperManager.setBitmap(bitmap); } catch (IOException e) { KLog.e(e); CrashUtils.crashReport(e); @@ -621,29 +370,29 @@ public void onNext(Bitmap bitmap) { } private void revokeWallpaper() { - Snackbar.make(mViewPager, R.string.meizi_wallpaper_success, Snackbar.LENGTH_LONG) + Snackbar.make(viewPager, R.string.meizi_wallpaper_success, Snackbar.LENGTH_LONG) .setAction(R.string.revoke, v -> { try { - if (mBitmap != null) { - myWallpaperManager.setBitmap(mBitmap); + if (bitmap != null) { + wallpaperManager.setBitmap(bitmap); } } catch (IOException e) { KLog.e(e); } finally { - mBitmap = null; + bitmap = null; } - ToastUtils.showToast(R.string.meizi_revoke_success); + ToastUtils.showToast(getBaseContext(), R.string.meizi_revoke_success); }) .show(); } private String getImageUrl() { - int position = mViewPager.getCurrentItem(); + int position = viewPager.getCurrentItem(); String mUrl; - if (EXTRA_GANK.equals(mViewsModel)) { - mUrl = MeiziArrayList.getInstance().getResultBean(position).getUrl(); + if (EXTRA_GANK.equals(browseModel)) { + mUrl = MeiziArrayList.getInstance().getResultBean(position).url; } else { - mUrl = mGiftList.get(position).getImgUrl(); + mUrl = gifts.get(position).imgUrl; } return mUrl; } @@ -656,7 +405,7 @@ private void saveImagePath(String imgUrl, final boolean isShare) { public void onError(Throwable e) { KLog.e(e); CrashUtils.crashReport(e); - ToastUtils.showToast(e.getMessage()); + ToastUtils.showToast(getBaseContext(), e.getMessage()); } @Override @@ -673,14 +422,14 @@ public void onSubscribe(Disposable d) { public void onNext(Uri uri) { String imgPath = getImagePath(); if (TextUtils.isEmpty(imgPath)) { - ToastUtils.showToast(R.string.tip_img_path_error); + ToastUtils.showToast(getBaseContext(), R.string.tip_img_path_error); return; } if (isShare) { ShareUtils.shareSingleImage(GalleryActivity.this, uri); } else { String msg = String.format(getString(R.string.meizi_picture_save_path), imgPath); - ToastUtils.showToast(msg); + ToastUtils.showToast(getBaseContext(), msg); } } }); @@ -691,61 +440,9 @@ private String getImagePath() { return appDir.getAbsolutePath(); } - private void hideSystemUi() { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); - mToolbar.animate() - .translationY(-mToolbar.getHeight()) - .setDuration(400) - .setInterpolator(new DecelerateInterpolator(2)) - .start(); - } - - private void showSystemUi() { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); - mToolbar.animate() - .translationY(0) - .setDuration(400) - .setInterpolator(new DecelerateInterpolator(2)) - .start(); - } - - public void switchToolbar() { - if (mToolbar.getTranslationY() == 0) { - hideSystemUi(); - } else { - showSystemUi(); - stopBrowse(); - } - } - - @Override - protected void onResume() { - super.onResume(); - overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out); - } - @Override protected void onDestroy() { unSubscribeTime(); - txtAutoTip.animate().cancel(); super.onDestroy(); } - - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - getTipWidth = txtAutoTip.getWidth(); -// KLog.d(getTipWidth); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_BACK) { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); - finishAfterTransition(); - overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out); - return true; - } - return super.onKeyDown(keyCode, event); - } } diff --git a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryContract.java b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryContract.java index 0ddbce4b..3d1f4eee 100644 --- a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryContract.java +++ b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryContract.java @@ -1,25 +1,28 @@ package com.gank.gankly.ui.gallery; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import android.content.Context; +import android.ly.business.domain.Gank; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2017-01-16 - * Email:137387869@qq.com */ public interface GalleryContract { - interface View extends IFetchView { - void appendData(List list); - - void sysNumText(); + interface View extends SupportView { + void appendData(List list); } - interface Presenter extends IFetchPresenter { + abstract class Presenter extends LoadMorePresenter { + public Presenter(@NonNull Context context, View view) { + super(context, view); + } } } diff --git a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryFragment.java b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryFragment.java index 338a0a70..a593bce4 100644 --- a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryFragment.java @@ -1,12 +1,12 @@ package com.gank.gankly.ui.gallery; -import android.content.Context; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.View; import com.gank.gankly.R; -import com.gank.gankly.ui.base.BaseFragment; +import com.gank.gankly.ui.base.fragment.SupportFragment; import com.gank.gankly.widget.ProgressImageView; import butterknife.BindView; @@ -14,23 +14,18 @@ /** * 图片浏览 * Create by LingYan on 2016-12-19 - * Email:137387869@qq.com */ -public class GalleryFragment extends BaseFragment implements ProgressImageView.ImageViewOnClick { +public class GalleryFragment extends SupportFragment implements ProgressImageView.ImageViewOnClick { public static final String IMAGE_URL = "Image_Url"; @BindView(R.id.progress_img) ProgressImageView mProgressImageView; - private GalleryActivity mActivity; - private String mUrl; - public GalleryFragment() { - } + private String mUrl; @Override - public void onAttach(Context context) { - super.onAttach(context); - this.mActivity = (GalleryActivity) context; + protected int getLayoutId() { + return R.layout.fragment_browse_picture; } @Override @@ -41,31 +36,24 @@ public void onCreate(@Nullable Bundle savedInstanceState) { setHasOptionsMenu(true); } - private void parseArguments() { - Bundle bundle = getArguments(); - if (bundle != null) { - mUrl = bundle.getString(IMAGE_URL); - } - } - @Override - protected void initValues() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); mProgressImageView.load(mUrl, GalleryFragment.this); + mProgressImageView.setImageViewOnClick(this); } @Override - protected void initViews() { + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); } - @Override - protected void bindListener() { - mProgressImageView.setImageViewOnClick(this); - } - - @Override - protected int getLayoutId() { - return R.layout.fragment_browse_picture; + private void parseArguments() { + Bundle bundle = getArguments(); + if (bundle != null) { + mUrl = bundle.getString(IMAGE_URL); + } } public static GalleryFragment newInstance(String url) { @@ -78,6 +66,5 @@ public static GalleryFragment newInstance(String url) { @Override public void onImageClick(View v) { - mActivity.switchToolbar(); } } diff --git a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryPagerAdapter.java b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryPagerAdapter.java new file mode 100644 index 00000000..248da97e --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryPagerAdapter.java @@ -0,0 +1,30 @@ +package com.gank.gankly.ui.gallery; + +import android.ly.business.domain.Gift; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; + +import java.util.List; + +public class GalleryPagerAdapter extends FragmentStatePagerAdapter { + private List gifts; + + GalleryPagerAdapter(FragmentManager fragmentManager) { + super(fragmentManager); + } + + void setGifts(List gifts) { + this.gifts = gifts; + } + + @Override + public int getCount() { + return gifts == null ? 0 : gifts.size(); + } + + @Override + public Fragment getItem(int position) { + return GalleryFragment.newInstance(gifts.get(position).imgUrl); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryPresenter.java b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryPresenter.java index c1932475..ed1a86a5 100644 --- a/app/src/main/java/com/gank/gankly/ui/gallery/GalleryPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/gallery/GalleryPresenter.java @@ -1,44 +1,33 @@ package com.gank.gankly.ui.gallery; +import android.content.Context; + import com.gank.gankly.bean.GankResult; -import com.gank.gankly.bean.ResultsBean; import com.gank.gankly.config.MeiziArrayList; -import com.gank.gankly.mvp.FetchPresenter; import com.gank.gankly.mvp.source.remote.GankDataSource; import com.gank.gankly.utils.CrashUtils; -import com.gank.gankly.utils.ListUtils; import com.socks.library.KLog; -import java.util.List; - import io.reactivex.Observer; import io.reactivex.disposables.Disposable; /** * Create by LingYan on 2017-01-16 - * Email:137387869@qq.com */ -public class GalleryPresenter extends FetchPresenter implements GalleryContract.Presenter { +public class GalleryPresenter extends GalleryContract.Presenter { private GankDataSource mTask; private GalleryContract.View mModelView; private boolean isFetch; - public GalleryPresenter(GankDataSource task, GalleryContract.View view) { - mTask = task; - mModelView = view; + public GalleryPresenter(Context context, GalleryContract.View view) { + super(context, view); } - @Override - public void fetchNew() { - - } - - @Override public void fetchMore() { if (!isFetch) { int nextPage = MeiziArrayList.getInstance().getPage() + 1; - mTask.fetchWelfare(nextPage, getFetchLimit()) + mTask.fetchWelfare(nextPage,20) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { @@ -47,19 +36,19 @@ public void onSubscribe(Disposable d) { @Override public void onNext(GankResult gankResult) { - List list = filterData(gankResult.getResults(), mModelView); - if (ListUtils.getListSize(list) > 0) { - mModelView.appendData(list); - mModelView.sysNumText(); - MeiziArrayList.getInstance().addImages(gankResult.getResults(), nextPage); - } +// List list = filterData(gankResult.getResults(), mModelView); +// if (ListUtils.getSize(list) > 0) { +// mModelView.appendData(list); +// mModelView.sysNumText(); +// MeiziArrayList.getInstance().addImages(gankResult.getResults(), nextPage); +// } } @Override public void onError(Throwable e) { KLog.e(e); CrashUtils.crashReport(e); - parseError(mModelView); +// parseError(mModelView); } @Override @@ -71,12 +60,12 @@ public void onComplete() { } @Override - public void subscribe() { + public void destroy() { } @Override - public void unSubscribe() { + protected void onDestroy() { } } diff --git a/app/src/main/java/com/gank/gankly/ui/girls/GirlsAdapter.java b/app/src/main/java/com/gank/gankly/ui/girls/GirlsAdapter.java index 9bb52995..2e7a7f25 100644 --- a/app/src/main/java/com/gank/gankly/ui/girls/GirlsAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/girls/GirlsAdapter.java @@ -1,8 +1,8 @@ package com.gank.gankly.ui.girls; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; import android.view.ViewGroup; import com.gank.gankly.ui.base.LazyFragment; diff --git a/app/src/main/java/com/gank/gankly/ui/girls/GirlsFragment.java b/app/src/main/java/com/gank/gankly/ui/girls/GirlsFragment.java index bfed6feb..00b1430f 100644 --- a/app/src/main/java/com/gank/gankly/ui/girls/GirlsFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/girls/GirlsFragment.java @@ -1,21 +1,18 @@ package com.gank.gankly.ui.girls; -import android.content.Context; -import android.content.res.Resources; -import android.support.design.widget.TabLayout; -import android.support.v4.view.ViewPager; -import android.util.TypedValue; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.tabs.TabLayout; +import androidx.viewpager.widget.ViewPager; +import android.view.View; -import com.gank.gankly.App; import com.gank.gankly.R; import com.gank.gankly.config.Constants; -import com.gank.gankly.rxjava.RxBus_; -import com.gank.gankly.rxjava.theme.ThemeEvent; -import com.gank.gankly.ui.base.BaseFragment; import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.girls.cure.CureFragment; -import com.gank.gankly.ui.girls.pure.PureFragment; -import com.gank.gankly.ui.main.MainActivity; +import com.gank.gankly.ui.base.fragment.SupportFragment; +import com.gank.gankly.ui.cure.CureFragment; +import com.gank.gankly.ui.pure.PureFragment; import java.util.ArrayList; import java.util.List; @@ -26,15 +23,14 @@ /** * 美しい妹 * Create by LingYan on 2016-07-01 - * Email:137387869@qq.com */ -public class GirlsFragment extends BaseFragment implements ViewPager.OnPageChangeListener { +public class GirlsFragment extends SupportFragment implements ViewPager.OnPageChangeListener { @BindView(R.id.girl_tabLayout) TabLayout mTabLayout; + @BindView(R.id.girl_view_pager) ViewPager mViewPager; - private MainActivity mActivity; private GirlsAdapter mPagerAdapter; private Disposable mDisposable; @@ -46,37 +42,30 @@ protected int getLayoutId() { } @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { - mDisposable = RxBus_.getInstance().toObservable(ThemeEvent.class) - .subscribe(themeEvent -> { - refreshUi(); - }); - } - - @Override - protected void initValues() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); List mList = new ArrayList<>(); mList.add(new PureFragment()); -// mList.add(new DailyMeiziFragment()); mList.add(new CureFragment()); mTitles = new ArrayList<>(); mTitles.add(Constants.QINGCHUN); mTitles.add(Constants.CURE); - mPagerAdapter = new GirlsAdapter(mActivity.getSupportFragmentManager(), mList, mTitles); + mPagerAdapter = new GirlsAdapter(getChildFragmentManager(), mList, mTitles); mViewPager.setAdapter(mPagerAdapter); mViewPager.setOffscreenPageLimit(1); mViewPager.addOnPageChangeListener(this); + mViewPager.setCurrentItem(0); initTabLayout(); } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + } + private void initTabLayout() { for (int i = 0; i < mTitles.size(); i++) { mTabLayout.addTab(mTabLayout.newTab().setText(mTitles.get(i))); @@ -84,15 +73,7 @@ private void initTabLayout() { mTabLayout.setupWithViewPager(mViewPager); mTabLayout.setTabMode(TabLayout.MODE_FIXED); - mTabLayout.setSelectedTabIndicatorColor(App.getAppColor(R.color.white)); - } - - private void refreshUi() { - TypedValue typedValue = new TypedValue(); - Resources.Theme theme = mActivity.getTheme(); - theme.resolveAttribute(R.attr.colorPrimary, typedValue, true); - int background = typedValue.data; - mTabLayout.setBackgroundColor(background); + mTabLayout.setSelectedTabIndicatorColor(getContext().getResources().getColor(R.color.white)); } @Override @@ -106,10 +87,4 @@ public void onPageSelected(int position) { @Override public void onPageScrollStateChanged(int state) { } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - mActivity = (MainActivity) context; - } } \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/ui/girls/cure/CureAdapter.java b/app/src/main/java/com/gank/gankly/ui/girls/cure/CureAdapter.java deleted file mode 100644 index cf13ffdf..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/cure/CureAdapter.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.gank.gankly.ui.girls.cure; - -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.gank.gankly.R; -import com.gank.gankly.bean.DailyMeiziBean; -import com.gank.gankly.listener.ItemClick; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Create by LingYan on 2016-07-05 - * Email:137387869@qq.com - */ -public class CureAdapter extends RecyclerView.Adapter { - private ItemClick mMeiZiOnClick; - private List mDailyMeiziBeanList; - - public CureAdapter() { - setHasStableIds(true); - mDailyMeiziBeanList = new ArrayList<>(); - } - - @Override - public CureAdapter.DailyMeiziHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_dailymeizi, parent, false); - return new DailyMeiziHolder(view); - } - - @Override - public void onBindViewHolder(CureAdapter.DailyMeiziHolder holder, int position) { - DailyMeiziBean dailyMeiziBean = mDailyMeiziBeanList.get(position); - holder.dailyMeiziBean = dailyMeiziBean; - if (dailyMeiziBean != null) { - holder.txtTitle.setText(dailyMeiziBean.getTitle()); - } - } - - public void setOnItemClickListener(ItemClick onItemClickListener) { - mMeiZiOnClick = onItemClickListener; - } - - @Override - public int getItemCount() { - return mDailyMeiziBeanList.size(); - } - - @Override - public long getItemId(int position) { - return position; - } - - public void refillItem(List dailyMeiziBeanList) { - int size = mDailyMeiziBeanList.size(); - mDailyMeiziBeanList.clear(); - notifyItemRangeRemoved(0, size); - appendItem(dailyMeiziBeanList); - } - - public void appendItem(List dailyMeiziBeanList) { - mDailyMeiziBeanList.addAll(dailyMeiziBeanList); - notifyItemRangeInserted(getItemCount(), dailyMeiziBeanList.size()); - } - - public class DailyMeiziHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - @BindView(R.id.daily_meizi_title) - TextView txtTitle; - DailyMeiziBean dailyMeiziBean; - - public DailyMeiziHolder(View itemView) { - super(itemView); - itemView.setOnClickListener(this); - ButterKnife.bind(this, itemView); - } - - @Override - public void onClick(View v) { - if (mMeiZiOnClick != null) { - mMeiZiOnClick.onClick(getAdapterPosition(), dailyMeiziBean); - } - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/cure/CureContract.java b/app/src/main/java/com/gank/gankly/ui/girls/cure/CureContract.java deleted file mode 100644 index e5df68a7..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/cure/CureContract.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gank.gankly.ui.girls.cure; - -import com.gank.gankly.bean.DailyMeiziBean; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; - -import java.util.ArrayList; -import java.util.List; - -/** - * Create by LingYan on 2016-10-26 - * Email:137387869@qq.com - */ - -public interface CureContract { - interface View extends IFetchView { - void refillData(List list); - - void appendItem(List list); - - void setMaxProgress(int value); - - void disProgressDialog(); - - void openBrowseActivity(ArrayList list); - } - - interface Presenter extends IFetchPresenter { - void girlsImages(String url); - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/cure/CureFragment.java b/app/src/main/java/com/gank/gankly/ui/girls/cure/CureFragment.java deleted file mode 100644 index ff824a7c..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/cure/CureFragment.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.gank.gankly.ui.girls.cure; - -import android.app.ProgressDialog; -import android.content.Context; -import android.content.Intent; -import android.content.res.Resources; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.text.TextUtils; -import android.util.TypedValue; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.gank.gankly.App; -import com.gank.gankly.R; -import com.gank.gankly.bean.DailyMeiziBean; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.listener.ItemClick; -import com.gank.gankly.mvp.source.remote.MeiziDataSource; -import com.gank.gankly.rxjava.RxBus_; -import com.gank.gankly.rxjava.theme.ThemeEvent; -import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.gallery.GalleryActivity; -import com.gank.gankly.ui.main.MainActivity; -import com.gank.gankly.utils.StyleUtils; -import com.gank.gankly.widget.LySwipeRefreshLayout; -import com.gank.gankly.widget.MultipleStatusView; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import io.reactivex.disposables.Disposable; - -/** - * 妹子每日更新 - * Create by LingYan on 2016-07-01 - * Email:137387869@qq.com - */ -public class CureFragment extends LazyFragment implements CureContract.View, ItemClick { - @BindView(R.id.multiple_status_view) - MultipleStatusView mMultipleStatusView; - @BindView(R.id.meizi_swipe_refresh) - LySwipeRefreshLayout mSwipeRefreshLayout; - - private CureAdapter mCureAdapter; - private CurePresenter mPresenter; - private MainActivity mActivity; - private Disposable mDisposable; - - private ProgressDialog mDialog; - - @Override - protected int getLayoutId() { - return R.layout.fragment_gift; - } - - @Override - protected void initPresenter() { - mPresenter = new CurePresenter(MeiziDataSource.getInstance(), this); - } - - @Override - protected void initValues() { - mDisposable = RxBus_.getInstance().toObservable(ThemeEvent.class) - .subscribe(themeEvent -> changeUi()); - } - - @Override - protected void initViews() { - mCureAdapter = new CureAdapter(); - mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity, LinearLayoutManager.VERTICAL, false)); - mSwipeRefreshLayout.setAdapter(mCureAdapter); - setSwipeRefreshLayout(mSwipeRefreshLayout); - } - - @Override - protected void bindListener() { - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { - @Override - public void onRefresh() { - mPresenter.fetchNew(); - } - - @Override - public void onLoadMore() { - mPresenter.fetchMore(); - } - }); - - mCureAdapter.setOnItemClickListener(this); - } - - @Override - protected void initData() { - mMultipleStatusView.showLoading(); - mPresenter.fetchNew(); - } - - private void changeUi() { - TypedValue typedValue = new TypedValue(); - Resources.Theme theme = mActivity.getTheme(); - theme.resolveAttribute(R.attr.meiziDailyItemBackground, typedValue, true); - int background = typedValue.data; - TypedValue textValue = new TypedValue(); - theme.resolveAttribute(R.attr.baseAdapterItemTextColor, textValue, true); - int textColor = textValue.data; - theme.resolveAttribute(R.attr.themeBackground, textValue, true); - int recyclerColor = textValue.data; - mSwipeRefreshLayout.getRecyclerView().setBackgroundColor(recyclerColor); - - int childCount = mSwipeRefreshLayout.getRecyclerView().getChildCount(); - for (int childIndex = 0; childIndex < childCount; childIndex++) { - ViewGroup childView = (ViewGroup) mSwipeRefreshLayout.getRecyclerView().getChildAt(childIndex); - childView.setBackgroundColor(background); - TextView title = (TextView) childView.findViewById(R.id.daily_meizi_title); - title.setTextColor(textColor); - } - - StyleUtils.clearRecyclerViewItem(mSwipeRefreshLayout.getRecyclerView()); - StyleUtils.changeSwipeRefreshLayout(mSwipeRefreshLayout); - } - - private void showLoadingDialog() { - if (mDialog == null) { - mDialog = new ProgressDialog(mActivity); - } - mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); - mDialog.setMessage(App.getAppString(R.string.loading_meizi_images)); - mDialog.setIndeterminate(true); - mDialog.setCanceledOnTouchOutside(true); - mDialog.setOnCancelListener(dialog -> mPresenter.unSubscribe()); - if (!mDialog.isShowing()) { - mDialog.show(); - } - } - - @Override - public void openBrowseActivity(@NonNull ArrayList list) { - Bundle bundle = new Bundle(); - Intent intent = new Intent(mActivity, GalleryActivity.class); - bundle.putString(GalleryActivity.EXTRA_MODEL, GalleryActivity.EXTRA_DAILY); - intent.putExtra(GalleryActivity.EXTRA_LIST, list); - intent.putExtras(bundle); - mActivity.startActivity(intent); - } - - @Override - public void hideRefresh() { - mSwipeRefreshLayout.setRefreshing(false); - } - - @Override - public void hasNoMoreDate() { - - } - - @Override - public void showRefresh() { - mSwipeRefreshLayout.setRefreshing(true); - } - - @Override - public void showRefreshError(String errorStr) { - - } - - @Override - public void showContent() { - mMultipleStatusView.showContent(); - } - - @Override - public void showEmpty() { - - } - - @Override - public void showDisNetWork() { - - } - - @Override - public void showError() { - - } - - @Override - public void showLoading() { - - } - - @Override - public void onClick(int position, Object object) { - DailyMeiziBean dailyMeiziBean = (DailyMeiziBean) object; - String url = dailyMeiziBean.getUrl(); - if (!TextUtils.isEmpty(url)) { - showLoadingDialog(); - mPresenter.girlsImages(url); - } - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - mActivity = (MainActivity) context; - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override - public void refillData(List list) { - mCureAdapter.refillItem(list); - } - - @Override - public void appendItem(List list) { - mCureAdapter.appendItem(list); - } - - @Override - public void setMaxProgress(int value) { - if (mDialog != null) { - mDialog.setMax(value); - } - } - - @Override - public void disProgressDialog() { - if (mDialog != null && mDialog.isShowing()) { - mDialog.dismiss(); - } - } - - @Override - protected void callBackRefreshUi() { - - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - if (mDisposable != null && !mDisposable.isDisposed()) { - mDisposable.dispose(); - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/cure/CurePresenter.java b/app/src/main/java/com/gank/gankly/ui/girls/cure/CurePresenter.java deleted file mode 100644 index 86ce2c59..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/cure/CurePresenter.java +++ /dev/null @@ -1,286 +0,0 @@ -package com.gank.gankly.ui.girls.cure; - -import com.gank.gankly.bean.DailyMeiziBean; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.mvp.FetchPresenter; -import com.gank.gankly.mvp.source.remote.MeiziDataSource; -import com.gank.gankly.utils.ListUtils; -import com.socks.library.KLog; - -import org.jsoup.nodes.Document; -import org.jsoup.select.Elements; - -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.Observer; -import io.reactivex.disposables.Disposable; - -/** - * Create by LingYan on 2016-10-26 - * Email:137387869@qq.com - */ - -class CurePresenter extends FetchPresenter implements CureContract.Presenter { - private static final String MEIZI_FIRST_URL = "http://www.meizitu.com/a/qingchun_3_"; - private static final int LIMIT = 30; - - private final MeiziDataSource mTask; - private final CureContract.View mModelView; - - private ArrayList imagesList; - private int max; - - CurePresenter(MeiziDataSource task, CureContract.View view) { - mTask = task; - mModelView = view; - } - - @Override - public void fetchNew() { - String url = getMeiziUrl(); - setFetchLimit(LIMIT); - fetchData(url); - } - - @Override - public void fetchMore() { - String url = getMeiziUrl(); - if (hasMore()) { - mModelView.showRefresh(); - fetchData(url); - } - //empty - } - - private void fetchData(String url) { - mTask.fetchDaily(url) - .subscribe(new Observer() { - @Override - public void onComplete() { - setFetchPage(getFetchPage() + 1); - mModelView.showContent(); - mModelView.hideRefresh(); - } - - @Override - public void onError(Throwable e) { - KLog.e(e); - parseError(mModelView); - } - - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(Document document) { - parseMeiZiTu(document); - } - }); - } - - @Override - public void subscribe() { - //empty - } - - @Override - public void unSubscribe() { - //empty - } - - @Override - public void girlsImages(final String url) { - mTask.fetchDailyDays(url) - .subscribe(new Observer() { - @Override - public void onComplete() { - mModelView.disProgressDialog(); - mModelView.openBrowseActivity(imagesList); - } - - @Override - public void onError(Throwable e) { - KLog.e(e); - } - - @Override - public void onSubscribe(Disposable d) { - //empty - } - - @Override - public void onNext(Document doc) { - getImagesList(doc); - } - }); - } - - private void getImagesList(Document doc) { - imagesList = new ArrayList<>(); - if (doc != null) { - Elements imgs = doc.select("#picture img"); - if (imgs != null && imgs.size() > 0) { - for (int i = 0; i < imgs.size(); i++) { - String src = imgs.get(i).attr("src"); - imagesList.add(new GiftBean(src)); - } - } - } - } - - private String getMeiziUrl() { - return MEIZI_FIRST_URL + getFetchPage() + ".html"; - } - - private void getImages(String url) { - mTask.fetchDailyDetailUrls(url) - .map(this::getImageCountList) - .subscribe(new Observer() { - @Override - public void onComplete() { - mModelView.disProgressDialog(); - mModelView.openBrowseActivity(imagesList); - } - - @Override - public void onError(Throwable e) { - mModelView.disProgressDialog(); - KLog.e(e); - } - - @Override - public void onSubscribe(Disposable d) { - //empty - } - - @Override - public void onNext(String url) { - imagesList = new ArrayList<>(); - String baseUrl = null; - String name = null; - String endType = null; - int lastPointIndex; - int lastNameIndex; - if (url.contains(".")) { - if (url.contains("-")) { - lastPointIndex = url.lastIndexOf("-"); - } else { - lastPointIndex = url.lastIndexOf("."); - } - lastNameIndex = url.lastIndexOf("/"); - baseUrl = url.substring(0, lastNameIndex); - name = url.substring(lastNameIndex, lastPointIndex - 2); - endType = url.substring(lastPointIndex, url.length()); - } - - String number; - String lastUrl; - for (int i = 1; i <= max; i++) { - if (i < 10) { - number = "0" + i; - } else { - number = String.valueOf(i); - } - lastUrl = baseUrl + name + number + endType; - imagesList.add(new GiftBean(lastUrl)); - } - } - }); - } - - private void parseMeiZiTu(Document document) { - if (document != null) { - List list = getColumnList(document); - list = filterData(list, mModelView); - if (ListUtils.getListSize(list) > 0) { - if(getFetchPage() >1){ - mModelView.appendItem(list); - }else { - mModelView.refillData(list); - } - } - } - } - - private void parseDocument(Document document) { - if (document != null) { - List list = getDays(document); - list = filterData(list, mModelView); - if (ListUtils.getListSize(list) > 0) { - mModelView.refillData(list); - } - } - } - - private List getColumnList(Document doc) { - List list = new ArrayList<>(); - if (doc != null) { - Elements times = doc.select(".con"); - KLog.d("times" + times.size()); - Elements imgs = doc.select(".con img"); - Elements a_href = doc.select(".con .pic a"); - for (int i = 0; i < times.size(); i++) { - KLog.d("href:" + a_href.get(i).attr("href")); - list.add(new DailyMeiziBean(a_href.get(i).attr("href"), times.get(i).text())); - } - } - return list; - } - - /** - * 筛选过滤得到月份集合 - */ - private List getDays(Document doc) { - List list = new ArrayList<>(); - if (doc != null) { - Elements times = doc.select(".post-content .archive-brick"); - Elements a_href = doc.select(".post-content .archive-brick a"); - for (int i = 0; i < a_href.size(); i++) { - list.add(new DailyMeiziBean(a_href.get(i).attr("href"), times.get(i).text())); - } - } - return list; - } - - - private int getImageUrlsMax(Document doc) { - int max = 0; - if (doc != null) { - Elements page = doc.select(".prev-next-page"); - if (page.size() > 0) { - String mm = page.get(0).text(); - String[] split = mm.split("/"); - int length = split.length; - if (length > 1) { - String s = split[1]; - mm = s.substring(0, s.length() - 1); - try { - max = Integer.parseInt(mm); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - } - - return max; - } - - private String getImageUrl(String url) { - return url + "/" + 0; - } - - private String getImageCountList(Document doc) { - String imgUrl = null; - if (doc != null) { - Elements page = doc.select(".place-padding p a img"); - for (int i = 0; i < page.size(); i++) { - imgUrl = page.get(i).attr("src"); - } - } - return imgUrl; - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziAdapter.java b/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziAdapter.java deleted file mode 100644 index 73afb6a9..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziAdapter.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.gank.gankly.ui.girls.dailymeizi; - -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.gank.gankly.R; -import com.gank.gankly.bean.DailyMeiziBean; -import com.gank.gankly.listener.ItemClick; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Create by LingYan on 2016-07-05 - * Email:137387869@qq.com - */ -public class DailyMeiziAdapter extends RecyclerView.Adapter { - private ItemClick mMeiZiOnClick; - private List mDailyMeiziBeanList; - - public DailyMeiziAdapter() { - setHasStableIds(true); - mDailyMeiziBeanList = new ArrayList<>(); - } - - @Override - public DailyMeiziAdapter.DailyMeiziHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_dailymeizi, parent, false); - return new DailyMeiziHolder(view); - } - - @Override - public void onBindViewHolder(DailyMeiziAdapter.DailyMeiziHolder holder, int position) { - DailyMeiziBean dailyMeiziBean = mDailyMeiziBeanList.get(position); - holder.dailyMeiziBean = dailyMeiziBean; - if (dailyMeiziBean != null) { - holder.txtTitle.setText(dailyMeiziBean.getTitle()); - } - } - - public void setOnItemClickListener(ItemClick onItemClickListener) { - mMeiZiOnClick = onItemClickListener; - } - - @Override - public int getItemCount() { - return mDailyMeiziBeanList.size(); - } - - @Override - public long getItemId(int position) { - return position; - } - - public void refillItem(List dailyMeiziBeanList) { - int size = mDailyMeiziBeanList.size(); - mDailyMeiziBeanList.clear(); - notifyItemRangeRemoved(0, size); - appendItem(dailyMeiziBeanList); - } - - public void appendItem(List dailyMeiziBeanList) { - mDailyMeiziBeanList.addAll(dailyMeiziBeanList); - notifyItemRangeInserted(getItemCount(), dailyMeiziBeanList.size()); - } - - public class DailyMeiziHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - @BindView(R.id.daily_meizi_title) - TextView txtTitle; - DailyMeiziBean dailyMeiziBean; - - public DailyMeiziHolder(View itemView) { - super(itemView); - itemView.setOnClickListener(this); - ButterKnife.bind(this, itemView); - } - - @Override - public void onClick(View v) { - if (mMeiZiOnClick != null) { - mMeiZiOnClick.onClick(getAdapterPosition(), dailyMeiziBean); - } - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziContract.java b/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziContract.java deleted file mode 100644 index 92a9c668..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziContract.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gank.gankly.ui.girls.dailymeizi; - -import com.gank.gankly.bean.DailyMeiziBean; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; - -import java.util.ArrayList; -import java.util.List; - -/** - * Create by LingYan on 2016-10-26 - * Email:137387869@qq.com - */ - -public interface DailyMeiziContract { - interface View extends IFetchView { - void refillData(List list); - - void appendItem(List list); - - void setMaxProgress(int value); - - void disProgressDialog(); - - void openBrowseActivity(ArrayList list); - } - - interface Presenter extends IFetchPresenter { - void girlsImages(String url); - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziFragment.java b/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziFragment.java deleted file mode 100644 index 30694f0f..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/dailymeizi/DailyMeiziFragment.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.gank.gankly.ui.girls.dailymeizi; - -import android.app.ProgressDialog; -import android.content.Context; -import android.content.Intent; -import android.content.res.Resources; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.text.TextUtils; -import android.util.TypedValue; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.gank.gankly.App; -import com.gank.gankly.R; -import com.gank.gankly.rxjava.RxBus_; -import com.gank.gankly.rxjava.theme.ThemeEvent; -import com.gank.gankly.bean.DailyMeiziBean; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.listener.ItemClick; -import com.gank.gankly.mvp.source.remote.MeiziDataSource; -import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.gallery.GalleryActivity; -import com.gank.gankly.ui.main.MainActivity; -import com.gank.gankly.utils.StyleUtils; -import com.gank.gankly.widget.LySwipeRefreshLayout; -import com.gank.gankly.widget.MultipleStatusView; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import io.reactivex.disposables.Disposable; - -/** - * 妹子每日更新 - * Create by LingYan on 2016-07-01 - * Email:137387869@qq.com - */ -public class DailyMeiziFragment extends LazyFragment implements DailyMeiziContract.View, ItemClick { - @BindView(R.id.multiple_status_view) - MultipleStatusView mMultipleStatusView; - @BindView(R.id.meizi_swipe_refresh) - LySwipeRefreshLayout mSwipeRefreshLayout; - - private DailyMeiziAdapter mDailyMeiziAdapter; - private DailyMeiziPresenter mPresenter; - private MainActivity mActivity; - private Disposable mDisposable; - - private ProgressDialog mDialog; - - @Override - protected int getLayoutId() { - return R.layout.fragment_gift; - } - - @Override - protected void initPresenter() { - mPresenter = new DailyMeiziPresenter(MeiziDataSource.getInstance(), this); - } - - @Override - protected void initValues() { - mDisposable = RxBus_.getInstance().toObservable(ThemeEvent.class) - .subscribe(themeEvent -> changeUi()); - } - - @Override - protected void initViews() { - mDailyMeiziAdapter = new DailyMeiziAdapter(); - mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity, LinearLayoutManager.VERTICAL, false)); - mSwipeRefreshLayout.setAdapter(mDailyMeiziAdapter); - setSwipeRefreshLayout(mSwipeRefreshLayout); - } - - @Override - protected void bindListener() { - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { - @Override - public void onRefresh() { - mPresenter.fetchNew(); - } - - @Override - public void onLoadMore() { -// mPresenter.fetchMore(); - } - }); - - mDailyMeiziAdapter.setOnItemClickListener(this); - } - - @Override - protected void initData() { - mMultipleStatusView.showLoading(); - mPresenter.fetchNew(); - } - - private void changeUi() { - TypedValue typedValue = new TypedValue(); - Resources.Theme theme = mActivity.getTheme(); - theme.resolveAttribute(R.attr.meiziDailyItemBackground, typedValue, true); - int background = typedValue.data; - TypedValue textValue = new TypedValue(); - theme.resolveAttribute(R.attr.baseAdapterItemTextColor, textValue, true); - int textColor = textValue.data; - theme.resolveAttribute(R.attr.themeBackground, textValue, true); - int recyclerColor = textValue.data; - mSwipeRefreshLayout.getRecyclerView().setBackgroundColor(recyclerColor); - - int childCount = mSwipeRefreshLayout.getRecyclerView().getChildCount(); - for (int childIndex = 0; childIndex < childCount; childIndex++) { - ViewGroup childView = (ViewGroup) mSwipeRefreshLayout.getRecyclerView().getChildAt(childIndex); - childView.setBackgroundColor(background); - TextView title = (TextView) childView.findViewById(R.id.daily_meizi_title); - title.setTextColor(textColor); - } - - StyleUtils.clearRecyclerViewItem(mSwipeRefreshLayout.getRecyclerView()); - StyleUtils.changeSwipeRefreshLayout(mSwipeRefreshLayout); - } - - private void showLoadingDialog() { - if (mDialog == null) { - mDialog = new ProgressDialog(mActivity); - } - mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); - mDialog.setMessage(App.getAppString(R.string.loading_meizi_images)); - mDialog.setIndeterminate(true); - mDialog.setCanceledOnTouchOutside(true); - mDialog.setOnCancelListener(dialog -> mPresenter.unSubscribe()); - if (!mDialog.isShowing()) { - mDialog.show(); - } - } - - @Override - public void openBrowseActivity(@NonNull ArrayList list) { - Bundle bundle = new Bundle(); - Intent intent = new Intent(mActivity, GalleryActivity.class); - bundle.putString(GalleryActivity.EXTRA_MODEL, GalleryActivity.EXTRA_DAILY); - intent.putExtra(GalleryActivity.EXTRA_LIST, list); - intent.putExtras(bundle); - mActivity.startActivity(intent); - } - - @Override - public void hideRefresh() { - mSwipeRefreshLayout.setRefreshing(false); - } - - @Override - public void hasNoMoreDate() { - - } - - @Override - public void showRefresh() { - - } - - @Override - public void showRefreshError(String errorStr) { - - } - - @Override - public void showContent() { - mMultipleStatusView.showContent(); - } - - @Override - public void showEmpty() { - - } - - @Override - public void showDisNetWork() { - - } - - @Override - public void showError() { - - } - - @Override - public void showLoading() { - mSwipeRefreshLayout.setRefreshing(true); - } - - @Override - public void onClick(int position, Object object) { - DailyMeiziBean dailyMeiziBean = (DailyMeiziBean) object; - String url = dailyMeiziBean.getUrl(); - if (!TextUtils.isEmpty(url)) { - showLoadingDialog(); - mPresenter.girlsImages(url); - } - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - mActivity = (MainActivity) context; - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override - public void refillData(List list) { - mDailyMeiziAdapter.refillItem(list); - } - - @Override - public void appendItem(List list) { - mDailyMeiziAdapter.appendItem(list); - } - - @Override - public void setMaxProgress(int value) { - if (mDialog != null) { - mDialog.setMax(value); - } - } - - @Override - public void disProgressDialog() { - if (mDialog != null && mDialog.isShowing()) { - mDialog.dismiss(); - } - } - - @Override - protected void callBackRefreshUi() { - - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - if (mDisposable != null && !mDisposable.isDisposed()) { - mDisposable.dispose(); - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/pure/PureAdapter.java b/app/src/main/java/com/gank/gankly/ui/girls/pure/PureAdapter.java deleted file mode 100644 index c871a7b8..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/pure/PureAdapter.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.gank.gankly.ui.girls.pure; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.model.GlideUrl; -import com.bumptech.glide.load.model.LazyHeaders; -import com.bumptech.glide.request.RequestOptions; -import com.gank.gankly.R; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.listener.ItemClick; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Create by LingYan on 2016-04-25 - * Email:137387869@qq.com - */ -public class PureAdapter extends RecyclerView.Adapter { - private List mResults; - private ItemClick mMeiZiOnClick; - private Context mContext; - - public PureAdapter(Context context) { - setHasStableIds(true); - mResults = new ArrayList<>(); - mContext = context; - } - - @Override - public GankViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_gift, parent, false); - return new GankViewHolder(view); - } - - @Override - public void onBindViewHolder(GankViewHolder holder, int position) { - final GiftBean bean = mResults.get(holder.getAdapterPosition()); - holder.mGiftBean = bean; - holder.position = position; - holder.txtDesc.setText(bean.getTitle()); - holder.txtAuthor.setText(bean.getTime()); - GlideUrl glideUrl = new GlideUrl(bean.getImgUrl(), new LazyHeaders.Builder() - .addHeader("referer", "http://www.mzitu.com/mm/") - .build()); - Glide.with(mContext) - .asBitmap() - .load(glideUrl) - .apply(new RequestOptions() - .fitCenter() - .diskCacheStrategy(DiskCacheStrategy.ALL) - ) - .into(holder.mImageView); - } - - @Override - public int getItemCount() { - return mResults.size(); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public void onViewRecycled(GankViewHolder holder) { - super.onViewRecycled(holder); - Glide.get(mContext).clearMemory(); - } - - public void refillItems(List getResults) { - int size = mResults.size(); - mResults.clear(); - notifyItemRangeRemoved(0, size); - appedItems(getResults); - } - - public void appedItems(List getResults) { - mResults.addAll(getResults); - notifyItemRangeInserted(mResults.size(), getResults.size()); - } - - public void clear() { - if (mResults != null) { - mResults.clear(); - } - } - - public void setOnItemClickListener(ItemClick onItemClickListener) { - mMeiZiOnClick = onItemClickListener; - } - - class GankViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - @BindView(R.id.goods_txt_title) - TextView txtDesc; - @BindView(R.id.goods_img_bg) - ImageView mImageView; - @BindView(R.id.video_txt_author) - TextView txtAuthor; - int position; - GiftBean mGiftBean; - - public GankViewHolder(View itemView) { - super(itemView); - itemView.setOnClickListener(this); - ButterKnife.bind(this, itemView); - } - - @Override - public void onClick(View v) { - if (mMeiZiOnClick != null) { - mMeiZiOnClick.onClick(position, mGiftBean); - } - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/pure/PureContract.java b/app/src/main/java/com/gank/gankly/ui/girls/pure/PureContract.java deleted file mode 100644 index 5d055e2c..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/pure/PureContract.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gank.gankly.ui.girls.pure; - -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; - -import java.util.ArrayList; -import java.util.List; - -/** - * Create by LingYan on 2016-12-27 - * Email:137387869@qq.com - */ - -public interface PureContract { - interface View extends IFetchView { - void refillData(List list); - - void appendData(List list); - - void openGalleryActivity(ArrayList list); - - void disLoadingDialog(); - } - - interface Presenter extends IFetchPresenter { - void fetchImages(String url); - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/pure/PureFragment.java b/app/src/main/java/com/gank/gankly/ui/girls/pure/PureFragment.java deleted file mode 100644 index fbd6f10c..00000000 --- a/app/src/main/java/com/gank/gankly/ui/girls/pure/PureFragment.java +++ /dev/null @@ -1,287 +0,0 @@ -package com.gank.gankly.ui.girls.pure; - -import android.app.ProgressDialog; -import android.content.Context; -import android.content.Intent; -import android.content.res.Resources; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.ActivityOptionsCompat; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; -import android.util.TypedValue; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.gank.gankly.App; -import com.gank.gankly.R; -import com.gank.gankly.rxjava.RxBus_; -import com.gank.gankly.rxjava.theme.ThemeEvent; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.listener.ItemClick; -import com.gank.gankly.mvp.source.remote.MeiziDataSource; -import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.gallery.GalleryActivity; -import com.gank.gankly.ui.main.MainActivity; -import com.gank.gankly.utils.DisplayUtils; -import com.gank.gankly.utils.StyleUtils; -import com.gank.gankly.widget.LySwipeRefreshLayout; -import com.gank.gankly.widget.MultipleStatusView; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import butterknife.BindView; -import io.reactivex.Observable; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; - -/** - * 清纯妹子 - * Create by LingYan on 2016-05-17 - * Email:137387869@qq.com - */ -public class PureFragment extends LazyFragment implements ItemClick, PureContract.View { - @BindView(R.id.meizi_swipe_refresh) - LySwipeRefreshLayout mSwipeRefreshLayout; - @BindView(R.id.multiple_status_view) - MultipleStatusView mMultipleStatusView; - - private RecyclerView mRecyclerView; - private PureAdapter mAdapter; - private MainActivity mActivity; - private Disposable mDisposable; - - private ArrayList mImageCountList = new ArrayList<>(); - private ProgressDialog mDialog; - private PureContract.Presenter mPresenter; - - @Override - protected int getLayoutId() { - return R.layout.fragment_gift; - } - - public static PureFragment getInstance() { - return new PureFragment(); - } - - @Override - protected void initPresenter() { - mPresenter = new PurePresenter(MeiziDataSource.getInstance(), this); - } - - @Override - protected void initValues() { -// initRefresh(); - mDisposable = RxBus_.getInstance().toObservable(ThemeEvent.class) - .subscribe(themeEvent -> changeUi()); - } - - @Override - protected void initViews() { - initRecycler(); - setSwipeRefreshLayout(mSwipeRefreshLayout); - } - - @Override - protected void bindListener() { - mAdapter.setOnItemClickListener(this); - } - - @Override - protected void initData() { - initRefresh(); - } - - private void initRefresh() { - mMultipleStatusView.showLoading(); - mPresenter.fetchNew(); - } - - private void changeUi() { - TypedValue typedValue = new TypedValue(); - Resources.Theme theme = mActivity.getTheme(); - theme.resolveAttribute(R.attr.baseAdapterItemBackground, typedValue, true); - int background = typedValue.data; - TypedValue textValue = new TypedValue(); - theme.resolveAttribute(R.attr.baseAdapterItemTextColor, textValue, true); - int textColor = textValue.data; - theme.resolveAttribute(R.attr.themeBackground, textValue, true); - int recyclerColor = textValue.data; - mRecyclerView.setBackgroundColor(recyclerColor); - - int childCount = mRecyclerView.getChildCount(); - for (int childIndex = 0; childIndex < childCount; childIndex++) { - ViewGroup childView = (ViewGroup) mRecyclerView.getChildAt(childIndex); - TextView title = (TextView) childView.findViewById(R.id.goods_txt_title); - title.setTextColor(textColor); - View rlView = childView.findViewById(R.id.goods_rl_title); - rlView.setBackgroundColor(background); - } - - StyleUtils.clearRecyclerViewItem(mRecyclerView); - StyleUtils.changeSwipeRefreshLayout(mSwipeRefreshLayout); - } - - private void initRecycler() { - mAdapter = new PureAdapter(mActivity); - mSwipeRefreshLayout.setAdapter(mAdapter); - - mRecyclerView = mSwipeRefreshLayout.getRecyclerView(); - mSwipeRefreshLayout.setLayoutManager(new StaggeredGridLayoutManager(2, - StaggeredGridLayoutManager.VERTICAL)); - - float leftPadding = DisplayUtils.dp2px(8);// because StaggeredGridLayoutManager left margin - mRecyclerView.setPadding((int) leftPadding, 0, 0, 0); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { - - @Override - public void onRefresh() { - mPresenter.fetchNew(); - } - - @Override - public void onLoadMore() { - mPresenter.fetchMore(); - } - }); - } - - - private void showDialog() { - if (mDialog == null) { - mDialog = new ProgressDialog(mActivity); - } - - mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); - mDialog.setMessage(App.getAppString(R.string.loading_meizi_images)); - mDialog.setIndeterminate(true); - mDialog.setCanceledOnTouchOutside(true); - mDialog.setOnCancelListener(dialog -> mPresenter.unSubscribe()); - - if (!mDialog.isShowing()) { - mDialog.show(); - } - - if (!mDialog.isShowing()) { - mDialog.show(); - } - } - - @Override - public void onClick(int position, Object object) { - showDialog(); - final GiftBean giftBean = (GiftBean) object; - Observable.just(giftBean) - .throttleFirst(100, TimeUnit.MILLISECONDS) - .subscribeOn(AndroidSchedulers.mainThread()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(giftBean1 -> mPresenter.fetchImages(giftBean1.getUrl())); - } - - public List getList() { - return mImageCountList; - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - this.mActivity = (MainActivity) context; - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); - setHasOptionsMenu(true); - } - - @Override - protected void callBackRefreshUi() { - - } - - @Override - public void showRefresh() { - mSwipeRefreshLayout.setRefreshing(true); - } - - @Override - public void hideRefresh() { - mSwipeRefreshLayout.setRefreshing(false); - } - - @Override - public void hasNoMoreDate() { - - } - - @Override - public void showContent() { - mMultipleStatusView.showContent(); - } - - @Override - public void showEmpty() { - mMultipleStatusView.showEmpty(); - } - - @Override - public void showDisNetWork() { - mMultipleStatusView.showDisNetwork(); - } - - @Override - public void showError() { - mMultipleStatusView.showError(); - } - - @Override - public void showLoading() { - mMultipleStatusView.showLoading(); - } - - @Override - public void showRefreshError(String errorStr) { - - } - - @Override - public void refillData(List list) { - mAdapter.refillItems(list); - } - - @Override - public void appendData(List list) { - mAdapter.appedItems(list); - } - - @Override - public void openGalleryActivity(ArrayList list) { - Bundle bundle = new Bundle(); - Intent intent = new Intent(mActivity, GalleryActivity.class); - bundle.putString(GalleryActivity.EXTRA_MODEL, GalleryActivity.EXTRA_GIFT); - intent.putExtra(GalleryActivity.EXTRA_LIST, list); - intent.putExtras(bundle); - ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(mActivity, - R.anim.alpha_in, R.anim.alpha_out); - mActivity.startActivity(intent, compat.toBundle()); - } - - @Override - public void disLoadingDialog() { - if (mDialog != null && mDialog.isShowing()) { - mDialog.dismiss(); - } - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - if (mDisposable != null && !mDisposable.isDisposed()) { - mDisposable.dispose(); - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryAdapter.java b/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryAdapter.java index eb5c85ec..0ebf8346 100644 --- a/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryAdapter.java @@ -1,7 +1,7 @@ package com.gank.gankly.ui.history; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -20,7 +20,6 @@ /** * Create by LingYan on 2016-10-31 - * Email:137387869@qq.com */ public class BrowseHistoryAdapter extends RecyclerView.Adapter { @@ -76,7 +75,7 @@ public ReadHistory getReadHistory(int position) { } public class BrowseHolder extends BaseHolder implements View.OnClickListener { - @BindView(R.id.daily_meizi_title) + @BindView(R.id.title) TextView mTitle; ReadHistory mReadHistory; @BindView(R.id.daily_meizi_ll_body) diff --git a/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryContract.java b/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryContract.java index 04b5c2f4..ac04d0e3 100644 --- a/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryContract.java +++ b/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryContract.java @@ -1,24 +1,30 @@ package com.gank.gankly.ui.history; +import android.content.Context; +import androidx.annotation.NonNull; + import com.gank.gankly.data.entity.ReadHistory; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; import java.util.List; /** * Create by LingYan on 2016-10-31 - * Email:137387869@qq.com */ public interface BrowseHistoryContract { - interface View extends IFetchView { + interface View extends SupportView { void refillData(List history); void appendData(List history); } - interface Presenter extends IFetchPresenter { - void deleteHistory(long id); + abstract class Presenter extends LoadMorePresenter { + public Presenter(@NonNull Context context, View view) { + super(context, view); + } + + abstract void deleteHistory(long id); } } diff --git a/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryFragment.java b/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryFragment.java index 7f60c7a3..9f60d49f 100644 --- a/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryFragment.java @@ -3,23 +3,24 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.design.widget.CoordinatorLayout; -import android.support.design.widget.Snackbar; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.Toolbar; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import com.google.android.material.snackbar.Snackbar; +import androidx.appcompat.app.ActionBar; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.appcompat.widget.Toolbar; +import android.view.View; import com.gank.gankly.R; import com.gank.gankly.data.entity.ReadHistory; import com.gank.gankly.listener.ItemClick; -import com.gank.gankly.mvp.base.FetchFragment; -import com.gank.gankly.mvp.source.LocalDataSource; +import com.gank.gankly.ui.base.fragment.SupportFragment; import com.gank.gankly.ui.more.MoreActivity; import com.gank.gankly.ui.web.normal.WebActivity; import com.gank.gankly.widget.LyRecyclerView; import com.gank.gankly.widget.LySwipeRefreshLayout; import com.gank.gankly.widget.MultipleStatusView; -import com.gank.gankly.widget.NoAlphaItemAnimator; import java.util.List; @@ -27,10 +28,9 @@ /** * Create by LingYan on 2016-10-31 - * Email:137387869@qq.com */ -public class BrowseHistoryFragment extends FetchFragment implements BrowseHistoryContract.View, ItemClick { +public class BrowseHistoryFragment extends SupportFragment implements BrowseHistoryContract.View, ItemClick { private BrowseHistoryContract.Presenter mPresenter; private BrowseHistoryAdapter mAdapter; @@ -52,24 +52,8 @@ public void onAttach(Context context) { } @Override - protected int getLayoutId() { - return R.layout.fragment_browse; - } - - @Override - protected void initPresenter() { - mPresenter = new BrowseHistoryPresenter(LocalDataSource.getInstance(), this); - } - - @Override - protected void initValues() { - mPresenter.fetchNew(); - mAdapter = new BrowseHistoryAdapter(); - mSwipeRefreshLayout.setAdapter(mAdapter); - } - - @Override - protected void initViews() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); mToolbar.setTitle(R.string.mine_browse); mActivity.setSupportActionBar(mToolbar); ActionBar barLayout = mActivity.getSupportActionBar(); @@ -78,9 +62,7 @@ protected void initViews() { } mToolbar.setNavigationOnClickListener(v -> mActivity.onBackPressed()); - setSwipeRefreshLayout(mSwipeRefreshLayout); mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); - mSwipeRefreshLayout.getRecyclerView().setItemAnimator(new NoAlphaItemAnimator()); mSwipeRefreshLayout.setILyRecycler(new LyRecyclerView.ILyRecycler() { @Override public void removeRecycle(int pos) { @@ -98,24 +80,36 @@ public void onClick(int pos) { openWebActivity(readHistory); } }); - } - @Override - protected void bindListener() { + mAdapter = new BrowseHistoryAdapter(); + mSwipeRefreshLayout.setAdapter(mAdapter); + mAdapter.setOnItemClick(this); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { + mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { @Override public void onRefresh() { - mPresenter.fetchNew(); +// mPresenter.fetchNew(); } @Override public void onLoadMore() { - mPresenter.fetchMore(); +// mPresenter.fetchMore(); } }); } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); +// mPresenter = new BrowseHistoryPresenter(LocalDataSource.getInstance(), this); +// mPresenter.fetchNew(); + } + + @Override + protected int getLayoutId() { + return R.layout.fragment_browse; + } + @Override public void refillData(List history) { mAdapter.updateList(history); @@ -127,12 +121,12 @@ public void appendData(List history) { } @Override - public void showRefresh() { + public void showProgress() { mSwipeRefreshLayout.setRefreshing(true); } @Override - public void hideRefresh() { + public void hideProgress() { mSwipeRefreshLayout.setRefreshing(false); } @@ -161,14 +155,10 @@ public void showError() { mMultipleStatusView.showError(); } - @Override - public void showLoading() { - mMultipleStatusView.showLoading(); - } - - @Override - public void showRefreshError(String errorStr) { - + private void showLoading() { + if (mMultipleStatusView != null) { + mMultipleStatusView.showLoading(); + } } @Override diff --git a/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryPresenter.java b/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryPresenter.java index 2cd8feae..524784a4 100644 --- a/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/history/BrowseHistoryPresenter.java @@ -1,88 +1,83 @@ package com.gank.gankly.ui.history; -import com.gank.gankly.data.entity.ReadHistory; -import com.gank.gankly.mvp.FetchPresenter; +import android.content.Context; + import com.gank.gankly.mvp.source.LocalDataSource; -import com.gank.gankly.utils.ListUtils; import com.socks.library.KLog; -import java.util.List; - import io.reactivex.Observer; import io.reactivex.disposables.Disposable; /** * Create by LingYan on 2016-10-31 - * Email:137387869@qq.com */ -public class BrowseHistoryPresenter extends FetchPresenter implements BrowseHistoryContract.Presenter { +public class BrowseHistoryPresenter extends BrowseHistoryContract.Presenter { private LocalDataSource mTask; private BrowseHistoryContract.View mModelView; - public BrowseHistoryPresenter(LocalDataSource task, BrowseHistoryContract.View view) { - mTask = task; - mModelView = view; + public BrowseHistoryPresenter(Context context, BrowseHistoryContract.View view) { + super(context, view); } - @Override +// @Override public void fetchNew() { - setOffSetPage(0); - setHasMore(true); +// setOffSetPage(0); +// setHasMore(true); fetch(); } - @Override +// @Override public void fetchMore() { - if (hasMore()) { - mModelView.showRefresh(); - fetch(); - } +// if (hasMore()) { +// mModelView.showProgress(); +// fetch(); +// } } private void fetch() { - int offset = getOffSet(); - mTask.selectReadHistory(offset, getFetchLimit()) - .subscribe(new Observer>() { - @Override - public void onError(Throwable e) { - KLog.e(e); - } - - @Override - public void onComplete() { - mModelView.hideRefresh(); - int nextOffsetPage = getOffSetPage() + 1; - setOffSetPage(nextOffsetPage); - } - - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(List readHistories) { - List list = filterDataBase(readHistories, mModelView); - int size = ListUtils.getListSize(list); - if (size > 0) { - if (getOffSetPage() == 0) { - mModelView.refillData(list); - } else { - mModelView.appendData(list); - } - } - } - }); +// int offset = getOffSet(); +// mTask.selectReadHistory(offset, getFetchLimit()) +// .subscribe(new Observer>() { +// @Override +// public void onError(Throwable e) { +// KLog.e(e); +// } +// +// @Override +// public void onComplete() { +// mModelView.hideProgress(); +// int nextOffsetPage = getOffSetPage() + 1; +// setOffSetPage(nextOffsetPage); +// } +// +// @Override +// public void onSubscribe(Disposable d) { +// +// } +// +// @Override +// public void onNext(List readHistories) { +// List list = filterDataBase(readHistories, mModelView); +// int size = ListUtils.getSize(list); +// if (size > 0) { +// if (getOffSetPage() == 0) { +// mModelView.refillData(list); +// } else { +// mModelView.appendData(list); +// } +// } +// } +// }); } @Override - public void subscribe() { + public void destroy() { } @Override - public void unSubscribe() { + protected void onDestroy() { } diff --git a/app/src/main/java/com/gank/gankly/ui/ios/IosAdapter.java b/app/src/main/java/com/gank/gankly/ui/ios/IosAdapter.java new file mode 100644 index 00000000..a6559230 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/ios/IosAdapter.java @@ -0,0 +1,104 @@ +package com.gank.gankly.ui.ios; + +import android.content.Context; +import android.ly.business.domain.Gank; +import androidx.annotation.NonNull; +import android.view.ViewGroup; + +import com.bumptech.glide.Glide; +import com.gank.gankly.butterknife.BindViewHolder; +import com.gank.gankly.butterknife.ItemModel; +import com.gank.gankly.ui.base.DiffAdapter; +import com.gank.gankly.utils.ListUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Create by LingYan on 2016-04-25 + */ +class IosAdapter extends DiffAdapter { + private List itemModels = new ArrayList<>(); + private List curGank; + + private Context context; + private ItemCallback itemCallBack; + + IosAdapter(Context context) { + super(context); + this.context = context; + } + + @Override + public BindViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + BindViewHolder defaultHolder; + switch (viewType) { + case ViewType.NORMAL: + defaultHolder = new NormalViewHolder(parent, itemCallBack); + break; + default: + defaultHolder = null; + break; + } + return defaultHolder; + } + + @Override + public void onBindViewHolder(@NonNull BindViewHolder holder, int position) { + final ItemModel viewItem = itemModels.get(position); + switch (viewItem.getViewType()) { + case ViewType.NORMAL: + ((NormalViewHolder) holder).bindHolder((TextViewModel) viewItem); + break; + } + } + + @Override + public int getItemViewType(int position) { + return itemModels.get(position).getViewType(); + } + + @Override + public void onViewRecycled(@NonNull BindViewHolder holder) { + super.onViewRecycled(holder); + Glide.get(context).clearMemory(); + } + + @Override + public int getItemCount() { + return itemModels.size(); + } + + void setItems(@NonNull List list) { + curGank = list; + } + + void clearItems() { + itemModels.clear(); + curGank = null; + } + + /** + * 在主线程进行列表差异结果比较,不适合大型数据量 + */ + public void update() { + final List newModels = new ArrayList<>(itemModels); + if (!ListUtils.isEmpty(curGank)) { + for (Gank gank : curGank) { + newModels.add(new TextViewModel(gank)); + } + } + + updateAdapter(itemModels, newModels); + } + + @Override + public void destroy() { + clearItems(); + itemCallBack = null; + } + + public void setOnItemClickListener(ItemCallback itemCallBack) { + this.itemCallBack = itemCallBack; + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/ios/IosContract.java b/app/src/main/java/com/gank/gankly/ui/ios/IosContract.java new file mode 100644 index 00000000..22527f98 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/ios/IosContract.java @@ -0,0 +1,28 @@ +package com.gank.gankly.ui.ios; + +import android.content.Context; +import android.ly.business.domain.Gank; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.PageView; + +/** + * Create by LingYan on 2016-12-20 + */ + +public interface IosContract { + interface View extends PageView { + } + + abstract class Presenter extends LoadMorePresenter { + + public Presenter(@NonNull Context context, View view) { + super(context, view); + } + + abstract void refreshIos(); + + abstract void appendIos(); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/ios/IosFragment.java b/app/src/main/java/com/gank/gankly/ui/ios/IosFragment.java new file mode 100644 index 00000000..47831190 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/ios/IosFragment.java @@ -0,0 +1,206 @@ +package com.gank.gankly.ui.ios; + +import android.content.Context; +import android.ly.business.domain.Gank; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.View; + +import com.gank.gankly.R; +import com.gank.gankly.config.Constants; +import com.gank.gankly.ui.base.LazyFragment; +import com.gank.gankly.ui.web.normal.WebActivity; +import com.gank.gankly.widget.MultipleStatusView; +import com.gank.gankly.widget.recyclerview.OnFlexibleScrollListener; + +import java.util.List; + +import butterknife.BindView; + +/** + * ios + * Create by LingYan on 2016-4-26 + */ +public class IosFragment extends LazyFragment implements IosContract.View { + @BindView(R.id.multiple_status_view) + MultipleStatusView multipleStatusView; + + @BindView(R.id.swipe_refresh) + SwipeRefreshLayout swipeRefreshLayout; + + @BindView(R.id.recycler_view) + RecyclerView recyclerView; + + private IosAdapter iosAdapter; + private IosContract.Presenter iosPresenter; + + @Override + protected int getLayoutId() { + return R.layout.fragment_welfare; + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + iosAdapter = new IosAdapter(getContext()); + iosAdapter.setOnItemClickListener(onItemClickListener); + + OnFlexibleScrollListener scrollListener = new OnFlexibleScrollListener(); + scrollListener.setOnScrollListener(onRecyclerViewListener); + recyclerView.addOnScrollListener(scrollListener); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerView.setAdapter(iosAdapter); + + swipeRefreshLayout.setOnRefreshListener(onRefreshListener); + multipleStatusView.setListener(v -> refreshIos()); + } + + @Override + public void onLazyActivityCreate() { + iosPresenter = new IosPresenter(getContext(), this); + refreshIos(); + } + + private final OnFlexibleScrollListener.OnRecyclerViewListener onRecyclerViewListener = new OnFlexibleScrollListener.OnRecyclerViewListener() { + @Override + public void onLoadMore() { + loadMoreIos(); + } + }; + + private final SwipeRefreshLayout.OnRefreshListener onRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + refreshIos(); + } + }; + + private final ItemCallback onItemClickListener = (view, gank) -> { + Bundle bundle = new Bundle(); + bundle.putString(WebActivity.TITLE, gank.desc); + bundle.putString(WebActivity.URL, gank.url); + bundle.putString(WebActivity.AUTHOR, gank.who); + bundle.putString(WebActivity.TYPE, Constants.IOS); + WebActivity.startWebActivity(getContext(), bundle); + }; + + @Override + public void showError() { + if (multipleStatusView != null) { + multipleStatusView.showError(); + } + } + + @Override + public void showEmpty() { + if (multipleStatusView != null) { + multipleStatusView.showEmpty(); + } + } + + @Override + public void showProgress() { + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setRefreshing(true); + } + } + + @Override + public void hideProgress() { + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setRefreshing(false); + } + } + + @Override + public void hasNoMoreDate() { + shortToast(getString(R.string.loading_all_over)); + } + + @Override + public void showContent() { + if (multipleStatusView != null) { + multipleStatusView.showContent(); + } + } + + @Override + public void showDisNetWork() { + if (multipleStatusView != null) { + multipleStatusView.showDisNetwork(); + } + } + + public static IosFragment newInstance() { + IosFragment fragment = new IosFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + private void refreshIos() { + if (iosPresenter != null) { + iosPresenter.refreshIos(); + } + } + + private void loadMoreIos() { + if (iosPresenter != null) { + iosPresenter.appendIos(); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (iosPresenter != null) { + iosPresenter.destroy(); + } + if (iosAdapter != null) { + iosAdapter.destroy(); + } + } + + @Override + public void refreshSuccess(List list) { + showContent(); + + if (list == null || list.isEmpty()) { + showEmpty(); + return; + } + + if (iosAdapter != null) { + iosAdapter.clearItems(); + iosAdapter.setItems(list); + iosAdapter.update(); + } + } + + @Override + public void refreshFailure(String msg) { + shortToast(msg); + } + + @Override + public void appendSuccess(List list) { + if (iosAdapter != null) { + iosAdapter.setItems(list); + iosAdapter.update(); + } + } + + @Override + public void appendFailure(String msg) { + shortToast(msg); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/ios/IosPresenter.java b/app/src/main/java/com/gank/gankly/ui/ios/IosPresenter.java new file mode 100644 index 00000000..5a2bda6e --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/ios/IosPresenter.java @@ -0,0 +1,92 @@ +package com.gank.gankly.ui.ios; + +import android.content.Context; +import android.ly.business.api.GankServer; +import android.ly.business.domain.Gank; +import android.ly.business.domain.PageConfig; +import android.ly.business.domain.PageEntity; +import androidx.annotation.NonNull; + +import com.leftcoding.rxbus.RxApiManager; + +import java.util.concurrent.atomic.AtomicBoolean; + +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + + +/** + * Create by LingYan on 2016-12-20 + */ + +public class IosPresenter extends IosContract.Presenter { + private PageConfig pageConfig; + private final AtomicBoolean destroyFlag = new AtomicBoolean(false); + + public IosPresenter(@NonNull Context context, IosContract.View view) { + super(context, view); + pageConfig = new PageConfig(); + } + + @Override + void refreshIos() { + fetchData(); + } + + @Override + void appendIos() { + fetchData(); + } + + private void fetchData() { + if (destroyFlag.get()) { + return; + } + GankServer.with(context) + .ios(pageConfig.getCurPage(), pageConfig.limit) + .doOnSubscribe(disposable -> { + if (isViewLife()) { + view.showProgress(); + } + }) + .doFinally(() -> { + if (isViewLife()) { + view.hideProgress(); + } + }) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(PageEntity gankPageEntity) { + + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + public void destroy() { + if (destroyFlag.compareAndSet(false, true)) { + RxApiManager.get().clear(requestTag); + } + super.destroy(); + } + + @Override + protected void onDestroy() { + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/ios/ItemCallback.java b/app/src/main/java/com/gank/gankly/ui/ios/ItemCallback.java new file mode 100644 index 00000000..d0d3f677 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/ios/ItemCallback.java @@ -0,0 +1,8 @@ +package com.gank.gankly.ui.ios; + +import android.ly.business.domain.Gank; +import android.view.View; + +public interface ItemCallback { + void onItemClick(View view, Gank gank); +} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/ui/ios/NormalViewHolder.java b/app/src/main/java/com/gank/gankly/ui/ios/NormalViewHolder.java new file mode 100644 index 00000000..ebeee1ec --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/ios/NormalViewHolder.java @@ -0,0 +1,43 @@ +package com.gank.gankly.ui.ios; + +import android.ly.business.domain.Gank; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.gank.gankly.R; +import com.gank.gankly.butterknife.BindViewHolder; + +import butterknife.BindView; + +public class NormalViewHolder extends BindViewHolder { + @BindView(R.id.author_name) + TextView authorName; + + @BindView(R.id.time) + TextView time; + + @BindView(R.id.title) + TextView title; + + private ItemCallback itemCallBack; + + NormalViewHolder(ViewGroup parent, ItemCallback callback) { + super(parent, R.layout.adapter_ios); + this.itemCallBack = callback; + } + + @Override + public void bindHolder(TextViewModel item) { + final Gank gank = item.gank; + + time.setText(item.getTime()); + title.setText(gank.desc); + authorName.setText(gank.who); + + itemView.setOnClickListener(v -> { + if (itemCallBack != null) { + itemCallBack.onItemClick(v, gank); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gank/gankly/ui/ios/TextViewModel.java b/app/src/main/java/com/gank/gankly/ui/ios/TextViewModel.java new file mode 100644 index 00000000..4b5218b1 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/ios/TextViewModel.java @@ -0,0 +1,45 @@ +package com.gank.gankly.ui.ios; + +import android.ly.business.domain.Gank; + +import com.gank.gankly.ui.base.adapter.ItemComparator; + +import com.gank.gankly.butterknife.ItemModel; +import com.gank.gankly.utils.DateUtils; + +import java.util.Date; + +/** + * Create by LingYan on 2018-11-12 + */ +public class TextViewModel extends ItemModel { + Gank gank; + + TextViewModel(Gank gank) { + this.gank = gank; + } + + public String getTime() { + Date date = DateUtils.formatToDate(gank.publishedAt); + return DateUtils.formatString(date, DateUtils.MM_DD); + } + + @Override + public boolean isItemSame(ItemComparator itemComparator) { + return itemComparator instanceof TextViewModel; + } + + @Override + public boolean isContentEqual(ItemComparator itemComparator) { + if (itemComparator instanceof TextViewModel) { + TextViewModel oldItem = (TextViewModel) itemComparator; + return gank.isContentEqual(oldItem.gank); + } + return false; + } + + @Override + public int getViewType() { + return ViewType.NORMAL; + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/ios/ViewType.java b/app/src/main/java/com/gank/gankly/ui/ios/ViewType.java new file mode 100644 index 00000000..d7b6b374 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/ios/ViewType.java @@ -0,0 +1,9 @@ +package com.gank.gankly.ui.ios; + +/** + * Create by LingYan on 2018-11-12 + */ +public interface ViewType { + int NORMAL = 1; + +} diff --git a/app/src/main/java/com/gank/gankly/ui/main/GankPagerAdapter.java b/app/src/main/java/com/gank/gankly/ui/main/GankPagerAdapter.java index a9bf8f40..fa15c298 100644 --- a/app/src/main/java/com/gank/gankly/ui/main/GankPagerAdapter.java +++ b/app/src/main/java/com/gank/gankly/ui/main/GankPagerAdapter.java @@ -1,8 +1,8 @@ package com.gank.gankly.ui.main; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; import android.view.ViewGroup; import com.gank.gankly.ui.base.LazyFragment; diff --git a/app/src/main/java/com/gank/gankly/ui/main/IndexContract.java b/app/src/main/java/com/gank/gankly/ui/main/IndexContract.java new file mode 100644 index 00000000..25bb1769 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/main/IndexContract.java @@ -0,0 +1,24 @@ +package com.gank.gankly.ui.main; + +import android.content.Context; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.BasePresenter; +import android.lectcoding.ui.base.BaseView; + +/** + * Create by LingYan on 2017-10-03 + */ + +public interface IndexContract { + interface View extends BaseView { + + } + + abstract class Presenter extends BasePresenter { + + public Presenter(@NonNull Context context, @NonNull View view) { + super(context, view); + } + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/main/MainFragment.java b/app/src/main/java/com/gank/gankly/ui/main/IndexFragment.java similarity index 77% rename from app/src/main/java/com/gank/gankly/ui/main/MainFragment.java rename to app/src/main/java/com/gank/gankly/ui/main/IndexFragment.java index 698e55e3..612846ef 100644 --- a/app/src/main/java/com/gank/gankly/ui/main/MainFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/main/IndexFragment.java @@ -3,22 +3,25 @@ import android.app.ProgressDialog; import android.content.Context; import android.content.res.Resources; -import android.support.design.widget.TabLayout; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AlertDialog; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.tabs.TabLayout; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AlertDialog; import android.util.TypedValue; +import android.view.View; -import com.gank.gankly.App; import com.gank.gankly.R; import com.gank.gankly.bean.CheckVersion; import com.gank.gankly.config.Constants; import com.gank.gankly.network.DownloadProgressListener; -import com.gank.gankly.presenter.LauncherPresenter; -import com.gank.gankly.ui.base.BaseSwipeRefreshFragment; +import com.gank.gankly.ui.MainActivity; +import com.gank.gankly.ui.android.AndroidFragment; import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.main.android.AndroidFragment; -import com.gank.gankly.ui.main.ios.IosFragment; -import com.gank.gankly.ui.main.welfare.WelfareFragment; +import com.gank.gankly.ui.base.fragment.SupportFragment; +import com.gank.gankly.ui.ios.IosFragment; +import com.gank.gankly.ui.welfare.WelfareFragment; import com.gank.gankly.view.ILauncher; import com.socks.library.KLog; @@ -28,11 +31,9 @@ import butterknife.BindView; /** - * 首页 * Create by LingYan on 2016-04-22 - * Email:137387869@qq.com */ -public class MainFragment extends BaseSwipeRefreshFragment implements ViewPager.OnPageChangeListener, +public class IndexFragment extends SupportFragment implements ViewPager.OnPageChangeListener, DownloadProgressListener, ILauncher { @BindView(R.id.baisi_tabLayout) TabLayout mTabLayout; @@ -57,29 +58,10 @@ public void onAttach(Context context) { } @Override - public void onHiddenChanged(boolean hidden) { - super.onHiddenChanged(hidden); - if (!hidden) { - changeThemeBackground(); - } - } - - @Override - protected void initPresenter() { - mPresenter = new LauncherPresenter(mActivity, this, this); - } - - @Override - protected void initViews() { - } - - @Override - protected void bindListener() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); changeThemeBackground(); - } - @Override - protected void initValues() { List mList = new ArrayList<>(); mList.add(AndroidFragment.newInstance()); mList.add(IosFragment.newInstance()); @@ -90,8 +72,7 @@ protected void initValues() { mTitles.add(Constants.IOS); mTitles.add(Constants.WELFRAE); - GankPagerAdapter mPagerAdapter = new GankPagerAdapter(mActivity.getSupportFragmentManager(), - mList, mTitles); + GankPagerAdapter mPagerAdapter = new GankPagerAdapter(getChildFragmentManager(), mList, mTitles); mViewPager.setAdapter(mPagerAdapter); mViewPager.setOffscreenPageLimit(1); mViewPager.addOnPageChangeListener(this); @@ -99,6 +80,20 @@ protected void initValues() { initTabLayout(); } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mPresenter = new LauncherPresenter(mActivity, this, this); + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if (!hidden) { + changeThemeBackground(); + } + } + private void initTabLayout() { for (int i = 0; i < mTitles.size(); i++) { mTabLayout.addTab(mTabLayout.newTab().setText(mTitles.get(i))); @@ -106,7 +101,7 @@ private void initTabLayout() { mTabLayout.setupWithViewPager(mViewPager); mTabLayout.setTabMode(TabLayout.MODE_FIXED); - mTabLayout.setSelectedTabIndicatorColor(App.getAppColor(R.color.white)); + mTabLayout.setSelectedTabIndicatorColor(getResources().getColor(R.color.white)); } /** @@ -151,7 +146,6 @@ public void update(long bytesRead, long contentLength, boolean done) { @Override public void callUpdate(CheckVersion checkVersion) { mAppLength = checkVersion.getAppLength(); - KLog.d("mAppLength:" + mAppLength); AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); builder.setMessage(checkVersion.getChangelog()); builder.setNegativeButton("取消", (dialog, which) -> { @@ -184,34 +178,4 @@ public void noNewVersion() { @Override public void hiddenDialog() { } - - @Override - protected void callBackRefreshUi() { - - } - - @Override - public void showEmpty() { - - } - - @Override - public void showDisNetWork() { - - } - - @Override - public void showContent() { - - } - - @Override - public void showError() { - - } - - @Override - public void showLoading() { - - } } diff --git a/app/src/main/java/com/gank/gankly/presenter/LauncherPresenter.java b/app/src/main/java/com/gank/gankly/ui/main/LauncherPresenter.java similarity index 82% rename from app/src/main/java/com/gank/gankly/presenter/LauncherPresenter.java rename to app/src/main/java/com/gank/gankly/ui/main/LauncherPresenter.java index 48b74759..5b74ef9b 100644 --- a/app/src/main/java/com/gank/gankly/presenter/LauncherPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/main/LauncherPresenter.java @@ -1,4 +1,4 @@ -package com.gank.gankly.presenter; +package com.gank.gankly.ui.main; import android.app.Activity; import android.content.Context; @@ -8,6 +8,7 @@ import com.gank.gankly.BuildConfig; import com.gank.gankly.bean.CheckVersion; +import com.gank.gankly.mvp.base.BasePresenter; import com.gank.gankly.network.DownloadProgressListener; import com.gank.gankly.network.api.DownloadApi; import com.gank.gankly.utils.CrashUtils; @@ -30,29 +31,31 @@ public class LauncherPresenter extends BasePresenter { private String apkName = "gankly.apk"; private File mFile = new File(Environment.getExternalStorageDirectory() .getAbsolutePath() + "/GankLy/" + apkName); + private Context mContext; public LauncherPresenter(Activity mActivity, ILauncher view) { this(mActivity, view, null); } - public LauncherPresenter(Activity mActivity, ILauncher view, DownloadProgressListener listener) { - super(mActivity, view); + public LauncherPresenter(Activity activity, ILauncher view, DownloadProgressListener listener) { + super(activity.getApplicationContext(), view); + mContext = activity; mDownloadApi = new DownloadApi(listener); } public void checkVersion() { - mIView.showDialog(); + view.showDialog(); mDownloadApi.checkVersion(new Observer() { @Override public void onError(Throwable e) { KLog.e(e); CrashUtils.crashReport(e); - mIView.hiddenDialog(); + view.hiddenDialog(); } @Override public void onComplete() { - mIView.hiddenDialog(); + view.hiddenDialog(); } @Override @@ -62,9 +65,9 @@ public void onSubscribe(Disposable d) { @Override public void onNext(CheckVersion checkVersion) { - int curVersion = BuildConfig.VERSION_CODE ; + int curVersion = BuildConfig.VERSION_CODE; if (checkVersion.getCode() > curVersion) { - mIView.callUpdate(checkVersion); + view.callUpdate(checkVersion); } } }); @@ -98,7 +101,7 @@ public void onSubscribe(Disposable d) { @Override public void onNext(InputStream inputStream) { - downloadSuccess(mActivity, mFile); + downloadSuccess(mContext, mFile); } }); } @@ -109,4 +112,9 @@ private void downloadSuccess(Context context, File file) { intent.setDataAndType(Uri.parse("file://" + file.getAbsolutePath()), "application/vnd.android.package-archive"); context.startActivity(intent); } + + @Override + protected void onDestroy() { + + } } diff --git a/app/src/main/java/com/gank/gankly/ui/main/android/AndroidAdapter.java b/app/src/main/java/com/gank/gankly/ui/main/android/AndroidAdapter.java deleted file mode 100644 index 9c417d3f..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/android/AndroidAdapter.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.gank.gankly.ui.main.android; - -import android.content.Context; -import android.databinding.DataBindingUtil; -import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.DataSource; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.engine.GlideException; -import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.RequestOptions; -import com.bumptech.glide.request.target.Target; -import com.gank.gankly.R; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.config.MeiziArrayList; -import com.gank.gankly.databinding.AdapterAndroidBinding; -import com.gank.gankly.listener.RecyclerOnClick; -import com.gank.gankly.utils.DateUtils; -import com.gank.gankly.utils.gilde.ImageLoaderUtil; -import com.gank.gankly.widget.ImageDefaultView; -import com.socks.library.KLog; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Create by LingYan on 2016-04-25 - * Email:137387869@qq.com - */ -class AndroidAdapter extends RecyclerView.Adapter { - private final List mResults; - private RecyclerOnClick mMeiZiOnClick; - private Context mContext; - - private int mImageSize; - private List mImagesList; - - - AndroidAdapter(Context context) { - setHasStableIds(true); - mResults = new ArrayList<>(); - mContext = context; - } - - @Override - public GankViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = getLayoutView(parent); - return new GankViewHolder(view); - } - - @Override - public void onBindViewHolder(GankViewHolder holder, int position) { - ResultsBean bean = mResults.get(position); - holder.mBean = bean; - holder.bind(bean); - - int imgPosition = position; - - if (mImageSize != 0) { - if (imgPosition > mImageSize) { - imgPosition = position % mImageSize; - } else if (position == mImageSize) { - imgPosition = 0; - } - } - - String url = mImagesList.get(imgPosition).getUrl(); - if (imgPosition < mImageSize) { - ImageLoaderUtil.getInstance().loadWifiImage(mContext, url) - .apply(new RequestOptions() - .centerCrop() - ) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - holder.imgHead.showLoadText(); - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - holder.imgHead.showImage(); - bean.setLoad(true); - mResults.set(position, bean); - return false; - } - }) - .into(holder.mImageView); - } - - holder.imgHead.setTag(position); - holder.imgHead.setOnClickListener(v -> { - if (bean.isLoad()) { - mMeiZiOnClick.onClick(v, bean); - } else { - if (!holder.imgHead.isCanLoad()) { - return; - } - holder.imgHead.showLoading(); - Glide.with(mContext).load(url) - .apply(new RequestOptions() - .centerCrop() - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) - ) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - KLog.e(e); - holder.imgHead.showErrorText(); - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - KLog.d("isFirstResource:" + isFirstResource); - holder.imgHead.showImage(); - bean.setLoad(true); - mResults.set(position, bean); - return false; - } - }) - .into(holder.mImageView); - } - }); - } - - @Override - public void onViewRecycled(GankViewHolder holder) { - super.onViewRecycled(holder); - Glide.get(mContext).clearMemory(); - } - - private View getLayoutView(ViewGroup parent) { - LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - return layoutInflater.inflate(R.layout.adapter_android, parent, false); - } - - @Override - public int getItemCount() { - return mResults == null ? 0 : mResults.size(); - } - - @Override - public long getItemId(int position) { - return position; - } - - public void refillItems(List results) { - shuffleImages(); - int size = mResults.size(); - mResults.clear(); - notifyItemRangeRemoved(0, size); - appendItems(results); - } - - public void appendItems(List results) { -// shuffleImages(); - - mResults.addAll(results); - int size = mResults.size(); - notifyItemRangeInserted(size, results.size()); - } - - private void shuffleImages() { - List list = MeiziArrayList.getInstance().getOneItemsList(); - mImagesList = new ArrayList<>(list); - mImageSize = mImagesList.size(); -// Collections.shuffle(mImagesList); - } - - public void setOnItemClickListener(RecyclerOnClick onItemClickListener) { - mMeiZiOnClick = onItemClickListener; - } - - class GankViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - @BindView(R.id.android_ratio_img_head) - ImageDefaultView imgHead; - - private ImageView mImageView; - private ResultsBean mBean; - private AdapterAndroidBinding mAndroidBinding; - - private GankViewHolder(View itemView) { - super(itemView); - bindView(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(this); - mImageView = new ImageView(mContext); - imgHead.setFrameLayout(mImageView); - } - - public void bind(ResultsBean resultsBean) { - Date date = DateUtils.formatDateFromStr(resultsBean.getPublishedAt()); - String formatDate = DateUtils.getFormatDate(date, DateUtils.MM_DD); - resultsBean.setPublishedAt(formatDate); - mAndroidBinding.setResult(resultsBean); - } - - @Override - public void onClick(View v) { - if (mMeiZiOnClick != null) { - mMeiZiOnClick.onClick(v, mBean); - } - } - - private void bindView(View itemView) { - mAndroidBinding = DataBindingUtil.bind(itemView); - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/android/AndroidContract.java b/app/src/main/java/com/gank/gankly/ui/main/android/AndroidContract.java deleted file mode 100644 index 2bb1ce35..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/android/AndroidContract.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gank.gankly.ui.main.android; - -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; - -import java.util.List; - -/** - * Create by LingYan on 2016-10-25 - * Email:137387869@qq.com - */ - -public interface AndroidContract { - interface View extends IFetchView { - void refillDate(List list); - - void appendData(List list); - } - - interface Presenter extends IFetchPresenter { - List getResultList(); - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/android/AndroidFragment.java b/app/src/main/java/com/gank/gankly/ui/main/android/AndroidFragment.java deleted file mode 100644 index 914a7c31..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/android/AndroidFragment.java +++ /dev/null @@ -1,245 +0,0 @@ -package com.gank.gankly.ui.main.android; - -import android.content.Context; -import android.content.Intent; -import android.content.res.ColorStateList; -import android.graphics.Color; -import android.os.Bundle; -import android.support.design.widget.Snackbar; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -import com.gank.gankly.App; -import com.gank.gankly.R; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.config.Constants; -import com.gank.gankly.listener.RecyclerOnClick; -import com.gank.gankly.mvp.source.remote.GankDataSource; -import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.main.MainActivity; -import com.gank.gankly.ui.web.normal.WebActivity; -import com.gank.gankly.utils.CircularAnimUtils; -import com.gank.gankly.utils.theme.RecyclerViewColor; -import com.gank.gankly.utils.theme.ThemeColor; -import com.gank.gankly.widget.LySwipeRefreshLayout; -import com.gank.gankly.widget.MultipleStatusView; - -import java.util.List; - -import butterknife.BindView; - -/** - * Android - * Create by LingYan on 2016-4-26 - * Email:137387869@qq.com - */ -public class AndroidFragment extends LazyFragment implements SwipeRefreshLayout.OnRefreshListener, - RecyclerOnClick, AndroidContract.View { - @BindView(R.id.multiple_status_view) - MultipleStatusView mMultipleStatusView; - @BindView(R.id.swipe_refresh) - LySwipeRefreshLayout mSwipeRefreshLayout; - - private RecyclerView mRecyclerView; - private MainActivity mActivity; - private AndroidAdapter mAndroidAdapter; - private AndroidContract.Presenter mPresenter; - - @Override - protected int getLayoutId() { - return R.layout.layout_swipe_normal; - } - - public static AndroidFragment newInstance() { - AndroidFragment fragment = new AndroidFragment(); - Bundle args = new Bundle(); - fragment.setArguments(args); - return fragment; - } - - @Override - protected void initPresenter() { - mPresenter = new AndroidPresenter(GankDataSource.getInstance(), this); - } - - @Override - protected void initValues() { - setSwipeRefreshLayout(mSwipeRefreshLayout); - } - - @Override - protected void initViews() { - initAdapter(); - initRecycler(); - } - - @Override - protected void bindListener() { - mAndroidAdapter.setOnItemClickListener(this); - mSwipeRefreshLayout.setOnRefreshListener(this); - mMultipleStatusView.setListener(v -> { - showLoading(); - mPresenter.fetchNew(); - }); - } - - @Override - protected void initData() { - showLoading(); - mPresenter.fetchNew(); - } - - private void initRecycler() { - mRecyclerView = mSwipeRefreshLayout.getRecyclerView(); - mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { - @Override - public void onRefresh() { - showRefresh(); - mPresenter.fetchNew(); - } - - @Override - public void onLoadMore() { - showRefresh(); - mPresenter.fetchMore(); - } - }); - } - - private void initAdapter() { - mAndroidAdapter = new AndroidAdapter(mActivity); -// AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(mAndroidAdapter); -// alphaAdapter.setFirstOnly(true); -// alphaAdapter.setDuration(500); -// alphaAdapter.setInterpolator(new OvershootInterpolator(0.5f)); - mSwipeRefreshLayout.setAdapter(mAndroidAdapter); - } - - @Override - public void onRefresh() { - mSwipeRefreshLayout.setRefreshing(true); - mPresenter.fetchNew(); - } - - @Override - public void onClick(View view, ResultsBean bean) { - Bundle bundle = new Bundle(); - bundle.putString(WebActivity.TITLE, bean.getDesc()); - bundle.putString(WebActivity.URL, bean.getUrl()); - bundle.putString(WebActivity.TYPE, Constants.ANDROID); - bundle.putString(WebActivity.AUTHOR, bean.getWho()); - Intent intent = new Intent(mActivity, WebActivity.class); - intent.putExtras(bundle); - CircularAnimUtils.startActivity(mActivity, intent, view, R.color.white_half); - } - - @Override - public void refillDate(List list) { - mAndroidAdapter.refillItems(list); - } - - @Override - public void appendData(List list) { - mAndroidAdapter.appendItems(list); - } - - @Override - public void hideRefresh() { - mSwipeRefreshLayout.setRefreshing(false); - } - - @Override - public void hasNoMoreDate() { - Snackbar.make(mSwipeRefreshLayout, R.string.loading_all_over, Snackbar.LENGTH_SHORT).show(); - } - - @Override - public void showContent() { - mMultipleStatusView.showContent(); - } - - @Override - public void showEmpty() { - mMultipleStatusView.showEmpty(); - } - - @Override - public void showDisNetWork() { - mMultipleStatusView.showDisNetwork(); - } - - @Override - public void showError() { - mMultipleStatusView.showError(); - } - - @Override - public void showLoading() { - mMultipleStatusView.showLoading(); - } - - @Override - public void showRefreshError(String errorStr) { - Snackbar.make(mSwipeRefreshLayout, errorStr, Snackbar.LENGTH_SHORT).show(); - } - - @Override - public void showRefresh() { - mSwipeRefreshLayout.setRefreshing(true); - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - this.mActivity = (MainActivity) context; - } - - private ColorStateList getSwitchThumbColorStateList() { - int mSelectColor; - int unSelectColor; - - if (App.isNight()) { - mSelectColor = R.color.switch_thumb_disabled_dark; - unSelectColor = R.color.navigation_item_icon; - } else { - mSelectColor = R.color.colorAccent; - unSelectColor = R.color.gray; - } - - final int[][] states = new int[3][]; - final int[] colors = new int[3]; - - // Disabled state - states[0] = new int[]{-android.R.attr.state_enabled}; - colors[0] = (Color.DKGRAY); - - // Checked state - states[1] = new int[]{android.R.attr.state_checked}; - - colors[1] = App.getAppColor(mSelectColor); - - // Unchecked enabled state state - states[2] = new int[0]; - - colors[2] = App.getAppColor(unSelectColor); - - return new ColorStateList(states, colors); - } - - @Override - protected void callBackRefreshUi() { - ThemeColor themeColor = new ThemeColor(this); - RecyclerViewColor mRecycler = new RecyclerViewColor(mRecyclerView); - mRecycler.setItemColor(R.id.android_txt_title, R.attr.baseAdapterItemTextColor); - mRecycler.setItemColor(R.id.android_txt_time, R.attr.textSecondaryColor); - mRecycler.setItemBackgroundColor(R.id.android_rl, R.attr.lyItemSelectBackground); - - themeColor.setBackgroundResource(R.attr.themeBackground, mRecyclerView); - themeColor.swipeRefresh(mSwipeRefreshLayout); - themeColor.recyclerViewColor(mRecycler); - themeColor.start(); - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/android/AndroidPresenter.java b/app/src/main/java/com/gank/gankly/ui/main/android/AndroidPresenter.java deleted file mode 100644 index 3c97251b..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/android/AndroidPresenter.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.gank.gankly.ui.main.android; - -import android.support.annotation.NonNull; - -import com.gank.gankly.bean.GankResult; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.config.MeiziArrayList; -import com.gank.gankly.mvp.FetchPresenter; -import com.gank.gankly.mvp.source.remote.GankDataSource; -import com.socks.library.KLog; - -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.Observable; -import io.reactivex.Observer; -import io.reactivex.disposables.Disposable; - -/** - * Create by LingYan on 2016-10-25 - * Email:137387869@qq.com - */ - -public class AndroidPresenter extends FetchPresenter implements AndroidContract.Presenter { - @NonNull - private final GankDataSource mTask; - @NonNull - private final AndroidContract.View mModelView; - - private final List mResultsBeanList; - - public AndroidPresenter(@NonNull GankDataSource gankDataSource, @NonNull AndroidContract.View view) { - mTask = gankDataSource; - mModelView = view; - mResultsBeanList = new ArrayList<>(); - } - - @Override - public void fetchNew() { - fetchAndroid(getInitPage()); - } - - @Override - public void fetchMore() { - if (hasMore()) { - mModelView.showRefresh(); - fetchAndroid(getFetchPage()); - } - } - - @Override - public void subscribe() { - - } - - @Override - public void unSubscribe() { - - } - - private void fetchAndroid(final int page) { - Observable observable; - if (MeiziArrayList.getInstance().isOneItemsEmpty()) { - observable = mTask.fetchAndroidAndImages(page, getFetchLimit()); - } else { - observable = mTask.fetchAndroid(page, getFetchLimit()); - } - - observable.subscribe(new Observer() { - @Override - public void onComplete() { - int nextPage = page + 1; - setFetchPage(nextPage); - } - - @Override - public void onError(Throwable e) { - KLog.e(e); - parseError(mModelView); - } - - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(GankResult gankResult) { - parseAndroidData(gankResult); - } - }); - } - - private void parseAndroidData(GankResult gankResult) { - List list = filterData(gankResult, mModelView); - if (list != null) { - if (getFetchPage() == 1) { - mResultsBeanList.clear(); - mModelView.refillDate(list); - } else { - mModelView.appendData(list); - } - mResultsBeanList.addAll(list); - } - } - - @Override - public List getResultList() { - return null; - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/ios/IosAdapter.java b/app/src/main/java/com/gank/gankly/ui/main/ios/IosAdapter.java deleted file mode 100644 index 8cbe7d1a..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/ios/IosAdapter.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.gank.gankly.ui.main.ios; - -import android.content.Context; -import android.databinding.DataBindingUtil; -import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.DataSource; -import com.bumptech.glide.load.engine.GlideException; -import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.RequestOptions; -import com.bumptech.glide.request.target.Target; -import com.gank.gankly.R; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.config.MeiziArrayList; -import com.gank.gankly.databinding.AdapterIosBinding; -import com.gank.gankly.listener.RecyclerOnClick; -import com.gank.gankly.utils.DateUtils; -import com.gank.gankly.utils.gilde.ImageLoaderUtil; -import com.gank.gankly.widget.ImageDefaultView; -import com.gank.gankly.widget.RatioImageView; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Create by LingYan on 2016-04-25 - * Email:137387869@qq.com - */ -public class IosAdapter extends RecyclerView.Adapter { - private final List mResults; - private RecyclerOnClick mMeiZiOnClick; - private Context mContext; - - private int mImageSize; - private List mImagesList; - - public IosAdapter(Context context) { - setHasStableIds(true); - mResults = new ArrayList<>(); - mContext = context; - } - - @Override - public GankViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = getLayoutView(parent); - return new GankViewHolder(view); - } - - @Override - public void onBindViewHolder(GankViewHolder holder, int position) { - ResultsBean bean = mResults.get(position); - holder.mBean = bean; - holder.bind(bean); - - int imgPosition = position; - - if (mImageSize != 0) { - if (imgPosition > mImageSize) { - imgPosition = position % mImageSize; - } else if (position == mImageSize) { - imgPosition = 0; - } - } - - String url = mImagesList.get(imgPosition).getUrl(); - if (imgPosition < mImageSize) { - ImageLoaderUtil.getInstance() - .loadWifiImage(mContext, url) - .apply(new RequestOptions() - .centerCrop() - ) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - holder.imgHead.showLoadText(); - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - bean.setLoad(true); - mResults.set(position, bean); - holder.imgHead.showImage(); - return false; - } - }) - .into(holder.mImageView); - } - - holder.imgHead.setOnClickListener(v -> { - if (bean.isLoad()) { - mMeiZiOnClick.onClick(v, bean); - } else { - if (!holder.imgHead.isCanLoad()) { - return; - } - holder.imgHead.showLoading(); - ImageLoaderUtil.getInstance() - .loadManualImage(mContext, url) - .apply(new RequestOptions() - .centerCrop() - ) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - holder.imgHead.showErrorText(); - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - holder.imgHead.showImage(); - bean.setLoad(true); - mResults.set(position, bean); - return false; - } - }) - .into(holder.mImageView); - } - }); - } - - @Override - public void onViewRecycled(GankViewHolder holder) { - super.onViewRecycled(holder); - Glide.get(mContext).clearMemory(); - } - - private View getLayoutView(ViewGroup parent) { - LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - return layoutInflater.inflate(R.layout.adapter_ios, parent, false); - } - - @Override - public int getItemCount() { - return mResults.size(); - } - - public void refillItems(List results) { - shuffleImages(); - - int size = mResults.size(); - mResults.clear(); - notifyItemRangeRemoved(0, size); - appendItems(results); - } - - public void appendItems(List results) { - mResults.addAll(results); - int size = mResults.size(); - notifyItemRangeInserted(size, results.size()); - } - - private void shuffleImages() { - List list = MeiziArrayList.getInstance().getOneItemsList(); - mImagesList = new ArrayList<>(list); - mImageSize = mImagesList.size(); -// Collections.shuffle(mImagesList); - } - - @Override - public long getItemId(int position) { - return position; - } - - public void setOnItemClickListener(RecyclerOnClick onItemClickListener) { - mMeiZiOnClick = onItemClickListener; - } - - public class GankViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - @BindView(R.id.ios_ratio_img_head) - ImageDefaultView imgHead; - RatioImageView mImageView; - - - private ResultsBean mBean; - private AdapterIosBinding mIosBinding; - - public GankViewHolder(View itemView) { - super(itemView); - bindView(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(this); - mImageView = new RatioImageView(mContext); - imgHead.setFrameLayout(mImageView); - } - - public void bind(ResultsBean resultsBean) { - Date date = DateUtils.formatDateFromStr(resultsBean.getPublishedAt()); - String formatDate = DateUtils.getFormatDate(date, DateUtils.MM_DD); - resultsBean.setPublishedAt(formatDate); - mIosBinding.setResult(resultsBean); - } - - @Override - public void onClick(View v) { - if (mMeiZiOnClick != null) { - mMeiZiOnClick.onClick(v, mBean); - } - } - - private void bindView(View itemView) { - mIosBinding = DataBindingUtil.bind(itemView); - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/ios/IosContract.java b/app/src/main/java/com/gank/gankly/ui/main/ios/IosContract.java deleted file mode 100644 index 1027c1e6..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/ios/IosContract.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gank.gankly.ui.main.ios; - -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; - -import java.util.List; - -/** - * Create by LingYan on 2016-12-20 - * Email:137387869@qq.com - */ - -public interface IosContract { - interface View extends IFetchView { - void refillDate(List list); - - void appendData(List list); - } - - interface Presenter extends IFetchPresenter { - - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/ios/IosFragment.java b/app/src/main/java/com/gank/gankly/ui/main/ios/IosFragment.java deleted file mode 100644 index c3ba7199..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/ios/IosFragment.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.gank.gankly.ui.main.ios; - -import android.content.Context; -import android.os.Bundle; -import android.support.design.widget.Snackbar; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -import com.gank.gankly.R; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.config.Constants; -import com.gank.gankly.listener.RecyclerOnClick; -import com.gank.gankly.mvp.source.remote.GankDataSource; -import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.main.MainActivity; -import com.gank.gankly.ui.web.normal.WebActivity; -import com.gank.gankly.utils.theme.RecyclerViewColor; -import com.gank.gankly.utils.theme.ThemeColor; -import com.gank.gankly.widget.LySwipeRefreshLayout; -import com.gank.gankly.widget.MultipleStatusView; - -import java.util.List; - -import butterknife.BindView; - -/** - * ios - * Create by LingYan on 2016-4-26 - * Email:137387869@qq.com - */ -public class IosFragment extends LazyFragment implements RecyclerOnClick, IosContract.View { - @BindView(R.id.multiple_status_view) - MultipleStatusView mMultipleStatusView; - @BindView(R.id.swipe_refresh) - LySwipeRefreshLayout mSwipeRefreshLayout; - - private MainActivity mActivity; - private IosAdapter mRecyclerAdapter; - private IosContract.Presenter mPresenter; - private RecyclerView mRecyclerView; - - @Override - protected int getLayoutId() { - return R.layout.layout_swipe_normal; - } - - public static IosFragment newInstance() { - IosFragment fragment = new IosFragment(); - Bundle args = new Bundle(); - fragment.setArguments(args); - return fragment; - } - - @Override - protected void initPresenter() { - mPresenter = new IosPresenter(GankDataSource.getInstance(), this); - } - - @Override - protected void initValues() { - } - - @Override - protected void initViews() { - setSwipeRefreshLayout(mSwipeRefreshLayout); - - mRecyclerAdapter = new IosAdapter(mActivity); - mSwipeRefreshLayout.setAdapter(mRecyclerAdapter); - - mRecyclerView = mSwipeRefreshLayout.getRecyclerView(); - mRecyclerView.setHasFixedSize(true); - mRecyclerAdapter.setOnItemClickListener(this); - mSwipeRefreshLayout.setLayoutManager(new LinearLayoutManager(mActivity)); - } - - @Override - protected void bindListener() { - mMultipleStatusView.setListener(v -> initFetchDate()); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { - @Override - public void onRefresh() { - mPresenter.fetchNew(); - } - - @Override - public void onLoadMore() { - mPresenter.fetchMore(); - } - }); - } - - @Override - protected void initData() { - showLoading(); - initFetchDate(); - } - - private void initFetchDate() { - mPresenter.fetchNew(); - } - - @Override - public void showLoading() { - mMultipleStatusView.showLoading(); - } - - @Override - public void showRefreshError(String errorStr) { - Snackbar.make(mSwipeRefreshLayout, errorStr, Snackbar.LENGTH_LONG) - .setAction(R.string.retry, v -> mPresenter.fetchMore()); - } - - @Override - public void showError() { - mMultipleStatusView.showError(); - } - - @Override - public void showEmpty() { - mMultipleStatusView.showEmpty(); - } - - @Override - public void showRefresh() { - mSwipeRefreshLayout.setRefreshing(true); - } - - @Override - public void hideRefresh() { - mSwipeRefreshLayout.setRefreshing(false); - } - - @Override - public void hasNoMoreDate() { - - } - - @Override - public void showContent() { - mMultipleStatusView.showContent(); - } - - @Override - public void showDisNetWork() { - mMultipleStatusView.showDisNetwork(); - } - - @Override - public void onClick(View view, ResultsBean bean) { - Bundle bundle = new Bundle(); - bundle.putString(WebActivity.TITLE, bean.getDesc()); - bundle.putString(WebActivity.URL, bean.getUrl()); - bundle.putString(WebActivity.TYPE, Constants.IOS); - bundle.putString(WebActivity.AUTHOR, bean.getWho()); - WebActivity.startWebActivity(mActivity, bundle); - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - this.mActivity = (MainActivity) context; - } - - @Override - protected void callBackRefreshUi() { - ThemeColor themeColor = new ThemeColor(this); - RecyclerViewColor mRecycler = new RecyclerViewColor(mRecyclerView); - mRecycler.setItemColor(R.id.ios_txt_title, R.attr.baseAdapterItemTextColor); - mRecycler.setItemColor(R.id.ios_txt_time, R.attr.textSecondaryColor); - mRecycler.setItemBackgroundColor(R.id.ios_ll, R.attr.lyItemSelectBackground); - - themeColor.setBackgroundResource(R.attr.themeBackground, mRecyclerView); - themeColor.swipeRefresh(mSwipeRefreshLayout); - themeColor.recyclerViewColor(mRecycler); - themeColor.start(); - } - - @Override - public void refillDate(List list) { - mRecyclerAdapter.refillItems(list); - } - - @Override - public void appendData(List list) { - mRecyclerAdapter.appendItems(list); - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/ios/IosPresenter.java b/app/src/main/java/com/gank/gankly/ui/main/ios/IosPresenter.java deleted file mode 100644 index faf5c1c9..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/ios/IosPresenter.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.gank.gankly.ui.main.ios; - -import android.support.annotation.NonNull; - -import com.gank.gankly.bean.GankResult; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.mvp.FetchPresenter; -import com.gank.gankly.mvp.source.remote.GankDataSource; -import com.socks.library.KLog; - -import java.util.List; - -import io.reactivex.Observer; -import io.reactivex.disposables.Disposable; - -/** - * Create by LingYan on 2016-12-20 - * Email:137387869@qq.com - */ - -public class IosPresenter extends FetchPresenter implements IosContract.Presenter { - @NonNull - private GankDataSource mTask; - @NonNull - private IosContract.View mModelView; - - public IosPresenter(@NonNull GankDataSource gankDataSource, @NonNull IosContract.View view) { - mTask = gankDataSource; - mModelView = view; - } - - @Override - public void fetchNew() { - fetchData(getInitPage()); - } - - @Override - public void fetchMore() { - if (hasMore()) { - mModelView.showRefresh(); - fetchData(getFetchPage()); - } - } - - private void fetchData(final int page) { - mTask.fetchIos(page, getFetchLimit()) - .subscribe(new Observer() { - @Override - public void onComplete() { - setFetchPage(page + 1); - } - - @Override - public void onError(Throwable e) { - KLog.e(e); - parseError(mModelView); - } - - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(GankResult gankResult) { - List list = filterData(gankResult.getResults(), mModelView); - if (list != null) { - if (page == 1) { - mModelView.refillDate(list); - } else { - mModelView.appendData(list); - } - } - } - }); - } - - @Override - public void subscribe() { - - } - - @Override - public void unSubscribe() { - - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabContract.java b/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabContract.java new file mode 100644 index 00000000..fa0b5eef --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabContract.java @@ -0,0 +1,26 @@ +package com.gank.gankly.ui.main.tab; + +import android.content.Context; +import androidx.annotation.NonNull; + +import android.lectcoding.ui.base.BaseView; +import com.gank.gankly.mvp.base.BasePresenter; + +/** + * Create by LingYan on 2017-09-28 + */ + +public interface MainTabContract { + interface View extends BaseView { + + } + + public abstract class Presenter extends BasePresenter { + public Presenter(@NonNull Context context, @NonNull View view) { + super(context, view); + } + + public abstract void loadPicture(); + } + +} diff --git a/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabFragment.java b/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabFragment.java new file mode 100644 index 00000000..c6e3bcde --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabFragment.java @@ -0,0 +1,28 @@ +package com.gank.gankly.ui.main.tab; + +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.view.View; + +import com.gank.gankly.butterknife.ButterKnifeFragment; + +/** + * Create by LingYan on 2017-09-28 + */ + +public abstract class MainTabFragment extends ButterKnifeFragment implements MainTabContract.View { + private MainTabPresenter mPresenter; + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mPresenter = new MainTabPresenter(getContext(), this); + mPresenter.loadPicture(); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabPresenter.java b/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabPresenter.java new file mode 100644 index 00000000..73271372 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/main/tab/MainTabPresenter.java @@ -0,0 +1,27 @@ +package com.gank.gankly.ui.main.tab; + + +import android.content.Context; +import androidx.annotation.NonNull; + +/** + * Create by LingYan on 2017-09-28 + */ + +public class MainTabPresenter extends MainTabContract.Presenter { + + + public MainTabPresenter(@NonNull Context context, @NonNull MainTabContract.View view) { + super(context, view); + } + + @Override + protected void onDestroy() { + + } + + @Override + public void loadPicture() { + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareAdapter.java b/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareAdapter.java deleted file mode 100644 index f783f1cd..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareAdapter.java +++ /dev/null @@ -1,244 +0,0 @@ -package com.gank.gankly.ui.main.welfare; - -import android.app.Activity; -import android.content.Context; -import android.graphics.Bitmap; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; -import android.util.ArrayMap; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.RelativeLayout; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.Priority; -import com.bumptech.glide.RequestBuilder; -import com.bumptech.glide.load.DataSource; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.load.engine.GlideException; -import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.RequestOptions; -import com.bumptech.glide.request.target.BitmapImageViewTarget; -import com.bumptech.glide.request.target.Target; -import com.bumptech.glide.request.transition.Transition; -import com.gank.gankly.R; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.listener.MeiziOnClick; -import com.gank.gankly.utils.AppUtils; -import com.gank.gankly.utils.gilde.ImageLoaderUtil; -import com.gank.gankly.widget.ImageDefaultView; -import com.socks.library.KLog; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; - -/** - * Create by LingYan on 2016-04-06 - * Email:137387869@qq.com - */ -public class WelfareAdapter extends RecyclerView.Adapter { - private List mResults; - private Activity mActivity; - private LayoutInflater inflater; - private int mScreenWidth = AppUtils.getDisplayWidth() / 2; - private int mScreenHeight = AppUtils.getDisplayWidth() / 2; - private ArrayMap heights = new ArrayMap<>(); - - private MeiziOnClick mMeiZiOnClick; - private Context mContext; - - public void setMeiZiOnClick(MeiziOnClick meiZiOnClick) { - mMeiZiOnClick = meiZiOnClick; - } - - public WelfareAdapter(Activity activity) { - setHasStableIds(true); - inflater = LayoutInflater.from(activity); - mActivity = activity; - mResults = new ArrayList<>(); - } - - @Override - public GoodsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - mContext = parent.getContext(); - View view = inflater.inflate(R.layout.adapter_meizi, parent, false); - return new GoodsViewHolder(view); - } - - @Override - public void onBindViewHolder(final GoodsViewHolder holder, int position) { - final ResultsBean bean = mResults.get(position); - final String url = bean.getUrl(); - RequestBuilder requestBuilder = ImageLoaderUtil.getInstance() - .glideAsBitmap(mContext, url); - requestBuilder - .listener(new RequestListener() { - - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - KLog.e("onException model:" + model); - holder.imgMeizi.showLoadText(); - return false; - } - - @Override - public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - holder.imgMeizi.showImage(); - bean.setLoad(true); - mResults.set(position, bean); - return false; - } - }); - - if (heights.containsKey(url)) { - setCardViewLayoutParams(holder.imgMeizi, mScreenWidth, heights.get(url)); - requestBuilder.apply(new RequestOptions() - .fitCenter() - .diskCacheStrategy(DiskCacheStrategy.ALL) - .priority(Priority.LOW) - ); - requestBuilder.into(holder.mImageView); - } else { - requestBuilder.apply(new RequestOptions() - .fitCenter() - .diskCacheStrategy(DiskCacheStrategy.ALL) - .priority(Priority.LOW) - .override(mScreenWidth, mScreenHeight)//设置宽高一致,后期改动不大 - ); - requestBuilder.into(new DriverViewTarget(holder.mImageView, url, holder.imgMeizi)); - } - - holder.imgMeizi.setOnClickListener(v -> { - if (bean.isLoad()) { - mMeiZiOnClick.onClick(v, position); - } else { - if (!holder.imgMeizi.isCanLoad()) { - return; - } - holder.imgMeizi.showLoading(); - ImageLoaderUtil.getInstance() - .loadAsImage(mContext, url) - .apply(new RequestOptions() - .fitCenter() - ) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - holder.imgMeizi.showErrorText(); - return false; - } - - @Override - public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - holder.imgMeizi.showImage(); - bean.setLoad(true); - mResults.set(position, bean); - return false; - } - }) - .into(new DriverViewTarget(holder.mImageView, url, holder.imgMeizi)); - } - }); - - - } - - @Override - public void onViewRecycled(GoodsViewHolder holder) { - super.onViewRecycled(holder); - Glide.get(mActivity).clearMemory();//view recycled,clear image request - holder.mImageView.setImageBitmap(null); - } - - @Override - public long getItemId(int position) { - return position; - } - - private class DriverViewTarget extends BitmapImageViewTarget { - private ImageView mImageView; - private String url; - private ImageDefaultView defaultView; - - public DriverViewTarget(ImageView image, String url, ImageDefaultView defaultView) { - super(image); - this.mImageView = image; - this.url = url; - this.defaultView = defaultView; - } - - @Override - public void onResourceReady(Bitmap resource, @Nullable Transition transition) { - int viewWidth = mScreenWidth; - int viewHeight; - if (!heights.containsKey(url) && url != null) { - viewHeight = resource.getHeight() * viewWidth / resource.getWidth(); - heights.put(url, viewHeight); - setCardViewLayoutParams(defaultView, viewWidth, viewHeight); - } - super.onResourceReady(resource, transition); - } - - // @Override -// public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { -// int viewWidth = mScreenWidth; -// int viewHeight; -// if (!heights.containsKey(url) && url != null) { -// viewHeight = resource.getHeight() * viewWidth / resource.getWidth(); -// heights.put(url, viewHeight); -// setCardViewLayoutParams(defaultView, viewWidth, viewHeight); -// } -// super.onResourceReady(resource, glideAnimation); -// } - } - - private void setCardViewLayoutParams(ImageDefaultView mImageView, int width, int height) { - ViewGroup.LayoutParams layoutParams = mImageView.getLayoutParams(); - layoutParams.width = width; - layoutParams.height = height; - mImageView.setLayoutParams(layoutParams); - } - - @Override - public int getItemCount() { - return mResults.size(); - } - - public void refillItems(List goods) { - clear(); - appendItems(goods); - } - - public void clear() { - mResults.clear(); - heights.clear(); - int size = mResults.size(); - notifyItemRangeRemoved(0, size); - } - - public void appendItems(List goods) { - mResults.addAll(goods); - notifyItemRangeInserted(mResults.size(), goods.size()); - } - - class GoodsViewHolder extends RecyclerView.ViewHolder { - @BindView(R.id.meizi_img_picture) - ImageDefaultView imgMeizi; - @BindView(R.id.meizi_card_view) - RelativeLayout mRelativeLayout; - ImageView mImageView; - - public GoodsViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - mImageView = new ImageView(mContext); - mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP); - imgMeizi.setFrameLayout(mImageView); - } - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareContract.java b/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareContract.java deleted file mode 100644 index 20375032..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareContract.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.gank.gankly.ui.main.welfare; - -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.mvp.IFetchPresenter; -import com.gank.gankly.mvp.IFetchView; - -import java.util.List; - -/** - * Create by LingYan on 2016-12-23 - * Email:137387869@qq.com - */ - -public class WelfareContract { - interface View extends IFetchView { - void refillData(List list); - - void appendData(List list); - } - - interface Presenter extends IFetchPresenter { - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareFragment.java b/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareFragment.java deleted file mode 100644 index 3ff50e22..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfareFragment.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.gank.gankly.ui.main.welfare; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.support.design.widget.Snackbar; -import android.support.v4.app.ActivityOptionsCompat; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SimpleItemAnimator; -import android.support.v7.widget.StaggeredGridLayoutManager; -import android.view.View; - -import com.gank.gankly.App; -import com.gank.gankly.R; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.listener.MeiziOnClick; -import com.gank.gankly.mvp.source.remote.GankDataSource; -import com.gank.gankly.ui.base.LazyFragment; -import com.gank.gankly.ui.gallery.GalleryActivity; -import com.gank.gankly.ui.main.MainActivity; -import com.gank.gankly.utils.StyleUtils; -import com.gank.gankly.utils.theme.ThemeColor; -import com.gank.gankly.widget.LySwipeRefreshLayout; -import com.gank.gankly.widget.MultipleStatusView; - -import java.util.List; - -import butterknife.BindView; - -/** - * 干货福利妹子 - * Create by LingYan on 2016-5-12 - * Email:137387869@qq.com - */ -public class WelfareFragment extends LazyFragment implements MeiziOnClick, WelfareContract.View { - @BindView(R.id.multiple_status_view) - MultipleStatusView mMultipleStatusView; - @BindView(R.id.swipe_refresh) - LySwipeRefreshLayout mSwipeRefreshLayout; - - private WelfareAdapter mWelfareAdapter; - private MainActivity mActivity; - private RecyclerView mRecyclerView; - - private WelfareContract.Presenter mPresenter; - - @Override - protected int getLayoutId() { - return R.layout.layout_swipe_normal; - } - - public static WelfareFragment newInstance() { - WelfareFragment fragment = new WelfareFragment(); - Bundle args = new Bundle(); - fragment.setArguments(args); - return fragment; - } - - @Override - protected void initValues() { - } - - @Override - protected void initViews() { - setSwipeRefreshLayout(mSwipeRefreshLayout); - - mWelfareAdapter = new WelfareAdapter(mActivity); - mWelfareAdapter.setMeiZiOnClick(this); - mRecyclerView = mSwipeRefreshLayout.getRecyclerView(); - ((SimpleItemAnimator)mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false); - mSwipeRefreshLayout.setLayoutManager(new StaggeredGridLayoutManager(2, - StaggeredGridLayoutManager.VERTICAL)); - mSwipeRefreshLayout.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefRecyclerViewListener() { - @Override - public void onRefresh() { - mSwipeRefreshLayout.setRefreshing(true); - fetchNew(); - } - - @Override - public void onLoadMore() { - fetchMore(); - } - }); - mSwipeRefreshLayout.setAdapter(mWelfareAdapter); - } - - @Override - protected void bindListener() { - mMultipleStatusView.setListener(v -> { - mMultipleStatusView.showLoading(); - fetchNew(); - }); - } - - @Override - protected void initData() { - mMultipleStatusView.showLoading(); - fetchNew(); - } - - @Override - protected void initPresenter() { - mPresenter = new WelfarePresenter(GankDataSource.getInstance(), this); - } - - @Override - public void hasNoMoreDate() { - Snackbar.make(mSwipeRefreshLayout, R.string.tip_no_more_load, Snackbar.LENGTH_LONG) - .setActionTextColor(App.getAppColor(R.color.Blue)) - .show(); - } - - @Override - public void showRefreshError(String errorStr) { - Snackbar.make(mSwipeRefreshLayout, errorStr, Snackbar.LENGTH_LONG) - .setActionTextColor(App.getAppColor(R.color.Blue)) - .setAction(R.string.retry, v -> fetchMore()).show(); - } - - private void fetchNew() { - mPresenter.fetchNew(); - } - - private void fetchMore() { - mPresenter.fetchMore(); - } - - @Override - public void hideRefresh() { - mSwipeRefreshLayout.setRefreshing(false); - } - - @Override - public void showRefresh() { - mSwipeRefreshLayout.setRefreshing(true); - } - - @Override - public void showContent() { - mMultipleStatusView.showContent(); - } - - @Override - public void showDisNetWork() { - mMultipleStatusView.showDisNetwork(); - } - - @Override - public void showEmpty() { - mMultipleStatusView.showEmpty(); - } - - @Override - public void showError() { - mMultipleStatusView.showError(); - } - - @Override - public void showLoading() { - mMultipleStatusView.showLoading(); - } - - @Override - public void onClick(View view, int position) { - Bundle bundle = new Bundle(); - bundle.putInt(GalleryActivity.EXTRA_POSITION, position); - Intent intent = new Intent(mActivity, GalleryActivity.class); - intent.putExtra(GalleryActivity.TYPE, 1); - intent.putExtras(bundle); - ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(mActivity); - mActivity.startActivity(intent, activityOptionsCompat.toBundle()); - - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - this.mActivity = (MainActivity) context; - } - - @Override - protected void callBackRefreshUi() { - ThemeColor themeColor = new ThemeColor(this); - int resource = themeColor.getResourceId(R.attr.themeBackground); - mRecyclerView.setBackgroundResource(resource); - - StyleUtils.clearRecyclerViewItem(mRecyclerView); - StyleUtils.changeSwipeRefreshLayout(mSwipeRefreshLayout); - } - - @Override - public void refillData(List list) { - mWelfareAdapter.refillItems(list); - } - - @Override - public void appendData(List list) { - mWelfareAdapter.appendItems(list); - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfarePresenter.java b/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfarePresenter.java deleted file mode 100644 index c98bcafa..00000000 --- a/app/src/main/java/com/gank/gankly/ui/main/welfare/WelfarePresenter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.gank.gankly.ui.main.welfare; - -import com.gank.gankly.bean.GankResult; -import com.gank.gankly.bean.ResultsBean; -import com.gank.gankly.config.MeiziArrayList; -import com.gank.gankly.mvp.FetchPresenter; -import com.gank.gankly.mvp.source.remote.GankDataSource; -import com.socks.library.KLog; - -import java.util.List; - -import io.reactivex.Observer; -import io.reactivex.disposables.Disposable; - -/** - * Create by LingYan on 2016-12-23 - * Email:137387869@qq.com - */ - -public class WelfarePresenter extends FetchPresenter implements WelfareContract.Presenter { - private WelfareContract.View mModelView; - private GankDataSource mTask; - - public WelfarePresenter(GankDataSource task, WelfareContract.View view) { - mTask = task; - mModelView = view; - } - - @Override - public void fetchNew() { - fetchData(getInitPage()); - } - - private void fetchData(final int page) { - mTask.fetchWelfare(page, getFetchLimit()) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(GankResult gankResult) { - List list = filterData(gankResult.getResults(), mModelView); - if (list != null) { - if (page == 1) { - mModelView.refillData(list); - } else { - mModelView.appendData(list); - } - MeiziArrayList.getInstance().addImages(list, page); - } - } - - @Override - public void onError(Throwable e) { - KLog.e(e); - parseError(mModelView); - } - - @Override - public void onComplete() { - setFetchPage(page + 1); - } - }); - } - - @Override - public void fetchMore() { - if (hasMore()) { - mModelView.showRefresh(); - fetchData(getFetchPage()); - } - } - - @Override - public void subscribe() { - - } - - @Override - public void unSubscribe() { - - } -} diff --git a/app/src/main/java/com/gank/gankly/ui/mine/MineFragment.java b/app/src/main/java/com/gank/gankly/ui/mine/MineFragment.java index 2cc709ea..9db6a5fc 100644 --- a/app/src/main/java/com/gank/gankly/ui/mine/MineFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/mine/MineFragment.java @@ -5,19 +5,15 @@ import android.content.res.Resources; import android.os.Build; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.widget.NestedScrollView; -import android.support.v7.widget.LinearLayoutCompat; -import android.support.v7.widget.Toolbar; import android.util.TypedValue; +import android.view.View; import android.widget.TextView; -import com.gank.gankly.App; import com.gank.gankly.R; +import com.gank.gankly.butterknife.ButterKnifeFragment; import com.gank.gankly.rxjava.RxBus_; import com.gank.gankly.rxjava.theme.ThemeEvent; -import com.gank.gankly.ui.base.BaseSwipeRefreshFragment; -import com.gank.gankly.ui.main.MainActivity; +import com.gank.gankly.ui.MainActivity; import com.gank.gankly.ui.more.MoreActivity; import com.gank.gankly.utils.GanklyPreferences; import com.gank.gankly.widget.LSwitch; @@ -25,9 +21,13 @@ import java.util.List; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.LinearLayoutCompat; +import androidx.appcompat.widget.Toolbar; +import androidx.core.widget.NestedScrollView; import butterknife.BindView; import butterknife.BindViews; -import butterknife.ButterKnife; import butterknife.OnClick; import static com.gank.gankly.ui.more.SettingFragment.IS_NIGHT; @@ -36,10 +36,9 @@ /** * 我的 * Create by LingYan on 2016-09-21 - * Email:137387869@qq.com */ -public class MineFragment extends BaseSwipeRefreshFragment { +public class MineFragment extends ButterKnifeFragment { public static final String TAG = "MineFragment"; @BindView(R.id.toolbar) @@ -66,30 +65,18 @@ protected int getLayoutId() { } @Override - protected void initPresenter() { - - } - - @Override - protected void initValues() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); selectItemSwitch(); - mNestedScrollView.setNestedScrollingEnabled(false); - } - - @Override - protected void initViews() { mToolbar.setTitle(R.string.navigation_mine); - } - - @Override - protected void bindListener() { themeSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> selectTheme(isChecked)); + mNestedScrollView.setNestedScrollingEnabled(false); } private void selectTheme(boolean isChecked) { - App.setIsNight(isChecked); - GanklyPreferences.putBoolean(IS_NIGHT, isChecked); +// AppConfig.setIsNight(isChecked); + GanklyPreferences.putBoolean(getContext(), IS_NIGHT, isChecked); if (isChecked) { mActivity.setTheme(R.style.AppTheme_Night); @@ -99,12 +86,45 @@ private void selectTheme(boolean isChecked) { themeSwitch.setChecked(isChecked); RxBus_.getInstance().post(new ThemeEvent(isChecked)); refreshStatusBar(); - callBackRefreshUi(); + + TypedValue typeValue = new TypedValue(); + Resources.Theme theme = mActivity.getTheme(); + theme.resolveAttribute(R.attr.themeBackground, typeValue, true); + mNestedScrollView.setBackgroundResource(typeValue.resourceId); + theme.resolveAttribute(R.attr.colorPrimary, typeValue, true); + mToolbar.setBackgroundResource(typeValue.resourceId); + theme.resolveAttribute(R.attr.textPrimaryColor, typeValue, true); + final int itemTextColor = typeValue.resourceId; + theme.resolveAttribute(R.attr.baseAdapterItemBackground, typeValue, true); + final int itemBackground = typeValue.resourceId; + +// setItemBackground(mViewList); + +// ButterKnife.apply(mSwitchList, new ButterKnife.Action() { +// @Override +// public void apply(@NonNull LSwitch view, int index) { +// view.changeTheme(); +// } +// }); +// +// ButterKnife.apply(mTextViewList, new ButterKnife.Action() { +// @Override +// public void apply(@NonNull TextView view, int index) { +// view.setTextColor(getContext().getResources().getColor(itemTextColor)); +// } +// }); +// +// ButterKnife.apply(mLinearLayoutCompatList, new ButterKnife.Action() { +// @Override +// public void apply(@NonNull LinearLayoutCompat view, int index) { +// view.setBackgroundResource(itemBackground); +// } +// }); } private void selectItemSwitch() { - boolean isNight = App.isNight(); - themeSwitch.setChecked(isNight); +// boolean isNight = AppConfig.isNight(); +// themeSwitch.setChecked(isNight); } @@ -133,7 +153,7 @@ void onSetting() { @OnClick(R.id.mine_rl_night) void onNight() { - isNight = !App.isNight(); +// isNight = !AppConfig.isNight(); selectTheme(isNight); } @@ -162,41 +182,4 @@ public void onAttach(Context context) { mActivity = (MainActivity) context; } - @Override - protected void callBackRefreshUi() { - - TypedValue typeValue = new TypedValue(); - Resources.Theme theme = mActivity.getTheme(); - theme.resolveAttribute(R.attr.themeBackground, typeValue, true); - mNestedScrollView.setBackgroundResource(typeValue.resourceId); - theme.resolveAttribute(R.attr.colorPrimary, typeValue, true); - mToolbar.setBackgroundResource(typeValue.resourceId); - theme.resolveAttribute(R.attr.textPrimaryColor, typeValue, true); - final int itemTextColor = typeValue.resourceId; - theme.resolveAttribute(R.attr.baseAdapterItemBackground, typeValue, true); - final int itemBackground = typeValue.resourceId; - - setItemBackground(mViewList); - - ButterKnife.apply(mSwitchList, new ButterKnife.Action() { - @Override - public void apply(@NonNull LSwitch view, int index) { - view.changeTheme(); - } - }); - - ButterKnife.apply(mTextViewList, new ButterKnife.Action() { - @Override - public void apply(@NonNull TextView view, int index) { - view.setTextColor(App.getAppColor(itemTextColor)); - } - }); - - ButterKnife.apply(mLinearLayoutCompatList, new ButterKnife.Action() { - @Override - public void apply(@NonNull LinearLayoutCompat view, int index) { - view.setBackgroundResource(itemBackground); - } - }); - } } diff --git a/app/src/main/java/com/gank/gankly/ui/more/AboutFragment.java b/app/src/main/java/com/gank/gankly/ui/more/AboutFragment.java index 11752213..685818d3 100644 --- a/app/src/main/java/com/gank/gankly/ui/more/AboutFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/more/AboutFragment.java @@ -4,13 +4,16 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.support.design.widget.CollapsingToolbarLayout; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.Toolbar; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.google.android.material.appbar.CollapsingToolbarLayout; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; +import android.view.View; -import com.gank.gankly.App; import com.gank.gankly.R; -import com.gank.gankly.ui.base.BaseFragment; +import com.gank.gankly.ui.base.fragment.SupportFragment; import butterknife.BindString; import butterknife.BindView; @@ -21,7 +24,7 @@ * Create by LingYan on 2016-05-10 * Email:137387869@qq.com */ -public class AboutFragment extends BaseFragment { +public class AboutFragment extends SupportFragment { @BindView(R.id.about_toolbar) Toolbar mToolbar; @BindView(R.id.about_collapsing) @@ -42,12 +45,9 @@ public void onAttach(Context context) { } @Override - protected void initValues() { - } - - @Override - protected void initViews() { - mCollapsingToolbarLayout.setTitle(App.getAppString(R.string.navigation_about)); + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mCollapsingToolbarLayout.setTitle(getContext().getString(R.string.navigation_about)); mActivity.setSupportActionBar(mToolbar); ActionBar bar = mActivity.getSupportActionBar(); if (bar != null) { @@ -57,7 +57,8 @@ protected void initViews() { } @Override - protected void bindListener() { + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); } @Override diff --git a/app/src/main/java/com/gank/gankly/ui/more/MoreActivity.java b/app/src/main/java/com/gank/gankly/ui/more/MoreActivity.java index 0d5b15e6..12d04fc8 100644 --- a/app/src/main/java/com/gank/gankly/ui/more/MoreActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/more/MoreActivity.java @@ -1,16 +1,16 @@ package com.gank.gankly.ui.more; import android.os.Bundle; -import android.support.v4.app.Fragment; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import com.gank.gankly.R; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.BaseActivity; import com.gank.gankly.ui.collect.CollectFragment; import com.gank.gankly.ui.history.BrowseHistoryFragment; /** * Create by LingYan on 2016-09-21 - * Email:137387869@qq.com */ public class MoreActivity extends BaseActivity { @@ -30,22 +30,13 @@ protected int getContentId() { } @Override - protected void initValues() { + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); parseIntent(); Fragment fragment = getFragment(mType); addFragment(fragment); } - @Override - protected void initViews() { - - } - - @Override - protected void bindListener() { - - } - private void parseIntent() { Bundle bundle = getIntent().getExtras(); if (bundle != null) { diff --git a/app/src/main/java/com/gank/gankly/ui/more/SettingFragment.java b/app/src/main/java/com/gank/gankly/ui/more/SettingFragment.java index 843a63f4..9b875048 100644 --- a/app/src/main/java/com/gank/gankly/ui/more/SettingFragment.java +++ b/app/src/main/java/com/gank/gankly/ui/more/SettingFragment.java @@ -3,18 +3,19 @@ import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.Toolbar; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; import android.view.View; import android.widget.TextView; -import com.gank.gankly.App; import com.gank.gankly.R; import com.gank.gankly.bean.CheckVersion; import com.gank.gankly.config.Preferences; import com.gank.gankly.listener.DialogOnClick; -import com.gank.gankly.presenter.LauncherPresenter; -import com.gank.gankly.ui.base.BaseSwipeRefreshFragment; +import com.gank.gankly.ui.base.fragment.SupportFragment; +import com.gank.gankly.ui.main.LauncherPresenter; import com.gank.gankly.utils.AppUtils; import com.gank.gankly.utils.GanklyPreferences; import com.gank.gankly.utils.GlideCatchUtil; @@ -34,9 +35,8 @@ /** * 设置 * Create by LingYan on 2016-05-10 - * Email:137387869@qq.com */ -public class SettingFragment extends BaseSwipeRefreshFragment implements ILauncher { +public class SettingFragment extends SupportFragment implements ILauncher { public static final String TAG = "SettingFragment"; public static final String IS_NIGHT = "isNight"; @@ -76,16 +76,8 @@ public static SettingFragment getInstance() { } @Override - protected void initPresenter() { - mPresenter = new LauncherPresenter(mActivity, this); - } - - @Override - protected void initValues() { - } - - @Override - protected void initViews() { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); initPreferences(); mToolbar.setTitle(R.string.navigation_settings); @@ -96,12 +88,22 @@ protected void initViews() { } mToolbar.setNavigationOnClickListener(v -> mActivity.onBackPressed()); - String cacheSize = GlideCatchUtil.getInstance().getCacheSize(); + String cacheSize = GlideCatchUtil.getInstance().getCacheSize(getContext()); itemCleanCache.setTextSummary(mActivity.getResources().getString(R.string.setting_picture_cache, cacheSize)); + + itemCheckSwitch.setSwitchListener(isCheck -> GanklyPreferences.putBoolean(getContext(), Preferences.SETTING_AUTO_CHECK, isCheck)); + itemOnlyWifi.setSwitchListener(isCheck -> GanklyPreferences.putBoolean(getContext(), Preferences.SETTING_WIFI_ONLY, isCheck)); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mPresenter = new LauncherPresenter(mActivity, this); } + private void initPreferences() { - String summary = App.getAppResources().getString(R.string.setting_current_version, + String summary = getContext().getString(R.string.setting_current_version, AppUtils.getVersionName(mActivity)); itemUpdate.setTextSummary(summary); itemUpdate.setTextName(R.string.setting_check_version); @@ -110,18 +112,12 @@ private void initPreferences() { } private void selectItemSwitch() { - boolean isAutoCheck = GanklyPreferences.getBoolean(Preferences.SETTING_AUTO_CHECK, true); + boolean isAutoCheck = GanklyPreferences.getBoolean(getContext(), Preferences.SETTING_AUTO_CHECK, true); itemCheckSwitch.setSwitchChecked(isAutoCheck); - boolean isOnlyWifi = GanklyPreferences.getBoolean(Preferences.SETTING_WIFI_ONLY, false); + boolean isOnlyWifi = GanklyPreferences.getBoolean(getContext(), Preferences.SETTING_WIFI_ONLY, false); itemOnlyWifi.setSwitchChecked(isOnlyWifi); } - @Override - protected void bindListener() { - itemCheckSwitch.setSwitchListener(isCheck -> GanklyPreferences.putBoolean(Preferences.SETTING_AUTO_CHECK, isCheck)); - itemOnlyWifi.setSwitchListener(isCheck -> GanklyPreferences.putBoolean(Preferences.SETTING_WIFI_ONLY, isCheck)); - } - @Override public void callUpdate(CheckVersion checkVersion) { showVersionDialog(checkVersion.getChangelog()); @@ -129,7 +125,7 @@ public void callUpdate(CheckVersion checkVersion) { @Override public void noNewVersion() { - ToastUtils.showToast(R.string.tip_no_new_version); + ToastUtils.showToast(getContext(), R.string.tip_no_new_version); } private void showVersionDialog(String content) { @@ -148,7 +144,7 @@ public void cancel() { @Override public void submit() { mVersionDialog.dismiss(); - ToastUtils.showToast(R.string.update_downing); + ToastUtils.showToast(getContext(), R.string.update_downing); mPresenter.downloadApk(); } }); @@ -160,7 +156,7 @@ private void createDialog() { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(mActivity); } - mProgressDialog.setMessage(App.getAppString(R.string.dialog_checking)); + mProgressDialog.setMessage(getContext().getString(R.string.dialog_checking)); mProgressDialog.show(); } @@ -192,7 +188,7 @@ void onClickAbout() { @OnClick(R.id.setting_item_text_clean_cache) void onClickCache() { - GlideCatchUtil.getInstance().clearCacheDiskSelf(); + GlideCatchUtil.getInstance().clearCacheDiskSelf(getContext()); itemCleanCache.setTextSummary(mActivity.getResources().getString(R.string.setting_picture_cache_string)); } @@ -207,11 +203,6 @@ public void onResume() { super.onResume(); } - @Override - protected void callBackRefreshUi() { - - } - @Override public void showEmpty() { @@ -231,9 +222,4 @@ public void showContent() { public void showError() { } - - @Override - public void showLoading() { - - } } diff --git a/app/src/main/java/com/gank/gankly/ui/pure/PureAdapter.java b/app/src/main/java/com/gank/gankly/ui/pure/PureAdapter.java new file mode 100644 index 00000000..1fe34d48 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/pure/PureAdapter.java @@ -0,0 +1,222 @@ +package com.gank.gankly.ui.pure; + +import android.content.Context; +import android.lectcoding.ui.adapter.ObserverAdapter; +import android.lectcoding.ui.logcat.Logcat; +import android.ly.business.domain.Gift; +import androidx.recyclerview.widget.RecyclerView; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.model.GlideUrl; +import com.bumptech.glide.load.model.LazyHeaders; +import com.bumptech.glide.request.RequestOptions; +import com.gank.gankly.R; +import com.gank.gankly.butterknife.BindViewHolder; +import com.gank.gankly.butterknife.ItemModel; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * Create by LingYan on 2016-04-25 + */ +public class PureAdapter extends ObserverAdapter { + private final List gifts = new ArrayList<>(); + private ItemClickCallback callback; + private Context mContext; + private final List items = new ArrayList<>(); + + PureAdapter(Context context) { + setHasStableIds(true); + mContext = context; + } + + private final RecyclerView.AdapterDataObserver observer = new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + super.onChanged(); + } + + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + super.onItemRangeInserted(positionStart, itemCount); + } + }; + + @Override + public PureViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + PureViewHolder holder; + switch (viewType) { + case GiftViewHolder.LAYOUT: + holder = new GiftViewHolder(parent); + break; + default: + holder = null; + break; + } + return holder; + } + + @Override + public void onBindViewHolder(PureViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case GiftViewHolder.LAYOUT: + ((GiftViewHolder) holder).bindHolder((GiftViewItem) items.get(position), callback); + break; + } + } + + @Override + public int getItemCount() { + return items.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemViewType(int position) { + if (!items.isEmpty()) { + return items.get(position).getViewType(); + } + return super.getItemViewType(position); + } + + @Override + public void onViewRecycled(PureViewHolder holder) { + super.onViewRecycled(holder); + Glide.get(mContext).clearMemory(); + } + + void refillItems(List getResults) { + gifts.clear(); + items.clear(); + appendItems(getResults); + } + + public void appendItems(List getResults) { + int startIndex = gifts.size(); + Logcat.d(""); + gifts.addAll(getResults); + changeItem(startIndex); + } + + private void changeItem(int startIndex) { + if (!gifts.isEmpty()) { + for (int i = startIndex, size = gifts.size(); i < size; i++) { + final Gift gift = gifts.get(i); + if (gift != null) { + items.add(new GiftViewItem(gift)); + } + } + } + } + + public void clear() { + if (gifts != null) { + gifts.clear(); + } + } + + public void setOnItemClickListener(ItemClickCallback itemClickCallback) { + this.callback = itemClickCallback; + } + + @Override + public void destroy() { + super.destroy(); + items.clear(); + gifts.clear(); + } + + @Override + protected RecyclerView.AdapterDataObserver getObserver() { + return observer; + } + + static class GiftViewHolder extends PureViewHolder { + static final int LAYOUT = R.layout.adapter_gift; + + @BindView(R.id.title) + TextView title; + + @BindView(R.id.goods_background) + ImageView goodsBackground; + + @BindView(R.id.author) + TextView author; + + GiftViewHolder(ViewGroup parent) { + super(parent, LAYOUT); + } + + @Override + void bindHolder(GiftViewItem item, ItemClickCallback callback) { + super.bindHolder(item, callback); + final Gift gift = item.gift; + final Context context = itemView.getContext(); + title.setText(gift.title); + author.setText(gift.time); + + final GlideUrl glideUrl = new GlideUrl(gift.imgUrl, new LazyHeaders.Builder() + .addHeader("referer", "http://www.mzitu.com/mm/") + .build()); + + Glide.with(context) + .asBitmap() + .load(glideUrl) + .apply(new RequestOptions() + .fitCenter() + .diskCacheStrategy(DiskCacheStrategy.ALL) + ) + .into(goodsBackground); + + itemView.setOnClickListener(v -> { + if (callback != null) { + callback.onItemClick(gift); + } + }); + } + } + + static class GiftViewItem extends ItemModel { + final Gift gift; + + GiftViewItem(Gift gift) { + this.gift = gift; + } + + @Override + public int getViewType() { + return GiftViewHolder.LAYOUT; + } + } + + abstract static class PureViewHolder extends BindViewHolder { + + PureViewHolder(ViewGroup parent, int layoutRes) { + super(parent, layoutRes); + } + + @Override + public void bindHolder(II item) { + + } + + void bindHolder(II item, ItemClickCallback callback) { + + } + } + + interface ItemClickCallback { + void onItemClick(Gift gift); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/pure/PureContract.java b/app/src/main/java/com/gank/gankly/ui/pure/PureContract.java new file mode 100644 index 00000000..d1b45a75 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/pure/PureContract.java @@ -0,0 +1,40 @@ +package com.gank.gankly.ui.pure; + +import android.content.Context; +import android.ly.business.domain.Gift; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.LoadMorePresenter; +import com.gank.gankly.mvp.base.SupportView; + +import java.util.ArrayList; +import java.util.List; + +/** + * Create by LingYan on 2016-12-27 + */ + +public interface PureContract { + interface View extends SupportView { + void refillData(List list); + + void appendData(List list); + + void openGalleryActivity(ArrayList list); + + void disLoadingDialog(); + } + + abstract class Presenter extends LoadMorePresenter { + + public Presenter(@NonNull Context context, @NonNull View view) { + super(context, view); + } + + abstract void refreshImages(String url); + + abstract void refreshPure(); + + abstract void appendPure(); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/pure/PureFragment.java b/app/src/main/java/com/gank/gankly/ui/pure/PureFragment.java new file mode 100644 index 00000000..930d57d4 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/pure/PureFragment.java @@ -0,0 +1,227 @@ +package com.gank.gankly.ui.pure; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.ly.business.domain.Gift; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityOptionsCompat; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; +import android.view.View; + +import com.gank.gankly.R; +import com.gank.gankly.ui.base.LazyFragment; +import com.gank.gankly.ui.gallery.GalleryActivity; +import com.gank.gankly.widget.LySwipeRefreshLayout; +import com.gank.gankly.widget.MultipleStatusView; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import butterknife.BindView; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; + +/** + * 妹子 - 清纯 + * Create by LingYan on 2016-05-17 + */ +public class PureFragment extends LazyFragment implements PureContract.View { + @BindView(R.id.swipe_refresh) + LySwipeRefreshLayout swipeRefresh; + + @BindView(R.id.multiple_status_view) + MultipleStatusView multipleStatusView; + + private PureAdapter pureAdapter; + private PureContract.Presenter purePresenter; + + private ProgressDialog progressDialog; + + @Override + protected int getLayoutId() { + return R.layout.fragment_gift; + } + + public static PureFragment getInstance() { + return new PureFragment(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initRecycler(); + + pureAdapter.setOnItemClickListener(pureCallback); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + purePresenter = new PurePresenter(getContext(), this); + initRefresh(); + } + + private final PureAdapter.ItemClickCallback pureCallback = new PureAdapter.ItemClickCallback() { + @Override + public void onItemClick(final Gift gift) { + showDialog(); + Observable.just(gift) + .throttleFirst(100, TimeUnit.MILLISECONDS) + .subscribeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(giftBean1 -> purePresenter.refreshImages(giftBean1.url)); + } + }; + + private void initRefresh() { + multipleStatusView.showLoading(); + purePresenter.refreshPure(); + } + + private void initRecycler() { + pureAdapter = new PureAdapter(getContext()); + swipeRefresh.setAdapter(pureAdapter); + + swipeRefresh.setLayoutManager(new StaggeredGridLayoutManager(2, + StaggeredGridLayoutManager.VERTICAL)); + + swipeRefresh.setOnScrollListener(new LySwipeRefreshLayout.OnSwipeRefreshListener() { + + @Override + public void onRefresh() { + purePresenter.refreshPure(); + } + + @Override + public void onLoadMore() { + purePresenter.appendPure(); + } + }); + } + + + private void showDialog() { + if (progressDialog == null) { + progressDialog = new ProgressDialog(getContext()); + } + + progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); + progressDialog.setMessage(getContext().getString(R.string.loading_meizi_images)); + progressDialog.setIndeterminate(true); + progressDialog.setCanceledOnTouchOutside(true); + progressDialog.setOnCancelListener(dialog -> purePresenter.destroy()); + + if (!progressDialog.isShowing()) { + progressDialog.show(); + } + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRetainInstance(true); + setHasOptionsMenu(true); + } + + @Override + public void showProgress() { + swipeRefresh.setRefreshing(true); + } + + @Override + public void hideProgress() { + if (swipeRefresh != null) { + swipeRefresh.setRefreshing(false); + } + if (multipleStatusView != null) { + multipleStatusView.showContent(); + } + } + + @Override + public void hasNoMoreDate() { + + } + + @Override + public void showContent() { + multipleStatusView.showContent(); + } + + @Override + public void showEmpty() { + multipleStatusView.showEmpty(); + } + + @Override + public void showDisNetWork() { + multipleStatusView.showDisNetwork(); + } + + @Override + public void showError() { + multipleStatusView.showError(); + } + + private void showLoading() { + if (multipleStatusView != null) { + multipleStatusView.showLoading(); + } + } + + @Override + public void refillData(List list) { + if (pureAdapter != null) { + pureAdapter.refillItems(list); + pureAdapter.notifyDataSetChanged(); + } + } + + @Override + public void appendData(List list) { + if (pureAdapter != null) { + pureAdapter.appendItems(list); + pureAdapter.notifyDataSetChanged(); + } + } + + @Override + public void openGalleryActivity(ArrayList list) { + Bundle bundle = new Bundle(); + Intent intent = new Intent(getContext(), GalleryActivity.class); + bundle.putString(GalleryActivity.EXTRA_MODEL, GalleryActivity.EXTRA_GIFT); + intent.putExtra(GalleryActivity.EXTRA_LIST, list); + intent.putExtras(bundle); + ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(getContext(), + R.anim.alpha_in, R.anim.alpha_out); + getContext().startActivity(intent, compat.toBundle()); + } + + @Override + public void disLoadingDialog() { + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (pureAdapter != null) { + pureAdapter.destroy(); + } + } + + @Override + public void onLazyActivityCreate() { + + } + + @Override + public void shortToast(String string) { + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/girls/pure/PurePresenter.java b/app/src/main/java/com/gank/gankly/ui/pure/PurePresenter.java similarity index 63% rename from app/src/main/java/com/gank/gankly/ui/girls/pure/PurePresenter.java rename to app/src/main/java/com/gank/gankly/ui/pure/PurePresenter.java index 9037eadf..fc351d8d 100644 --- a/app/src/main/java/com/gank/gankly/ui/girls/pure/PurePresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/pure/PurePresenter.java @@ -1,10 +1,12 @@ -package com.gank.gankly.ui.girls.pure; +package com.gank.gankly.ui.pure; +import android.content.Context; +import android.lectcoding.ui.logcat.Logcat; +import android.ly.business.domain.Gift; +import android.ly.business.domain.PageConfig; +import android.ly.jsoup.JsoupServer; import android.text.TextUtils; -import com.gank.gankly.bean.GiftBean; -import com.gank.gankly.mvp.FetchPresenter; -import com.gank.gankly.mvp.source.remote.MeiziDataSource; import com.gank.gankly.utils.CrashUtils; import com.gank.gankly.utils.StringUtils; import com.socks.library.KLog; @@ -21,41 +23,39 @@ /** * Create by LingYan on 2016-12-27 - * Email:137387869@qq.com */ -public class PurePresenter extends FetchPresenter implements PureContract.Presenter { - private static String BASE_URL = "http://www.mzitu.com/mm"; - private String nextUrl = BASE_URL + "/page/"; +public class PurePresenter extends PureContract.Presenter { + private static String BASE_URL = "http://www.mzitu.com/mm/"; + private static String HOST = "page/"; + private static String nextUrl = BASE_URL + HOST; - private MeiziDataSource mTask; - private PureContract.View mModelView; + private int maxPageNumber; + private PageConfig pageConfig; - private int mMaxPageNumber; - - public PurePresenter(MeiziDataSource task, PureContract.View view) { - this.mTask = task; - this.mModelView = view; + PurePresenter(Context context, PureContract.View view) { + super(context, view); + pageConfig = new PageConfig(); + pageConfig.limit = 24; } @Override - public void fetchNew() { - setFetchLimit(24); - fetchData(getInitPage()); + public void refreshPure() { + fetchData(1); } @Override - public void fetchMore() { - if (hasMore()) { - mModelView.showRefresh(); - fetchData(getFetchPage()); + public void appendPure() { + int page = pageConfig.getNextPage(); + if (page < maxPageNumber) { + fetchData(page); } } - private void fetchData(final int page) { - KLog.d("fetchData"); + private void fetchData(int page) { String url = getUrl(page); - mTask.fetchPure(url) + JsoupServer.rxConnect(url).build() + .doFinally(() -> view.hideProgress()) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { @@ -64,31 +64,27 @@ public void onSubscribe(Disposable d) { @Override public void onNext(Document document) { -// KLog.d(document); - mMaxPageNumber = getMaxPageNum(document); - List list = getPageLists(document); - list = filterData(list, mModelView); - if (list != null) { - if (page == 1) { - mModelView.refillData(list); - } else { - mModelView.appendData(list); + Logcat.d(document); + maxPageNumber = getMaxPageNum(document); + List gifts = getPageLists(document); + if (gifts != null) { + if (view != null) { + if (pageConfig.isFirst()) { + view.refillData(gifts); + } else { + view.appendData(gifts); + } } } } @Override public void onError(Throwable e) { - KLog.e(e); - CrashUtils.crashReport(e); - parseError(mModelView); + Logcat.e(e); } @Override public void onComplete() { - mModelView.showContent(); - mModelView.hideRefresh(); - setFetchPage(page + 1); } }); } @@ -114,8 +110,8 @@ private String getImageFirstUrl(Document doc) { return links.get(0).attr("src"); } - private ArrayList getImages(String url) { - ArrayList imagesList = new ArrayList<>(); + private ArrayList getImages(String url) { + ArrayList imagesList = new ArrayList<>(); String baseUrl = null; String name = null; String endType = null; @@ -135,42 +131,44 @@ private ArrayList getImages(String url) { String number; String lastUrl; - for (int i = 1; i <= mMaxPageNumber; i++) { + for (int i = 1; i <= maxPageNumber; i++) { if (i < 10) { number = "0" + i; } else { number = String.valueOf(i); } lastUrl = baseUrl + name + number + endType; - imagesList.add(new GiftBean(lastUrl)); + imagesList.add(new Gift(lastUrl)); } return imagesList; } - private List getPageLists(Document doc) { - List list = new ArrayList<>(); + /** + * 解析每面,封面入口地址 + */ + private List getPageLists(Document doc) { + List list = new ArrayList<>(); if (doc == null) { return null; } - Elements hrefs = doc.select("#pins > li > a"); + Elements href = doc.select("#pins > li > a"); Elements img = doc.select("#pins a img"); Elements times = doc.select(".time"); Elements views = doc.select(".view"); - int countSize = hrefs.size(); - int imgSize = img.size(); - int size = countSize > imgSize ? imgSize : countSize; + final int countSize = href.size(); + final int imgSize = img.size(); + final int size = countSize > imgSize ? imgSize : countSize; if (size > 0) { for (int i = 0; i < size; i++) { String imgUrl = img.get(i).attr("data-original"); - KLog.d("imgurl:"+imgUrl); String title = img.get(i).attr("alt"); - String url = hrefs.get(i).attr("href"); + String url = href.get(i).attr("href"); String time = times.get(i).text(); String view = views.get(i).text(); if (!TextUtils.isEmpty(imgUrl) && !TextUtils.isEmpty(url)) { - list.add(new GiftBean(imgUrl, url, time, view, title)); + list.add(new Gift(imgUrl, url, time, view, title)); } } } @@ -209,34 +207,41 @@ private int getMaxPageNum(Document doc) { return p; } - @Override - public void subscribe() { + public void destroy() { } @Override - public void unSubscribe() { + protected void onDestroy() { } @Override - public void fetchImages(String url) { - mTask.fetchPure(url) + public void refreshImages(String url) { + JsoupServer.rxConnect(url) + .build() .map(document -> { - mMaxPageNumber = getImageMaxPage(document); + maxPageNumber = getImageMaxPage(document); String firstUrl = getImageFirstUrl(document); return getImages(firstUrl); }) - .subscribe(new Observer>() { + .doFinally(() -> { + if (view != null) { + view.disLoadingDialog(); + } + }) + .subscribe(new Observer>() { @Override public void onSubscribe(Disposable d) { } @Override - public void onNext(ArrayList list) { - mModelView.openGalleryActivity(list); + public void onNext(ArrayList list) { + if (view != null) { + view.openGalleryActivity(list); + } } @Override @@ -247,7 +252,6 @@ public void onError(Throwable e) { @Override public void onComplete() { - mModelView.disLoadingDialog(); } }); } diff --git a/app/src/main/java/com/gank/gankly/ui/main/SplashActivity.java b/app/src/main/java/com/gank/gankly/ui/splash/SplashActivity.java similarity index 85% rename from app/src/main/java/com/gank/gankly/ui/main/SplashActivity.java rename to app/src/main/java/com/gank/gankly/ui/splash/SplashActivity.java index 5cffc641..06458374 100644 --- a/app/src/main/java/com/gank/gankly/ui/main/SplashActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/splash/SplashActivity.java @@ -1,17 +1,18 @@ -package com.gank.gankly.ui.main; +package com.gank.gankly.ui.splash; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.view.View; import android.view.Window; import android.view.WindowManager; import com.gank.gankly.R; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.BaseActivity; +import com.gank.gankly.ui.MainActivity; import java.util.concurrent.TimeUnit; @@ -21,7 +22,6 @@ /** * Create by LingYan on 2016-06-01 - * Email:137387869@qq.com */ public class SplashActivity extends BaseActivity { @BindView(R.id.splash_main) @@ -33,6 +33,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); + start(); } @Override @@ -40,25 +41,6 @@ protected int getContentId() { return R.layout.activity_splash; } - @Override - protected void initViews() { - } - - @Override - protected void bindListener() { - - } - - @Override - protected void initPresenter() { - super.initPresenter(); - } - - @Override - protected void initValues() { - start(); - } - private void start() { Observable.timer(50, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/java/com/gank/gankly/ui/web/JiandanWebActivity.java b/app/src/main/java/com/gank/gankly/ui/web/JiandanWebActivity.java index f9cfbcea..b1a6c0c1 100644 --- a/app/src/main/java/com/gank/gankly/ui/web/JiandanWebActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/web/JiandanWebActivity.java @@ -1,13 +1,13 @@ package com.gank.gankly.ui.web; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.design.widget.Snackbar; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.Toolbar; +import androidx.annotation.Nullable; +import com.google.android.material.snackbar.Snackbar; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; @@ -18,12 +18,11 @@ import android.widget.FrameLayout; import android.widget.ProgressBar; -import com.gank.gankly.App; import com.gank.gankly.R; import com.gank.gankly.config.Constants; import com.gank.gankly.data.entity.UrlCollect; import com.gank.gankly.data.entity.UrlCollectDao; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.BaseActivity; import com.gank.gankly.utils.AppUtils; import com.gank.gankly.utils.CrashUtils; import com.gank.gankly.utils.ListUtils; @@ -58,7 +57,6 @@ /** * Create by LingYan on 2016-5-10 - * Email:137387869@qq.com */ public class JiandanWebActivity extends BaseActivity { public static final int FROM_COLLECT = 1; @@ -101,13 +99,17 @@ enum CollectStates { } @Override - protected int getContentId() { - return R.layout.activity_web; - } + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setTitle(mTitle); + setSupportActionBar(mToolbar); + ActionBar bar = getSupportActionBar(); + if (bar != null) { + bar.setHomeAsUpIndicator(R.drawable.ic_toolbar_close); + bar.setDisplayHomeAsUpEnabled(true); + } + mToolbar.setNavigationOnClickListener(v -> onBackPressed()); - @SuppressLint("SetJavaScriptEnabled") - @Override - protected void initViews() { mWebView = new WebView(this, null); mViewParent.addView(mWebView, new FrameLayout.LayoutParams( @@ -133,22 +135,7 @@ protected void initViews() { settings.setDefaultTextEncodingName("utf-8");//设置编码格式 mWebView.setWebViewClient(new MyWebViewClient()); mWebView.setWebChromeClient(new MyWebChromeClient()); - } - - @Override - protected void bindListener() { - setTitle(mTitle); - setSupportActionBar(mToolbar); - ActionBar bar = getSupportActionBar(); - if (bar != null) { - bar.setHomeAsUpIndicator(R.drawable.ic_toolbar_close); - bar.setDisplayHomeAsUpEnabled(true); - } - mToolbar.setNavigationOnClickListener(v -> onBackPressed()); - } - @Override - protected void initValues() { Bundle bundle = getIntent().getExtras(); if (bundle != null) { mUrl = bundle.getString(URL); @@ -158,9 +145,9 @@ protected void initValues() { mFromWay = bundle.getInt(FROM_WAY); } - mUrlCollectDao = App.getDaoSession().getUrlCollectDao(); +// mUrlCollectDao = AppConfig.getDaoSession().getUrlCollectDao(); List list = mUrlCollectDao.queryBuilder().where(UrlCollectDao.Properties.Url.eq(mUrl)).list(); - if (!ListUtils.isListEmpty(list)) { + if (!ListUtils.isEmpty(list)) { isInitCollect = true; isCollect = true; mUrlCollect = list.get(0); @@ -169,6 +156,11 @@ protected void initValues() { parseLoadUrlData(filterUrl(mUrl)); } + @Override + protected int getContentId() { + return R.layout.activity_web; + } + private String filterUrl(String url) { if (!TextUtils.isEmpty(url)) { if (url.contains("/") && url.startsWith("http://jandan.net")) { @@ -356,7 +348,7 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; case R.id.welfare_copy_url: AppUtils.copyText(this, mUrl); - ToastUtils.showToast(R.string.tip_copy_success); + ToastUtils.showToast(getBaseContext(), R.string.tip_copy_success); return true; case R.id.welfare_refresh: mWebView.reload(); @@ -386,7 +378,7 @@ private void openBrowser(String url) { if (intent.resolveActivity(JiandanWebActivity.this.getPackageManager()) != null) { JiandanWebActivity.this.startActivity(intent); } else { - ToastUtils.showToast(R.string.web_open_failed); + ToastUtils.showToast(getBaseContext(), R.string.web_open_failed); } } diff --git a/app/src/main/java/com/gank/gankly/ui/web/WebVideoViewActivity.java b/app/src/main/java/com/gank/gankly/ui/web/WebVideoViewActivity.java index c99ed065..9340f26e 100644 --- a/app/src/main/java/com/gank/gankly/ui/web/WebVideoViewActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/web/WebVideoViewActivity.java @@ -5,6 +5,7 @@ import android.graphics.PixelFormat; import android.net.Uri; import android.os.Bundle; +import androidx.annotation.Nullable; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -12,7 +13,7 @@ import android.widget.ProgressBar; import com.gank.gankly.R; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.BaseActivity; import com.gank.gankly.utils.ToastUtils; import com.socks.library.KLog; import com.tencent.smtt.export.external.interfaces.IX5WebChromeClient; @@ -49,7 +50,13 @@ protected int getContentId() { } @Override - protected void initViews() { + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Bundle bundle = getIntent().getExtras(); + if (bundle != null) { + mUrl = bundle.getString(URL); + } + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); getWindow().setFormat(PixelFormat.TRANSLUCENT); @@ -62,21 +69,10 @@ protected void initViews() { if (!TextUtils.isEmpty(mUrl)) { mWebView.loadUrl(mUrl); } else { - ToastUtils.showToast(R.string.tip_server_error); + ToastUtils.showToast(getBaseContext(), R.string.tip_server_error); } - } - - @Override - protected void bindListener() { - } - @Override - protected void initValues() { - Bundle bundle = getIntent().getExtras(); - if (bundle != null) { - mUrl = bundle.getString(URL); - } } public static void startWebActivity(Context packageContext, Bundle bundle) { diff --git a/app/src/main/java/com/gank/gankly/ui/web/normal/WebActivity.java b/app/src/main/java/com/gank/gankly/ui/web/normal/WebActivity.java index 696c4b3b..a4081d1e 100644 --- a/app/src/main/java/com/gank/gankly/ui/web/normal/WebActivity.java +++ b/app/src/main/java/com/gank/gankly/ui/web/normal/WebActivity.java @@ -1,13 +1,12 @@ package com.gank.gankly.ui.web.normal; -import android.annotation.SuppressLint; -import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.Toolbar; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; import android.text.TextUtils; import android.util.Base64; import android.view.KeyEvent; @@ -15,21 +14,20 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.ViewParent; import android.widget.FrameLayout; import android.widget.ProgressBar; -import com.gank.gankly.App; import com.gank.gankly.R; import com.gank.gankly.config.Constants; import com.gank.gankly.data.entity.ReadHistory; import com.gank.gankly.data.entity.UrlCollect; import com.gank.gankly.mvp.source.LocalDataSource; -import com.gank.gankly.ui.base.BaseActivity; +import com.gank.gankly.ui.base.activity.BaseActivity; import com.gank.gankly.utils.AppUtils; import com.gank.gankly.utils.CircularAnimUtils; import com.gank.gankly.utils.ShareUtils; import com.gank.gankly.utils.ToastUtils; -import com.socks.library.KLog; import com.tencent.smtt.export.external.interfaces.IX5WebChromeClient; import com.tencent.smtt.sdk.CookieSyncManager; import com.tencent.smtt.sdk.ValueCallback; @@ -46,7 +44,6 @@ /** * 普通webView * Create by LingYan on 2016-5-10 - * Email:137387869@qq.com */ public class WebActivity extends BaseActivity implements WebContract.View { public static final int FROM_MAIN = 0; @@ -82,41 +79,47 @@ public class WebActivity extends BaseActivity implements WebContract.View { private ValueCallback uploadFile; - enum CollectStates { - NORMAL, COLLECT, UN_COLLECT + @Override + public void shortToast(String string) { + } @Override - protected int getContentId() { - return R.layout.activity_web; + public void showProgress() { + } @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - parseBundle(); - super.onCreate(savedInstanceState); - initTheme(); + public void hideProgress() { + } @Override - protected void initPresenter() { - mPresenter = new WebPresenter(LocalDataSource.getInstance(), this); + public void showEmpty() { + } @Override - protected void initTheme() { - super.initTheme(); - if (App.isNight()) { - setTheme(R.style.AppTheme_Night_NoActionBar); - } else { - setTheme(R.style.AppTheme_light_NoActionBar); - } + public void showContent() { + + } + + enum CollectStates { + NORMAL, COLLECT, UN_COLLECT } - @SuppressLint("SetJavaScriptEnabled") @Override - protected void initViews() { - mWebView = new WebView(this, null); + protected int getContentId() { + return R.layout.activity_web; + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + parseBundle(); + super.onCreate(savedInstanceState); + mPresenter = new WebPresenter(LocalDataSource.getInstance(), this); + + mWebView = new WebView(getApplicationContext(), null); mWebParent.addView(mWebView, new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, @@ -155,10 +158,7 @@ protected void initViews() { CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().sync(); - } - @Override - protected void bindListener() { setTitle(mTitle); setSupportActionBar(mToolbar); ActionBar bar = getSupportActionBar(); @@ -167,14 +167,13 @@ protected void bindListener() { bar.setDisplayHomeAsUpEnabled(true); } mToolbar.setNavigationOnClickListener(v -> CircularAnimUtils.actionVisible_(false, WebActivity.this, v, mView, 0, 618)); - } - @Override - protected void initValues() { isInitCollect = true; if (!TextUtils.isEmpty(mUrl)) { - mPresenter.findCollectUrl(mUrl); - mPresenter.insetHistoryUrl(new ReadHistory(null, mUrl, mTitle, new Date(), mCollectType)); + if (mPresenter != null) { + mPresenter.findCollectUrl(mUrl); + mPresenter.insetHistoryUrl(new ReadHistory(null, mUrl, mTitle, new Date(), mCollectType)); + } } } @@ -187,15 +186,14 @@ private void parseBundle() { mAuthor = bundle.getString(AUTHOR); mFromType = bundle.getInt(FROM_TYPE); } -// KLog.d("mUrl:" + mUrl); } - public static void startWebActivity(Activity activity, Bundle bundle) { - Intent intent = new Intent(activity, WebActivity.class); + public static void startWebActivity(Context context, Bundle bundle) { + Intent intent = new Intent(context, WebActivity.class); if (bundle != null) { intent.putExtras(bundle); } - activity.startActivity(intent); + context.startActivity(intent); } @Override @@ -240,7 +238,7 @@ public boolean onOptionsItemSelected(MenuItem item) { isCollect = !isCollect; mPresenter.collectAction(isCollect); - showSnackbar(mView, resText, App.getAppColor(resColor)); + showSnackbar(mView, resText, getResources().getColor(resColor)); switchCollectIcon(isCollect); return true; case R.id.welfare_share: @@ -248,7 +246,7 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; case R.id.welfare_copy_url: AppUtils.copyText(this, mWebView.getUrl()); - ToastUtils.showToast(R.string.tip_copy_success); + ToastUtils.showToast(getBaseContext(), R.string.tip_copy_success); return true; case R.id.welfare_refresh: mWebView.reload(); @@ -282,7 +280,7 @@ private void openBrowser(String url) { if (intent.resolveActivity(WebActivity.this.getPackageManager()) != null) { WebActivity.this.startActivity(intent); } else { - ToastUtils.showToast(R.string.web_open_failed); + ToastUtils.showToast(getBaseContext(), R.string.web_open_failed); } } @@ -387,7 +385,6 @@ public void onHideCustomView() { @Override public boolean onShowFileChooser(WebView arg0, ValueCallback arg1, WebChromeClient.FileChooserParams arg2) { - KLog.e("onShowFileChooser"); return super.onShowFileChooser(arg0, arg1, arg2); } @@ -404,23 +401,6 @@ public void openFileChooser(ValueCallback uploadFile, String acceptType, St @Override public boolean onJsAlert(WebView arg0, String arg1, String arg2, com.tencent.smtt.export.external.interfaces.JsResult arg3) { - /** - * 这里写入你自定义的window alert - */ - // AlertDialog.Builder builder = new Builder(getContext()); - // builder.setTitle("X5内核"); - // builder.setPositiveButton("确定", new - // DialogInterface.OnClickListener() { - // - // @Override - // public void onClick(DialogInterface dialog, int which) { - // dialog.dismiss(); - // } - // }); - // builder.show(); - // arg3.confirm(); - // return true; - KLog.d("setX5webview = null"); return super.onJsAlert(null, "www.baidu.com", "aa", arg3); } @@ -463,7 +443,18 @@ protected void onStop() { @Override protected void onDestroy() { if (mWebView != null) { + ViewParent viewParent = mWebView.getParent(); + if (viewParent != null) { + ((ViewGroup) viewParent).removeView(mWebView); + } + mWebView.stopLoading(); + mWebView.getSettings().setJavaScriptEnabled(false); + mWebView.clearView(); + mWebView.clearFormData(); + mWebView.clearHistory(); + mWebView.removeAllViews(); mWebView.destroy(); + mWebView = null; } super.onDestroy(); // All you have to do is destroy() the WebView before Activity finishes } diff --git a/app/src/main/java/com/gank/gankly/ui/web/normal/WebContract.java b/app/src/main/java/com/gank/gankly/ui/web/normal/WebContract.java index 79be0bb1..054caf56 100644 --- a/app/src/main/java/com/gank/gankly/ui/web/normal/WebContract.java +++ b/app/src/main/java/com/gank/gankly/ui/web/normal/WebContract.java @@ -1,19 +1,17 @@ package com.gank.gankly.ui.web.normal; -import android.support.annotation.NonNull; +import android.lectcoding.ui.base.BaseView; +import androidx.annotation.NonNull; import com.gank.gankly.data.entity.ReadHistory; import com.gank.gankly.data.entity.UrlCollect; -import com.gank.gankly.mvp.IBasePresenter; -import com.gank.gankly.mvp.IBaseView; /** * Create by LingYan on 2016-10-27 - * Email:137387869@qq.com */ public interface WebContract { - interface View extends IBaseView { + interface View extends BaseView { void onCollect(); void onCancelCollect(); @@ -23,7 +21,7 @@ interface View extends IBaseView { void setCollectIcon(boolean isCollect); } - interface Presenter extends IBasePresenter { + interface Presenter { void findCollectUrl(@NonNull String url); void insetHistoryUrl(@NonNull ReadHistory readHistory); diff --git a/app/src/main/java/com/gank/gankly/ui/web/normal/WebPresenter.java b/app/src/main/java/com/gank/gankly/ui/web/normal/WebPresenter.java index 8be87932..07769f14 100644 --- a/app/src/main/java/com/gank/gankly/ui/web/normal/WebPresenter.java +++ b/app/src/main/java/com/gank/gankly/ui/web/normal/WebPresenter.java @@ -1,12 +1,11 @@ package com.gank.gankly.ui.web.normal; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import com.gank.gankly.rxjava.RxBus_; import com.gank.gankly.bean.RxCollect; import com.gank.gankly.data.entity.ReadHistory; import com.gank.gankly.data.entity.UrlCollect; -import com.gank.gankly.mvp.BasePresenter; import com.gank.gankly.mvp.source.LocalDataSource; import com.gank.gankly.utils.ListUtils; import com.socks.library.KLog; @@ -25,10 +24,9 @@ /** * Create by LingYan on 2016-10-27 - * Email:137387869@qq.com */ -public class WebPresenter extends BasePresenter implements WebContract.Presenter { +public class WebPresenter implements WebContract.Presenter { private LocalDataSource mTask; private WebContract.View mView; private long endTime; @@ -64,7 +62,7 @@ public void onSubscribe(Disposable d) { @Override public void onNext(List urlCollects) { mCollects = urlCollects; - boolean isCollect_ = ListUtils.getListSize(urlCollects) > 0; + boolean isCollect_ = ListUtils.getSize(urlCollects) > 0; isCollect = isCollect_; mView.setCollectIcon(isCollect_); } @@ -181,13 +179,6 @@ public void subscribe(ObservableEmitter subscriber) throws Exception { }); } - - @Override - public void subscribe() { - - } - - @Override - public void unSubscribe() { + public void destroy() { } } diff --git a/app/src/main/java/com/gank/gankly/ui/welfare/ImageViewModel.java b/app/src/main/java/com/gank/gankly/ui/welfare/ImageViewModel.java new file mode 100644 index 00000000..38f37eaf --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/welfare/ImageViewModel.java @@ -0,0 +1,155 @@ +package com.gank.gankly.ui.welfare; + +import android.content.Context; +import android.graphics.Bitmap; +import android.ly.business.domain.Gank; +import androidx.annotation.Nullable; +import android.util.ArrayMap; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.bumptech.glide.Priority; +import com.bumptech.glide.RequestBuilder; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.bumptech.glide.request.transition.Transition; +import com.gank.gankly.R; +import com.gank.gankly.ui.base.adapter.BaseViewModel; +import com.gank.gankly.ui.base.adapter.ButterKnifeHolder; +import com.gank.gankly.utils.AppUtils; +import com.gank.gankly.utils.gilde.ImageLoaderUtil; +import com.gank.gankly.widget.ImageDefaultView; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * Create by LingYan on 2018-09-25 + */ +public class ImageViewModel extends BaseViewModel { + private ArrayMap heights = new ArrayMap<>(); + + private Gank gank; + + private WelfareViewManager.ItemClickListener itemClickListener; + + ImageViewModel() { + + } + + public void setData(Gank gank) { + this.gank = gank; + } + + public void setListener(WelfareViewManager.ItemClickListener itemClickListener) { + this.itemClickListener = itemClickListener; + } + + private void setCardViewLayoutParams(ImageDefaultView mImageView, int width, int height) { + ViewGroup.LayoutParams layoutParams = mImageView.getLayoutParams(); + layoutParams.width = width; + layoutParams.height = height; + mImageView.setLayoutParams(layoutParams); + } + + @Override + public ViewHolder createViewHolder(ViewGroup parent) { + return new ViewHolder(createView(parent)); + } + + @Override + public void bindView(final ViewHolder viewHolder) { + super.bindView(viewHolder); + final String url = gank.url; + + RequestBuilder requestBuilder = ImageLoaderUtil.getInstance() + .glideAsBitmap(context, url); + + if (heights.containsKey(url)) { + setCardViewLayoutParams(viewHolder.imgMeizi, viewHolder.screenWidth, heights.get(url)); + requestBuilder.apply(new RequestOptions() + .fitCenter() + .diskCacheStrategy(DiskCacheStrategy.ALL) + .priority(Priority.HIGH) + ); + requestBuilder.into(viewHolder.imageView); + } else { + requestBuilder.apply(new RequestOptions() + .fitCenter() + .diskCacheStrategy(DiskCacheStrategy.ALL) + .priority(Priority.HIGH) + .override(viewHolder.screenWidth, viewHolder.screenHeight)//设置宽高一致,后期改动不大 + ); + requestBuilder.into(new DriverViewTarget(viewHolder.imageView, new onResourceCallback() { + @Override + public void onCallback(int width, int height) { + if (!heights.containsKey(url) && url != null) { + int viewHeight = width * viewHolder.screenWidth / height; + heights.put(url, viewHeight); + setCardViewLayoutParams(viewHolder.imgMeizi, viewHolder.screenWidth, heights.get(url)); + } + } + })); + } + + viewHolder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + itemClickListener.onItem(viewHolder.imgMeizi, viewHolder.getLayoutPosition()); + } + }); + } + + @Override + public int getLayoutRes() { + return R.layout.adapter_meizi; + } + + public interface onResourceCallback { + void onCallback(int width, int height); + } + + private static class DriverViewTarget extends BitmapImageViewTarget { + private final onResourceCallback resourceCallback; + + DriverViewTarget(ImageView image, onResourceCallback resourceCallback) { + super(image); + this.resourceCallback = resourceCallback; + } + + @Override + public void onResourceReady(Bitmap resource, @Nullable Transition transition) { + super.onResourceReady(resource, transition); + if (resourceCallback != null) { + resourceCallback.onCallback(resource.getWidth(), resource.getHeight()); + } + } + } + + public static class ViewHolder extends ButterKnifeHolder { + @BindView(R.id.img_meizi) + ImageDefaultView imgMeizi; + + @BindView(R.id.meizi_card_view) + RelativeLayout mRelativeLayout; + + ImageView imageView; + + private int screenWidth; + private int screenHeight; + + public ViewHolder(View view) { + super(view); + ButterKnife.bind(this, itemView); + final Context context = view.getContext(); + imageView = new ImageView(context); + imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); + imgMeizi.setFrameLayout(imageView); + + screenWidth = screenHeight = AppUtils.getDisplayWidth(context) / 2; + } + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/welfare/WelfareContract.java b/app/src/main/java/com/gank/gankly/ui/welfare/WelfareContract.java new file mode 100644 index 00000000..c03d156d --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/welfare/WelfareContract.java @@ -0,0 +1,31 @@ +package com.gank.gankly.ui.welfare; + +import android.content.Context; +import android.lectcoding.ui.base.BaseView; +import android.ly.business.domain.Gank; +import androidx.annotation.NonNull; + +import com.gank.gankly.mvp.base.LoadMorePresenter; + +import java.util.List; + +/** + * Create by LingYan on 2016-12-23 + */ + +public interface WelfareContract { + interface View extends BaseView { + void loadWelfareSuccess(int page, List list); + + void loadWelfareFailure(String msg); + } + + public abstract class Presenter extends LoadMorePresenter { + + public Presenter(@NonNull Context context, View view) { + super(context, view); + } + + public abstract void loadWelfare(int page); + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/welfare/WelfareFragment.java b/app/src/main/java/com/gank/gankly/ui/welfare/WelfareFragment.java new file mode 100644 index 00000000..e2e71188 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/welfare/WelfareFragment.java @@ -0,0 +1,181 @@ +package com.gank.gankly.ui.welfare; + +import android.content.Intent; +import android.ly.business.domain.Gank; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityOptionsCompat; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; +import android.view.View; + +import com.gank.gankly.R; +import com.gank.gankly.config.MeiziArrayList; +import com.gank.gankly.ui.base.LazyFragment; +import com.gank.gankly.ui.base.adapter.ViewModelAdapter; +import com.gank.gankly.ui.gallery.GalleryActivity; +import com.gank.gankly.utils.ListUtils; +import com.gank.gankly.widget.MultipleStatusView; +import com.gank.gankly.widget.recyclerview.OnFlexibleScrollListener; + +import java.util.List; + +import butterknife.BindView; + +/** + * 干货 - 妹子 + * Create by LingYan on 2016-5-12 + */ +public class WelfareFragment extends LazyFragment implements WelfareContract.View { + @BindView(R.id.multiple_status_view) + MultipleStatusView multipleStatusView; + + @BindView(R.id.swipe_refresh) + SwipeRefreshLayout swipeRefreshLayout; + + @BindView(R.id.recycler_view) + RecyclerView recyclerView; + + private WelfareViewManager itemManager; + private WelfareContract.Presenter presenter; + + private int curPage = 1; + + @Override + protected int getLayoutId() { + return R.layout.fragment_welfare; + } + + public static WelfareFragment newInstance() { + WelfareFragment fragment = new WelfareFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + ViewModelAdapter welfareAdapter = new ViewModelAdapter(); + itemManager = new WelfareViewManager(); + itemManager.setClickListener(itemClickListener); + welfareAdapter.setViewManager(itemManager); + + recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, + StaggeredGridLayoutManager.VERTICAL)); + OnFlexibleScrollListener scrollListener = new OnFlexibleScrollListener(); + scrollListener.setOnScrollListener(onRecyclerViewListener); + recyclerView.addOnScrollListener(scrollListener); + recyclerView.setAdapter(welfareAdapter); + + swipeRefreshLayout.setOnRefreshListener(onRefreshListener); + + multipleStatusView.setListener(onMultipleClick); + } + + @Override + public void onLazyActivityCreate() { + presenter = new WelfarePresenter(getContext(), this); + presenter.loadWelfare(curPage); + } + + private final OnFlexibleScrollListener.OnRecyclerViewListener onRecyclerViewListener = new OnFlexibleScrollListener.OnRecyclerViewListener() { + @Override + public void onLoadMore() { + loadWelfare(); + } + }; + + private final SwipeRefreshLayout.OnRefreshListener onRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + curPage = 1; + loadWelfare(); + } + }; + + private final MultipleStatusView.OnMultipleClick onMultipleClick = new MultipleStatusView.OnMultipleClick() { + @Override + public void retry(View v) { + multipleStatusView.showLoading(); + } + }; + + private final WelfareViewManager.ItemClickListener itemClickListener = new WelfareViewManager.ItemClickListener() { + @Override + public void onItem(View view, int position) { + Intent intent = new Intent(getContext(), GalleryActivity.class); + Bundle bundle = new Bundle(); + bundle.putInt(GalleryActivity.EXTRA_POSITION, position); + bundle.putInt(GalleryActivity.TYPE, GalleryActivity.TYPE_INDEX); + intent.putExtras(bundle); +// startActivity(intent); + + ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), view, getString(R.string.transition_welfare_image)); + startActivity(intent, activityOptionsCompat.toBundle()); + } + }; + + private void loadWelfare() { + if (presenter != null) { + presenter.loadWelfare(curPage); + } + } + + @Override + public void hideProgress() { + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setRefreshing(false); + } + } + + @Override + public void showProgress() { + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setRefreshing(true); + } + } + + public void showContent() { + if (multipleStatusView != null) { + multipleStatusView.showContent(); + } + } + + public void showEmpty() { + if (multipleStatusView != null) { + multipleStatusView.showEmpty(); + } + } + + @Override + public void loadWelfareSuccess(int page, List list) { + if (itemManager != null) { + if (page == 1 && ListUtils.isEmpty(list)) { + showEmpty(); + return; + } + + showContent(); + curPage = page + 1; + itemManager.setData(page, list); + itemManager.notifyDataSetChanged(); + MeiziArrayList.getInstance().addImages(list, page); + } + } + + @Override + public void loadWelfareFailure(String msg) { + shortToast(msg); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (presenter != null) { + presenter.destroy(); + } + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/welfare/WelfarePresenter.java b/app/src/main/java/com/gank/gankly/ui/welfare/WelfarePresenter.java new file mode 100644 index 00000000..13f0d3fc --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/welfare/WelfarePresenter.java @@ -0,0 +1,66 @@ +package com.gank.gankly.ui.welfare; + +import android.content.Context; +import android.lectcoding.ui.logcat.Logcat; +import android.ly.business.api.GankServer; +import android.ly.business.domain.Gank; +import android.ly.business.domain.PageEntity; + +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + +/** + * Create by LingYan on 2016-12-23 + */ + +public class WelfarePresenter extends WelfareContract.Presenter { + private static final int DEFAULT_LIMIT = 20; + + WelfarePresenter(Context context, WelfareContract.View view) { + super(context, view); + } + + @Override + public void loadWelfare(final int page) { + showProgress(); + GankServer.with(context) + .images(page, DEFAULT_LIMIT) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(PageEntity pageEntity) { + hideProgress(); + if (pageEntity != null) { + view.loadWelfareSuccess(page, pageEntity.results); + return; + } + if (view != null) { + view.loadWelfareFailure("获取数据失败"); + } + } + + @Override + public void onError(Throwable e) { + hideProgress(); + Logcat.e(e); + if (view != null) { + view.loadWelfareFailure("获取数据失败"); + } + } + + @Override + public void onComplete() { + + } + }); + } + + @Override + protected void onDestroy() { + + } +} diff --git a/app/src/main/java/com/gank/gankly/ui/welfare/WelfareViewManager.java b/app/src/main/java/com/gank/gankly/ui/welfare/WelfareViewManager.java new file mode 100644 index 00000000..9ebe5d8f --- /dev/null +++ b/app/src/main/java/com/gank/gankly/ui/welfare/WelfareViewManager.java @@ -0,0 +1,49 @@ +package com.gank.gankly.ui.welfare; + +import android.ly.business.domain.Gank; +import android.view.View; + +import com.gank.gankly.ui.base.adapter.BaseViewManager; +import com.gank.gankly.ui.base.adapter.ViewModel; + +import java.util.ArrayList; +import java.util.List; + +/** + * Create by LingYan on 2018-09-26 + */ +public class WelfareViewManager extends BaseViewManager { + private List list = new ArrayList<>(); + private ItemClickListener itemClickListener; + + public WelfareViewManager() { + + } + + public void setData(int page, List _list) { + if (page == 1) { + list.clear(); + } + list.addAll(_list); + } + + @Override + public List getModels() { + List viewModels = new ArrayList<>(); + for (Gank gank : list) { + ImageViewModel imageViewModel = new ImageViewModel(); + imageViewModel.setData(gank); + imageViewModel.setListener(itemClickListener); + viewModels.add(imageViewModel); + } + return viewModels; + } + + public void setClickListener(ItemClickListener itemClickListener) { + this.itemClickListener = itemClickListener; + } + + public interface ItemClickListener { + void onItem(View view, int position); + } +} diff --git a/app/src/main/java/com/gank/gankly/utils/AppUtils.java b/app/src/main/java/com/gank/gankly/utils/AppUtils.java index d34771e2..130f641f 100644 --- a/app/src/main/java/com/gank/gankly/utils/AppUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/AppUtils.java @@ -8,7 +8,6 @@ import android.os.Build; import android.util.DisplayMetrics; -import com.gank.gankly.App; import com.socks.library.KLog; import java.util.List; @@ -71,13 +70,13 @@ public static String getVersionName(Context context) { return appVersionName; } - public static int getDisplayWidth() { - DisplayMetrics dm = App.getGankContext().getResources().getDisplayMetrics(); + public static int getDisplayWidth(Context context) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); return dm.widthPixels; } - public static int getDisplayHeight() { - DisplayMetrics dm = App.getGankContext().getResources().getDisplayMetrics(); + public static int getDisplayHeight(Context context) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); return dm.heightPixels; } diff --git a/app/src/main/java/com/gank/gankly/utils/DateUtils.java b/app/src/main/java/com/gank/gankly/utils/DateUtils.java index fb8d25f4..602e67cb 100644 --- a/app/src/main/java/com/gank/gankly/utils/DateUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/DateUtils.java @@ -1,84 +1,63 @@ package com.gank.gankly.utils; import android.text.TextUtils; +import android.util.Log; -import java.text.DateFormat; +import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; + /** * 日期转换 * Create by LingYan on 2016-04-28 */ public class DateUtils { private static final String GMT_8 = "GMT+8"; - public static final String YY_MM_DD = "yyyy/MM/dd"; - public static final String YY_MM_DD_ = "yyyy-MM-dd"; + public static final String YY_MM_DD_SLASH = "yyyy/MM/dd"; + public static final String YY_MM_DD_HORIZONTAL = "yyyy-MM-dd"; public static final String MM_DD = "MM-dd"; + public static final String YMD_S = "yyyy-MM-dd'T'HH:mm:ss.sss'Z'"; - - public static String getFormatDateStr(final Date date) { - if (null == date) { + public static String formatString(final Date date, final String format) { + if (null == date || TextUtils.isEmpty(format)) { return null; } - return DateFormat.getDateInstance(DateFormat.DEFAULT).format(date); + SimpleDateFormat simpleDateFormat = getDateFormat(format); + return getSimpleFormat(simpleDateFormat, date); } - public static String getFormatDate(final Date date, String type) { - if (null == date || TextUtils.isEmpty(type)) { - return null; - } - - SimpleDateFormat sdf; - try { - sdf = new SimpleDateFormat(type, Locale.SIMPLIFIED_CHINESE); - } catch (Exception e) { - sdf = new SimpleDateFormat(YY_MM_DD_, Locale.SIMPLIFIED_CHINESE); - } - TimeZone timeZone = TimeZone.getTimeZone(GMT_8); - sdf.setTimeZone(timeZone); - return sdf.format(date); + private static String getSimpleFormat(SimpleDateFormat simpleDateFormat, final Date date) { + return simpleDateFormat == null ? "" : simpleDateFormat.format(date); } - public static Date formatDateFromStr(final String dateStr) { + public static Date formatToDate(final String dateStr) { Date date = new Date(); if (!TextUtils.isEmpty(dateStr)) { - String format = "yyyy-MM-dd'T'HH:mm:ss.sss'Z'"; - SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE); - TimeZone timeZone = TimeZone.getTimeZone(GMT_8); - sdf.setTimeZone(timeZone); - try { - date = sdf.parse(dateStr); - } catch (Exception e) { - System.out.print("Error,format Date error"); + SimpleDateFormat dateFormat = getDateFormat(YMD_S); + if (dateFormat != null) { + try { + return dateFormat.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } } } return date; } - public static String getMonth(final Date date) { - if (date != null) { - Calendar calendar = Calendar.getInstance(); - TimeZone timeZone = TimeZone.getTimeZone(GMT_8); - calendar.setTimeZone(timeZone); - calendar.setTime(date); - return String.valueOf(calendar.get(Calendar.MONTH) + 1); - } - return "0"; - } - - public static String getDay(final Date date) { - if (date != null) { - Calendar calendar = Calendar.getInstance(); + private static SimpleDateFormat getDateFormat(String format) { + SimpleDateFormat dateFormat; + try { TimeZone timeZone = TimeZone.getTimeZone(GMT_8); - calendar.setTimeZone(timeZone); - calendar.setTime(date); - return String.valueOf(calendar.get(Calendar.DATE)); + dateFormat = new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE); + dateFormat.setTimeZone(timeZone); + } catch (Exception e) { + dateFormat = null; + Log.e("", e.toString()); } - return "0"; + return dateFormat; } - } diff --git a/app/src/main/java/com/gank/gankly/utils/DisplayUtils.java b/app/src/main/java/com/gank/gankly/utils/DisplayUtils.java index e1dc2975..c2e73e0b 100644 --- a/app/src/main/java/com/gank/gankly/utils/DisplayUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/DisplayUtils.java @@ -8,17 +8,15 @@ import android.content.Context; -import com.gank.gankly.App; - public class DisplayUtils { - public static float px2dp(final float px) { - return px / App.getAppResources().getDisplayMetrics().density; + public static float px2dp(Context context, final float px) { + return px / context.getResources().getDisplayMetrics().density; } - public static float dp2px(final float dp) { - return dp * App.getAppResources().getDisplayMetrics().density; + public static float dp2px(Context context, final float dp) { + return dp * context.getResources().getDisplayMetrics().density; } /** diff --git a/app/src/main/java/com/gank/gankly/utils/GanklyPreferences.java b/app/src/main/java/com/gank/gankly/utils/GanklyPreferences.java index caeab2af..f4bcdf6d 100644 --- a/app/src/main/java/com/gank/gankly/utils/GanklyPreferences.java +++ b/app/src/main/java/com/gank/gankly/utils/GanklyPreferences.java @@ -3,28 +3,24 @@ import android.content.Context; import android.content.SharedPreferences; -import com.gank.gankly.App; - import javax.annotation.Nullable; /** - * 偏好设置 * Create by LingYan on 2016-06-01 - * Email:137387869@qq.com */ public class GanklyPreferences { - public static final String PREFERENCES_NAME_DEFAULT = "gankly_config"; + private static final String PREFERENCES_NAME_DEFAULT = "gankly_config"; private volatile static SharedPreferences mSharedPreferences; private volatile static SharedPreferences.Editor sEditor; - public static SharedPreferences getDefaultPreference() { - return initPreference(PREFERENCES_NAME_DEFAULT); + public static SharedPreferences getDefaultPreference(Context context) { + return initPreference(context, PREFERENCES_NAME_DEFAULT); } - public static SharedPreferences.Editor getDefaultEditor() { + public static SharedPreferences.Editor getDefaultEditor(Context context) { if (mSharedPreferences == null) { - initPreference(PREFERENCES_NAME_DEFAULT); + initPreference(context, PREFERENCES_NAME_DEFAULT); } if (sEditor == null) { @@ -37,55 +33,55 @@ public static SharedPreferences.Editor getDefaultEditor() { return sEditor; } - public static SharedPreferences getPreference(String name) { - return initPreference(name); + public static SharedPreferences getPreference(Context context, String name) { + return initPreference(context, name); } - public static SharedPreferences initPreference(String name) { + public static SharedPreferences initPreference(Context context, String name) { if (mSharedPreferences == null) { synchronized (GanklyPreferences.class) { if (mSharedPreferences == null) { - mSharedPreferences = App.getGankContext().getSharedPreferences(name, Context.MODE_PRIVATE); + mSharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE); } } } return mSharedPreferences; } - public static void clear() { - getDefaultPreference().edit().clear().commit(); + public static void clear(Context context) { + getDefaultPreference(context).edit().clear().commit(); } - public static int getInt(String key, int defValue) { - return getDefaultPreference().getInt(key, defValue); + public static int getInt(Context context, String key, int defValue) { + return getDefaultPreference(context).getInt(key, defValue); } - public static long getLong(String key, int defValue) { - return getDefaultPreference().getLong(key, defValue); + public static long getLong(Context context, String key, int defValue) { + return getDefaultPreference(context).getLong(key, defValue); } - public static boolean getBoolean(String key, boolean defValue) { - return getDefaultPreference().getBoolean(key, defValue); + public static boolean getBoolean(Context context, String key, boolean defValue) { + return getDefaultPreference(context).getBoolean(key, defValue); } @Nullable - public static String getString(String key, @Nullable String defValue) { - return getDefaultPreference().getString(key, defValue); + public static String getString(Context context, String key, @Nullable String defValue) { + return getDefaultPreference(context).getString(key, defValue); } - public static void putInt(String key, int value) { - getDefaultEditor().putInt(key, value).apply(); + public static void putInt(Context context, String key, int value) { + getDefaultEditor(context).putInt(key, value).apply(); } - public static void putLong(String key, long value) { - getDefaultEditor().putLong(key, value).apply(); + public static void putLong(Context context, String key, long value) { + getDefaultEditor(context).putLong(key, value).apply(); } - public static void putBoolean(String key, boolean value) { - getDefaultEditor().putBoolean(key, value).apply(); + public static void putBoolean(Context context, String key, boolean value) { + getDefaultEditor(context).putBoolean(key, value).apply(); } - public static void putString(String key, @Nullable String value) { - getDefaultEditor().putString(key, value).apply(); + public static void putString(Context context, String key, @Nullable String value) { + getDefaultEditor(context).putString(key, value).apply(); } } diff --git a/app/src/main/java/com/gank/gankly/utils/GlideCatchUtil.java b/app/src/main/java/com/gank/gankly/utils/GlideCatchUtil.java index 2629565e..ffcb1d77 100644 --- a/app/src/main/java/com/gank/gankly/utils/GlideCatchUtil.java +++ b/app/src/main/java/com/gank/gankly/utils/GlideCatchUtil.java @@ -1,9 +1,9 @@ package com.gank.gankly.utils; +import android.content.Context; import android.os.Looper; import com.bumptech.glide.Glide; -import com.gank.gankly.App; import java.io.File; import java.math.BigDecimal; @@ -19,9 +19,9 @@ public static GlideCatchUtil getInstance() { } // 获取Glide磁盘缓存大小 - public String getCacheSize() { + public String getCacheSize(Context context) { try { - return getFormatSize(getFolderSize(new File(FileUtils.getGlideDefaultPath(App.getGankContext())))); + return getFormatSize(getFolderSize(new File(FileUtils.getGlideDefaultPath(context)))); } catch (Exception e) { e.printStackTrace(); return "获取失败"; @@ -29,17 +29,17 @@ public String getCacheSize() { } // 清除Glide磁盘缓存,自己获取缓存文件夹并删除方法 - public boolean cleanCatchDisk() { - return deleteFolderFile(FileUtils.getGlideDefaultPath(App.getGankContext()), true); + public boolean cleanCatchDisk(Context context) { + return deleteFolderFile(FileUtils.getGlideDefaultPath(context), true); } // 清除图片磁盘缓存,调用Glide自带方法 - public boolean clearCacheDiskSelf() { + public boolean clearCacheDiskSelf(Context context) { try { if (Looper.myLooper() == Looper.getMainLooper()) { - new Thread(() -> Glide.get(App.getGankContext()).clearDiskCache()).start(); + new Thread(() -> Glide.get(context).clearDiskCache()).start(); } else { - Glide.get(App.getGankContext()).clearDiskCache(); + Glide.get(context).clearDiskCache(); } return true; } catch (Exception e) { @@ -49,10 +49,10 @@ public boolean clearCacheDiskSelf() { } // 清除Glide内存缓存 - public boolean clearCacheMemory() { + public boolean clearCacheMemory(Context context) { try { if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主线程执行 - Glide.get(App.getGankContext()).clearMemory(); + Glide.get(context).clearMemory(); return true; } } catch (Exception e) { diff --git a/app/src/main/java/com/gank/gankly/utils/ListUtils.java b/app/src/main/java/com/gank/gankly/utils/ListUtils.java index 9b92ef23..dcffce52 100644 --- a/app/src/main/java/com/gank/gankly/utils/ListUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/ListUtils.java @@ -6,11 +6,11 @@ * Create by LingYan on 2016-04-06 */ public class ListUtils { - public static int getListSize(List list) { + public static int getSize(List list) { return list == null ? 0 : list.size(); } - public static boolean isListEmpty(List list) { + public static boolean isEmpty(List list) { return list == null || list.isEmpty(); } } diff --git a/app/src/main/java/com/gank/gankly/utils/NetworkUtils.java b/app/src/main/java/com/gank/gankly/utils/NetworkUtils.java index 4eeb8f7f..05af4650 100644 --- a/app/src/main/java/com/gank/gankly/utils/NetworkUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/NetworkUtils.java @@ -5,8 +5,6 @@ import android.net.NetworkInfo; import android.telephony.TelephonyManager; -import com.gank.gankly.App; - /** * Create by LingYan on 2016-6-3 */ @@ -15,10 +13,10 @@ public class NetworkUtils { /** * 判断网络连接是否可用 */ - public static boolean isNetworkAvailable() { - return (App.getGankContext().getSystemService(Context.CONNECTIVITY_SERVICE) != + public static boolean isNetworkAvailable(Context context) { + return (context.getSystemService(Context.CONNECTIVITY_SERVICE) != null) && (( - (ConnectivityManager) App.getGankContext().getSystemService(Context.CONNECTIVITY_SERVICE)) + (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)) .getActiveNetworkInfo() != null); } @@ -42,8 +40,8 @@ public static boolean isWiFiEnabled(Context context) { /** * 判断是否是移动网络 */ - public static boolean isMobileNetwork() { - NetworkInfo networkInfo = ((ConnectivityManager) App.getGankContext().getSystemService(Context + public static boolean isMobileNetwork(Context context) { + NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context .CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); return (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE); } @@ -51,8 +49,8 @@ public static boolean isMobileNetwork() { /** * 判断是否是WiFi */ - public static boolean isWiFi() { - NetworkInfo networkInfo = ((ConnectivityManager) App.getGankContext().getSystemService(Context + public static boolean isWiFi(Context context) { + NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context .CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); return (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI); } diff --git a/app/src/main/java/com/gank/gankly/utils/RxClick.java b/app/src/main/java/com/gank/gankly/utils/RxClick.java index b562ae4b..5c05e74d 100644 --- a/app/src/main/java/com/gank/gankly/utils/RxClick.java +++ b/app/src/main/java/com/gank/gankly/utils/RxClick.java @@ -2,7 +2,6 @@ /** * Created by Lingyan on 2017/4/1 0001. - * Email:137387869@qq.com */ public class RxClick { diff --git a/app/src/main/java/com/gank/gankly/utils/ShareUtils.java b/app/src/main/java/com/gank/gankly/utils/ShareUtils.java index 83326239..808871ec 100644 --- a/app/src/main/java/com/gank/gankly/utils/ShareUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/ShareUtils.java @@ -5,7 +5,6 @@ import android.net.Uri; import android.text.TextUtils; -import com.gank.gankly.App; import com.gank.gankly.R; /** @@ -28,7 +27,7 @@ public void shareText(Context context, String share) { public void shareText(Context context, String title, String share) { if (TextUtils.isEmpty(share)) { - ToastUtils.showToast(R.string.tip_share_empty_text); + ToastUtils.showToast(context, R.string.tip_share_empty_text); return; } share = title + "! " + share + " [Gankly]"; @@ -36,7 +35,7 @@ public void shareText(Context context, String title, String share) { shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_TEXT, share); shareIntent.setType("text/plain"); - context.startActivity(Intent.createChooser(shareIntent, App.getAppString(R.string.share_to))); + context.startActivity(Intent.createChooser(shareIntent, context.getString(R.string.share_to))); } public static void shareSingleImage(Context context, Uri result) { diff --git a/app/src/main/java/com/gank/gankly/utils/StyleUtils.java b/app/src/main/java/com/gank/gankly/utils/StyleUtils.java index 6ba53051..bd28a4d9 100644 --- a/app/src/main/java/com/gank/gankly/utils/StyleUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/StyleUtils.java @@ -1,9 +1,8 @@ package com.gank.gankly.utils; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.recyclerview.widget.RecyclerView; -import com.gank.gankly.App; import com.gank.gankly.R; import com.socks.library.KLog; @@ -13,7 +12,6 @@ /** * Create by LingYan on 2016-09-12 - * Email:137387869@qq.com */ public class StyleUtils { public static void changeSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayout) { @@ -24,13 +22,13 @@ public static void changeSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayou int progressColor = R.color.white; int schemeColor = R.color.colorAccent; - if (App.isNight()) { - progressColor = R.color.baseSwipeRefreshLayoutProgressSchemeColor; - schemeColor = R.color.baseSwipeRefreshLayoutSchemeColors; - } +// if (AppConfig.isNight()) { +// progressColor = R.color.baseSwipeRefreshLayoutProgressSchemeColor; +// schemeColor = R.color.baseSwipeRefreshLayoutSchemeColors; +// } - swipeRefreshLayout.setProgressBackgroundColorSchemeColor(App.getAppColor(progressColor)); - swipeRefreshLayout.setColorSchemeColors(App.getAppColor(schemeColor)); + swipeRefreshLayout.setProgressBackgroundColorSchemeColor(swipeRefreshLayout.getContext().getResources().getColor(progressColor)); + swipeRefreshLayout.setColorSchemeColors(swipeRefreshLayout.getContext().getResources().getColor(schemeColor)); } //让 RecyclerView 缓存在 Pool 中的 Item 失效 diff --git a/app/src/main/java/com/gank/gankly/utils/ToastUtils.java b/app/src/main/java/com/gank/gankly/utils/ToastUtils.java index 8655d4ea..a1061f14 100644 --- a/app/src/main/java/com/gank/gankly/utils/ToastUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/ToastUtils.java @@ -1,10 +1,9 @@ package com.gank.gankly.utils; +import android.content.Context; import android.view.Gravity; import android.widget.Toast; -import com.gank.gankly.App; - /** * Create by LingYan on 2016-04-01 */ @@ -14,43 +13,43 @@ public class ToastUtils { private ToastUtils() { } - public static void showToast(String msg) { - show(msg, Toast.LENGTH_SHORT); + public static void showToast(Context context, String msg) { + show(context, msg, Toast.LENGTH_SHORT); } - public static void showToast(int resText) { - show(resText, Toast.LENGTH_SHORT); + public static void showToast(Context context, int resText) { + show(context, resText, Toast.LENGTH_SHORT); } - public static void longBottom(int resText) { - show(resText, Toast.LENGTH_LONG, Gravity.BOTTOM); + public static void longBottom(Context context, int resText) { + show(context, resText, Toast.LENGTH_LONG, Gravity.BOTTOM); } - public static void shortBottom(int resText) { - show(resText, Toast.LENGTH_SHORT, Gravity.BOTTOM); + public static void shortBottom(Context context, int resText) { + show(context, resText, Toast.LENGTH_SHORT, Gravity.BOTTOM); } - public static void longToast(int resText) { - show(resText, Toast.LENGTH_LONG); + public static void longToast(Context context, int resText) { + show(context, resText, Toast.LENGTH_LONG); } - private static void show(String msg, int duration) { + private static void show(Context context, String msg, int duration) { cancel(); - mToast = Toast.makeText(App.getGankContext(), msg, duration); + mToast = Toast.makeText(context.getApplicationContext(), msg, duration); mToast.setGravity(Gravity.CENTER, 0, 0); mToast.show(); } - private static void show(int resText, int duration) { + private static void show(Context context, int resText, int duration) { cancel(); - mToast = Toast.makeText(App.getGankContext(), resText, duration); + mToast = Toast.makeText(context.getApplicationContext(), resText, duration); mToast.setGravity(Gravity.CENTER, 0, 0); mToast.show(); } - private static void show(int resText, int duration, int gravity) { + private static void show(Context context, int resText, int duration, int gravity) { cancel(); - mToast = Toast.makeText(App.getGankContext(), resText, duration); + mToast = Toast.makeText(context.getApplicationContext(), resText, duration); mToast.setGravity(gravity, 0, 100); mToast.show(); } @@ -62,6 +61,4 @@ private static void cancel() { mToast = null; } } - - } diff --git a/app/src/main/java/com/gank/gankly/utils/gilde/GlideImageLoaderStrategy.java b/app/src/main/java/com/gank/gankly/utils/gilde/GlideImageLoaderStrategy.java index c900e4e3..2fcedfba 100644 --- a/app/src/main/java/com/gank/gankly/utils/gilde/GlideImageLoaderStrategy.java +++ b/app/src/main/java/com/gank/gankly/utils/gilde/GlideImageLoaderStrategy.java @@ -3,7 +3,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.widget.ImageView; import com.bumptech.glide.Glide; @@ -52,7 +52,7 @@ public void loadImage(Context context, String url, int placeholder, ImageView im @Override public RequestBuilder loadWifiImage(Context context, String url) { - return getImageCache(context, url, isAllowDown()); + return getImageCache(context, url, isAllowDown(context)); } @Override @@ -126,7 +126,7 @@ public void saveImage(Context context, String url, String savePath, String saveF @Override public RequestBuilder glideAsBitmap(Context context, String imgUrl) { - if (isAllowDown()) { + if (isAllowDown(context)) { return Glide.with(context) .asBitmap() .load(imgUrl) @@ -204,11 +204,11 @@ public boolean onResourceReady(Drawable resource, Object model, Target .into(imageView); } - private boolean isAllowDown() { + private boolean isAllowDown(Context context) { boolean allowDownload = true; - boolean isOnlyWif = GanklyPreferences.getBoolean(Preferences.SETTING_WIFI_ONLY, false); + boolean isOnlyWif = GanklyPreferences.getBoolean(context, Preferences.SETTING_WIFI_ONLY, false); if (isOnlyWif) { - if (!NetworkUtils.isWiFi()) { + if (!NetworkUtils.isWiFi(context)) { allowDownload = false; } } diff --git a/app/src/main/java/com/gank/gankly/utils/gilde/NetworkDisablingLoader.java b/app/src/main/java/com/gank/gankly/utils/gilde/NetworkDisablingLoader.java index 4e8aa5c9..d0509752 100644 --- a/app/src/main/java/com/gank/gankly/utils/gilde/NetworkDisablingLoader.java +++ b/app/src/main/java/com/gank/gankly/utils/gilde/NetworkDisablingLoader.java @@ -1,6 +1,6 @@ package com.gank.gankly.utils.gilde; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.bumptech.glide.load.Options; import com.bumptech.glide.load.model.GlideUrl; diff --git a/app/src/main/java/com/gank/gankly/utils/gilde/WifiOnlyLoader.java b/app/src/main/java/com/gank/gankly/utils/gilde/WifiOnlyLoader.java index f7e90563..147423f1 100644 --- a/app/src/main/java/com/gank/gankly/utils/gilde/WifiOnlyLoader.java +++ b/app/src/main/java/com/gank/gankly/utils/gilde/WifiOnlyLoader.java @@ -1,7 +1,8 @@ package com.gank.gankly.utils.gilde; +import android.content.Context; import android.content.SharedPreferences; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import com.bumptech.glide.load.Options; import com.bumptech.glide.load.model.GlideUrl; @@ -18,15 +19,17 @@ public class WifiOnlyLoader implements ModelLoader { private final ModelLoader defaultLoader; + private final Context context; - public WifiOnlyLoader(ModelLoader loader) { + public WifiOnlyLoader(Context context, ModelLoader loader) { + this.context = context; defaultLoader = loader; } @Nullable @Override public LoadData buildLoadData(GlideUrl glideUrl, int width, int height, Options options) { - SharedPreferences prefs = GanklyPreferences.getDefaultPreference(); + SharedPreferences prefs = GanklyPreferences.getDefaultPreference(context); if (prefs.getBoolean(SETTING_WIFI_ONLY, true)) { return new NetworkDisablingLoader().buildLoadData(glideUrl, width, height, options); } else { @@ -40,9 +43,15 @@ public boolean handles(GlideUrl glideUrl) { } public static class Factory implements ModelLoaderFactory { + private final Context context; + + public Factory(Context context) { + this.context = context; + } + @Override public ModelLoader build(MultiModelLoaderFactory multiFactory) { - return new WifiOnlyLoader(new HttpGlideUrlLoader(new ModelCache<>(500))); + return new WifiOnlyLoader(context, new HttpGlideUrlLoader(new ModelCache<>(500))); } @Override diff --git a/app/src/main/java/com/gank/gankly/utils/permission/ActivityUtils.java b/app/src/main/java/com/gank/gankly/utils/permission/ActivityUtils.java index 6808260a..5cd31021 100644 --- a/app/src/main/java/com/gank/gankly/utils/permission/ActivityUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/permission/ActivityUtils.java @@ -4,7 +4,6 @@ /** * Created by Lingyan on 2017/3/22 0022. - * Email:137387869@qq.com */ public class ActivityUtils { diff --git a/app/src/main/java/com/gank/gankly/utils/permission/PermissionUtils.java b/app/src/main/java/com/gank/gankly/utils/permission/PermissionUtils.java index c315f59c..ba8ba079 100644 --- a/app/src/main/java/com/gank/gankly/utils/permission/PermissionUtils.java +++ b/app/src/main/java/com/gank/gankly/utils/permission/PermissionUtils.java @@ -8,9 +8,9 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.provider.Settings; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import com.socks.library.KLog; @@ -19,7 +19,6 @@ /** * Created by Lingyan on 2017/3/22 0022. - * Email:137387869@qq.com */ public class PermissionUtils { diff --git a/app/src/main/java/com/gank/gankly/utils/theme/RecyclerViewColor.java b/app/src/main/java/com/gank/gankly/utils/theme/RecyclerViewColor.java index 2d0195d4..9672c4c6 100644 --- a/app/src/main/java/com/gank/gankly/utils/theme/RecyclerViewColor.java +++ b/app/src/main/java/com/gank/gankly/utils/theme/RecyclerViewColor.java @@ -1,8 +1,8 @@ package com.gank.gankly.utils.theme; import android.content.res.Resources; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; @@ -19,7 +19,6 @@ /** * Create by LingYan on 2016-11-28 - * Email:137387869@qq.com */ public class RecyclerViewColor { diff --git a/app/src/main/java/com/gank/gankly/utils/theme/TextViewResorce.java b/app/src/main/java/com/gank/gankly/utils/theme/TextViewResorce.java index d0e2592e..2c795f90 100644 --- a/app/src/main/java/com/gank/gankly/utils/theme/TextViewResorce.java +++ b/app/src/main/java/com/gank/gankly/utils/theme/TextViewResorce.java @@ -4,7 +4,6 @@ /** * Create by LingYan on 2016-11-25 - * Email:137387869@qq.com */ public class TextViewResorce { diff --git a/app/src/main/java/com/gank/gankly/utils/theme/ThemeColor.java b/app/src/main/java/com/gank/gankly/utils/theme/ThemeColor.java index 56a5ae3e..f7f9226d 100644 --- a/app/src/main/java/com/gank/gankly/utils/theme/ThemeColor.java +++ b/app/src/main/java/com/gank/gankly/utils/theme/ThemeColor.java @@ -2,9 +2,9 @@ import android.app.Activity; import android.content.res.Resources; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.widget.SwipeRefreshLayout; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import android.util.TypedValue; import android.view.View; import android.widget.TextView; @@ -17,7 +17,6 @@ /** * 主题控制 * Create by LingYan on 2016-11-25 - * Email:137387869@qq.com */ public final class ThemeColor { diff --git a/app/src/main/java/com/gank/gankly/utils/theme/ViewResorce.java b/app/src/main/java/com/gank/gankly/utils/theme/ViewResorce.java index a184069d..032b5d29 100644 --- a/app/src/main/java/com/gank/gankly/utils/theme/ViewResorce.java +++ b/app/src/main/java/com/gank/gankly/utils/theme/ViewResorce.java @@ -4,7 +4,6 @@ /** * Create by LingYan on 2016-11-25 - * Email:137387869@qq.com */ public class ViewResorce { diff --git a/app/src/main/java/com/gank/gankly/view/ILauncher.java b/app/src/main/java/com/gank/gankly/view/ILauncher.java index 9b2047b9..c153d430 100644 --- a/app/src/main/java/com/gank/gankly/view/ILauncher.java +++ b/app/src/main/java/com/gank/gankly/view/ILauncher.java @@ -1,11 +1,12 @@ package com.gank.gankly.view; import com.gank.gankly.bean.CheckVersion; +import android.lectcoding.ui.base.BaseView; /** * Create by LingYan on 2016-06-01 */ -public interface ILauncher extends IBaseView { +public interface ILauncher extends BaseView { void callUpdate(CheckVersion checkVersion); void showDialog(); diff --git a/app/src/main/java/com/gank/gankly/widget/ByeBurgerBehavior.java b/app/src/main/java/com/gank/gankly/widget/ByeBurgerBehavior.java index ea427fcd..2767deea 100644 --- a/app/src/main/java/com/gank/gankly/widget/ByeBurgerBehavior.java +++ b/app/src/main/java/com/gank/gankly/widget/ByeBurgerBehavior.java @@ -1,8 +1,8 @@ package com.gank.gankly.widget; import android.content.Context; -import android.support.design.widget.CoordinatorLayout; -import android.support.v4.view.ViewCompat; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.view.ViewCompat; import android.util.AttributeSet; import android.view.View; import android.view.ViewConfiguration; diff --git a/app/src/main/java/com/gank/gankly/widget/ByeBurgerBottomBehavior.java b/app/src/main/java/com/gank/gankly/widget/ByeBurgerBottomBehavior.java index b30489b8..7ac80150 100644 --- a/app/src/main/java/com/gank/gankly/widget/ByeBurgerBottomBehavior.java +++ b/app/src/main/java/com/gank/gankly/widget/ByeBurgerBottomBehavior.java @@ -1,7 +1,7 @@ package com.gank.gankly.widget; import android.content.Context; -import android.support.design.widget.CoordinatorLayout; +import androidx.coordinatorlayout.widget.CoordinatorLayout; import android.util.AttributeSet; import android.view.View; diff --git a/app/src/main/java/com/gank/gankly/widget/DeleteDialog.java b/app/src/main/java/com/gank/gankly/widget/DeleteDialog.java index 68642cf5..de6bebc7 100644 --- a/app/src/main/java/com/gank/gankly/widget/DeleteDialog.java +++ b/app/src/main/java/com/gank/gankly/widget/DeleteDialog.java @@ -3,10 +3,10 @@ import android.app.Dialog; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.DialogFragment; -import android.support.v7.app.AlertDialog; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.appcompat.app.AlertDialog; import com.gank.gankly.R; diff --git a/app/src/main/java/com/gank/gankly/widget/DepthPageTransformer.java b/app/src/main/java/com/gank/gankly/widget/DepthPageTransformer.java index e61f1846..e51a6297 100644 --- a/app/src/main/java/com/gank/gankly/widget/DepthPageTransformer.java +++ b/app/src/main/java/com/gank/gankly/widget/DepthPageTransformer.java @@ -1,6 +1,6 @@ package com.gank.gankly.widget; -import android.support.v4.view.ViewPager; +import androidx.viewpager.widget.ViewPager; import android.view.View; /** diff --git a/app/src/main/java/com/gank/gankly/widget/HorizontalLoading.java b/app/src/main/java/com/gank/gankly/widget/HorizontalLoading.java index 608ed511..dacf3d79 100644 --- a/app/src/main/java/com/gank/gankly/widget/HorizontalLoading.java +++ b/app/src/main/java/com/gank/gankly/widget/HorizontalLoading.java @@ -6,14 +6,13 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import android.view.animation.LinearInterpolator; /** * Create by LingYan on 2017-04-27 - * Email:137387869@qq.com */ public class HorizontalLoading extends View { diff --git a/app/src/main/java/com/gank/gankly/widget/ImageDefaultLoading.java b/app/src/main/java/com/gank/gankly/widget/ImageDefaultLoading.java index e1a6500c..bd0f15b7 100644 --- a/app/src/main/java/com/gank/gankly/widget/ImageDefaultLoading.java +++ b/app/src/main/java/com/gank/gankly/widget/ImageDefaultLoading.java @@ -1,7 +1,7 @@ package com.gank.gankly.widget; import android.content.Context; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -20,7 +20,6 @@ /** * Create by LingYan on 2017-04-28 - * Email:137387869@qq.com */ public class ImageDefaultLoading extends LinearLayout { diff --git a/app/src/main/java/com/gank/gankly/widget/ImageDefaultView.java b/app/src/main/java/com/gank/gankly/widget/ImageDefaultView.java index 1e135a75..690a7420 100644 --- a/app/src/main/java/com/gank/gankly/widget/ImageDefaultView.java +++ b/app/src/main/java/com/gank/gankly/widget/ImageDefaultView.java @@ -1,7 +1,7 @@ package com.gank.gankly.widget; import android.content.Context; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -18,7 +18,6 @@ /** * Create by LingYan on 2017-04-28 - * Email:137387869@qq.com */ public class ImageDefaultView extends LinearLayout { diff --git a/app/src/main/java/com/gank/gankly/widget/ItemTextView.java b/app/src/main/java/com/gank/gankly/widget/ItemTextView.java index d905fd74..318498a8 100644 --- a/app/src/main/java/com/gank/gankly/widget/ItemTextView.java +++ b/app/src/main/java/com/gank/gankly/widget/ItemTextView.java @@ -8,7 +8,6 @@ import android.widget.RelativeLayout; import android.widget.TextView; -import com.gank.gankly.App; import com.gank.gankly.R; import butterknife.BindView; @@ -35,6 +34,7 @@ public class ItemTextView extends RelativeLayout { private int mTitleColor; private int mSummaryColor; + private Context context; public ItemTextView(Context context) { this(context, null); @@ -54,8 +54,8 @@ public ItemTextView(Context context, AttributeSet attrs, int defStyleAttr) { mSummary = array.getString(R.styleable.ItemTextView_textSummary); mTitleSize = array.getInteger(R.styleable.ItemTextView_textTitleSize, 14); mSummarySize = array.getInteger(R.styleable.ItemTextView_textSummarySize, 12); - mTitleColor = array.getColor(R.styleable.ItemTextView_textTitleColor, App.getAppColor(R.color.text_default)); - mSummaryColor = array.getColor(R.styleable.ItemTextView_textSummaryColor, App.getAppColor(R.color.text_999999)); + mTitleColor = array.getColor(R.styleable.ItemTextView_textTitleColor, context.getResources().getColor(R.color.text_default)); + mSummaryColor = array.getColor(R.styleable.ItemTextView_textSummaryColor, context.getResources().getColor(R.color.text_999999)); } catch (Exception e) { throw new IllegalArgumentException(e); } diff --git a/app/src/main/java/com/gank/gankly/widget/LSwitch.java b/app/src/main/java/com/gank/gankly/widget/LSwitch.java index 8475b885..aebbc64d 100644 --- a/app/src/main/java/com/gank/gankly/widget/LSwitch.java +++ b/app/src/main/java/com/gank/gankly/widget/LSwitch.java @@ -3,16 +3,15 @@ import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; -import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.widget.SwitchCompat; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.appcompat.widget.SwitchCompat; import android.util.AttributeSet; -import com.gank.gankly.App; import com.gank.gankly.R; /** * Create by LingYan on 2016-09-01 - * Email:137387869@qq.com */ public class LSwitch extends SwitchCompat { private int mColor = 1; @@ -51,12 +50,13 @@ private ColorStateList getSwitchThumbColorStateList() { // Checked state states[1] = new int[]{android.R.attr.state_checked}; - if (App.isNight()) { - mColor = R.color.switch_thumb_disabled_dark; - } else { - mColor = R.color.colorAccent; - } - colors[1] = App.getAppColor(mColor); +// if (AppConfig.isNight()) { +// mColor = R.color.switch_thumb_disabled_dark; +// } else { + mColor = R.color.colorAccent; +// } + + colors[1] = getContext().getResources().getColor(mColor); // Unchecked enabled state state states[2] = new int[0]; @@ -76,9 +76,9 @@ private ColorStateList getSwitchTrackColorStateList() { // Checked state states[1] = new int[]{android.R.attr.state_checked}; colors[1] = Color.argb(0x4D, // 30% alpha - Color.red(App.getAppColor(mColor)), - Color.green(App.getAppColor(mColor)), - Color.blue(App.getAppColor(mColor))); + Color.red(ContextCompat.getColor(getContext(), mColor)), + Color.green(ContextCompat.getColor(getContext(),mColor)), + Color.blue(ContextCompat.getColor(getContext(),mColor))); // Unchecked enabled state state states[2] = new int[0]; diff --git a/app/src/main/java/com/gank/gankly/widget/LYRelativeLayoutRipple.java b/app/src/main/java/com/gank/gankly/widget/LYRelativeLayoutRipple.java index ed6e93dd..2b909b18 100644 --- a/app/src/main/java/com/gank/gankly/widget/LYRelativeLayoutRipple.java +++ b/app/src/main/java/com/gank/gankly/widget/LYRelativeLayoutRipple.java @@ -11,7 +11,6 @@ /** * RelativeLayout 水波纹点击背景 * Create by LingYan on 2016-09-23 - * Email:137387869@qq.com */ public class LYRelativeLayoutRipple extends RelativeLayout { diff --git a/app/src/main/java/com/gank/gankly/widget/LyRecyclerView.java b/app/src/main/java/com/gank/gankly/widget/LyRecyclerView.java index 64fe481e..da873469 100644 --- a/app/src/main/java/com/gank/gankly/widget/LyRecyclerView.java +++ b/app/src/main/java/com/gank/gankly/widget/LyRecyclerView.java @@ -2,9 +2,9 @@ import android.content.Context; import android.graphics.Rect; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -17,7 +17,6 @@ /** * reference https://github.com/moodstrikerdd/Test_Android/blob/53ecf70a131e553a68daad2b57bfe3f09722ddc2/sidesliplist/src/main/java/com/example/sidesliplist/MyRecyclerView.java * Create by LingYan on 2016-11-07 - * Email:137387869@qq.com */ public class LyRecyclerView extends RecyclerView { diff --git a/app/src/main/java/com/gank/gankly/widget/LySwipeRefreshLayout.java b/app/src/main/java/com/gank/gankly/widget/LySwipeRefreshLayout.java index 8333294a..b96f08b5 100644 --- a/app/src/main/java/com/gank/gankly/widget/LySwipeRefreshLayout.java +++ b/app/src/main/java/com/gank/gankly/widget/LySwipeRefreshLayout.java @@ -2,11 +2,11 @@ import android.content.Context; import android.content.res.TypedArray; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -27,7 +27,7 @@ public class LySwipeRefreshLayout extends SwipeRefreshLayout { private RecyclerView.LayoutManager layoutManager; private RecyclerView mRecyclerView; - private OnSwipeRefRecyclerViewListener mOnSwipeRefRecyclerViewListener; + private OnSwipeRefreshListener mOnSwipeRefreshListener; private Context mContext; private int mCurManager = 1; private int mState; @@ -67,7 +67,7 @@ private void init() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - if (newState == RecyclerView.SCROLL_STATE_IDLE && mOnSwipeRefRecyclerViewListener != null + if (newState == RecyclerView.SCROLL_STATE_IDLE && mOnSwipeRefreshListener != null && !isRefreshing()) { int count = recyclerView.getAdapter().getItemCount() - 1; switch (mCurManager) { @@ -107,7 +107,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } public void loadMore() { - mOnSwipeRefRecyclerViewListener.onLoadMore(); + mOnSwipeRefreshListener.onLoadMore(); } public void setLayoutManager(RecyclerView.LayoutManager layoutManager) { @@ -122,8 +122,8 @@ public void setLayoutManager(RecyclerView.LayoutManager layoutManager) { mRecyclerView.setLayoutManager(layoutManager); } - public void setOnScrollListener(OnSwipeRefRecyclerViewListener listener) { - this.mOnSwipeRefRecyclerViewListener = listener; + public void setOnScrollListener(OnSwipeRefreshListener listener) { + this.mOnSwipeRefreshListener = listener; super.setOnRefreshListener(listener); } @@ -154,7 +154,7 @@ public int getPosition() { /** * 刷新和加载更多的监听 */ - public interface OnSwipeRefRecyclerViewListener extends OnRefreshListener { + public interface OnSwipeRefreshListener extends OnRefreshListener { void onRefresh(); void onLoadMore(); diff --git a/app/src/main/java/com/gank/gankly/widget/MultipleStatusView.java b/app/src/main/java/com/gank/gankly/widget/MultipleStatusView.java index 26ee98d4..cd3ed529 100644 --- a/app/src/main/java/com/gank/gankly/widget/MultipleStatusView.java +++ b/app/src/main/java/com/gank/gankly/widget/MultipleStatusView.java @@ -15,7 +15,6 @@ /** * 包括Loading Empty Error DisNetWork界面 * Create by LingYan on 2016-06-15 - * Email:137387869@qq.com */ public class MultipleStatusView extends RelativeLayout { public static final int STATUS_CONTENT = 0x01; diff --git a/app/src/main/java/com/gank/gankly/widget/MyDecoration.java b/app/src/main/java/com/gank/gankly/widget/MyDecoration.java index 9959f0b0..add188a3 100644 --- a/app/src/main/java/com/gank/gankly/widget/MyDecoration.java +++ b/app/src/main/java/com/gank/gankly/widget/MyDecoration.java @@ -7,8 +7,8 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.util.Log; import android.view.View; diff --git a/app/src/main/java/com/gank/gankly/widget/NoAlphaItemAnimator.java b/app/src/main/java/com/gank/gankly/widget/NoAlphaItemAnimator.java deleted file mode 100644 index 9c76a2dd..00000000 --- a/app/src/main/java/com/gank/gankly/widget/NoAlphaItemAnimator.java +++ /dev/null @@ -1,664 +0,0 @@ -package com.gank.gankly.widget; - -import android.support.annotation.NonNull; -import android.support.v4.animation.AnimatorCompatHelper; -import android.support.v4.view.ViewCompat; -import android.support.v4.view.ViewPropertyAnimatorCompat; -import android.support.v4.view.ViewPropertyAnimatorListener; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SimpleItemAnimator; -import android.view.View; - -import java.util.ArrayList; -import java.util.List; - -/** - * Create by LingYan on 2016-11-08 - * Email:137387869@qq.com - */ - -public class NoAlphaItemAnimator extends SimpleItemAnimator { - private static final boolean DEBUG = false; - - private ArrayList mPendingRemovals = new ArrayList<>(); - private ArrayList mPendingAdditions = new ArrayList<>(); - private ArrayList mPendingMoves = new ArrayList<>(); - private ArrayList mPendingChanges = new ArrayList<>(); - - private ArrayList> mAdditionsList = new ArrayList<>(); - private ArrayList> mMovesList = new ArrayList<>(); - private ArrayList> mChangesList = new ArrayList<>(); - - private ArrayList mAddAnimations = new ArrayList<>(); - private ArrayList mMoveAnimations = new ArrayList<>(); - private ArrayList mRemoveAnimations = new ArrayList<>(); - private ArrayList mChangeAnimations = new ArrayList<>(); - - private static class MoveInfo { - public RecyclerView.ViewHolder holder; - public int fromX, fromY, toX, toY; - - private MoveInfo(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { - this.holder = holder; - this.fromX = fromX; - this.fromY = fromY; - this.toX = toX; - this.toY = toY; - } - } - - private static class ChangeInfo { - public RecyclerView.ViewHolder oldHolder, newHolder; - public int fromX, fromY, toX, toY; - - private ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder) { - this.oldHolder = oldHolder; - this.newHolder = newHolder; - } - - private ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, - int fromX, int fromY, int toX, int toY) { - this(oldHolder, newHolder); - this.fromX = fromX; - this.fromY = fromY; - this.toX = toX; - this.toY = toY; - } - - @Override - public String toString() { - return "ChangeInfo{" + - "oldHolder=" + oldHolder + - ", newHolder=" + newHolder + - ", fromX=" + fromX + - ", fromY=" + fromY + - ", toX=" + toX + - ", toY=" + toY + - '}'; - } - } - - @Override - public void runPendingAnimations() { - boolean removalsPending = !mPendingRemovals.isEmpty(); - boolean movesPending = !mPendingMoves.isEmpty(); - boolean changesPending = !mPendingChanges.isEmpty(); - boolean additionsPending = !mPendingAdditions.isEmpty(); - if (!removalsPending && !movesPending && !additionsPending && !changesPending) { - // nothing to animate - return; - } - // First, remove stuff - for (RecyclerView.ViewHolder holder : mPendingRemovals) { - animateRemoveImpl(holder); - } - mPendingRemovals.clear(); - // Next, move stuff - if (movesPending) { - final ArrayList moves = new ArrayList<>(); - moves.addAll(mPendingMoves); - mMovesList.add(moves); - mPendingMoves.clear(); - Runnable mover = new Runnable() { - @Override - public void run() { - for (NoAlphaItemAnimator.MoveInfo moveInfo : moves) { - animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY, - moveInfo.toX, moveInfo.toY); - } - moves.clear(); - mMovesList.remove(moves); - } - }; - if (removalsPending) { - View view = moves.get(0).holder.itemView; - ViewCompat.postOnAnimationDelayed(view, mover, getRemoveDuration()); - } else { - mover.run(); - } - } - // Next, change stuff, to run in parallel with move animations - if (changesPending) { - final ArrayList changes = new ArrayList<>(); - changes.addAll(mPendingChanges); - mChangesList.add(changes); - mPendingChanges.clear(); - Runnable changer = new Runnable() { - @Override - public void run() { - for (NoAlphaItemAnimator.ChangeInfo change : changes) { - animateChangeImpl(change); - } - changes.clear(); - mChangesList.remove(changes); - } - }; - if (removalsPending) { - RecyclerView.ViewHolder holder = changes.get(0).oldHolder; - ViewCompat.postOnAnimationDelayed(holder.itemView, changer, getRemoveDuration()); - } else { - changer.run(); - } - } - // Next, add stuff - if (additionsPending) { - final ArrayList additions = new ArrayList<>(); - additions.addAll(mPendingAdditions); - mAdditionsList.add(additions); - mPendingAdditions.clear(); - Runnable adder = new Runnable() { - @Override - public void run() { - for (RecyclerView.ViewHolder holder : additions) { - animateAddImpl(holder); - } - additions.clear(); - mAdditionsList.remove(additions); - } - }; - if (removalsPending || movesPending || changesPending) { - long removeDuration = removalsPending ? getRemoveDuration() : 0; - long moveDuration = movesPending ? getMoveDuration() : 0; - long changeDuration = changesPending ? getChangeDuration() : 0; - long totalDelay = removeDuration + Math.max(moveDuration, changeDuration); - View view = additions.get(0).itemView; - ViewCompat.postOnAnimationDelayed(view, adder, totalDelay); - } else { - adder.run(); - } - } - } - - @Override - public boolean animateRemove(final RecyclerView.ViewHolder holder) { - resetAnimation(holder); - mPendingRemovals.add(holder); - return true; - } - - private void animateRemoveImpl(final RecyclerView.ViewHolder holder) { - final View view = holder.itemView; - final ViewPropertyAnimatorCompat animation = ViewCompat.animate(view); - mRemoveAnimations.add(holder); - animation.setDuration(getRemoveDuration()) - .alpha(0).setListener(new NoAlphaItemAnimator.VpaListenerAdapter() { - @Override - public void onAnimationStart(View view) { - dispatchRemoveStarting(holder); - } - - @Override - public void onAnimationEnd(View view) { - animation.setListener(null); - ViewCompat.setAlpha(view, 1); - dispatchRemoveFinished(holder); - mRemoveAnimations.remove(holder); - dispatchFinishedWhenDone(); - } - }).start(); - } - - @Override - public boolean animateAdd(final RecyclerView.ViewHolder holder) { - resetAnimation(holder); - ViewCompat.setAlpha(holder.itemView, 0); - mPendingAdditions.add(holder); - return true; - } - - private void animateAddImpl(final RecyclerView.ViewHolder holder) { - final View view = holder.itemView; - final ViewPropertyAnimatorCompat animation = ViewCompat.animate(view); - mAddAnimations.add(holder); - animation.alpha(1).setDuration(getAddDuration()). - setListener(new NoAlphaItemAnimator.VpaListenerAdapter() { - @Override - public void onAnimationStart(View view) { - dispatchAddStarting(holder); - } - - @Override - public void onAnimationCancel(View view) { - ViewCompat.setAlpha(view, 1); - } - - @Override - public void onAnimationEnd(View view) { - animation.setListener(null); - dispatchAddFinished(holder); - mAddAnimations.remove(holder); - dispatchFinishedWhenDone(); - } - }).start(); - } - - @Override - public boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY, - int toX, int toY) { - final View view = holder.itemView; - fromX += ViewCompat.getTranslationX(holder.itemView); - fromY += ViewCompat.getTranslationY(holder.itemView); - resetAnimation(holder); - int deltaX = toX - fromX; - int deltaY = toY - fromY; - if (deltaX == 0 && deltaY == 0) { - dispatchMoveFinished(holder); - return false; - } - if (deltaX != 0) { - ViewCompat.setTranslationX(view, -deltaX); - } - if (deltaY != 0) { - ViewCompat.setTranslationY(view, -deltaY); - } - mPendingMoves.add(new NoAlphaItemAnimator.MoveInfo(holder, fromX, fromY, toX, toY)); - return true; - } - - private void animateMoveImpl(final RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { - final View view = holder.itemView; - final int deltaX = toX - fromX; - final int deltaY = toY - fromY; - if (deltaX != 0) { - ViewCompat.animate(view).translationX(0); - } - if (deltaY != 0) { - ViewCompat.animate(view).translationY(0); - } - // TODO: make EndActions end listeners instead, since end actions aren't called when - // vpas are canceled (and can't end them. why?) - // need listener functionality in VPACompat for this. Ick. - final ViewPropertyAnimatorCompat animation = ViewCompat.animate(view); - mMoveAnimations.add(holder); - animation.setDuration(getMoveDuration()).setListener(new NoAlphaItemAnimator.VpaListenerAdapter() { - @Override - public void onAnimationStart(View view) { - dispatchMoveStarting(holder); - } - - @Override - public void onAnimationCancel(View view) { - if (deltaX != 0) { - ViewCompat.setTranslationX(view, 0); - } - if (deltaY != 0) { - ViewCompat.setTranslationY(view, 0); - } - } - - @Override - public void onAnimationEnd(View view) { - animation.setListener(null); - dispatchMoveFinished(holder); - mMoveAnimations.remove(holder); - dispatchFinishedWhenDone(); - } - }).start(); - } - - @Override - public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, - int fromX, int fromY, int toX, int toY) { - if (oldHolder == newHolder) { - // Don't know how to run change animations when the same view holder is re-used. - // run a move animation to handle position changes. - return animateMove(oldHolder, fromX, fromY, toX, toY); - } - final float prevTranslationX = ViewCompat.getTranslationX(oldHolder.itemView); - final float prevTranslationY = ViewCompat.getTranslationY(oldHolder.itemView); - final float prevAlpha = ViewCompat.getAlpha(oldHolder.itemView); - resetAnimation(oldHolder); - int deltaX = (int) (toX - fromX - prevTranslationX); - int deltaY = (int) (toY - fromY - prevTranslationY); - // recover prev translation state after ending animation - ViewCompat.setTranslationX(oldHolder.itemView, prevTranslationX); - ViewCompat.setTranslationY(oldHolder.itemView, prevTranslationY); - ViewCompat.setAlpha(oldHolder.itemView, prevAlpha); - if (newHolder != null) { - // carry over translation values - resetAnimation(newHolder); - ViewCompat.setTranslationX(newHolder.itemView, -deltaX); - ViewCompat.setTranslationY(newHolder.itemView, -deltaY); - ViewCompat.setAlpha(newHolder.itemView, 0); - } - mPendingChanges.add(new NoAlphaItemAnimator.ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY)); - return true; - } - - private void animateChangeImpl(final NoAlphaItemAnimator.ChangeInfo changeInfo) { - final RecyclerView.ViewHolder holder = changeInfo.oldHolder; - final View view = holder == null ? null : holder.itemView; - final RecyclerView.ViewHolder newHolder = changeInfo.newHolder; - final View newView = newHolder != null ? newHolder.itemView : null; - if (view != null) { - final ViewPropertyAnimatorCompat oldViewAnim = ViewCompat.animate(view).setDuration( - getChangeDuration()); - mChangeAnimations.add(changeInfo.oldHolder); - oldViewAnim.translationX(changeInfo.toX - changeInfo.fromX); - oldViewAnim.translationY(changeInfo.toY - changeInfo.fromY); -// oldViewAnim.alpha(0).setListener(new NoAlphaItemAnimator.VpaListenerAdapter() { - oldViewAnim.setListener(new NoAlphaItemAnimator.VpaListenerAdapter() { - @Override - public void onAnimationStart(View view) { - dispatchChangeStarting(changeInfo.oldHolder, true); - } - - @Override - public void onAnimationEnd(View view) { - oldViewAnim.setListener(null); - ViewCompat.setAlpha(view, 1); - ViewCompat.setTranslationX(view, 0); - ViewCompat.setTranslationY(view, 0); - dispatchChangeFinished(changeInfo.oldHolder, true); - mChangeAnimations.remove(changeInfo.oldHolder); - dispatchFinishedWhenDone(); - } - }).start(); - } - if (newView != null) { - final ViewPropertyAnimatorCompat newViewAnimation = ViewCompat.animate(newView); - mChangeAnimations.add(changeInfo.newHolder); - newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()). -// alpha(1).setListener(new NoAlphaItemAnimator.VpaListenerAdapter() { - setListener(new NoAlphaItemAnimator.VpaListenerAdapter() { - @Override - public void onAnimationStart(View view) { - dispatchChangeStarting(changeInfo.newHolder, false); - } - - @Override - public void onAnimationEnd(View view) { - newViewAnimation.setListener(null); - ViewCompat.setAlpha(newView, 1); - ViewCompat.setTranslationX(newView, 0); - ViewCompat.setTranslationY(newView, 0); - dispatchChangeFinished(changeInfo.newHolder, false); - mChangeAnimations.remove(changeInfo.newHolder); - dispatchFinishedWhenDone(); - } - }).start(); - } - } - - private void endChangeAnimation(List infoList, RecyclerView.ViewHolder item) { - for (int i = infoList.size() - 1; i >= 0; i--) { - NoAlphaItemAnimator.ChangeInfo changeInfo = infoList.get(i); - if (endChangeAnimationIfNecessary(changeInfo, item)) { - if (changeInfo.oldHolder == null && changeInfo.newHolder == null) { - infoList.remove(changeInfo); - } - } - } - } - - private void endChangeAnimationIfNecessary(NoAlphaItemAnimator.ChangeInfo changeInfo) { - if (changeInfo.oldHolder != null) { - endChangeAnimationIfNecessary(changeInfo, changeInfo.oldHolder); - } - if (changeInfo.newHolder != null) { - endChangeAnimationIfNecessary(changeInfo, changeInfo.newHolder); - } - } - - private boolean endChangeAnimationIfNecessary(NoAlphaItemAnimator.ChangeInfo changeInfo, RecyclerView.ViewHolder item) { - boolean oldItem = false; - if (changeInfo.newHolder == item) { - changeInfo.newHolder = null; - } else if (changeInfo.oldHolder == item) { - changeInfo.oldHolder = null; - oldItem = true; - } else { - return false; - } - ViewCompat.setAlpha(item.itemView, 1); - ViewCompat.setTranslationX(item.itemView, 0); - ViewCompat.setTranslationY(item.itemView, 0); - dispatchChangeFinished(item, oldItem); - return true; - } - - @Override - public void endAnimation(RecyclerView.ViewHolder item) { - final View view = item.itemView; - // this will trigger end callback which should set properties to their target values. - ViewCompat.animate(view).cancel(); - // TODO if some other animations are chained to end, how do we cancel them as well? - for (int i = mPendingMoves.size() - 1; i >= 0; i--) { - NoAlphaItemAnimator.MoveInfo moveInfo = mPendingMoves.get(i); - if (moveInfo.holder == item) { - ViewCompat.setTranslationY(view, 0); - ViewCompat.setTranslationX(view, 0); - dispatchMoveFinished(item); - mPendingMoves.remove(i); - } - } - endChangeAnimation(mPendingChanges, item); - if (mPendingRemovals.remove(item)) { - ViewCompat.setAlpha(view, 1); - dispatchRemoveFinished(item); - } - if (mPendingAdditions.remove(item)) { - ViewCompat.setAlpha(view, 1); - dispatchAddFinished(item); - } - - for (int i = mChangesList.size() - 1; i >= 0; i--) { - ArrayList changes = mChangesList.get(i); - endChangeAnimation(changes, item); - if (changes.isEmpty()) { - mChangesList.remove(i); - } - } - for (int i = mMovesList.size() - 1; i >= 0; i--) { - ArrayList moves = mMovesList.get(i); - for (int j = moves.size() - 1; j >= 0; j--) { - NoAlphaItemAnimator.MoveInfo moveInfo = moves.get(j); - if (moveInfo.holder == item) { - ViewCompat.setTranslationY(view, 0); - ViewCompat.setTranslationX(view, 0); - dispatchMoveFinished(item); - moves.remove(j); - if (moves.isEmpty()) { - mMovesList.remove(i); - } - break; - } - } - } - for (int i = mAdditionsList.size() - 1; i >= 0; i--) { - ArrayList additions = mAdditionsList.get(i); - if (additions.remove(item)) { - ViewCompat.setAlpha(view, 1); - dispatchAddFinished(item); - if (additions.isEmpty()) { - mAdditionsList.remove(i); - } - } - } - - // animations should be ended by the cancel above. - //noinspection PointlessBooleanExpression,ConstantConditions - if (mRemoveAnimations.remove(item) && DEBUG) { - throw new IllegalStateException("after animation is cancelled, item should not be in " - + "mRemoveAnimations list"); - } - - //noinspection PointlessBooleanExpression,ConstantConditions - if (mAddAnimations.remove(item) && DEBUG) { - throw new IllegalStateException("after animation is cancelled, item should not be in " - + "mAddAnimations list"); - } - - //noinspection PointlessBooleanExpression,ConstantConditions - if (mChangeAnimations.remove(item) && DEBUG) { - throw new IllegalStateException("after animation is cancelled, item should not be in " - + "mChangeAnimations list"); - } - - //noinspection PointlessBooleanExpression,ConstantConditions - if (mMoveAnimations.remove(item) && DEBUG) { - throw new IllegalStateException("after animation is cancelled, item should not be in " - + "mMoveAnimations list"); - } - dispatchFinishedWhenDone(); - } - - private void resetAnimation(RecyclerView.ViewHolder holder) { - AnimatorCompatHelper.clearInterpolator(holder.itemView); - endAnimation(holder); - } - - @Override - public boolean isRunning() { - return (!mPendingAdditions.isEmpty() || - !mPendingChanges.isEmpty() || - !mPendingMoves.isEmpty() || - !mPendingRemovals.isEmpty() || - !mMoveAnimations.isEmpty() || - !mRemoveAnimations.isEmpty() || - !mAddAnimations.isEmpty() || - !mChangeAnimations.isEmpty() || - !mMovesList.isEmpty() || - !mAdditionsList.isEmpty() || - !mChangesList.isEmpty()); - } - - /** - * Check the state of currently pending and running animations. If there are none - * pending/running, call {@link #dispatchAnimationsFinished()} to notify any - * listeners. - */ - private void dispatchFinishedWhenDone() { - if (!isRunning()) { - dispatchAnimationsFinished(); - } - } - - @Override - public void endAnimations() { - int count = mPendingMoves.size(); - for (int i = count - 1; i >= 0; i--) { - NoAlphaItemAnimator.MoveInfo item = mPendingMoves.get(i); - View view = item.holder.itemView; - ViewCompat.setTranslationY(view, 0); - ViewCompat.setTranslationX(view, 0); - dispatchMoveFinished(item.holder); - mPendingMoves.remove(i); - } - count = mPendingRemovals.size(); - for (int i = count - 1; i >= 0; i--) { - RecyclerView.ViewHolder item = mPendingRemovals.get(i); - dispatchRemoveFinished(item); - mPendingRemovals.remove(i); - } - count = mPendingAdditions.size(); - for (int i = count - 1; i >= 0; i--) { - RecyclerView.ViewHolder item = mPendingAdditions.get(i); - View view = item.itemView; - ViewCompat.setAlpha(view, 1); - dispatchAddFinished(item); - mPendingAdditions.remove(i); - } - count = mPendingChanges.size(); - for (int i = count - 1; i >= 0; i--) { - endChangeAnimationIfNecessary(mPendingChanges.get(i)); - } - mPendingChanges.clear(); - if (!isRunning()) { - return; - } - - int listCount = mMovesList.size(); - for (int i = listCount - 1; i >= 0; i--) { - ArrayList moves = mMovesList.get(i); - count = moves.size(); - for (int j = count - 1; j >= 0; j--) { - NoAlphaItemAnimator.MoveInfo moveInfo = moves.get(j); - RecyclerView.ViewHolder item = moveInfo.holder; - View view = item.itemView; - ViewCompat.setTranslationY(view, 0); - ViewCompat.setTranslationX(view, 0); - dispatchMoveFinished(moveInfo.holder); - moves.remove(j); - if (moves.isEmpty()) { - mMovesList.remove(moves); - } - } - } - listCount = mAdditionsList.size(); - for (int i = listCount - 1; i >= 0; i--) { - ArrayList additions = mAdditionsList.get(i); - count = additions.size(); - for (int j = count - 1; j >= 0; j--) { - RecyclerView.ViewHolder item = additions.get(j); - View view = item.itemView; - ViewCompat.setAlpha(view, 1); - dispatchAddFinished(item); - additions.remove(j); - if (additions.isEmpty()) { - mAdditionsList.remove(additions); - } - } - } - listCount = mChangesList.size(); - for (int i = listCount - 1; i >= 0; i--) { - ArrayList changes = mChangesList.get(i); - count = changes.size(); - for (int j = count - 1; j >= 0; j--) { - endChangeAnimationIfNecessary(changes.get(j)); - if (changes.isEmpty()) { - mChangesList.remove(changes); - } - } - } - - cancelAll(mRemoveAnimations); - cancelAll(mMoveAnimations); - cancelAll(mAddAnimations); - cancelAll(mChangeAnimations); - - dispatchAnimationsFinished(); - } - - void cancelAll(List viewHolders) { - for (int i = viewHolders.size() - 1; i >= 0; i--) { - ViewCompat.animate(viewHolders.get(i).itemView).cancel(); - } - } - - /** - * {@inheritDoc} - *

- * If the payload list is not empty, NoAlphaItemAnimator returns true. - * When this is the case: - *

    - *
  • If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both - * ViewHolder arguments will be the same instance. - *
  • - *
  • - * If you are not overriding {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, - * then NoAlphaItemAnimator will call {@link #animateMove(RecyclerView.ViewHolder, int, int, int, int)} and - * run a move animation instead. - *
  • - *
- */ - @Override - public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, - @NonNull List payloads) { - return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads); - } - - private static class VpaListenerAdapter implements ViewPropertyAnimatorListener { - @Override - public void onAnimationStart(View view) { - } - - @Override - public void onAnimationEnd(View view) { - } - - @Override - public void onAnimationCancel(View view) { - } - } -} diff --git a/app/src/main/java/com/gank/gankly/widget/ProgressImageView.java b/app/src/main/java/com/gank/gankly/widget/ProgressImageView.java index 0d435f5d..a107cbd4 100644 --- a/app/src/main/java/com/gank/gankly/widget/ProgressImageView.java +++ b/app/src/main/java/com/gank/gankly/widget/ProgressImageView.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; -import android.support.v4.app.Fragment; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -22,6 +21,8 @@ import com.gank.gankly.R; import com.gank.gankly.config.glide.ProgressTarget; +import androidx.fragment.app.Fragment; + /** * Glide image with progress * Create by LingYan on 2016-5-19 @@ -107,7 +108,7 @@ public void load(String url, final Fragment fragment) { .addHeader("referer", "http://www.mzitu.com/mm/") .build()); - Glide.with(fragment) + Glide.with(fragment.getContext()) .asBitmap() .apply(new RequestOptions() .diskCacheStrategy(DiskCacheStrategy.RESOURCE) @@ -118,7 +119,7 @@ public void load(String url, final Fragment fragment) { .load(glideUrl) .into(target); } else { - Glide.with(fragment) + Glide.with(fragment.getContext()) .asBitmap() .apply(new RequestOptions() .diskCacheStrategy(DiskCacheStrategy.RESOURCE) @@ -132,20 +133,18 @@ public void load(String url, final Fragment fragment) { } public void load(String url, Activity fragment) { -// if (url.endsWith("gif")) { target.setModel(url); // update target's cache Glide.with(fragment) .asBitmap() .load(url) .apply(new RequestOptions() - .diskCacheStrategy(DiskCacheStrategy.RESOURCE) - .placeholder(R.drawable.image_loading) - .error(R.drawable.image_failure) - .fitCenter() // needs explicit transformation, because we're using a custom target + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .placeholder(R.drawable.image_loading) + .error(R.drawable.image_failure) + .fitCenter() // needs explicit transformation, because we're using a custom target ) .into(target); -// } } /** diff --git a/app/src/main/java/com/gank/gankly/widget/RatioImageView.java b/app/src/main/java/com/gank/gankly/widget/RatioImageView.java index cfde0b6b..20650d5d 100644 --- a/app/src/main/java/com/gank/gankly/widget/RatioImageView.java +++ b/app/src/main/java/com/gank/gankly/widget/RatioImageView.java @@ -44,7 +44,7 @@ * pick from drakeet https://github.com/drakeet * Create by LingYan on 2016-4-19 */ -public class RatioImageView extends android.support.v7.widget.AppCompatImageView { +public class RatioImageView extends androidx.appcompat.widget.AppCompatImageView { private int originalWidth; private int originalHeight; diff --git a/app/src/main/java/com/gank/gankly/widget/RecycleViewDivider.java b/app/src/main/java/com/gank/gankly/widget/RecycleViewDivider.java index 0a086f76..89a77dba 100644 --- a/app/src/main/java/com/gank/gankly/widget/RecycleViewDivider.java +++ b/app/src/main/java/com/gank/gankly/widget/RecycleViewDivider.java @@ -4,8 +4,8 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.Drawable; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; /** diff --git a/app/src/main/java/com/gank/gankly/widget/SpaceItemDecoration.java b/app/src/main/java/com/gank/gankly/widget/SpaceItemDecoration.java index 638308b4..12112e74 100644 --- a/app/src/main/java/com/gank/gankly/widget/SpaceItemDecoration.java +++ b/app/src/main/java/com/gank/gankly/widget/SpaceItemDecoration.java @@ -1,7 +1,7 @@ package com.gank.gankly.widget; import android.graphics.Rect; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; public class SpaceItemDecoration extends RecyclerView.ItemDecoration { diff --git a/app/src/main/java/com/gank/gankly/widget/TouchImageView.java b/app/src/main/java/com/gank/gankly/widget/TouchImageView.java index f4737aba..014b49af 100644 --- a/app/src/main/java/com/gank/gankly/widget/TouchImageView.java +++ b/app/src/main/java/com/gank/gankly/widget/TouchImageView.java @@ -15,7 +15,7 @@ import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Parcelable; -import android.support.v7.widget.AppCompatImageView; +import androidx.appcompat.widget.AppCompatImageView; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; diff --git a/app/src/main/java/com/gank/gankly/widget/UpdateVersionDialog.java b/app/src/main/java/com/gank/gankly/widget/UpdateVersionDialog.java index d993aed3..2d93e9a2 100644 --- a/app/src/main/java/com/gank/gankly/widget/UpdateVersionDialog.java +++ b/app/src/main/java/com/gank/gankly/widget/UpdateVersionDialog.java @@ -4,8 +4,8 @@ import android.app.Dialog; import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -15,7 +15,6 @@ /** * Create by LingYan on 2016-09-09 - * Email:137387869@qq.com */ public class UpdateVersionDialog extends DialogFragment { public static final String UPDATE_CONTENT = "update_content"; diff --git a/app/src/main/java/com/gank/gankly/widget/WheelView.java b/app/src/main/java/com/gank/gankly/widget/WheelView.java index 40f1a3e0..b6343eac 100644 --- a/app/src/main/java/com/gank/gankly/widget/WheelView.java +++ b/app/src/main/java/com/gank/gankly/widget/WheelView.java @@ -107,11 +107,9 @@ private void init(Context context) { scrollerTask = new Runnable() { public void run() { int newY = getScrollY(); -// KLog.d("newY:" + newY); if (initialY - newY == 0) { // stopped final int remainder = initialY % itemHeight; final int divided = initialY / itemHeight; -// KLog.d(TAG, "initialY: " + initialY); if (remainder == 0) { selectedIndex = divided + offset; onSeletedCallBack(); @@ -173,7 +171,6 @@ private TextView createView(String content) { tv.setPadding(padding, padding, padding, padding); if (0 == itemHeight) { itemHeight = getViewMeasuredHeight(tv); -// KLog.d(TAG, "itemHeight: " + itemHeight); views.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeight * displayItemCount)); LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) this.getLayoutParams(); this.setLayoutParams(new LinearLayout.LayoutParams(lp.width, itemHeight * displayItemCount)); @@ -185,7 +182,6 @@ private TextView createView(String content) { @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); -// KLog.d(TAG, "l: " + l + ", t: " + t + ", oldl: " + oldl + ", oldt: " + oldt); refreshItemView(t); } @@ -268,7 +264,6 @@ public int getOpacity() { @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); -// KLog.d(TAG, "w: " + w + ", h: " + h + ", oldw: " + oldw + ", oldh: " + oldh); viewWidth = w; setBackground(null); } diff --git a/app/src/main/java/com/gank/gankly/widget/recyclerview/OnFlexibleScrollListener.java b/app/src/main/java/com/gank/gankly/widget/recyclerview/OnFlexibleScrollListener.java new file mode 100644 index 00000000..4a9da888 --- /dev/null +++ b/app/src/main/java/com/gank/gankly/widget/recyclerview/OnFlexibleScrollListener.java @@ -0,0 +1,69 @@ +package com.gank.gankly.widget.recyclerview; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +public class OnFlexibleScrollListener extends RecyclerView.OnScrollListener { + + private OnRecyclerViewListener onRecyclerViewListener; + + public OnFlexibleScrollListener() { + super(); + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + } + + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if (layoutManager instanceof LinearLayoutManager) { + int count = recyclerView.getAdapter().getItemCount() - 1; + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager; + if (linearLayoutManager.findLastCompletelyVisibleItemPosition() == count) { + onLoadMore(); + } + } + if (layoutManager instanceof StaggeredGridLayoutManager) { + StaggeredGridLayoutManager staggeredGridLayoutManager = + (StaggeredGridLayoutManager) layoutManager; + int[] positions = new int[staggeredGridLayoutManager.getSpanCount()]; + staggeredGridLayoutManager.findLastVisibleItemPositions(positions); + for (int position : positions) { + if (position == staggeredGridLayoutManager.getItemCount() - 1) { + onLoadMore(); + } + } + } + if (layoutManager instanceof GridLayoutManager) { + GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; + if (gridLayoutManager.findLastCompletelyVisibleItemPosition() == 0) { + onLoadMore(); + } + } + } + } + + private void onLoadMore() { + if (onRecyclerViewListener != null) { + onRecyclerViewListener.onLoadMore(); + } + } + + public void setOnScrollListener(OnRecyclerViewListener listener) { + this.onRecyclerViewListener = listener; + } + + /** + * 加载更多的监听 + */ + public interface OnRecyclerViewListener { + void onLoadMore(); + } +} diff --git a/app/src/main/java/com/gank/gankly/widget/transforms/ABaseTransformer.java b/app/src/main/java/com/gank/gankly/widget/transforms/ABaseTransformer.java index fa1377e4..e6328ecf 100644 --- a/app/src/main/java/com/gank/gankly/widget/transforms/ABaseTransformer.java +++ b/app/src/main/java/com/gank/gankly/widget/transforms/ABaseTransformer.java @@ -16,7 +16,7 @@ package com.gank.gankly.widget.transforms; -import android.support.v4.view.ViewPager.PageTransformer; +import androidx.viewpager.widget.ViewPager.PageTransformer; import android.view.View; public abstract class ABaseTransformer implements PageTransformer { diff --git a/app/src/main/java/com/gank/gankly/widget/transforms/ZoomOutSlideTransformer.java b/app/src/main/java/com/gank/gankly/widget/transforms/ZoomOutSlideTransformer.java index 931e5784..8e66c05e 100644 --- a/app/src/main/java/com/gank/gankly/widget/transforms/ZoomOutSlideTransformer.java +++ b/app/src/main/java/com/gank/gankly/widget/transforms/ZoomOutSlideTransformer.java @@ -20,36 +20,35 @@ public class ZoomOutSlideTransformer extends ABaseTransformer { - private static final float MIN_SCALE = 0.85f; - private static final float MIN_ALPHA = 0.5f; - - @Override - protected void onTransform(View view, float position) { - if (position >= -1 || position <= 1) { - // Modify the default slide transition to shrink the page as well - final float height = view.getHeight(); - final float width = view.getWidth(); - final float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); - final float vertMargin = height * (1 - scaleFactor) / 2; - final float horzMargin = width * (1 - scaleFactor) / 2; - - // Center vertically - view.setPivotY(0.5f * height); - view.setPivotX(0.5f * width); - - 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)); - } - } - + private static final float MIN_SCALE = 0.85f; + private static final float MIN_ALPHA = 0.5f; + + @Override + protected void onTransform(View view, float position) { + if (position >= -1 || position <= 1) { + // Modify the default slide transition to shrink the page as well + final float height = view.getHeight(); + final float width = view.getWidth(); + final float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); + final float vertMargin = height * (1 - scaleFactor) / 2; + final float horzMargin = width * (1 - scaleFactor) / 2; + + // Center vertically + view.setPivotY(0.5f * height); + view.setPivotX(0.5f * width); + + 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)); + } + } } diff --git a/app/src/main/res/anim/alpha_in.xml b/app/src/main/res/anim/alpha_in.xml index 4d1cab38..1e3d435c 100644 --- a/app/src/main/res/anim/alpha_in.xml +++ b/app/src/main/res/anim/alpha_in.xml @@ -1,8 +1,7 @@ + android:fromAlpha="0.0" + android:toAlpha="1.0" /> \ No newline at end of file diff --git a/app/src/main/res/anim/alpha_out.xml b/app/src/main/res/anim/alpha_out.xml index ae086910..cf6b6879 100644 --- a/app/src/main/res/anim/alpha_out.xml +++ b/app/src/main/res/anim/alpha_out.xml @@ -1,8 +1,7 @@ + android:fromAlpha="1.0" + android:toAlpha="0.0" /> \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/bg_consulting_placeholder_guest.png b/app/src/main/res/drawable-xxhdpi/bg_consulting_placeholder_guest.png new file mode 100644 index 00000000..8aafd54c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_consulting_placeholder_guest.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_leave_frame_full.9.png b/app/src/main/res/drawable-xxhdpi/bg_leave_frame_full.9.png new file mode 100644 index 00000000..50febccf Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_leave_frame_full.9.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_bottom_bar_home.png b/app/src/main/res/drawable-xxhdpi/ic_bottom_bar_home.png index fd40ac31..1f1667ff 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_bottom_bar_home.png and b/app/src/main/res/drawable-xxhdpi/ic_bottom_bar_home.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_bottom_bar_more.png b/app/src/main/res/drawable-xxhdpi/ic_bottom_bar_more.png index 22c82ea5..31bf1d04 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_bottom_bar_more.png and b/app/src/main/res/drawable-xxhdpi/ic_bottom_bar_more.png differ diff --git a/app/src/main/res/layout/activity_browse_picture.xml b/app/src/main/res/layout/activity_browse_picture.xml index fc3816f3..82ed74e7 100644 --- a/app/src/main/res/layout/activity_browse_picture.xml +++ b/app/src/main/res/layout/activity_browse_picture.xml @@ -1,65 +1,41 @@ - - - + android:layout_height="match_parent" + android:transitionName="@string/transition_welfare_image" /> + android:background="@color/video_item_black_light_bg" + android:paddingTop="6dp" + android:paddingBottom="6dp"> - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_collcet.xml b/app/src/main/res/layout/activity_collcet.xml index 1721be19..7194e9f8 100644 --- a/app/src/main/res/layout/activity_collcet.xml +++ b/app/src/main/res/layout/activity_collcet.xml @@ -1,5 +1,5 @@ - - - - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_jiandan.xml b/app/src/main/res/layout/activity_jiandan.xml index 02364505..2166e2d5 100644 --- a/app/src/main/res/layout/activity_jiandan.xml +++ b/app/src/main/res/layout/activity_jiandan.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e00246d2..124955ea 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - - + diff --git a/app/src/main/res/layout/activity_web.xml b/app/src/main/res/layout/activity_web.xml index e88916ac..691524ab 100644 --- a/app/src/main/res/layout/activity_web.xml +++ b/app/src/main/res/layout/activity_web.xml @@ -1,17 +1,17 @@ - - - - + - + diff --git a/app/src/main/res/layout/adapter_android.xml b/app/src/main/res/layout/adapter_android.xml index 04e965d9..1092e6bd 100644 --- a/app/src/main/res/layout/adapter_android.xml +++ b/app/src/main/res/layout/adapter_android.xml @@ -1,64 +1,57 @@ - + - - - - - - - - - - - - - - - - - - + android:paddingBottom="10dp" + android:paddingEnd="12dp" + android:paddingStart="12dp" + android:paddingTop="10dp"> - + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + - - - \ No newline at end of file + android:text="" + android:textColor="@color/text_333333" + android:textSize="@dimen/normalSize" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_browse_history.xml b/app/src/main/res/layout/adapter_browse_history.xml index a2b99944..ea3c1d58 100644 --- a/app/src/main/res/layout/adapter_browse_history.xml +++ b/app/src/main/res/layout/adapter_browse_history.xml @@ -36,7 +36,7 @@ android:orientation="vertical"> - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_ios.xml b/app/src/main/res/layout/adapter_ios.xml index 277a3cb2..e0abd09e 100644 --- a/app/src/main/res/layout/adapter_ios.xml +++ b/app/src/main/res/layout/adapter_ios.xml @@ -1,95 +1,84 @@ - + - - - - - - - - + android:paddingStart="12dp" + android:paddingTop="10dp" + android:paddingEnd="12dp" + android:paddingBottom="10dp"> - - + - - - - - - - + + android:gravity="start" + android:maxLines="1" + android:text="" + android:textColor="#23c5d9" + android:textSize="@dimen/normalSize" /> + - + - + - - - - - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_meizi.xml b/app/src/main/res/layout/adapter_meizi.xml index c6c5ef71..bcb18d10 100644 --- a/app/src/main/res/layout/adapter_meizi.xml +++ b/app/src/main/res/layout/adapter_meizi.xml @@ -3,18 +3,17 @@ android:id="@+id/meizi_card_view" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="5dp" android:layout_marginLeft="4dp" - android:layout_marginRight="4dp" - android:layout_marginTop="5dp"> + android:layout_marginTop="5dp" + android:layout_marginRight="4dp"> + android:transitionName="@string/transition_welfare_image" /> \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_technology.xml b/app/src/main/res/layout/adapter_technology.xml index a2692f28..e7bf43a1 100644 --- a/app/src/main/res/layout/adapter_technology.xml +++ b/app/src/main/res/layout/adapter_technology.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_video.xml b/app/src/main/res/layout/adapter_video.xml index 81a2db78..849f066c 100644 --- a/app/src/main/res/layout/adapter_video.xml +++ b/app/src/main/res/layout/adapter_video.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml index 0ad88624..a126699d 100644 --- a/app/src/main/res/layout/fragment_about.xml +++ b/app/src/main/res/layout/fragment_about.xml @@ -1,5 +1,5 @@ - - - - - - + + - @@ -109,5 +109,5 @@ app:textTitle="@string/about_contact"/> - - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_baisi_preview_video.xml b/app/src/main/res/layout/fragment_baisi_preview_video.xml index a5e4b840..edbbe2af 100644 --- a/app/src/main/res/layout/fragment_baisi_preview_video.xml +++ b/app/src/main/res/layout/fragment_baisi_preview_video.xml @@ -6,12 +6,12 @@ android:background="@color/black" android:clickable="true"> - - + - - - - + - + diff --git a/app/src/main/res/layout/fragment_discovered.xml b/app/src/main/res/layout/fragment_discovered.xml index 42579bf4..a379812f 100644 --- a/app/src/main/res/layout/fragment_discovered.xml +++ b/app/src/main/res/layout/fragment_discovered.xml @@ -7,7 +7,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - @@ -19,14 +19,14 @@ - - + - - @@ -19,14 +19,14 @@ - - + - - - - + - - + android:layout_height="match_parent" + android:orientation="vertical"> - + android:layout_height="0dp" + android:layout_weight="1" /> - + app:bb_tabXmlResource="@xml/bottombar_tabs_color_changing" + app:bb_titleTextAppearance="@style/BottomTextAppearance" /> + diff --git a/app/src/main/res/layout/fragment_mian_baisi.xml b/app/src/main/res/layout/fragment_mian_baisi.xml index 08bbcea4..2d9ec5df 100644 --- a/app/src/main/res/layout/fragment_mian_baisi.xml +++ b/app/src/main/res/layout/fragment_mian_baisi.xml @@ -1,33 +1,33 @@ - - - - - + - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index c2a62182..5e7161c3 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -1,26 +1,26 @@ - - - - + - - - - + - - - - + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index bf723017..49e145c3 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -1,5 +1,5 @@ - @@ -11,7 +11,7 @@ android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_welfare.xml b/app/src/main/res/layout/fragment_welfare.xml new file mode 100644 index 00000000..809944bc --- /dev/null +++ b/app/src/main/res/layout/fragment_welfare.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_bar.xml b/app/src/main/res/layout/layout_bar.xml index bca3a056..b7560c5f 100644 --- a/app/src/main/res/layout/layout_bar.xml +++ b/app/src/main/res/layout/layout_bar.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_default_refresh.xml b/app/src/main/res/layout/layout_default_refresh.xml index b0422731..9ce3451b 100644 --- a/app/src/main/res/layout/layout_default_refresh.xml +++ b/app/src/main/res/layout/layout_default_refresh.xml @@ -7,7 +7,7 @@ android:minWidth="300dip" android:orientation="vertical"> - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/transition/gallery_mid.xml b/app/src/main/res/transition/gallery_mid.xml deleted file mode 100644 index ca3f0bd9..00000000 --- a/app/src/main/res/transition/gallery_mid.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/transition/gallery_out.xml b/app/src/main/res/transition/gallery_out.xml new file mode 100644 index 00000000..a9111d40 --- /dev/null +++ b/app/src/main/res/transition/gallery_out.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/transition/image_transfom.xml b/app/src/main/res/transition/image_transfom.xml deleted file mode 100644 index d94039cc..00000000 --- a/app/src/main/res/transition/image_transfom.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ 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 76ee9a24..b8df4c78 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -11,6 +11,7 @@ #ff555555 #666666 #333333 + #9f9fa6 #ff00A0DC @@ -42,16 +43,12 @@ #4093c6 - - - - #00796B #009688 #009688 #EFEEF4 #F1F3F6 - #f3f6f9 + #f8f8f8 #fefefe #33000000 #4093c6 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0547b48e..da604e80 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -11,4 +11,5 @@ 34sp 45sp 56sp + 16dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9731e62b..f3a59b45 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ 其他 视频 发现 - 妹子 + 美图 首页 关于 煎蛋杂集 @@ -36,6 +36,8 @@ Wi-Fi和移动数据已断开 全部加载完毕 + 网络请求出错 + 确定 取消 更新 @@ -106,4 +108,10 @@ 选择页数 已开启自动浏览模式 + + + %1$s_%2$d.html + Main2Activity + / + share_welfare_image diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6f63cb6d..9fc61c98 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -13,9 +13,9 @@ true - + + + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index f1c598af..af319c56 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -2,6 +2,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/bottombar_tabs_color_changing.xml b/app/src/main/res/xml/bottombar_tabs_color_changing.xml index 07d09def..8c92f683 100644 --- a/app/src/main/res/xml/bottombar_tabs_color_changing.xml +++ b/app/src/main/res/xml/bottombar_tabs_color_changing.xml @@ -4,21 +4,21 @@ barColorWhenSelected="@color/colorPrimary" icon="@drawable/ic_bottom_bar_home" id="@+id/tab_home" - title="干货"/> + title="@string/navigation_home" /> + title="@string/navigation_news" /> + title="@string/navigation_gift" /> + title="@string/navigation_mine" /> \ No newline at end of file diff --git a/app/src/test/java/com/gank/gankly/ui/main/MainActivityTest.java b/app/src/test/java/com/gank/gankly/ui/main/MainActivityTest.java new file mode 100644 index 00000000..79fb9394 --- /dev/null +++ b/app/src/test/java/com/gank/gankly/ui/main/MainActivityTest.java @@ -0,0 +1,58 @@ +package com.gank.gankly.ui.main; + +import org.junit.Test; + +/** + * Create by LingYan on 2018-04-24 + */ +public class MainActivityTest { + @Test + public void getContentId() throws Exception { + } + + @Test + public void initViews() throws Exception { + } + + @Test + public void onRequestPermissionsResult() throws Exception { + } + + @Test + public void bindListener() throws Exception { + } + + @Test + public void initValues() throws Exception { + } + + @Test + public void initPresenter() throws Exception { + } + + @Test + public void testMy() throws Exception { + + } + + @Test + public void changeBottomBar() throws Exception { + } + + @Test + public void onKeyDown() throws Exception { + } + + @Test + public void onDestroy() throws Exception { + } + + @Test + public void onCreate() throws Exception { + } + + @Test + public void onSaveInstanceState() throws Exception { + } + +} \ No newline at end of file diff --git a/app/src/test/java/com/test/test/ExampleUnitTest.java b/app/src/test/java/com/test/test/ExampleUnitTest.java new file mode 100644 index 00000000..165a86e3 --- /dev/null +++ b/app/src/test/java/com/test/test/ExampleUnitTest.java @@ -0,0 +1,38 @@ +package com.test.test; + +import com.gank.gankly.ui.MainActivity; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.shadows.ShadowLog; + +import static junit.framework.Assert.assertNotNull; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +@RunWith(RobolectricTestRunner.class) +public class ExampleUnitTest { + MainActivity mainActivity; + + @Before + public void setUp() { + ShadowLog.stream = System.out; + mainActivity = Robolectric.setupActivity(MainActivity.class); + } + + @Test + public void addition_isCorrect() throws Exception { +// assertEquals(4, 2 + 2); + assertNotNull(mainActivity); + } + + @Test + public void testMain1() throws Exception { + } +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8eaabdbe..360f6c98 100644 --- a/build.gradle +++ b/build.gradle @@ -2,25 +2,34 @@ buildscript { repositories { + google() jcenter() + maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' - //bugly - classpath 'com.tencent.bugly:symtabfileuploader:1.3.9' - // lambda - classpath 'me.tatarka:gradle-retrolambda:3.4.0' + classpath 'com.android.tools.build:gradle:3.3.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } + ext { - + compileSdkVersion = 28 + minSdkVersion = 21 + targetSdkVersion = 23 + + superplayerVersionCode = 1 + superplayerVersionName = "1.0" + + normalVersionCode = 1 + normalVersionName = "1.0" } allprojects { repositories { + google() jcenter() + maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } } diff --git a/gradle.properties b/gradle.properties index 1f8a2499..6f0a31e4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,21 +5,40 @@ # # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m +# Default value: -Xmx1024m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -#Mon Jul 11 16:48:27 CST 2016 -# ʹndk +#Wed Nov 29 14:48:44 CST 2017 +butterknife=10.1.0 +butterknifeCompiler=10.1.0 +greendao=2.1.0 +supportVersion=1.0.0 +retrofitConverters=2.3.0 +retrofitVersion=2.3.0 +loggingInterceptor=3.9.0 +converterGson=2.3.0 +stethoOkhttp3=1.5.0 +subsamplingVersion=3.10.0 +jsoup=1.10.3 +okhttp=3.9.0 +gsonVersion=2.7 android.useDeprecatedNdk=true -# ô -#systemProp.http.proxyHost=127.0.0.1 -#systemProp.http.proxyPort=1080 -#systemProp.https.proxyHost=127.0.0.1 -#systemProp.https.proxyPort=1080 -#support version -supportVersion=25.3.1 +gank_server_url=http\://gank.io/api/data/ +leakcanaryandroid=1.5.4 +rxjava=2.1.3 +adapterRxjava2=2.3.0 +glide=4.9.0 +bottomBar=2.3.1 +retrofitAdapters=2.3.0 +rxandroid=2.1.1 +crashreportUpgrade=1.3.1 klogVersion=1.6.0 +stethoVersion=1.5.0 +constraintLayout=1.1.3 +android.useAndroidX=true +android.enableJetifier=true + diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6dfbf250..d86560a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Mar 03 12:41:37 CST 2017 +#Sat Apr 13 23:05:27 CST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/ijkplayerlibrary/build.gradle b/ijkplayerlibrary/build.gradle index f455127d..f4d6663e 100644 --- a/ijkplayerlibrary/build.gradle +++ b/ijkplayerlibrary/build.gradle @@ -1,12 +1,11 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 24 - buildToolsVersion '25.0.0' + compileSdkVersion rootProject.compileSdkVersion defaultConfig { - minSdkVersion 14 - targetSdkVersion 24 + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion versionCode 1 versionName "1.0" } @@ -19,7 +18,7 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:24.2.0' + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.12' + implementation "androidx.appcompat:appcompat:${supportVersion}" } diff --git a/ijkplayerlibrary/src/androidTest/java/tv/danmaku/ijk/media/player/ApplicationTest.java b/ijkplayerlibrary/src/androidTest/java/tv/danmaku/ijk/media/player/ApplicationTest.java deleted file mode 100644 index 60d1d732..00000000 --- a/ijkplayerlibrary/src/androidTest/java/tv/danmaku/ijk/media/player/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package tv.danmaku.ijk.media.player; - -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/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/IRenderView.java b/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/IRenderView.java index 5591674c..a1dd0633 100644 --- a/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/IRenderView.java +++ b/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/IRenderView.java @@ -17,11 +17,12 @@ package tv.danmaku.ijk.media.player.widget; import android.graphics.SurfaceTexture; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.Surface; import android.view.SurfaceHolder; import android.view.View; + import tv.danmaku.ijk.media.player.IMediaPlayer; public interface IRenderView { diff --git a/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/IjkVideoView.java b/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/IjkVideoView.java index 32ae7e11..9218da48 100644 --- a/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/IjkVideoView.java +++ b/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/IjkVideoView.java @@ -22,7 +22,7 @@ import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; diff --git a/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/SurfaceRenderView.java b/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/SurfaceRenderView.java index 25cb502e..e268c43f 100644 --- a/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/SurfaceRenderView.java +++ b/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/SurfaceRenderView.java @@ -24,8 +24,8 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.Surface; diff --git a/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/TextureRenderView.java b/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/TextureRenderView.java index ff520908..83727ae7 100644 --- a/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/TextureRenderView.java +++ b/ijkplayerlibrary/src/main/java/tv/danmaku/ijk/media/player/widget/TextureRenderView.java @@ -24,8 +24,8 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.Surface; diff --git a/ijkplayerlibrary/src/test/java/tv/danmaku/ijk/media/player/ExampleUnitTest.java b/ijkplayerlibrary/src/test/java/tv/danmaku/ijk/media/player/ExampleUnitTest.java deleted file mode 100644 index 34d6ea38..00000000 --- a/ijkplayerlibrary/src/test/java/tv/danmaku/ijk/media/player/ExampleUnitTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package tv.danmaku.ijk.media.player; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * To work on unit tests, switch the Test Artifact in the Build Variants view. - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 925f4354..274a098a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':test', ':superplayerlibrary', ':ijkplayerlibrary' +include ':app', ':superplayerlibrary', ':ijkplayerlibrary', ':support-coding-network', ':support-coding-rxbus', ':support-coding-ui', ':support-coding-business', ':support-coding-jsoup' diff --git a/superplayerlibrary/build.gradle b/superplayerlibrary/build.gradle index 76450b89..57da8391 100644 --- a/superplayerlibrary/build.gradle +++ b/superplayerlibrary/build.gradle @@ -1,14 +1,13 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 24 - buildToolsVersion '25.0.0' + compileSdkVersion rootProject.compileSdkVersion defaultConfig { - minSdkVersion 14 - targetSdkVersion 24 - versionCode 1 - versionName "1.0" + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + versionCode rootProject.superplayerVersionCode + versionName rootProject.superplayerVersionName } buildTypes { release { @@ -16,11 +15,15 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + lintOptions { + abortOnError false + } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:24.2.0' - compile project(':ijkplayerlibrary') + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.12' + implementation "androidx.appcompat:appcompat:${supportVersion}" + implementation project(':ijkplayerlibrary') } diff --git a/superplayerlibrary/src/main/java/com/superplayer/library/SuperPlayer.java b/superplayerlibrary/src/main/java/com/superplayer/library/SuperPlayer.java index 121ee065..cc83444d 100644 --- a/superplayerlibrary/src/main/java/com/superplayer/library/SuperPlayer.java +++ b/superplayerlibrary/src/main/java/com/superplayer/library/SuperPlayer.java @@ -12,8 +12,8 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; diff --git a/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/IRenderView.java b/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/IRenderView.java index 7bd83a97..d4845317 100644 --- a/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/IRenderView.java +++ b/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/IRenderView.java @@ -18,8 +18,8 @@ import tv.danmaku.ijk.media.player.IMediaPlayer; import android.graphics.SurfaceTexture; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.Surface; import android.view.SurfaceHolder; import android.view.View; diff --git a/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/IjkVideoView.java b/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/IjkVideoView.java index b835f52f..6fb2cc5e 100644 --- a/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/IjkVideoView.java +++ b/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/IjkVideoView.java @@ -25,7 +25,7 @@ import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; diff --git a/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/SurfaceRenderView.java b/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/SurfaceRenderView.java index 3b884012..19f814da 100644 --- a/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/SurfaceRenderView.java +++ b/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/SurfaceRenderView.java @@ -26,8 +26,8 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.Surface; diff --git a/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/TextureRenderView.java b/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/TextureRenderView.java index 86d24f4a..18a9d933 100644 --- a/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/TextureRenderView.java +++ b/superplayerlibrary/src/main/java/com/superplayer/library/mediaplayer/TextureRenderView.java @@ -26,8 +26,8 @@ import android.content.Context; import android.graphics.SurfaceTexture; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.Surface; import android.view.SurfaceHolder; diff --git a/support-coding-business/.gitignore b/support-coding-business/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/support-coding-business/.gitignore @@ -0,0 +1 @@ +/build diff --git a/support-coding-business/build.gradle b/support-coding-business/build.gradle new file mode 100644 index 00000000..b1f7da11 --- /dev/null +++ b/support-coding-business/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion rootProject.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + versionCode rootProject.normalVersionCode + versionName rootProject.normalVersionName + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + api project(':support-coding-network') +} diff --git a/support-coding-business/proguard-rules.pro b/support-coding-business/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/support-coding-business/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/support-coding-business/src/main/AndroidManifest.xml b/support-coding-business/src/main/AndroidManifest.xml new file mode 100644 index 00000000..194b1172 --- /dev/null +++ b/support-coding-business/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/support-coding-business/src/main/java/android/ly/business/api/Api.java b/support-coding-business/src/main/java/android/ly/business/api/Api.java new file mode 100644 index 00000000..427f6ce0 --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/api/Api.java @@ -0,0 +1,57 @@ +package android.ly.business.api; + +import android.ly.business.domain.ListEntity; +import android.ly.business.domain.PageEntity; +import android.ly.business.domain.Gank; + +import io.reactivex.Observable; +import retrofit2.Response; +import retrofit2.http.GET; +import retrofit2.http.Path; + + +/** + * Create by LingYan on 2017-09-29 + */ + +public interface Api { + /** + * android 资源 + */ + @GET("Android/{limit}/{page}") + Observable>> androids( + @Path("page") int page, + @Path("limit") int limit + ); + + /** + * ios 资源 + */ + @GET("iOS/{limit}/{page}") + Observable>> ios( + @Path("page") int page, + @Path("limit") int limit + + ); + + @GET("all/{limit}/{page}") + Observable>> allGoods( + @Path("page") int page, + @Path("limit") int limit + ); + + /** + * 福利 - 图片 + */ + @GET("福利/{limit}/{page}") + Observable>> images( + @Path("page") int page, + @Path("limit") int limit + ); + + @GET("休息视频/{limit}/{page}") + Observable>> videos( + @Path("page") int page, + @Path("limit") int limit + ); +} diff --git a/support-coding-business/src/main/java/android/ly/business/api/GankServer.java b/support-coding-business/src/main/java/android/ly/business/api/GankServer.java new file mode 100644 index 00000000..b90ef1ef --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/api/GankServer.java @@ -0,0 +1,95 @@ +package android.ly.business.api; + +import android.content.Context; +import android.ly.business.domain.Gank; +import android.ly.business.domain.PageEntity; + +import com.leftcoding.network.base.Server; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Function; +import io.reactivex.schedulers.Schedulers; +import retrofit2.Response; + + +/** + * Create by LingYan on 2017-09-30 + */ + +public class GankServer extends Server { + private volatile static GankServer server; + private GankServerHelper gankServerHelper; + private Api api; + + private GankServer(Context context) { + super(context); + if (gankServerHelper == null) { + gankServerHelper = GankServerHelper.init(context); + } + api = gankServerHelper + .newRetrofit() + .create(Api.class); + } + + @Override + public void init(Context context) { + gankServerHelper = GankServerHelper.init(context); + } + + public static GankServer with(Context context) { + if (server == null) { + synchronized (GankServer.class) { + if (server == null) { + server = new GankServer(context); + } + } + } + return server; + } + + public Observable> androids(final int page, final int limit) { + return api.androids(page, limit) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .map(new Function>, PageEntity>() { + @Override + public PageEntity apply(Response> pageEntityResponse) throws Exception { + if (pageEntityResponse == null) { + return null; + } + return pageEntityResponse.body(); + } + }); + } + + public Observable> ios(int page, int limit) { + return api.ios(page, limit) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .map(new Function>, PageEntity>() { + @Override + public PageEntity apply(Response> pageEntityResponse) throws Exception { + if (pageEntityResponse == null) { + return null; + } + return pageEntityResponse.body(); + } + }); + } + + public Observable> images(final int page, final int limit) { + return api.images(page, limit) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .map(new Function>, PageEntity>() { + @Override + public PageEntity apply(Response> response) throws Exception { + if (response == null || !response.isSuccessful()) { + return null; + } + return response.body(); + } + }); + } +} diff --git a/support-coding-business/src/main/java/android/ly/business/api/GankServerHelper.java b/support-coding-business/src/main/java/android/ly/business/api/GankServerHelper.java new file mode 100644 index 00000000..8240853b --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/api/GankServerHelper.java @@ -0,0 +1,53 @@ +package android.ly.business.api; + +import android.content.Context; +import android.util.Log; + +import com.leftcoding.network.base.ServerHelper; + +import okhttp3.Interceptor; +import retrofit2.Retrofit; + +/** + * Create by LingYan on 2018-03-20 + */ + +public class GankServerHelper { + private volatile static GankServerHelper gankServerHelper; + private Context context; + private ServerHelper serverHelper; + private String baseUrl; + + private GankServerHelper(Context context) { + this.context = context.getApplicationContext() == null ? context : context.getApplicationContext(); + serverHelper = ServerHelper.get(); + } + + public static GankServerHelper init(Context context) { + if (gankServerHelper == null) { + synchronized (GankServerHelper.class) { + if (gankServerHelper == null) { + gankServerHelper = new GankServerHelper(context); + } + } + } + return gankServerHelper; + } + + public GankServerHelper baseUrl(String baseUrl) { + Log.d(">>", ">>GankServerHelper baseUrl:" + baseUrl); + this.baseUrl = baseUrl; + return this; + } + + public GankServerHelper addNetworkInterceptor(Interceptor interceptor) { + serverHelper.addNetworkInterceptor(interceptor); + return this; + } + + Retrofit newRetrofit() { + Log.d(">>>", ">>baseUrl:" + baseUrl); + return serverHelper.baseUrl(baseUrl) + .newRetrofit(); + } +} diff --git a/support-coding-business/src/main/java/android/ly/business/domain/BaseEntity.java b/support-coding-business/src/main/java/android/ly/business/domain/BaseEntity.java new file mode 100644 index 00000000..5fd82002 --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/domain/BaseEntity.java @@ -0,0 +1,18 @@ +package android.ly.business.domain; + +import java.io.Serializable; + +public class BaseEntity implements Serializable { + /** + * 错误码 + */ + public boolean code; + + /** + * 提示语 + */ + public String msg; + + public BaseEntity() { + } +} \ No newline at end of file diff --git a/support-coding-business/src/main/java/android/ly/business/domain/ContentEqual.java b/support-coding-business/src/main/java/android/ly/business/domain/ContentEqual.java new file mode 100644 index 00000000..3b42e35c --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/domain/ContentEqual.java @@ -0,0 +1,8 @@ +package android.ly.business.domain; + +/** + * Create by LingYan on 2018-11-12 + */ +public interface ContentEqual { + boolean isContentEqual(ContentEqual contentEqual); +} diff --git a/support-coding-business/src/main/java/android/ly/business/domain/Gank.java b/support-coding-business/src/main/java/android/ly/business/domain/Gank.java new file mode 100644 index 00000000..2837f3c8 --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/domain/Gank.java @@ -0,0 +1,37 @@ +package android.ly.business.domain; + +import android.text.TextUtils; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class Gank extends BaseEntity implements Serializable, ContentEqual { + @SerializedName("_id") + public String id; + public String createdAt; + public String desc; + public String publishedAt; + public String source; + public String type; + public String url; + public boolean used; + public String who; + + @Override + public boolean isContentEqual(ContentEqual contentEqual) { + if (contentEqual instanceof Gank) { + Gank item = (Gank) contentEqual; + return TextUtils.equals(id, item.id) + && TextUtils.equals(createdAt, item.createdAt) + && TextUtils.equals(desc, item.desc) + && TextUtils.equals(publishedAt, item.publishedAt) + && TextUtils.equals(source, item.source) + && TextUtils.equals(type, item.type) + && TextUtils.equals(url, item.url) + && TextUtils.equals(who, item.who) + && used == item.used; + } + return false; + } +} \ No newline at end of file diff --git a/support-coding-business/src/main/java/android/ly/business/domain/Gift.java b/support-coding-business/src/main/java/android/ly/business/domain/Gift.java new file mode 100644 index 00000000..cf6f1d4b --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/domain/Gift.java @@ -0,0 +1,61 @@ +package android.ly.business.domain; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Create by LingYan on 2016-05-18 + */ +public class Gift implements Parcelable { + public String imgUrl; + public String url; + public String time; + public String views; + public String title; + + public Gift(String imgUrl) { + this.imgUrl = imgUrl; + } + + public Gift(String imgUrl, String url, String time, String views, String title) { + this.imgUrl = imgUrl; + this.url = url; + this.time = time; + this.views = views; + this.title = title; + } + + protected Gift(Parcel in) { + imgUrl = in.readString(); + url = in.readString(); + time = in.readString(); + views = in.readString(); + title = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public Gift createFromParcel(Parcel in) { + return new Gift(in); + } + + @Override + public Gift[] newArray(int size) { + return new Gift[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(imgUrl); + dest.writeString(url); + dest.writeString(time); + dest.writeString(views); + dest.writeString(title); + } +} diff --git a/support-coding-business/src/main/java/android/ly/business/domain/Girl.java b/support-coding-business/src/main/java/android/ly/business/domain/Girl.java new file mode 100644 index 00000000..f0c982cb --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/domain/Girl.java @@ -0,0 +1,67 @@ +package android.ly.business.domain; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Create by LingYan on 2016-07-05 + */ +public class Girl implements Parcelable { + /** + * 月份 + */ + public String month; + + /** + * 日期 + */ + public String day; + + /** + * 请求地址 + */ + public String url; + + /** + * 标题 + */ + public String title; + + public Girl(String url, String title) { + this.url = url; + this.title = title; + } + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.month); + dest.writeString(this.day); + dest.writeString(this.url); + dest.writeString(this.title); + } + + protected Girl(Parcel in) { + this.month = in.readString(); + this.day = in.readString(); + this.url = in.readString(); + this.title = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public Girl createFromParcel(Parcel source) { + return new Girl(source); + } + + @Override + public Girl[] newArray(int size) { + return new Girl[size]; + } + }; +} diff --git a/support-coding-business/src/main/java/android/ly/business/domain/ListEntity.java b/support-coding-business/src/main/java/android/ly/business/domain/ListEntity.java new file mode 100644 index 00000000..2ea9118a --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/domain/ListEntity.java @@ -0,0 +1,11 @@ +package android.ly.business.domain; + +import java.util.List; + +/** + * Create by LingYan on 2017-09-30 + */ + +public class ListEntity extends BaseEntity { + public List results; +} diff --git a/support-coding-business/src/main/java/android/ly/business/domain/PageConfig.java b/support-coding-business/src/main/java/android/ly/business/domain/PageConfig.java new file mode 100644 index 00000000..3af7b32a --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/domain/PageConfig.java @@ -0,0 +1,52 @@ +package android.ly.business.domain; + +/** + * Create by LingYan on 2017-11-18 + */ + +public class PageConfig { + /** + * 分页个数 默认20 + */ + public int limit = 20; + + /** + * 初始化请求页数 + */ + public int initPage = 1; + + /** + * 当前请求页数 + */ + private int curPage = 1; + + public PageConfig() { + + } + + public PageConfig(int limit, int initPage, int curPage) { + this.limit = limit; + this.initPage = initPage; + this.curPage = curPage; + } + + public boolean isFirst() { + return initPage == curPage; + } + + public int getNextPage() { + return curPage + 1; + } + + public int getCurPage() { + return curPage; + } + + public int getInitPage() { + return initPage; + } + + public static int starPage() { + return 1; + } +} diff --git a/support-coding-business/src/main/java/android/ly/business/domain/PageEntity.java b/support-coding-business/src/main/java/android/ly/business/domain/PageEntity.java new file mode 100644 index 00000000..c86a2217 --- /dev/null +++ b/support-coding-business/src/main/java/android/ly/business/domain/PageEntity.java @@ -0,0 +1,13 @@ +package android.ly.business.domain; + +/** + * Create by LingYan on 2017-10-12 + */ + +public class PageEntity extends ListEntity { + public int nextPage; + + public boolean hasNoMore(int limit) { + return results != null && !results.isEmpty() && results.size() < limit; + } +} diff --git a/support-coding-business/src/main/res/values/strings.xml b/support-coding-business/src/main/res/values/strings.xml new file mode 100644 index 00000000..6c663037 --- /dev/null +++ b/support-coding-business/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + support-ly-business + diff --git a/support-coding-jsoup/.gitignore b/support-coding-jsoup/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/support-coding-jsoup/.gitignore @@ -0,0 +1 @@ +/build diff --git a/support-coding-jsoup/build.gradle b/support-coding-jsoup/build.gradle new file mode 100644 index 00000000..2b566aa5 --- /dev/null +++ b/support-coding-jsoup/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion rootProject.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + versionCode rootProject.normalVersionCode + versionName rootProject.normalVersionName + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + + api "org.jsoup:jsoup:${jsoup}" + implementation project(':support-coding-rxbus') +} diff --git a/support-coding-jsoup/proguard-rules.pro b/support-coding-jsoup/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/support-coding-jsoup/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/support-coding-jsoup/src/main/AndroidManifest.xml b/support-coding-jsoup/src/main/AndroidManifest.xml new file mode 100644 index 00000000..02cae5ed --- /dev/null +++ b/support-coding-jsoup/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/support-coding-jsoup/src/main/java/android/ly/jsoup/JsoupMate.java b/support-coding-jsoup/src/main/java/android/ly/jsoup/JsoupMate.java new file mode 100644 index 00000000..0b323d2d --- /dev/null +++ b/support-coding-jsoup/src/main/java/android/ly/jsoup/JsoupMate.java @@ -0,0 +1,45 @@ +package android.ly.jsoup; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.io.IOException; + +/** + * Create by LingYan on 2018-03-23 + */ + +public class JsoupMate extends Mate { + + public JsoupMate(String url) { + super(url); + } + + @Override + public Document build() { + try { + return Jsoup.connect(url).timeout(timeOut).userAgent(userAgent).get(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Mate setTimeOut(int timeOut) { + this.timeOut = timeOut; + return this; + } + + @Override + public Mate setUserAgent(String userAgent) { + this.userAgent = userAgent; + return this; + } + + @Override + public Mate setMobile(boolean isMobile) { + this.isMobile = isMobile; + return this; + } +} diff --git a/support-coding-jsoup/src/main/java/android/ly/jsoup/JsoupServer.java b/support-coding-jsoup/src/main/java/android/ly/jsoup/JsoupServer.java new file mode 100644 index 00000000..83e74324 --- /dev/null +++ b/support-coding-jsoup/src/main/java/android/ly/jsoup/JsoupServer.java @@ -0,0 +1,18 @@ +package android.ly.jsoup; + +/** + * Create by LingYan on 2018-03-23 + */ + +public class JsoupServer { + private JsoupServer() { + } + + public static JsoupMate connect(String url) { + return new JsoupMate(url); + } + + public static RxJsoupMate rxConnect(String url) { + return new RxJsoupMate(url); + } +} diff --git a/support-coding-jsoup/src/main/java/android/ly/jsoup/Mate.java b/support-coding-jsoup/src/main/java/android/ly/jsoup/Mate.java new file mode 100644 index 00000000..b86661c2 --- /dev/null +++ b/support-coding-jsoup/src/main/java/android/ly/jsoup/Mate.java @@ -0,0 +1,28 @@ +package android.ly.jsoup; + +/** + * Create by LingYan on 2018-03-23 + */ + +abstract class Mate { + static final int TIME_OUT = 50 * 1000; + static final String USER_AGENT = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36"; + static final String DESKTOP_USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; Desktop) AppleWebKit/534.13 (KHTML, like Gecko) UCBrowser/8.9.0.25"; + + int timeOut = TIME_OUT; + String userAgent = USER_AGENT; + String url; + boolean isMobile = true; + + Mate(String url) { + this.url = url; + } + + public abstract T build(); + + public abstract Mate setTimeOut(int timeOut); + + public abstract Mate setUserAgent(String userAgent); + + public abstract Mate setMobile(boolean isMobile); +} diff --git a/support-coding-jsoup/src/main/java/android/ly/jsoup/RxJsoupMate.java b/support-coding-jsoup/src/main/java/android/ly/jsoup/RxJsoupMate.java new file mode 100644 index 00000000..6c1c57de --- /dev/null +++ b/support-coding-jsoup/src/main/java/android/ly/jsoup/RxJsoupMate.java @@ -0,0 +1,63 @@ +package android.ly.jsoup; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.io.IOException; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Create by LingYan on 2018-03-23 + */ + +public class RxJsoupMate extends Mate> { + + RxJsoupMate(String url) { + super(url); + } + + @Override + public Observable build() { + return Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter subscriber) throws Exception { + Document doc; + try { + doc = Jsoup.connect(url) + .userAgent(userAgent) + .timeout(timeOut) + .get(); + subscriber.onNext(doc); + } catch (IOException e) { + subscriber.onError(new Throwable(e)); + } + subscriber.onComplete(); + } + }).subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + @Override + public Mate setTimeOut(int timeOut) { + this.timeOut = timeOut; + return this; + } + + @Override + public Mate setUserAgent(String userAgent) { + this.userAgent = userAgent; + return this; + } + + @Override + public Mate setMobile(boolean isMobile) { + this.isMobile = isMobile; + return this; + } +} diff --git a/support-coding-jsoup/src/main/res/values/strings.xml b/support-coding-jsoup/src/main/res/values/strings.xml new file mode 100644 index 00000000..1a20827c --- /dev/null +++ b/support-coding-jsoup/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + support-ly-jsoup + diff --git a/support-coding-network/.gitignore b/support-coding-network/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/support-coding-network/.gitignore @@ -0,0 +1 @@ +/build diff --git a/support-coding-network/build.gradle b/support-coding-network/build.gradle new file mode 100644 index 00000000..e9d04571 --- /dev/null +++ b/support-coding-network/build.gradle @@ -0,0 +1,39 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion rootProject.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + versionCode rootProject.normalVersionCode + versionName rootProject.normalVersionName + + buildConfigField("String", "GANK_SERVER_ULR", "\"${gank_server_url}\"") + } + buildTypes { + debug { + minifyEnabled false + shrinkResources false + } + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + api fileTree(include: ['*.jar'], dir: 'libs') + // Gson + api "com.google.code.gson:gson:${gsonVersion}" + + // Retrofit + api "com.squareup.okhttp3:logging-interceptor:${loggingInterceptor}" + + api "com.squareup.retrofit2:retrofit:${retrofitVersion}" + api "com.squareup.retrofit2:converter-gson:${converterGson}" + api "com.squareup.retrofit2:adapter-rxjava2:${adapterRxjava2}" + // RxJava2 + api project(':support-coding-rxbus') +} diff --git a/support-coding-network/proguard-rules.pro b/support-coding-network/proguard-rules.pro new file mode 100644 index 00000000..f3e3ccae --- /dev/null +++ b/support-coding-network/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in D:\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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/support-coding-network/src/main/AndroidManifest.xml b/support-coding-network/src/main/AndroidManifest.xml new file mode 100644 index 00000000..88a35b33 --- /dev/null +++ b/support-coding-network/src/main/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/support-coding-network/src/main/java/com/leftcoding/network/base/NetworkControl.java b/support-coding-network/src/main/java/com/leftcoding/network/base/NetworkControl.java new file mode 100644 index 00000000..88e05313 --- /dev/null +++ b/support-coding-network/src/main/java/com/leftcoding/network/base/NetworkControl.java @@ -0,0 +1,48 @@ +package com.leftcoding.network.base; + + +import java.util.concurrent.TimeUnit; + +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; + +/** + * Create by LingYan on 2017-09-30 + */ +public class NetworkControl { + private static final int DEFAULT_OUT_TIME = 30; + private OkHttpClient.Builder builder; + + private NetworkControl() { + builder = new OkHttpClient.Builder(); + builder.connectTimeout(DEFAULT_OUT_TIME, TimeUnit.SECONDS); + } + + @SuppressWarnings("unchecked") + public NetworkControl connectTimeout(long timeout, TimeUnit unit) { + builder.connectTimeout(timeout, unit); + return this; + } + + public NetworkControl addNetworkInterceptor(Interceptor interceptor) { + builder.addNetworkInterceptor(interceptor); + return this; + } + + public NetworkControl addInterceptor(Interceptor interceptor) { + builder.addInterceptor(interceptor); + return this; + } + + public OkHttpClient build() { + return builder.build(); + } + + private static class SingletonHolder { + private static final NetworkControl INSTANCE = new NetworkControl(); + } + + static synchronized NetworkControl get() { + return SingletonHolder.INSTANCE; + } +} diff --git a/support-coding-network/src/main/java/com/leftcoding/network/base/Server.java b/support-coding-network/src/main/java/com/leftcoding/network/base/Server.java new file mode 100644 index 00000000..96b12a4d --- /dev/null +++ b/support-coding-network/src/main/java/com/leftcoding/network/base/Server.java @@ -0,0 +1,16 @@ +package com.leftcoding.network.base; + +import android.content.Context; + +/** + * Create by LingYan on 2018-09-21 + */ + +public abstract class Server extends ServerDisposable { + + protected Server(Context context) { + super(context); + } + + public abstract void init(Context context); +} diff --git a/support-coding-network/src/main/java/com/leftcoding/network/base/ServerDisposable.java b/support-coding-network/src/main/java/com/leftcoding/network/base/ServerDisposable.java new file mode 100644 index 00000000..f9f01f10 --- /dev/null +++ b/support-coding-network/src/main/java/com/leftcoding/network/base/ServerDisposable.java @@ -0,0 +1,48 @@ +package com.leftcoding.network.base; + +import android.content.Context; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; + +/** + * Create by LingYan on 2018-09-21 + */ + +public class ServerDisposable { + private Map disposableMap = new ConcurrentHashMap<>(); + protected Context context; + + ServerDisposable(Context context) { + this.context = context; + } + + public void addExec(String tag, Disposable disposable) { + CompositeDisposable _disposable = disposableMap.get(tag); + if (_disposable == null) { + _disposable = new CompositeDisposable(); + disposableMap.put(tag, _disposable); + } + _disposable.add(disposable); + } + + public void remove(String tag) { + CompositeDisposable _disposable = disposableMap.get(tag); + if (_disposable != null && !_disposable.isDisposed()) { + _disposable.dispose(); + } + } + + public void clear() { + for (Map.Entry entry : disposableMap.entrySet()) { + CompositeDisposable compositeDisposable = entry.getValue(); + if (compositeDisposable != null && !compositeDisposable.isDisposed()) { + compositeDisposable.dispose(); + } + } + disposableMap.clear(); + } +} diff --git a/support-coding-network/src/main/java/com/leftcoding/network/base/ServerHelper.java b/support-coding-network/src/main/java/com/leftcoding/network/base/ServerHelper.java new file mode 100644 index 00000000..1cd7723a --- /dev/null +++ b/support-coding-network/src/main/java/com/leftcoding/network/base/ServerHelper.java @@ -0,0 +1,90 @@ +package com.leftcoding.network.base; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; +import retrofit2.CallAdapter; +import retrofit2.Converter; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +/** + * Create by LingYan on 2017-09-29 + */ +public class ServerHelper { + private String url; + + private NetworkControl networkControl; + + private Retrofit.Builder retrofitBuilder; + + private OkHttpClient okHttpClient; + + private final Gson gson = new GsonBuilder() + .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + .serializeNulls() + .create(); + + private ServerHelper() { + this(NetworkControl.get(), new Retrofit.Builder()); + } + + private ServerHelper(NetworkControl networkControl, Retrofit.Builder builder) { + this.networkControl = networkControl; + retrofitBuilder = builder; + } + + public ServerHelper addInterceptor(Interceptor interceptor) { + networkControl.addInterceptor(interceptor); + return this; + } + + public ServerHelper addNetworkInterceptor(Interceptor interceptor) { + networkControl.addNetworkInterceptor(interceptor); + return this; + } + + public ServerHelper addConverterFactory(Converter.Factory factory) { + retrofitBuilder.addConverterFactory(factory); + return this; + } + + public ServerHelper addCallAdapterFactory(CallAdapter.Factory factory) { + retrofitBuilder.addCallAdapterFactory(factory); + return this; + } + + public ServerHelper baseUrl(String url) { + this.url = url; + return this; + } + + public ServerHelper client(OkHttpClient client) { + okHttpClient = client; + return this; + } + + private OkHttpClient getClient() { + return okHttpClient != null ? okHttpClient : networkControl.build(); + } + + public Retrofit newRetrofit() { + return retrofitBuilder + .client(getClient()) + .addConverterFactory(GsonConverterFactory.create(gson)) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .baseUrl(url) + .build(); + } + + private static final class ServerHelperHolder { + private static final ServerHelper INSTANCE = new ServerHelper(); + } + + public static synchronized ServerHelper get() { + return ServerHelperHolder.INSTANCE; + } +} diff --git a/support-coding-network/src/main/res/values/strings.xml b/support-coding-network/src/main/res/values/strings.xml new file mode 100644 index 00000000..af91b420 --- /dev/null +++ b/support-coding-network/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + HttpLib + 网络请求出错 + diff --git a/support-coding-rxbus/.gitignore b/support-coding-rxbus/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/support-coding-rxbus/.gitignore @@ -0,0 +1 @@ +/build diff --git a/support-coding-rxbus/build.gradle b/support-coding-rxbus/build.gradle new file mode 100644 index 00000000..6284fe49 --- /dev/null +++ b/support-coding-rxbus/build.gradle @@ -0,0 +1,26 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion rootProject.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + versionCode rootProject.normalVersionCode + versionName rootProject.normalVersionName + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + api fileTree(dir: 'libs', include: ['*.jar']) + api "io.reactivex.rxjava2:rxjava:${rxjava}" + api "io.reactivex.rxjava2:rxandroid:${rxandroid}" +} diff --git a/support-coding-rxbus/proguard-rules.pro b/support-coding-rxbus/proguard-rules.pro new file mode 100644 index 00000000..f3e3ccae --- /dev/null +++ b/support-coding-rxbus/proguard-rules.pro @@ -0,0 +1,25 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in D:\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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/support-coding-rxbus/src/main/AndroidManifest.xml b/support-coding-rxbus/src/main/AndroidManifest.xml new file mode 100644 index 00000000..f7fa5bd0 --- /dev/null +++ b/support-coding-rxbus/src/main/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxActionManager.java b/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxActionManager.java new file mode 100644 index 00000000..f7950ea4 --- /dev/null +++ b/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxActionManager.java @@ -0,0 +1,15 @@ +package com.leftcoding.rxbus; + +import io.reactivex.disposables.Disposable; + +/** + * Create by LingYan on 2018-03-20 + */ + +public interface RxActionManager { + void add(String tag, Disposable disposable); + + void clear(String tag); + + void clearAll(); +} diff --git a/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxApiManager.java b/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxApiManager.java new file mode 100644 index 00000000..b178af45 --- /dev/null +++ b/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxApiManager.java @@ -0,0 +1,74 @@ +package com.leftcoding.rxbus; + +import android.util.ArrayMap; + +import java.util.Iterator; +import java.util.Map; + +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; + +/** + * Create by LingYan on 2018-03-20 + */ + +public class RxApiManager implements RxActionManager { + private static RxApiManager sInstance = null; + private final ArrayMap maps; + + public static RxApiManager get() { + if (sInstance == null) { + synchronized (RxApiManager.class) { + if (sInstance == null) { + sInstance = new RxApiManager(); + } + } + } + return sInstance; + } + + private RxApiManager() { + maps = new ArrayMap<>(); + } + + @Override + public void add(String tag, Disposable disposable) { + CompositeDisposable compositeDisposable = null; + if (isContainsKey(tag)) { + compositeDisposable = maps.get(tag); + } + if (compositeDisposable == null) { + compositeDisposable = new CompositeDisposable(); + maps.put(tag, compositeDisposable); + } + compositeDisposable.add(disposable); + } + + @Override + public void clear(String tag) { + if (isContainsKey(tag)) { + CompositeDisposable disposable = maps.remove(tag); + if (disposable != null && !disposable.isDisposed()) { + disposable.isDisposed(); + } + } + } + + private boolean isContainsKey(String key) { + return !isEmpty() && maps.containsKey(key); + } + + private boolean isEmpty() { + return maps.isEmpty(); + } + + @Override + public void clearAll() { + if (!isEmpty()) { + Iterator> it = maps.entrySet().iterator(); + while (it.hasNext()) { + it.remove(); + } + } + } +} diff --git a/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxBus.java b/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxBus.java new file mode 100644 index 00000000..c4a09596 --- /dev/null +++ b/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxBus.java @@ -0,0 +1,32 @@ +package com.leftcoding.rxbus; + +import io.reactivex.processors.FlowableProcessor; +import io.reactivex.processors.PublishProcessor; + +/** + * Create by LingYan on 2017-10-15 + */ + +public class RxBus { + private final FlowableProcessor mBus; + + private RxBus() { + mBus = PublishProcessor.create().toSerialized(); + } + + public synchronized void onNext(T t) { + mBus.onNext(t); + } + + public synchronized void toObservable(Class t) { + mBus.ofType(t); + } + + public static RxBus get() { + return RxBusHolder.INSTANCE; + } + + private static final class RxBusHolder { + private static final RxBus INSTANCE = new RxBus(); + } +} diff --git a/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxConsumer.java b/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxConsumer.java new file mode 100644 index 00000000..1737fa33 --- /dev/null +++ b/support-coding-rxbus/src/main/java/com/leftcoding/rxbus/RxConsumer.java @@ -0,0 +1,11 @@ +package com.leftcoding.rxbus; + +/** + * Create by LingYan on 2018-03-20 + */ + +public interface RxConsumer { + void next(T t) throws Exception; + + void onError(Throwable throwable); +} diff --git a/support-coding-rxbus/src/main/res/values/strings.xml b/support-coding-rxbus/src/main/res/values/strings.xml new file mode 100644 index 00000000..0b9f6c92 --- /dev/null +++ b/support-coding-rxbus/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + support-ly-rxbus + diff --git a/support-coding-ui/.gitignore b/support-coding-ui/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/support-coding-ui/.gitignore @@ -0,0 +1 @@ +/build diff --git a/support-coding-ui/build.gradle b/support-coding-ui/build.gradle new file mode 100644 index 00000000..c74086c6 --- /dev/null +++ b/support-coding-ui/build.gradle @@ -0,0 +1,26 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion rootProject.compileSdkVersion + + defaultConfig { + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + versionCode 1 + versionName "1.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "androidx.recyclerview:recyclerview:${supportVersion}" + implementation "androidx.appcompat:appcompat:${supportVersion}" +} diff --git a/support-coding-ui/proguard-rules.pro b/support-coding-ui/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/support-coding-ui/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/support-coding-ui/src/main/AndroidManifest.xml b/support-coding-ui/src/main/AndroidManifest.xml new file mode 100644 index 00000000..f0fc81c4 --- /dev/null +++ b/support-coding-ui/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BaseAdapter.java b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BaseAdapter.java new file mode 100644 index 00000000..2f29416a --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BaseAdapter.java @@ -0,0 +1,12 @@ +package android.lectcoding.ui.adapter; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * Create by LingYan on 2017-10-14 + */ + +public abstract class BaseAdapter extends RecyclerView.Adapter { + + public abstract void destroy(); +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BasicHolder.java b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BasicHolder.java new file mode 100644 index 00000000..e452b343 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BasicHolder.java @@ -0,0 +1,26 @@ +package android.lectcoding.ui.adapter; + +import androidx.annotation.LayoutRes; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Create by LingYan on 2017-11-27 + */ + +public abstract class BasicHolder extends RecyclerView.ViewHolder { + public BasicHolder(View view) { + super(view); + } + + @LayoutRes + public abstract int getLayoutRes(); + + public abstract void bindHolder(II item); + + protected View createView(ViewGroup parent) { + return LayoutInflater.from(parent.getContext()).inflate(getLayoutRes(), parent, false); + } +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BasicViewItem.java b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BasicViewItem.java new file mode 100644 index 00000000..29a0dc94 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/BasicViewItem.java @@ -0,0 +1,8 @@ +package android.lectcoding.ui.adapter; + +/** + * Create by LingYan on 2017-11-27 + */ + +public abstract class BasicViewItem implements ViewItem { +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/ObserverAdapter.java b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/ObserverAdapter.java new file mode 100644 index 00000000..53ee13f5 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/ObserverAdapter.java @@ -0,0 +1,28 @@ +package android.lectcoding.ui.adapter; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * Create by LingYan on 2018-03-23 + */ + +public abstract class ObserverAdapter extends BaseAdapter { + public ObserverAdapter() { + if (!isObserverNull()) { + registerAdapterDataObserver(getObserver()); + } + } + + @Override + public void destroy() { + if (!isObserverNull()) { + unregisterAdapterDataObserver(getObserver()); + } + } + + protected abstract RecyclerView.AdapterDataObserver getObserver(); + + private boolean isObserverNull() { + return getObserver() == null; + } +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/ViewItem.java b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/ViewItem.java new file mode 100644 index 00000000..e3d26545 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/adapter/ViewItem.java @@ -0,0 +1,12 @@ +package android.lectcoding.ui.adapter; + +import androidx.annotation.LayoutRes; + +/** + * Create by LingYan on 2017-11-27 + */ + +public interface ViewItem { + @LayoutRes + int getViewType(); +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseContract.java b/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseContract.java new file mode 100644 index 00000000..736fbb36 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseContract.java @@ -0,0 +1,15 @@ +package android.lectcoding.ui.base; + +/** + * Create by LingYan on 2017-09-30 + */ + +public interface BaseContract { + interface View { + + } + + abstract class Presenter { + + } +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseFragment.java b/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseFragment.java new file mode 100644 index 00000000..bc996704 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseFragment.java @@ -0,0 +1,68 @@ +package android.lectcoding.ui.base; + +import android.content.Context; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +/** + * Create by LingYan on 2016-04-05 + */ +public abstract class BaseFragment extends Fragment implements BaseView { + + @Override + public void onAttach(Context context) { + super.onAttach(context); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + } + + @Override + public void shortToast(String msg) { + Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show(); + } + + @Override + public void showProgress() { + + } + + @Override + public void hideProgress() { + + } + + @Override + public void showEmpty() { + + } + + @Override + public void showContent() { + + } +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseView.java b/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseView.java new file mode 100644 index 00000000..d9121446 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/base/BaseView.java @@ -0,0 +1,17 @@ +package android.lectcoding.ui.base; + +/** + * Create by LingYan on 2016-10-20 + */ + +public interface BaseView extends BaseContract.View { + public void shortToast(String msg); + + public void showProgress(); + + public void hideProgress(); + + public void showEmpty(); + + public void showContent(); +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/Logcat.java b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/Logcat.java new file mode 100644 index 00000000..0f7ebd4d --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/Logcat.java @@ -0,0 +1,327 @@ +package android.lectcoding.ui.logcat; + + +import android.lectcoding.ui.logcat.base.BaseLog; +import android.lectcoding.ui.logcat.base.FileLog; +import android.lectcoding.ui.logcat.base.JsonLog; +import android.lectcoding.ui.logcat.base.XmlLog; +import androidx.annotation.Nullable; +import android.text.TextUtils; + +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; + +/** + * This is a Log tool,with this you can the following + *
    + *
  1. use KLog.d(),you could print whether the method execute,and the default tag is current class's name
  2. + *
  3. use KLog.d(msg),you could print log as before,and you could location the method with a click in Android Studio Logcat
  4. + *
  5. use KLog.json(),you could print json string with well format automatic
  6. + *
+ * + * @author zhaokaiqiang + * github https://github.com/ZhaoKaiQiang/KLog + * 15/11/17 扩展功能,添加对文件的支持 + * 15/11/18 扩展功能,增加对XML的支持,修复BUG + * 15/12/8 扩展功能,添加对任意参数的支持 + * 15/12/11 扩展功能,增加对无限长字符串支持 + * 16/6/13 扩展功能,添加对自定义全局Tag的支持,修复内部类不能点击跳转的BUG + * 16/6/15 扩展功能,添加不能关闭的KLog.debug(),用于发布版本的Log打印,优化部分代码 + * 16/6/20 扩展功能,添加堆栈跟踪功能KLog.trace() + */ +public final class Logcat { + + public static final String LINE_SEPARATOR = System.getProperty("line.separator"); + public static final String NULL_TIPS = "Log with null object"; + + private static final String DEFAULT_MESSAGE = "execute"; + private static final String PARAM = "Param"; + private static final String NULL = "null"; + private static final String TAG_DEFAULT = "KLog"; + private static final String SUFFIX = ".java"; + + public static final int JSON_INDENT = 4; + + public static final int V = 0x1; + public static final int D = 0x2; + public static final int I = 0x3; + public static final int W = 0x4; + public static final int E = 0x5; + public static final int A = 0x6; + + private static final int JSON = 0x7; + private static final int XML = 0x8; + + private static final int STACK_TRACE_INDEX_5 = 5; + private static final int STACK_TRACE_INDEX_4 = 4; + + private static String mGlobalTag; + private static boolean mIsGlobalTagEmpty = true; + private static boolean IS_SHOW_LOG = true; + + public static void init(boolean isShowLog) { + IS_SHOW_LOG = isShowLog; + } + + public static void init(boolean isShowLog, @Nullable String tag) { + IS_SHOW_LOG = isShowLog; + mGlobalTag = tag; + mIsGlobalTagEmpty = TextUtils.isEmpty(mGlobalTag); + } + + public static void v() { + printLog(V, null, DEFAULT_MESSAGE); + } + + public static void v(Object msg) { + printLog(V, null, msg); + } + + public static void v(String tag, Object... objects) { + printLog(V, tag, objects); + } + + public static void d() { + printLog(D, null, DEFAULT_MESSAGE); + } + + public static void d(Object msg) { + printLog(D, null, msg); + } + + public static void d(String tag, Object... objects) { + printLog(D, tag, objects); + } + + public static void i() { + printLog(I, null, DEFAULT_MESSAGE); + } + + public static void i(Object msg) { + printLog(I, null, msg); + } + + public static void i(String tag, Object... objects) { + printLog(I, tag, objects); + } + + public static void w() { + printLog(W, null, DEFAULT_MESSAGE); + } + + public static void w(Object msg) { + printLog(W, null, msg); + } + + public static void w(String tag, Object... objects) { + printLog(W, tag, objects); + } + + public static void e() { + printLog(E, null, DEFAULT_MESSAGE); + } + + public static void e(Object msg) { + printLog(E, null, msg); + } + + public static void e(String tag, Object... objects) { + printLog(E, tag, objects); + } + + public static void a() { + printLog(A, null, DEFAULT_MESSAGE); + } + + public static void a(Object msg) { + printLog(A, null, msg); + } + + public static void a(String tag, Object... objects) { + printLog(A, tag, objects); + } + + public static void json(String jsonFormat) { + printLog(JSON, null, jsonFormat); + } + + public static void json(String tag, String jsonFormat) { + printLog(JSON, tag, jsonFormat); + } + + public static void xml(String xml) { + printLog(XML, null, xml); + } + + public static void xml(String tag, String xml) { + printLog(XML, tag, xml); + } + + public static void file(File targetDirectory, Object msg) { + printFile(null, targetDirectory, null, msg); + } + + public static void file(String tag, File targetDirectory, Object msg) { + printFile(tag, targetDirectory, null, msg); + } + + public static void file(String tag, File targetDirectory, String fileName, Object msg) { + printFile(tag, targetDirectory, fileName, msg); + } + + public static void debug() { + printDebug(null, DEFAULT_MESSAGE); + } + + public static void debug(Object msg) { + printDebug(null, msg); + } + + public static void debug(String tag, Object... objects) { + printDebug(tag, objects); + } + + public static void trace() { + printStackTrace(); + } + + private static void printStackTrace() { + + if (!IS_SHOW_LOG) { + return; + } + + Throwable tr = new Throwable(); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + tr.printStackTrace(pw); + pw.flush(); + String message = sw.toString(); + + String traceString[] = message.split("\\n\\t"); + StringBuilder sb = new StringBuilder(); + sb.append("\n"); + for (String trace : traceString) { + if (trace.contains("at com.socks.library.KLog")) { + continue; + } + sb.append(trace).append("\n"); + } + String[] contents = wrapperContent(STACK_TRACE_INDEX_4, null, sb.toString()); + String tag = contents[0]; + String msg = contents[1]; + String headString = contents[2]; + BaseLog.printDefault(D, tag, headString + msg); + } + + private static void printLog(int type, String tagStr, Object... objects) { + + if (!IS_SHOW_LOG) { + return; + } + + String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objects); + String tag = contents[0]; + String msg = contents[1]; + String headString = contents[2]; + + switch (type) { + case V: + case D: + case I: + case W: + case E: + case A: + BaseLog.printDefault(type, tag, headString + msg); + break; + case JSON: + JsonLog.printJson(tag, msg, headString); + break; + case XML: + XmlLog.printXml(tag, msg, headString); + break; + } + + } + + private static void printDebug(String tagStr, Object... objects) { + String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objects); + String tag = contents[0]; + String msg = contents[1]; + String headString = contents[2]; + BaseLog.printDefault(D, tag, headString + msg); + } + + + private static void printFile(String tagStr, File targetDirectory, String fileName, Object objectMsg) { + + if (!IS_SHOW_LOG) { + return; + } + + String[] contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objectMsg); + String tag = contents[0]; + String msg = contents[1]; + String headString = contents[2]; + + FileLog.printFile(tag, targetDirectory, fileName, headString, msg); + } + + private static String[] wrapperContent(int stackTraceIndex, String tagStr, Object... objects) { + + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + + StackTraceElement targetElement = stackTrace[stackTraceIndex]; + String className = targetElement.getClassName(); + String[] classNameInfo = className.split("\\."); + if (classNameInfo.length > 0) { + className = classNameInfo[classNameInfo.length - 1] + SUFFIX; + } + + if (className.contains("$")) { + className = className.split("\\$")[0] + SUFFIX; + } + + String methodName = targetElement.getMethodName(); + int lineNumber = targetElement.getLineNumber(); + + if (lineNumber < 0) { + lineNumber = 0; + } + + String tag = (tagStr == null ? className : tagStr); + + if (mIsGlobalTagEmpty && TextUtils.isEmpty(tag)) { + tag = TAG_DEFAULT; + } else if (!mIsGlobalTagEmpty) { + tag = mGlobalTag; + } + + String msg = (objects == null) ? NULL_TIPS : getObjectsString(objects); + String headString = "[ (" + className + ":" + lineNumber + ")#" + methodName + " ] "; + + return new String[]{tag, msg, headString}; + } + + private static String getObjectsString(Object... objects) { + + if (objects.length > 1) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("\n"); + for (int i = 0; i < objects.length; i++) { + Object object = objects[i]; + if (object == null) { + stringBuilder.append(PARAM).append("[").append(i).append("]").append(" = ").append(NULL).append("\n"); + } else { + stringBuilder.append(PARAM).append("[").append(i).append("]").append(" = ").append(object.toString()).append("\n"); + } + } + return stringBuilder.toString(); + } else { + Object object = objects[0]; + return object == null ? NULL : object.toString(); + } + } + +} \ No newline at end of file diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/LogcatUtil.java b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/LogcatUtil.java new file mode 100644 index 00000000..d042beee --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/LogcatUtil.java @@ -0,0 +1,23 @@ +package android.lectcoding.ui.logcat; + +import android.text.TextUtils; +import android.util.Log; + +/** + * Created by zhaokaiqiang on 15/12/11. + */ +public class LogcatUtil { + + public static boolean isEmpty(String line) { + return TextUtils.isEmpty(line) || line.equals("\n") || line.equals("\t") || TextUtils.isEmpty(line.trim()); + } + + public static void printLine(String tag, boolean isTop) { + if (isTop) { + Log.d(tag, "╔═══════════════════════════════════════════════════════════════════════════════════════"); + } else { + Log.d(tag, "╚═══════════════════════════════════════════════════════════════════════════════════════"); + } + } + +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/BaseLog.java b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/BaseLog.java new file mode 100644 index 00000000..f901ab9b --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/BaseLog.java @@ -0,0 +1,51 @@ +package android.lectcoding.ui.logcat.base; + +import android.lectcoding.ui.logcat.Logcat; +import android.util.Log; + +public class BaseLog { + + private static final int MAX_LENGTH = 4000; + + public static void printDefault(int type, String tag, String msg) { + + int index = 0; + int length = msg.length(); + int countOfSub = length / MAX_LENGTH; + + if (countOfSub > 0) { + for (int i = 0; i < countOfSub; i++) { + String sub = msg.substring(index, index + MAX_LENGTH); + printSub(type, tag, sub); + index += MAX_LENGTH; + } + printSub(type, tag, msg.substring(index, length)); + } else { + printSub(type, tag, msg); + } + } + + private static void printSub(int type, String tag, String sub) { + switch (type) { + case Logcat.V: + Log.v(tag, sub); + break; + case Logcat.D: + Log.d(tag, sub); + break; + case Logcat.I: + Log.i(tag, sub); + break; + case Logcat.W: + Log.w(tag, sub); + break; + case Logcat.E: + Log.e(tag, sub); + break; + case Logcat.A: + Log.wtf(tag, sub); + break; + } + } + +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/FileLog.java b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/FileLog.java new file mode 100644 index 00000000..f6d840e5 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/FileLog.java @@ -0,0 +1,51 @@ +package android.lectcoding.ui.logcat.base; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.util.Random; + +public class FileLog { + + private static final String FILE_PREFIX = "KLog_"; + private static final String FILE_FORMAT = ".log"; + + public static void printFile(String tag, File targetDirectory, @Nullable String fileName, String headString, String msg) { + + fileName = (fileName == null) ? getFileName() : fileName; + if (save(targetDirectory, fileName, msg)) { + Log.d(tag, headString + " save log success ! location is >>>" + targetDirectory.getAbsolutePath() + "/" + fileName); + } else { + Log.e(tag, headString + "save log fails !"); + } + } + + private static boolean save(File dic, @NonNull String fileName, String msg) { + + File file = new File(dic, fileName); + + try { + OutputStream outputStream = new FileOutputStream(file); + OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8"); + outputStreamWriter.write(msg); + outputStreamWriter.flush(); + outputStream.close(); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + private static String getFileName() { + Random random = new Random(); + return FILE_PREFIX + Long.toString(System.currentTimeMillis() + random.nextInt(10000)).substring(4) + FILE_FORMAT; + } + +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/JsonLog.java b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/JsonLog.java new file mode 100644 index 00000000..93a908d6 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/JsonLog.java @@ -0,0 +1,37 @@ +package android.lectcoding.ui.logcat.base; + +import android.lectcoding.ui.logcat.Logcat; +import android.lectcoding.ui.logcat.LogcatUtil; +import android.util.Log; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class JsonLog { + + public static void printJson(String tag, String msg, String headString) { + String message; + try { + if (msg.startsWith("{")) { + JSONObject jsonObject = new JSONObject(msg); + message = jsonObject.toString(Logcat.JSON_INDENT); + } else if (msg.startsWith("[")) { + JSONArray jsonArray = new JSONArray(msg); + message = jsonArray.toString(Logcat.JSON_INDENT); + } else { + message = msg; + } + } catch (JSONException e) { + message = msg; + } + + LogcatUtil.printLine(tag, true); + message = headString + Logcat.LINE_SEPARATOR + message; + String[] lines = message.split(Logcat.LINE_SEPARATOR); + for (String line : lines) { + Log.d(tag, "║ " + line); + } + LogcatUtil.printLine(tag, false); + } +} diff --git a/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/XmlLog.java b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/XmlLog.java new file mode 100644 index 00000000..334ce167 --- /dev/null +++ b/support-coding-ui/src/main/java/android/lectcoding/ui/logcat/base/XmlLog.java @@ -0,0 +1,56 @@ +package android.lectcoding.ui.logcat.base; + +import android.lectcoding.ui.logcat.Logcat; +import android.lectcoding.ui.logcat.LogcatUtil; +import android.util.Log; + +import java.io.StringReader; +import java.io.StringWriter; + +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +/** + * Created by zhaokaiqiang on 15/11/18. + */ +public class XmlLog { + + public static void printXml(String tag, String xml, String headString) { + + if (xml != null) { + xml = XmlLog.formatXML(xml); + xml = headString + "\n" + xml; + } else { + xml = headString + Logcat.NULL_TIPS; + } + + LogcatUtil.printLine(tag, true); + String[] lines = xml.split(Logcat.LINE_SEPARATOR); + for (String line : lines) { + if (!LogcatUtil.isEmpty(line)) { + Log.d(tag, "║ " + line); + } + } + LogcatUtil.printLine(tag, false); + } + + private static String formatXML(String inputXML) { + try { + Source xmlInput = new StreamSource(new StringReader(inputXML)); + StreamResult xmlOutput = new StreamResult(new StringWriter()); + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + transformer.transform(xmlInput, xmlOutput); + return xmlOutput.getWriter().toString().replaceFirst(">", ">\n"); + } catch (Exception e) { + e.printStackTrace(); + return inputXML; + } + } + +} diff --git a/support-coding-ui/src/main/res/values/strings.xml b/support-coding-ui/src/main/res/values/strings.xml new file mode 100644 index 00000000..a1abc7f5 --- /dev/null +++ b/support-coding-ui/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + support-ly-ui + diff --git a/test.txt b/test.txt deleted file mode 100644 index e69de29b..00000000