mirror of
https://github.com/k0shk0sh/FastHub.git
synced 2026-01-25 14:47:05 +00:00
fix trending
This commit is contained in:
parent
cf857d2c1f
commit
9cb104fcfa
46
.travis.yml
46
.travis.yml
@ -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
|
||||
@ -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'
|
||||
|
||||
@ -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<String, String>?): 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
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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<String>
|
||||
@GET("{lan}") fun getTrending(@Path("lan") lan: String?, @Query("since") since: String?): Observable<Response<String>>
|
||||
|
||||
@GET("{path}") fun getWiki(@Path(value = "path", encoded = true) path: String?): Observable<String>
|
||||
}
|
||||
|
||||
@ -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<String, LanguageColorModel> 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;
|
||||
}
|
||||
|
||||
@ -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<ResponseBody, String> {
|
||||
public static class StringResponseConverter implements Converter<ResponseBody, String> {
|
||||
@Override public String convert(@NonNull ResponseBody value) throws IOException {
|
||||
return value.string();
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -108,9 +108,7 @@ public class BasePresenter<V extends BaseMvp.FAView> extends TiPresenter<V> 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<V extends BaseMvp.FAView> extends TiPresenter<V> 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() {
|
||||
|
||||
@ -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<TrendingMvp.View, TrendingPresenter>(), 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<TrendingMvp.View, TrendingPresenter>(), 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<TrendingMvp.View, TrendingPresenter>(), 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<TrendingMvp.View, TrendingPresenter>(), 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<TrendingMvp.View, TrendingPresenter>(), 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<TrendingMvp.View, TrendingPresenter>(), 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<TrendingMvp.View, TrendingPresenter>(), 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
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,7 +25,6 @@ class TrendingPresenter : BasePresenter<TrendingMvp.View>(), 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 {
|
||||
|
||||
@ -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<TrendingFragmentMvp.View, TrendingFragment
|
||||
fastScroller.attachRecyclerView(recycler)
|
||||
}
|
||||
|
||||
override fun onNotifyAdapter(items: TrendingModel) {
|
||||
adapter.addItem(items)
|
||||
override fun onNotifyAdapter(items: List<TrendingModel>) {
|
||||
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)
|
||||
}
|
||||
|
||||
@ -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<TrendingModel>)
|
||||
fun onSetQuery(lang: String, since: String)
|
||||
fun clearAdapter()
|
||||
}
|
||||
|
||||
@ -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<TrendingFragmentMvp.View>(), Tre
|
||||
private var disposel: Disposable? = null
|
||||
|
||||
private val trendingList: ArrayList<TrendingModel> = ArrayList()
|
||||
private var firebaseTrendingConfigModel: FirebaseTrendingConfigModel? = null
|
||||
|
||||
override fun getTendingList(): ArrayList<TrendingModel> {
|
||||
return trendingList
|
||||
@ -30,53 +34,82 @@ class TrendingFragmentPresenter : BasePresenter<TrendingFragmentMvp.View>(), 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<String, String>)
|
||||
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<TrendingModel> {
|
||||
private fun getTrendingObservable(html: String, trendingModel: FirebaseTrendingConfigModel): Observable<List<TrendingModel>> {
|
||||
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<TrendingModel>()
|
||||
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<Any>?)
|
||||
s.onNext(trendingList)
|
||||
s.onComplete()
|
||||
}
|
||||
}
|
||||
|
||||
@ -94,7 +94,7 @@ public class AvatarLayout extends FrameLayout {
|
||||
.dontAnimate()
|
||||
.into(avatar);
|
||||
}
|
||||
|
||||
|
||||
private void setBackground() {
|
||||
if (PrefGetter.isRectAvatar()) {
|
||||
setBackgroundResource(R.drawable.rect_shape);
|
||||
|
||||
@ -1,12 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.v4.widget.DrawerLayout
|
||||
android:id="@+id/drawer"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/drawer"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:openDrawer="end">
|
||||
|
||||
<LinearLayout
|
||||
@ -19,7 +17,7 @@
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1">
|
||||
|
||||
<include layout="@layout/appbar_elevation_dark"/>
|
||||
<include layout="@layout/appbar_elevation_dark" />
|
||||
|
||||
<fragment
|
||||
android:id="@+id/trendingFragment"
|
||||
@ -27,18 +25,17 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/scroll_behavior"
|
||||
tools:layout="@layout/micro_grid_refresh_list"/>
|
||||
tools:layout="@layout/micro_grid_refresh_list" />
|
||||
|
||||
</android.support.design.widget.CoordinatorLayout>
|
||||
|
||||
<include layout="@layout/add_banner_layout"/>
|
||||
<include layout="@layout/add_banner_layout" />
|
||||
</LinearLayout>
|
||||
|
||||
<android.support.design.widget.NavigationView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="end"
|
||||
android:fitsSystemWindows="true"
|
||||
app:itemIconTint="?android:textColorSecondary"
|
||||
app:itemTextColor="?android:textColorPrimary">
|
||||
|
||||
@ -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">
|
||||
|
||||
<com.fastaccess.ui.widgets.FontTextView
|
||||
android:id="@+id/daily"
|
||||
@ -67,7 +65,7 @@
|
||||
android:maxLines="1"
|
||||
android:padding="@dimen/spacing_normal"
|
||||
android:text="@string/daily"
|
||||
android:textColor="@color/search_tab_highlighter"/>
|
||||
android:textColor="@color/search_tab_highlighter" />
|
||||
|
||||
<com.fastaccess.ui.widgets.FontTextView
|
||||
android:id="@+id/weekly"
|
||||
@ -82,7 +80,7 @@
|
||||
android:maxLines="1"
|
||||
android:padding="@dimen/spacing_normal"
|
||||
android:text="@string/weekly"
|
||||
android:textColor="@color/search_tab_highlighter"/>
|
||||
android:textColor="@color/search_tab_highlighter" />
|
||||
|
||||
<com.fastaccess.ui.widgets.FontTextView
|
||||
android:id="@+id/monthly"
|
||||
@ -97,13 +95,13 @@
|
||||
android:maxLines="1"
|
||||
android:padding="@dimen/spacing_normal"
|
||||
android:text="@string/monthly"
|
||||
android:textColor="@color/search_tab_highlighter"/>
|
||||
android:textColor="@color/search_tab_highlighter" />
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/divider_height"
|
||||
android:background="?dividerColor"/>
|
||||
android:background="?dividerColor" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
@ -124,9 +122,9 @@
|
||||
android:imeOptions="actionSearch"
|
||||
android:inputType="text"
|
||||
android:maxLines="1"
|
||||
android:paddingEnd="@dimen/spacing_xs_large"
|
||||
android:paddingStart="@dimen/spacing_normal"
|
||||
android:textColorHint="?android:textColorSecondary"/>
|
||||
android:paddingEnd="@dimen/spacing_xs_large"
|
||||
android:textColorHint="?android:textColorSecondary" />
|
||||
|
||||
<com.fastaccess.ui.widgets.ForegroundImageView
|
||||
android:id="@+id/clear"
|
||||
@ -140,14 +138,14 @@
|
||||
android:scaleType="centerCrop"
|
||||
android:src="@drawable/ic_clear"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"/>
|
||||
tools:visibility="visible" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/divider_height"
|
||||
android:background="?dividerColor"/>
|
||||
android:background="?dividerColor" />
|
||||
|
||||
<android.support.design.widget.NavigationView
|
||||
android:id="@+id/navMenu"
|
||||
@ -158,11 +156,11 @@
|
||||
app:itemBackground="@color/transparent"
|
||||
app:itemIconTint="@color/search_tab_highlighter"
|
||||
app:itemTextColor="@color/search_tab_highlighter"
|
||||
app:menu="@menu/dynamic_trending_menu"/>
|
||||
app:menu="@menu/dynamic_trending_menu" />
|
||||
</LinearLayout>
|
||||
|
||||
</android.support.design.widget.NavigationView>
|
||||
|
||||
<include layout="@layout/nav_menu_layout"/>
|
||||
<include layout="@layout/nav_menu_layout" />
|
||||
|
||||
</android.support.v4.widget.DrawerLayout>
|
||||
@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<cn.gavinliu.android.lib.shapedimageview.ShapedImageView
|
||||
@ -11,5 +10,5 @@
|
||||
android:scaleType="centerCrop"
|
||||
android:src="?colorPrimaryDark"
|
||||
android:transitionName="@string/icon_transition"
|
||||
app:shape_mode="circle"/>
|
||||
app:shape_mode="circle" />
|
||||
</merge>
|
||||
Loading…
x
Reference in New Issue
Block a user