From 9cb104fcfa858dc91dd0fddfa1b16fbcac46589d Mon Sep 17 00:00:00 2001 From: k0shk0sh Date: Wed, 25 Dec 2019 08:50:01 +0100 Subject: [PATCH] fix trending --- .travis.yml | 46 -------- app/build.gradle | 3 +- .../data/dao/FirebaseTrendingConfigModel.kt | 36 ++++++ .../fastaccess/data/service/ScrapService.kt | 3 +- .../provider/colors/ColorsProvider.java | 5 +- .../converters/GithubResponseConverter.java | 2 +- .../interceptors/AuthenticationInterceptor.kt | 4 +- .../provider/rest/jsoup/JsoupProvider.java | 13 ++- .../ui/base/mvp/presenter/BasePresenter.java | 16 ++- .../ui/modules/trending/TrendingActivity.kt | 35 +++--- .../ui/modules/trending/TrendingPresenter.kt | 1 - .../trending/fragment/TrendingFragment.kt | 7 +- .../trending/fragment/TrendingFragmentMvp.kt | 2 +- .../fragment/TrendingFragmentPresenter.kt | 109 ++++++++++++------ .../fastaccess/ui/widgets/AvatarLayout.java | 2 +- .../layout/trending_activity_layout.xml | 36 +++--- .../other_layouts/layout/avatar_layout.xml | 5 +- 17 files changed, 177 insertions(+), 148 deletions(-) delete mode 100644 .travis.yml create mode 100644 app/src/main/java/com/fastaccess/data/dao/FirebaseTrendingConfigModel.kt diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7b5efd7a..00000000 --- a/.travis.yml +++ /dev/null @@ -1,46 +0,0 @@ -language: android - -android: - components: - - tools - - platform-tools - - tools # Upgrade again after upgrading platform-tools. - -jdk: oraclejdk8 - -sudo: required - -before_install: - # Skip build if the commit message contains [skip travis] or [travis skip] - - > - echo "$TRAVIS_COMMIT_MESSAGE" - | grep -E '\[(skip travis|travis skip)\]' - && echo "[skip travis] has been found, exiting." - && exit 0 || true - -before_script: - - mkdir -p $ANDROID_HOME/licenses - - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > $ANDROID_HOME/licenses/android-sdk-license - - echo -e "d56f5187479451eabf01fb78af6dfcb131a6481e" >> $ANDROID_HOME/licenses/android-sdk-license - - echo -e "\n504667f4c0de7af1a06de9f4b1727b84351f2910" > $ANDROID_HOME/licenses/android-sdk-preview-license - -script: - - ./gradlew clean assembleDebug --no-daemon --stacktrace - -before_cache: - - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ - -cache: - directories: - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ - - $HOME/.android/build-cache - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - email: false - webhooks: https://www.travisbuddy.com/ - on_success: never diff --git a/app/build.gradle b/app/build.gradle index 7d66e313..a86ec646 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -130,8 +130,9 @@ dependencies { implementation "com.squareup.retrofit2:retrofit:${retrofit}" implementation "com.squareup.retrofit2:converter-gson:${retrofit}" implementation "com.squareup.retrofit2:adapter-rxjava2:${retrofit}" + implementation "com.squareup.retrofit2:converter-scalars:${retrofit}" implementation "com.github.bumptech.glide:glide:${glideVersion}" - implementation 'cn.gavinliu.android.lib:ShapedImageView:0.8.3' + implementation 'cn.gavinliu:ShapedImageView:0.8.7' implementation "com.jakewharton:butterknife:${butterKnifeVersion}" implementation 'it.sephiroth.android.library.bottomnavigation:bottom-navigation:2.0.2' implementation 'io.reactivex.rxjava2:rxjava:2.1.10' diff --git a/app/src/main/java/com/fastaccess/data/dao/FirebaseTrendingConfigModel.kt b/app/src/main/java/com/fastaccess/data/dao/FirebaseTrendingConfigModel.kt new file mode 100644 index 00000000..9859cd68 --- /dev/null +++ b/app/src/main/java/com/fastaccess/data/dao/FirebaseTrendingConfigModel.kt @@ -0,0 +1,36 @@ +package com.fastaccess.data.dao + +data class FirebaseTrendingConfigModel( + var pathUrl: String = "https://github.com/trending/", + var description: String = ".Box-row > p", + var forks: String = ".f6 > a[href*=/network]", + var language: String = ".f6 span[itemprop=programmingLanguage]", + var languageFallback: String = ".f6 span[itemprop=programmingLanguage]", + var listName: String = ".Box", + var listNameSublistTag: String = "article", + var stars: String = ".f6 > a[href*=/stargazers]", + var title: String = ".Box-row > h1 > a", + var todayStars: String = ".f6 > span.float-sm-right", + var todayStarsFallback: String = ".f6 > span.float-sm-right" +) { + + companion object { + fun map(map: HashMap?): FirebaseTrendingConfigModel { + val trendingModel = FirebaseTrendingConfigModel() + map?.let { + trendingModel.description = it.getOrElse("description") { trendingModel.description } + trendingModel.forks = it.getOrElse("forks") { trendingModel.forks } + trendingModel.language = it.getOrElse("language") { trendingModel.language } + trendingModel.languageFallback = it.getOrElse("language_fallback") { trendingModel.languageFallback } + trendingModel.listName = it.getOrElse("list_name") { trendingModel.listName } + trendingModel.listNameSublistTag = it.getOrElse("list_name_sublist_tag") { trendingModel.listNameSublistTag } + trendingModel.stars = it.getOrElse("stars") { trendingModel.stars } + trendingModel.title = it.getOrElse("title") { trendingModel.title } + trendingModel.todayStars = it.getOrElse("today_stars") { trendingModel.title } + trendingModel.todayStarsFallback = it.getOrElse("today_stars_fallback") { trendingModel.title } + trendingModel.pathUrl = it.getOrElse("path_url") { trendingModel.pathUrl } + } + return trendingModel + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/data/service/ScrapService.kt b/app/src/main/java/com/fastaccess/data/service/ScrapService.kt index de9d15f2..c75711ce 100644 --- a/app/src/main/java/com/fastaccess/data/service/ScrapService.kt +++ b/app/src/main/java/com/fastaccess/data/service/ScrapService.kt @@ -2,6 +2,7 @@ package com.fastaccess.data.service import io.reactivex.Observable +import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Path import retrofit2.http.Query @@ -12,7 +13,7 @@ import retrofit2.http.Query interface ScrapService { - @GET("{lan}") fun getTrending(@Path("lan") lan: String?, @Query("since") since: String?): Observable + @GET("{lan}") fun getTrending(@Path("lan") lan: String?, @Query("since") since: String?): Observable> @GET("{path}") fun getWiki(@Path(value = "path", encoded = true) path: String?): Observable } diff --git a/app/src/main/java/com/fastaccess/provider/colors/ColorsProvider.java b/app/src/main/java/com/fastaccess/provider/colors/ColorsProvider.java index f21b1672..fc760f27 100644 --- a/app/src/main/java/com/fastaccess/provider/colors/ColorsProvider.java +++ b/app/src/main/java/com/fastaccess/provider/colors/ColorsProvider.java @@ -1,5 +1,6 @@ package com.fastaccess.provider.colors; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Color; import android.support.annotation.ColorInt; @@ -39,7 +40,7 @@ public class ColorsProvider { private static Map colors = new LinkedHashMap<>(); - public static void load() { + @SuppressLint("CheckResult") public static void load() { if (colors.isEmpty()) { RxHelper.safeObservable(Observable .create(observableEmitter -> { @@ -68,7 +69,7 @@ public class ColorsProvider { .filter(value -> value != null && !InputHelper.isEmpty(value.getKey())) .map(Map.Entry::getKey) .collect(Collectors.toCollection(ArrayList::new))); - lang.add(0, "All Languages"); + lang.add(0, "All"); lang.addAll(1, POPULAR_LANG); return lang; } diff --git a/app/src/main/java/com/fastaccess/provider/rest/converters/GithubResponseConverter.java b/app/src/main/java/com/fastaccess/provider/rest/converters/GithubResponseConverter.java index 630f6e77..d8bca871 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/converters/GithubResponseConverter.java +++ b/app/src/main/java/com/fastaccess/provider/rest/converters/GithubResponseConverter.java @@ -39,7 +39,7 @@ public class GithubResponseConverter extends Converter.Factory { return GsonConverterFactory.create(gson).requestBodyConverter(type, parameterAnnotations, methodAnnotations, retrofit); } - private static class StringResponseConverter implements Converter { + public static class StringResponseConverter implements Converter { @Override public String convert(@NonNull ResponseBody value) throws IOException { return value.string(); } diff --git a/app/src/main/java/com/fastaccess/provider/rest/interceptors/AuthenticationInterceptor.kt b/app/src/main/java/com/fastaccess/provider/rest/interceptors/AuthenticationInterceptor.kt index 5e381a54..be5eae49 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/interceptors/AuthenticationInterceptor.kt +++ b/app/src/main/java/com/fastaccess/provider/rest/interceptors/AuthenticationInterceptor.kt @@ -28,10 +28,10 @@ class AuthenticationInterceptor : Interceptor { val authToken = if (token.isNullOrBlank()) if (isEnterprise) PrefGetter.getEnterpriseToken() else PrefGetter.getToken() else token val otpCode = if (otp.isNullOrBlank()) if (isEnterprise) PrefGetter.getEnterpriseOtpCode() else PrefGetter.getOtpCode() else otp if (!authToken.isNullOrBlank()) { - builder.header("Authorization", if (authToken!!.startsWith("Basic")) authToken else "token " + authToken) + builder.header("Authorization", if (authToken.startsWith("Basic")) authToken else "token $authToken") } if (!otpCode.isNullOrBlank()) { - builder.addHeader("X-GitHub-OTP", otpCode!!.trim()) + builder.addHeader("X-GitHub-OTP", otpCode.trim()) } if (!isScrapping) builder.addHeader("User-Agent", "FastHub") val request = builder.build() diff --git a/app/src/main/java/com/fastaccess/provider/rest/jsoup/JsoupProvider.java b/app/src/main/java/com/fastaccess/provider/rest/jsoup/JsoupProvider.java index c95d4be4..479a9c25 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/jsoup/JsoupProvider.java +++ b/app/src/main/java/com/fastaccess/provider/rest/jsoup/JsoupProvider.java @@ -1,15 +1,16 @@ package com.fastaccess.provider.rest.jsoup; +import android.support.annotation.NonNull; + import com.fastaccess.BuildConfig; import com.fastaccess.data.service.ScrapService; -import com.fastaccess.provider.rest.converters.GithubResponseConverter; import com.fastaccess.provider.rest.interceptors.AuthenticationInterceptor; -import com.google.gson.Gson; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.scalars.ScalarsConverterFactory; /** * Created by Kosh on 02 Jun 2017, 12:47 PM @@ -32,11 +33,11 @@ public class JsoupProvider { return okHttpClient; } - public static ScrapService getTrendingService() { + public static ScrapService getTrendingService(@NonNull String url) { return new Retrofit.Builder() - .baseUrl("https://github.com/trending/") + .baseUrl(url) .client(provideOkHttpClient()) - .addConverterFactory(new GithubResponseConverter(new Gson())) + .addConverterFactory(ScalarsConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build() .create(ScrapService.class); @@ -46,7 +47,7 @@ public class JsoupProvider { return new Retrofit.Builder() .baseUrl("https://github.com/") .client(provideOkHttpClient()) - .addConverterFactory(new GithubResponseConverter(new Gson())) + .addConverterFactory(ScalarsConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build() .create(ScrapService.class); diff --git a/app/src/main/java/com/fastaccess/ui/base/mvp/presenter/BasePresenter.java b/app/src/main/java/com/fastaccess/ui/base/mvp/presenter/BasePresenter.java index d3c7da5d..bc209f93 100644 --- a/app/src/main/java/com/fastaccess/ui/base/mvp/presenter/BasePresenter.java +++ b/app/src/main/java/com/fastaccess/ui/base/mvp/presenter/BasePresenter.java @@ -108,9 +108,7 @@ public class BasePresenter extends TiPresenter impl @StringRes private int getPrettifiedErrorMessage(@Nullable Throwable throwable) { int resId = R.string.network_error; - if (throwable instanceof HttpException) { - resId = R.string.network_error; - } else if (throwable instanceof IOException) { + if (throwable instanceof IOException) { resId = R.string.request_error; } else if (throwable instanceof TimeoutException) { resId = R.string.unexpected_error; @@ -119,12 +117,12 @@ public class BasePresenter extends TiPresenter impl } public void onCheckGitHubStatus() { - manageObservable(RestProvider.gitHubStatus() - .doOnNext(gitHubStatusModel -> { - if (!"good".equalsIgnoreCase(gitHubStatusModel.getStatus())) { - sendToView(v -> v.showErrorMessage("Github Status:\n" + gitHubStatusModel.getBody())); - } - })); +// manageObservable(RestProvider.gitHubStatus() +// .doOnNext(gitHubStatusModel -> { +// if (!"good".equalsIgnoreCase(gitHubStatusModel.getStatus())) { +// sendToView(v -> v.showErrorMessage("Github Status:\n" + gitHubStatusModel.getBody())); +// } +// })); } public boolean isEnterprise() { diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt index 2f924b41..8092d423 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingActivity.kt @@ -26,6 +26,7 @@ import com.fastaccess.ui.base.BaseActivity import com.fastaccess.ui.modules.main.MainActivity import com.fastaccess.ui.modules.trending.fragment.TrendingFragment import com.fastaccess.ui.widgets.FontEditText +import java.util.* /** @@ -44,7 +45,7 @@ class TrendingActivity : BaseActivity(), Tr @BindView(R.id.searchEditText) lateinit var searchEditText: FontEditText - @State var selectedTitle: String = "All Language" + @State var selectedTitle: String = "All" @OnTextChanged(value = [R.id.searchEditText], callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED) fun onTextChange(s: Editable) { val text = s.toString() @@ -103,11 +104,11 @@ class TrendingActivity : BaseActivity(), Tr override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) navMenu.itemIconTintList = null - trendingFragment = supportFragmentManager.findFragmentById(R.id.trendingFragment) as TrendingFragment? - navMenu.setNavigationItemSelectedListener({ item -> + trendingFragment = supportFragmentManager.findFragmentById(R.id.trendingFragment) as? TrendingFragment + navMenu.setNavigationItemSelectedListener { item -> closeDrawerLayout() onItemClicked(item) - }) + } setupIntent(savedInstanceState) if (savedInstanceState == null) { presenter.onLoadLanguage() @@ -136,8 +137,10 @@ class TrendingActivity : BaseActivity(), Tr true } R.id.share -> { - ActivityHelper.shareUrl(this, "${LinkParserHelper.PROTOCOL_HTTPS}://${LinkParserHelper.HOST_DEFAULT}" + - "/trending/$selectedTitle") + ActivityHelper.shareUrl( + this, "${LinkParserHelper.PROTOCOL_HTTPS}://${LinkParserHelper.HOST_DEFAULT}" + + "/trending/$selectedTitle" + ) return true } android.R.id.home -> { @@ -151,9 +154,9 @@ class TrendingActivity : BaseActivity(), Tr override fun onAppend(title: String, color: Int) { navMenu.menu.add(R.id.languageGroup, title.hashCode(), Menu.NONE, title) - .setCheckable(true) - .setIcon(createOvalShape(color)) - .isChecked = title.toLowerCase() == selectedTitle.toLowerCase() + .setCheckable(true) + .setIcon(createOvalShape(color)) + .isChecked = title.toLowerCase() == selectedTitle.toLowerCase() } override fun onClearMenu() { @@ -162,7 +165,7 @@ class TrendingActivity : BaseActivity(), Tr private fun onItemClicked(item: MenuItem?): Boolean { selectedTitle = when (item?.title.toString()) { - "All Language" -> "" + "All" -> "" else -> item?.title.toString() } Logger.e(selectedTitle) @@ -194,15 +197,15 @@ class TrendingActivity : BaseActivity(), Tr if (intent != null && intent.extras != null) { val bundle = intent.extras if (bundle != null) { - val lang: String = bundle.getString(BundleConstant.EXTRA) + val lang: String = bundle.getString(BundleConstant.EXTRA) ?: "All" val query: String? = bundle.getString(BundleConstant.EXTRA_TWO) - if (!lang.isEmpty()) { + if (lang.isNotEmpty()) { selectedTitle = lang } if (query.isNullOrEmpty()) { daily.isSelected = true } else { - when (query?.toLowerCase()) { + when (query.toLowerCase(Locale.getDefault())) { "daily" -> daily.isSelected = true "weekly" -> weekly.isSelected = true "monthly" -> monthly.isSelected = true @@ -229,10 +232,12 @@ class TrendingActivity : BaseActivity(), Tr companion object { fun getTrendingIntent(context: Context, lang: String?, query: String?): Intent { val intent = Intent(context, TrendingActivity::class.java) - intent.putExtras(Bundler.start() + intent.putExtras( + Bundler.start() .put(BundleConstant.EXTRA, lang) .put(BundleConstant.EXTRA_TWO, query) - .end()) + .end() + ) return intent } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingPresenter.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingPresenter.kt index f6d44553..438a3d28 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingPresenter.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingPresenter.kt @@ -25,7 +25,6 @@ class TrendingPresenter : BasePresenter(), TrendingMvp.Present val lanColor = Color.parseColor(color.color) sendToView { it.onAppend(t, lanColor) } } catch (e: Exception) { - e.printStackTrace() sendToView { it.onAppend(t, Color.LTGRAY) } } } else { diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragment.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragment.kt index ad4d0d77..40366027 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragment.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragment.kt @@ -7,11 +7,13 @@ import butterknife.BindView import com.evernote.android.state.State import com.fastaccess.R import com.fastaccess.data.dao.TrendingModel +import com.fastaccess.helper.Logger import com.fastaccess.ui.adapter.TrendingAdapter import com.fastaccess.ui.base.BaseFragment import com.fastaccess.ui.widgets.StateLayout import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView import com.fastaccess.ui.widgets.recyclerview.scroll.RecyclerViewFastScroller +import kotlin.math.sin /** * Created by Kosh on 30 May 2017, 11:37 PM @@ -43,13 +45,14 @@ class TrendingFragment : BaseFragment) { + adapter.insertItems(items) } override fun onSetQuery(lang: String, since: String) { this.lang = lang this.since = since + Logger.e(lang, since) adapter.clear() presenter.onCallApi(lang, since) } diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragmentMvp.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragmentMvp.kt index 68a66dcc..c3957d2f 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragmentMvp.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragmentMvp.kt @@ -11,7 +11,7 @@ import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder interface TrendingFragmentMvp { interface View : BaseMvp.FAView { - fun onNotifyAdapter(items: TrendingModel) + fun onNotifyAdapter(items: List) fun onSetQuery(lang: String, since: String) fun clearAdapter() } diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragmentPresenter.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragmentPresenter.kt index f30468ae..b0e171a0 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragmentPresenter.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/fragment/TrendingFragmentPresenter.kt @@ -1,17 +1,20 @@ package com.fastaccess.ui.modules.trending.fragment import android.view.View +import com.fastaccess.data.dao.FirebaseTrendingConfigModel import com.fastaccess.data.dao.TrendingModel -import com.fastaccess.helper.InputHelper +import com.fastaccess.helper.Logger import com.fastaccess.helper.RxHelper import com.fastaccess.provider.rest.jsoup.JsoupProvider import com.fastaccess.ui.base.mvp.presenter.BasePresenter import com.fastaccess.ui.modules.repos.RepoPagerActivity +import com.github.b3er.rxfirebase.database.RxFirebaseDatabase +import com.google.firebase.database.FirebaseDatabase import io.reactivex.Observable import io.reactivex.disposables.Disposable import org.jsoup.Jsoup -import org.jsoup.nodes.Document -import org.jsoup.select.Elements +import java.util.* +import kotlin.collections.ArrayList /** * Created by Kosh on 30 May 2017, 11:04 PM @@ -22,6 +25,7 @@ class TrendingFragmentPresenter : BasePresenter(), Tre private var disposel: Disposable? = null private val trendingList: ArrayList = ArrayList() + private var firebaseTrendingConfigModel: FirebaseTrendingConfigModel? = null override fun getTendingList(): ArrayList { return trendingList @@ -30,53 +34,82 @@ class TrendingFragmentPresenter : BasePresenter(), Tre override fun onItemLongClick(position: Int, v: View?, item: TrendingModel?) {} override fun onItemClick(position: Int, v: View?, item: TrendingModel?) { - val split = item?.title?.trim()?.split("/")!! - v?.context!!.startActivity(RepoPagerActivity.createIntent(v.context!!, split[1].trim(), split[0].trim())) + val split = item?.title?.trim()?.split("/") ?: return + v?.context?.let { it.startActivity(RepoPagerActivity.createIntent(it, split[1].trim(), split[0].trim())) } } override fun onCallApi(lang: String, since: String) { disposel?.let { if (!it.isDisposed) it.dispose() } - disposel = RxHelper.getObservable(JsoupProvider.getTrendingService().getTrending( - (if (!InputHelper.isEmpty(lang)) lang.replace(" ".toRegex(), "-") else "").toLowerCase(), since)) - .flatMap { s -> RxHelper.getObservable(getTrendingObservable(s)) } - .doOnSubscribe { - sendToView { - it.showProgress(0) - it.clearAdapter() + val config = firebaseTrendingConfigModel + + if (com.fastaccess.BuildConfig.DEBUG) { + callApi(lang, since) + } else { + if (config == null) { + manageDisposable(RxHelper.getSingle( + RxFirebaseDatabase.data(FirebaseDatabase.getInstance().reference.child("github_trending")) + ) + .map { + firebaseTrendingConfigModel = FirebaseTrendingConfigModel + .map(it.value as? HashMap) + return@map firebaseTrendingConfigModel } + .subscribe( + { callApi(lang, since) }, + { callApi(lang, since) } + ) + ) + } else { + callApi(lang, since) + } + } + } + + private fun callApi( + lang: String, + since: String + ) { + val model = firebaseTrendingConfigModel ?: FirebaseTrendingConfigModel() + + val language = if (lang == "All") "" else lang.replace(" ", "_").toLowerCase(Locale.getDefault()) + + disposel = RxHelper.getObservable(JsoupProvider.getTrendingService(model.pathUrl).getTrending(language, since)) + .doOnSubscribe { + sendToView { + it.showProgress(0) + it.clearAdapter() } - .subscribe({ response -> sendToView { view -> view.onNotifyAdapter(response) } }, - { throwable -> onError(throwable) }, { sendToView({ it.hideProgress() }) }) + }.flatMap { + RxHelper.getObservable(getTrendingObservable(it.body() ?: "", model)) + }.subscribe( + { response -> sendToView { view -> view.onNotifyAdapter(response) } }, + { throwable -> onError(throwable) }, + { sendToView { it.hideProgress() } } + ) manageDisposable(disposel) } - private fun getTrendingObservable(response: String): Observable { + private fun getTrendingObservable(html: String, trendingModel: FirebaseTrendingConfigModel): Observable> { return Observable.fromPublisher { s -> - val document: Document = Jsoup.parse(response, "") - val repoList = document.select(".repo-list") - if (repoList.isNotEmpty()) { - val list: Elements? = repoList.select("li") - list?.let { - if (list.isNotEmpty()) { - it.onEach { - val title = it.select(".d-inline-block > h3 > a").text() - val description = it.select(".py-1 > p").text() - val stars = it.select(".f6 > a[href*=/stargazers]").text() - val forks = it.select(".f6 > a[href*=/network]").text() - var todayStars = it.select(".f6 > span.float-right").text() - if (todayStars.isNullOrBlank()) { - todayStars = it.select(".f6 > span.float-sm-right").text() - } - var language = it.select(".f6 .mr-3 > span[itemprop=programmingLanguage]").text() - if (language.isNullOrBlank()) { - language = it.select(".f6 span[itemprop=programmingLanguage]").text() - } - s.onNext(TrendingModel(title, description, language, stars, forks, todayStars)) - } - } - } + val document = Jsoup.parse(html, "") + val list = document.select(trendingModel.listName) + val trendingList = arrayListOf() + list.select(trendingModel.listNameSublistTag)?.let { li -> + trendingList.addAll(li.map { body -> + val trendingLang = kotlin.runCatching { body.select(trendingModel.language).text() } + .getOrNull() ?: kotlin.runCatching { body.select(trendingModel.languageFallback).text() }.getOrNull() + val todayStars = kotlin.runCatching { body.select(trendingModel.todayStars).text() } + .getOrNull() ?: kotlin.runCatching { body.select(trendingModel.todayStarsFallback).text() }.getOrNull() + val title = kotlin.runCatching { body.select(trendingModel.title).text() }.getOrNull() + val description = kotlin.runCatching { body.select(trendingModel.description).text() }.getOrNull() + val stars = kotlin.runCatching { body.select(trendingModel.stars).text() }.getOrNull() + val forks = kotlin.runCatching { body.select(trendingModel.forks).text() }.getOrNull() + TrendingModel(title, description, trendingLang, stars, forks, todayStars) + }) } + Logger.e(trendingList as List?) + s.onNext(trendingList) s.onComplete() } } diff --git a/app/src/main/java/com/fastaccess/ui/widgets/AvatarLayout.java b/app/src/main/java/com/fastaccess/ui/widgets/AvatarLayout.java index db84b7e1..7988b861 100644 --- a/app/src/main/java/com/fastaccess/ui/widgets/AvatarLayout.java +++ b/app/src/main/java/com/fastaccess/ui/widgets/AvatarLayout.java @@ -94,7 +94,7 @@ public class AvatarLayout extends FrameLayout { .dontAnimate() .into(avatar); } - + private void setBackground() { if (PrefGetter.isRectAvatar()) { setBackgroundResource(R.drawable.rect_shape); diff --git a/app/src/main/res/layouts/main_layouts/layout/trending_activity_layout.xml b/app/src/main/res/layouts/main_layouts/layout/trending_activity_layout.xml index cc88799c..084f905b 100644 --- a/app/src/main/res/layouts/main_layouts/layout/trending_activity_layout.xml +++ b/app/src/main/res/layouts/main_layouts/layout/trending_activity_layout.xml @@ -1,12 +1,10 @@ - - + + tools:layout="@layout/micro_grid_refresh_list" /> - + @@ -52,7 +49,8 @@ android:layout_height="wrap_content" android:minHeight="?actionBarSize" android:orientation="horizontal" - android:paddingTop="@dimen/spacing_large"> + android:paddingTop="@dimen/spacing_large" + android:paddingBottom="@dimen/spacing_large"> + android:textColor="@color/search_tab_highlighter" /> + android:textColor="@color/search_tab_highlighter" /> + android:textColor="@color/search_tab_highlighter" /> + android:background="?dividerColor" /> + android:paddingEnd="@dimen/spacing_xs_large" + android:textColorHint="?android:textColorSecondary" /> + tools:visibility="visible" /> + android:background="?dividerColor" /> + app:menu="@menu/dynamic_trending_menu" /> - + \ No newline at end of file diff --git a/app/src/main/res/layouts/other_layouts/layout/avatar_layout.xml b/app/src/main/res/layouts/other_layouts/layout/avatar_layout.xml index 92d2dc0e..a9a21c87 100644 --- a/app/src/main/res/layouts/other_layouts/layout/avatar_layout.xml +++ b/app/src/main/res/layouts/other_layouts/layout/avatar_layout.xml @@ -1,6 +1,5 @@ - + app:shape_mode="circle" /> \ No newline at end of file