Add tab position setting support

This commit is contained in:
Tlaster 2020-05-12 15:20:12 +08:00
parent 6d05e2128e
commit 0d6f6c5dd1
9 changed files with 114 additions and 31 deletions

View File

@ -71,6 +71,9 @@ public interface SharedPreferenceConstants {
String VALUE_COMPOSE_NOW_ACTION_TAKE_PHOTO = "take_photo";
String VALUE_COMPOSE_NOW_ACTION_PICK_IMAGE = "pick_image";
String VALUE_TAB_POSITION_TOP = "top";
String VALUE_TAB_POSITION_BOTTOM = "bottom";
String DEFAULT_THEME = VALUE_THEME_NAME_LIGHT;
String DEFAULT_THEME_BACKGROUND = VALUE_THEME_BACKGROUND_DEFAULT;
int DEFAULT_THEME_BACKGROUND_ALPHA = 160;
@ -98,6 +101,8 @@ public interface SharedPreferenceConstants {
int DEFAULT_DATABASE_ITEM_LIMIT = 100;
int DEFAULT_LOAD_ITEM_LIMIT = 20;
String DEFAULT_TAB_POSITION = VALUE_TAB_POSITION_TOP;
// Exportable preferences
@ExportablePreference(INT)
@ -286,6 +291,8 @@ public interface SharedPreferenceConstants {
String KEY_NAVBAR_STYLE = "navbar_style";
@ExportablePreference(STRING)
String KEY_OVERRIDE_LANGUAGE = "override_language";
@ExportablePreference(STRING)
String KEY_TAB_POSITION = "tab_position";
// Internal preferences

View File

@ -148,6 +148,12 @@ android {
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation project(':twidere.component.common')
implementation project(':twidere.component.nyan')
@ -174,6 +180,7 @@ dependencies {
implementation 'androidx.palette:palette:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation "androidx.core:core-ktx:1.2.0"
/** Third-party dependencies **/

View File

@ -37,20 +37,6 @@ import android.graphics.drawable.Drawable
import android.os.AsyncTask
import android.os.Build
import android.os.Bundle
import androidx.annotation.StringRes
import androidx.fragment.app.Fragment
import androidx.core.app.NotificationCompat
import androidx.core.view.GravityCompat
import androidx.core.view.ViewCompat
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.unwrapped
import androidx.drawerlayout.widget.DrawerLayout
import androidx.drawerlayout.widget.DrawerLayoutAccessor
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.widget.TintTypedArray
import android.util.SparseIntArray
import android.view.Gravity
import android.view.KeyEvent
@ -59,6 +45,18 @@ import android.view.View
import android.view.View.OnClickListener
import android.view.View.OnLongClickListener
import android.view.ViewGroup.MarginLayoutParams
import android.widget.RelativeLayout
import androidx.annotation.StringRes
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.widget.TintTypedArray
import androidx.core.app.NotificationCompat
import androidx.core.view.*
import androidx.drawerlayout.widget.DrawerLayout
import androidx.drawerlayout.widget.DrawerLayoutAccessor
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
import com.getkeepsafe.taptargetview.TapTarget
import com.getkeepsafe.taptargetview.TapTargetView
import com.squareup.otto.Subscribe
@ -402,12 +400,20 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
if (caller === leftDrawerFragment) return super.getSystemWindowInsets(caller, insets)
if (mainTabs == null || homeContent == null) return false
val height = mainTabs.height
if (height != 0) {
insets.top = height
if (preferences[tabPositionKey] == SharedPreferenceConstants.VALUE_TAB_POSITION_TOP) {
if (height != 0) {
insets.top = height
} else {
insets.top = ThemeUtils.getActionBarHeight(this)
}
insets.bottom = systemWindowsInsets?.bottom ?: 0
} else {
insets.top = ThemeUtils.getActionBarHeight(this)
if (height != 0) {
insets.bottom = height
} else {
insets.bottom = ThemeUtils.getActionBarHeight(this)
}
}
insets.bottom = systemWindowsInsets?.bottom ?: 0
return true
}
@ -600,19 +606,44 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
return 1 - actionsButton.translationY / total
}
val totalHeight = controlBarHeight.toFloat()
return 1 + toolbar.translationY / totalHeight
return 1 + if (preferences[tabPositionKey] == SharedPreferenceConstants.VALUE_TAB_POSITION_TOP) {
toolbar.translationY
} else {
-toolbar.translationY
} / totalHeight
}
set(offset) {
val translationY = if (mainTabs.columns > 1) 0 else (controlBarHeight * (offset - 1)).toInt()
toolbar.translationY = translationY.toFloat()
windowOverlay.translationY = translationY.toFloat()
val lp = actionsButton.layoutParams
if (lp is MarginLayoutParams) {
actionsButton.translationY = (lp.bottomMargin + actionsButton.height) * (1 - offset)
if (preferences[tabPositionKey] == SharedPreferenceConstants.VALUE_TAB_POSITION_TOP) {
val translationY = if (mainTabs.columns > 1) {
0
} else {
(controlBarHeight * (offset - 1)).toInt()
}
toolbar.translationY = translationY.toFloat()
windowOverlay.translationY = translationY.toFloat()
val lp = actionsButton.layoutParams
if (lp is MarginLayoutParams) {
actionsButton.translationY = (lp.bottomMargin + actionsButton.height) * (1 - offset)
} else {
actionsButton.translationY = actionsButton.height * (1 - offset)
}
notifyControlBarOffsetChanged()
} else {
actionsButton.translationY = actionsButton.height * (1 - offset)
val translationY = if (mainTabs.columns > 1) {
0
} else {
(toolbar.height * (offset - 1)).toInt()
}
toolbar.translationY = -translationY.toFloat()
windowOverlay.translationY = -translationY.toFloat()
val lp = actionsButton.layoutParams
if (lp is MarginLayoutParams) {
actionsButton.translationY = (lp.bottomMargin + toolbar.height + actionsButton.height) * (1 - offset)
} else {
actionsButton.translationY = actionsButton.height * (1 - offset)
}
notifyControlBarOffsetChanged()
}
notifyControlBarOffsetChanged()
}
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
@ -830,6 +861,21 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
pagerAdapter.hasMultipleColumns = false
mainTabs.columns = 1
}
if (preferences[tabPositionKey] == SharedPreferenceConstants.VALUE_TAB_POSITION_TOP) {
toolbar.updateLayoutParams<RelativeLayout.LayoutParams> {
addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE)
}
actionsButton.updateLayoutParams<RelativeLayout.LayoutParams> {
addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE)
}
} else {
toolbar.updateLayoutParams<RelativeLayout.LayoutParams> {
addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE)
}
actionsButton.updateLayoutParams<RelativeLayout.LayoutParams> {
addRule(RelativeLayout.ABOVE, toolbar.id)
}
}
}
private fun setupSlidingMenu() {

View File

@ -2,9 +2,9 @@ package org.mariotaku.twidere.constant
import android.content.SharedPreferences
import android.os.Build
import androidx.core.os.LocaleHelperAccessor
import androidx.collection.ArraySet
import android.text.TextUtils
import androidx.collection.ArraySet
import androidx.core.os.LocaleHelperAccessor
import org.mariotaku.kpreferences.*
import org.mariotaku.ktextension.bcp47Tag
import org.mariotaku.ktextension.toLongOr
@ -88,6 +88,7 @@ val navbarStyleKey = KStringKey(KEY_NAVBAR_STYLE, NavbarStyle.DEFAULT)
val lastLaunchTimeKey = KLongKey("last_launch_time", -1)
val promotionsEnabledKey = KBooleanKey("promotions_enabled", false)
val translationDestinationKey = KNullableStringKey(KEY_TRANSLATION_DESTINATION, null)
val tabPositionKey = KStringKey(KEY_TAB_POSITION, SharedPreferenceConstants.DEFAULT_TAB_POSITION)
object cacheSizeLimitKey : KSimpleKey<Int>(KEY_CACHE_SIZE_LIMIT, 300) {
override fun read(preferences: SharedPreferences) = preferences.getInt(key, def).coerceIn(100,

View File

@ -37,7 +37,6 @@
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:layout_alignParentTop="true"
android:background="?colorToolbar"
android:elevation="@dimen/toolbar_elevation"
app:contentInsetEnd="0dp"
@ -80,7 +79,6 @@
android:id="@+id/actionsButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_margin="@dimen/element_spacing_large"

View File

@ -35,6 +35,10 @@
<item>Transparent</item>
<item>Colored</item>
</string-array>
<string-array name="entries_tab_position">
<item>Top</item>
<item>Bottom</item>
</string-array>
<string-array name="entries_notification_content">
<item>Home</item>
<item>Interactions</item>

View File

@ -94,6 +94,10 @@
<item>transparent</item>
<item>colored</item>
</string-array>
<string-array name="values_tab_position">
<item>top</item>
<item>bottom</item>
</string-array>
<string-array name="values_notification_content">
<item>home</item>
<item>mentions</item>

View File

@ -914,6 +914,7 @@
<string name="preference_title_multi_column_tab_width">Multi column tab width</string>
<string name="preference_title_multi_column_tabs">Multi column tabs</string>
<string name="preference_title_navbar_style">Navbar style</string>
<string name="preference_title_tab_position">Tab position</string>
<string name="preference_title_notification_channels">Channels</string>
<string name="preference_title_notification_ringtone">Ringtone</string>
<string name="preference_title_override_language">App language</string>

View File

@ -68,4 +68,19 @@
android:value="true"/>
</org.mariotaku.twidere.preference.EmojiSupportPreference>
<org.mariotaku.twidere.preference.EntrySummaryListPreference
android:entries="@array/entries_tab_position"
android:entryValues="@array/values_tab_position"
android:key="tab_position"
android:order="26"
android:title="@string/preference_title_tab_position">
<extra
android:name="should_recreate"
android:value="true"/>
<extra
android:name="recreate_activity"
android:value="true"/>
</org.mariotaku.twidere.preference.EntrySummaryListPreference>
</PreferenceScreen>