fix trending

This commit is contained in:
k0shk0sh 2019-12-25 08:50:01 +01:00
parent cf857d2c1f
commit 9cb104fcfa
17 changed files with 177 additions and 148 deletions

View File

@ -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

View File

@ -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'

View File

@ -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
}
}
}

View File

@ -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>
}

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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()

View File

@ -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);

View File

@ -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() {

View File

@ -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
}
}

View File

@ -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 {

View File

@ -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)
}

View File

@ -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()
}

View File

@ -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()
}
}

View File

@ -94,7 +94,7 @@ public class AvatarLayout extends FrameLayout {
.dontAnimate()
.into(avatar);
}
private void setBackground() {
if (PrefGetter.isRectAvatar()) {
setBackgroundResource(R.drawable.rect_shape);

View File

@ -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>

View File

@ -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>