diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/presentation/LaunchPresentation.java b/twidere/src/main/java/org/mariotaku/twidere/model/presentation/LaunchPresentation.java index 0b0f6fd22..bcb4ae4af 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/presentation/LaunchPresentation.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/presentation/LaunchPresentation.java @@ -143,8 +143,29 @@ public class LaunchPresentation { @JsonField(name = "url") String url; + @JsonField(name = "density") + float density; + + @JsonField(name = "width") + int width; + + @JsonField(name = "height") + int height; + public String getUrl() { return url; } + + public float getDensity() { + return density; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MainActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MainActivity.kt index 80ca4ed43..8e798db16 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MainActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MainActivity.kt @@ -32,6 +32,7 @@ import android.support.annotation.StyleRes import android.support.v4.view.ViewCompat import android.support.v7.app.TwilightManagerAccessor import android.view.View +import android.view.View.MeasureSpec import android.widget.Toast import com.bumptech.glide.Glide import com.bumptech.glide.Priority @@ -54,6 +55,7 @@ import org.mariotaku.twidere.constant.lastLaunchTimeKey import org.mariotaku.twidere.constant.promotionsEnabledKey import org.mariotaku.twidere.constant.themeColorKey import org.mariotaku.twidere.constant.themeKey +import org.mariotaku.twidere.extension.model.displayingScore import org.mariotaku.twidere.extension.model.hasInvalidAccount import org.mariotaku.twidere.extension.model.shouldShow import org.mariotaku.twidere.model.presentation.LaunchPresentation @@ -138,10 +140,10 @@ open class MainActivity : ChameleonActivity(), IBaseActivity { } ViewCompat.setOnApplyWindowInsetsListener(main) lambda@ { _, insets -> - main.setPadding(0, 0, 0, insets.systemWindowInsetBottom) + main.setPadding(0, 0, insets.systemWindowInsetRight, + insets.systemWindowInsetBottom) - controlOverlay.setPadding(insets.systemWindowInsetLeft, insets.systemWindowInsetTop, - insets.systemWindowInsetRight, 0) + controlOverlay.setPadding(0, insets.systemWindowInsetTop, 0, 0) return@lambda insets.consumeSystemWindowInsets() } ViewSupport.setOutlineProvider(skipPresentation, ViewOutlineProviderCompat.BACKGROUND) @@ -163,10 +165,9 @@ open class MainActivity : ChameleonActivity(), IBaseActivity { } val presentation = jsonCache.getList(RefreshLaunchPresentationsTask.JSON_CACHE_KEY, LaunchPresentation::class.java)?.firstOrNull { - it.shouldShow() + it.shouldShow(this) } - if (presentation != null) { - displayPresentation(presentation) + if (presentation != null && displayPresentation(presentation)) { launchLater() } else { launchDirectly() @@ -225,12 +226,24 @@ open class MainActivity : ChameleonActivity(), IBaseActivity { isNightBackup = nightState } - private fun displayPresentation(presentation: LaunchPresentation) { + private fun displayPresentation(presentation: LaunchPresentation): Boolean { skipPresentation.visibility = View.VISIBLE controlOverlay.tag = presentation - Glide.with(this).load(presentation.images.first().url) + + val dm = resources.displayMetrics + main.measure(MeasureSpec.makeMeasureSpec(dm.widthPixels, + MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(dm.heightPixels, + MeasureSpec.EXACTLY)) + + val width = presentationView.measuredWidth + val height = presentationView.measuredHeight + val images = presentation.images.sortedByDescending { it.displayingScore(dm.density, width, height) } + val image = images.firstOrNull() ?: return false + + Glide.with(this).load(image.url) .priority(Priority.HIGH) .into(presentationView) + return true } private fun launchDirectly() { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/LaunchPresentationExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/LaunchPresentationExtensions.kt index 90c3c99cb..83124f52d 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/LaunchPresentationExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/LaunchPresentationExtensions.kt @@ -19,17 +19,16 @@ package org.mariotaku.twidere.extension.model +import android.content.Context +import android.support.v4.os.LocaleListCompat +import org.mariotaku.ktextension.localesCompat import org.mariotaku.twidere.model.presentation.LaunchPresentation import java.util.* -/** - * Created by mariotaku on 2017/8/20. - */ - -fun LaunchPresentation.shouldShow(): Boolean { +fun LaunchPresentation.shouldShow(context: Context): Boolean { // Check language - val locale = Locale.getDefault() - if (locales != null && locales.none { it.matches(locale) }) { + val userLocales = context.resources.configuration.localesCompat + if (locales != null && locales.none { it.matchesAny(userLocales) }) { return false } // Check date/time @@ -53,4 +52,34 @@ fun LaunchPresentation.Locale.matches(locale: Locale): Boolean { return locale.country.isNullOrEmpty() } return country == locale.country -} \ No newline at end of file +} + +fun LaunchPresentation.Locale.matchesAny(locales: LocaleListCompat): Boolean { + return (0 until locales.size()).any { matches(locales[it]) } +} + +fun LaunchPresentation.Image.displayingScore(viewDensity: Float, viewWidth: Int, + viewHeight: Int): Int { + if (viewWidth == 0 || viewHeight == 0) return 0 + var score = 0 + // Compute size scores + score += when { + viewWidth == width && viewHeight <= height -> 100 + viewHeight == height && viewWidth <= width -> 100 + viewWidth < width && viewHeight < height -> { + val diffW = (width / viewWidth.toFloat() - 1).coerceAtMost(0.5f) + val diffH = (height / viewHeight.toFloat() - 1).coerceAtMost(0.5f) + 100 - Math.round(diffH * 100) - Math.round(diffW * 100) + } + else -> { + val diffW = (width / viewWidth.toFloat() - 1).coerceAtMost(0.5f) + val diffH = (height / viewHeight.toFloat() - 1).coerceAtMost(0.5f) + 100 - Math.round(diffH * 50) - Math.round(diffW * 50) + } + } + if (this.density != 0f) { + score += 100 - Math.round(Math.abs(this.density / viewDensity - 1).coerceAtMost(1f)) + } + return score +} + diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/filter/RefreshLaunchPresentationsTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/filter/RefreshLaunchPresentationsTask.kt index 68198f387..571150f4c 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/filter/RefreshLaunchPresentationsTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/filter/RefreshLaunchPresentationsTask.kt @@ -22,6 +22,7 @@ package org.mariotaku.twidere.task.filter import android.content.Context import org.mariotaku.restfu.annotation.method.GET import org.mariotaku.restfu.http.HttpRequest +import org.mariotaku.twidere.BuildConfig import org.mariotaku.twidere.model.presentation.LaunchPresentation import org.mariotaku.twidere.task.BaseAbstractTask import org.mariotaku.twidere.util.JsonSerializer @@ -33,10 +34,14 @@ import java.io.IOException */ class RefreshLaunchPresentationsTask(context: Context) : BaseAbstractTask Unit>(context) { override fun doLongOperation(params: Unit?): Boolean { - val request = HttpRequest.Builder() - .method(GET.METHOD) - .url("https://twidere.mariotaku.org/assets/data/launch_presentations.json") - .build() + val builder = HttpRequest.Builder() + builder.method(GET.METHOD) + if (BuildConfig.DEBUG) { + builder.url("https://twidere.mariotaku.org/assets/data/launch_presentations_debug.json") + } else { + builder.url("https://twidere.mariotaku.org/assets/data/launch_presentations.json") + } + val request = builder.build() try { val presentations = restHttpClient.newCall(request).execute().use { if (!it.isSuccessful) return@use null diff --git a/twidere/src/main/res/layout-land/activity_main.xml b/twidere/src/main/res/layout-land/activity_main.xml new file mode 100644 index 000000000..629d6f865 --- /dev/null +++ b/twidere/src/main/res/layout-land/activity_main.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + +