From 9a3b92ecbc909467a6897a0fa63f116749fbb9cd Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 3 Oct 2019 18:55:32 +0200 Subject: [PATCH 01/86] change active boost icon (#1513) --- .../tusky/adapter/StatusBaseViewHolder.java | 2 +- app/src/main/res/drawable/ic_reblog_active_24dp.xml | 9 +++++++++ .../{ic_reblog_dark_18dp.xml => ic_reblog_dark_24dp.xml} | 0 ...ic_reblog_light_18dp.xml => ic_reblog_light_24dp.xml} | 0 app/src/main/res/drawable/reblog_active.xml | 9 --------- app/src/main/res/layout/item_status.xml | 2 +- app/src/main/res/layout/item_status_detailed.xml | 2 +- app/src/main/res/values-night/styles.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/drawable/ic_reblog_active_24dp.xml rename app/src/main/res/drawable/{ic_reblog_dark_18dp.xml => ic_reblog_dark_24dp.xml} (100%) rename app/src/main/res/drawable/{ic_reblog_light_18dp.xml => ic_reblog_light_24dp.xml} (100%) delete mode 100644 app/src/main/res/drawable/reblog_active.xml diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index 6cbdc7d08..5a082cfe1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -324,7 +324,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } else { inactiveId = ThemeUtils.getDrawableId(reblogButton.getContext(), R.attr.status_reblog_inactive_drawable, R.drawable.reblog_inactive_dark); - activeId = R.drawable.reblog_active; + activeId = R.drawable.ic_reblog_active_24dp; } reblogButton.setInactiveImage(inactiveId); reblogButton.setActiveImage(activeId); diff --git a/app/src/main/res/drawable/ic_reblog_active_24dp.xml b/app/src/main/res/drawable/ic_reblog_active_24dp.xml new file mode 100644 index 000000000..8d28a4005 --- /dev/null +++ b/app/src/main/res/drawable/ic_reblog_active_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_reblog_dark_18dp.xml b/app/src/main/res/drawable/ic_reblog_dark_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_reblog_dark_18dp.xml rename to app/src/main/res/drawable/ic_reblog_dark_24dp.xml diff --git a/app/src/main/res/drawable/ic_reblog_light_18dp.xml b/app/src/main/res/drawable/ic_reblog_light_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_reblog_light_18dp.xml rename to app/src/main/res/drawable/ic_reblog_light_24dp.xml diff --git a/app/src/main/res/drawable/reblog_active.xml b/app/src/main/res/drawable/reblog_active.xml deleted file mode 100644 index d27942e55..000000000 --- a/app/src/main/res/drawable/reblog_active.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/item_status.xml b/app/src/main/res/layout/item_status.xml index 2a9614b96..a0e2b8515 100644 --- a/app/src/main/res/layout/item_status.xml +++ b/app/src/main/res/layout/item_status.xml @@ -435,7 +435,7 @@ app:layout_constraintEnd_toStartOf="@id/status_favourite" app:layout_constraintStart_toEndOf="@id/status_reply" app:layout_constraintTop_toTopOf="@id/status_reply" - sparkbutton:activeImage="@drawable/reblog_active" + sparkbutton:activeImage="@drawable/ic_reblog_active_24dp" sparkbutton:iconSize="28dp" sparkbutton:inactiveImage="?attr/status_reblog_inactive_drawable" sparkbutton:primaryColor="@color/tusky_blue" diff --git a/app/src/main/res/layout/item_status_detailed.xml b/app/src/main/res/layout/item_status_detailed.xml index 01db587ea..8db4d0d9e 100644 --- a/app/src/main/res/layout/item_status_detailed.xml +++ b/app/src/main/res/layout/item_status_detailed.xml @@ -525,7 +525,7 @@ app:layout_constraintEnd_toStartOf="@id/status_favourite" app:layout_constraintStart_toEndOf="@id/status_reply" app:layout_constraintTop_toTopOf="@id/status_reply" - sparkbutton:activeImage="@drawable/reblog_active" + sparkbutton:activeImage="@drawable/ic_reblog_active_24dp" sparkbutton:iconSize="28dp" sparkbutton:inactiveImage="?attr/status_reblog_inactive_drawable" sparkbutton:primaryColor="@color/tusky_blue" diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 8212c850b..2733e1e6d 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -30,7 +30,7 @@ @color/toolbar_background_dark @color/toolbar_icon_dark @style/TuskyImageButton.Dark - @drawable/ic_reblog_dark_18dp + @drawable/ic_reblog_dark_24dp @drawable/reblog_inactive_dark @drawable/reblog_private_dark @drawable/reblog_direct_dark diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 22353321f..919a5417f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -80,7 +80,7 @@ @color/toolbar_background_light @color/toolbar_icon_light @style/TuskyImageButton.Light - @drawable/ic_reblog_light_18dp + @drawable/ic_reblog_light_24dp @drawable/reblog_inactive_light @drawable/reblog_private_light @drawable/reblog_direct_light From 2dad358c96239ffee0ed90e8343829c73d0649b9 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 3 Oct 2019 19:58:21 +0200 Subject: [PATCH 02/86] upgrade appcompat, fix nightmode (#1455) * upgrade appcompat, fix language switching & nightmode * cleanup ThemeUtils * upgrade dependencies * change active boost icon (#1513) * upgrade jetifier and android gradle plugin * fix FilterTest --- app/build.gradle | 10 ++--- .../com/keylesspalace/tusky/BaseActivity.java | 4 -- .../tusky/PreferencesActivity.kt | 10 +---- .../keylesspalace/tusky/TuskyApplication.java | 9 +++++ .../tusky/adapter/StatusBaseViewHolder.java | 2 +- .../keylesspalace/tusky/util/ThemeUtils.java | 39 +++++++------------ .../res/drawable/ic_reblog_active_24dp.xml | 9 +++++ ..._dark_18dp.xml => ic_reblog_dark_24dp.xml} | 0 ...ight_18dp.xml => ic_reblog_light_24dp.xml} | 0 app/src/main/res/drawable/reblog_active.xml | 9 ----- app/src/main/res/layout/item_status.xml | 2 +- .../main/res/layout/item_status_detailed.xml | 2 +- app/src/main/res/values-night/styles.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- .../tusky/ComposeActivityTest.kt | 14 ++----- .../tusky/FakeTuskyApplication.kt | 4 ++ .../com/keylesspalace/tusky/FilterTest.kt | 1 - build.gradle | 4 +- 18 files changed, 52 insertions(+), 71 deletions(-) create mode 100644 app/src/main/res/drawable/ic_reblog_active_24dp.xml rename app/src/main/res/drawable/{ic_reblog_dark_18dp.xml => ic_reblog_dark_24dp.xml} (100%) rename app/src/main/res/drawable/{ic_reblog_light_18dp.xml => ic_reblog_light_24dp.xml} (100%) delete mode 100644 app/src/main/res/drawable/reblog_active.xml diff --git a/app/build.gradle b/app/build.gradle index ae6dda088..d0f5750e4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -95,15 +95,15 @@ dependencies { implementation('com.mikepenz:materialdrawer:6.1.2@aar') { transitive = true } - implementation 'androidx.core:core:1.0.2' - implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.core:core:1.1.0' + implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation 'androidx.legacy:legacy-support-v13:1.0.0' implementation 'com.google.android.material:material:1.1.0-alpha10' implementation 'androidx.exifinterface:exifinterface:1.0.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.preference:preference:1.1.0-alpha04' + implementation 'androidx.preference:preference:1.1.0' implementation "com.squareup.retrofit2:retrofit:$retrofitVersion" implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion" implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion" @@ -123,7 +123,7 @@ dependencies { implementation 'androidx.emoji:emoji-appcompat:1.0.0' implementation 'de.c1710:filemojicompat:1.0.17' // architecture components - implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' + implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0' //room implementation 'androidx.room:room-runtime:2.1.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' @@ -157,5 +157,5 @@ dependencies { implementation 'com.github.bumptech.glide:okhttp3-integration:4.10.0' //Add some useful extensions - implementation 'androidx.core:core-ktx:1.2.0-alpha01' + implementation 'androidx.core:core-ktx:1.2.0-alpha04' } diff --git a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java index 389a745e6..05cc99c2e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java @@ -52,8 +52,6 @@ import javax.inject.Inject; public abstract class BaseActivity extends AppCompatActivity implements Injectable { - @Inject - public ThemeUtils themeUtils; @Inject public AccountManager accountManager; @@ -75,8 +73,6 @@ public abstract class BaseActivity extends AppCompatActivity implements Injectab setTheme(R.style.TuskyBlackTheme); } - themeUtils.setAppNightMode(theme, this); - /* set the taskdescription programmatically, the theme would turn it blue */ String appName = getString(R.string.app_name); Bitmap appIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); diff --git a/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt b/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt index d1e0c6a8f..fc07271a4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/PreferencesActivity.kt @@ -32,7 +32,6 @@ import dagger.android.DispatchingAndroidInjector import kotlinx.android.synthetic.main.toolbar_basic.* import java.lang.IllegalArgumentException import javax.inject.Inject -import androidx.appcompat.app.AppCompatDelegate import dagger.android.HasAndroidInjector class PreferencesActivity : BaseActivity(), SharedPreferences.OnSharedPreferenceChangeListener, @@ -124,18 +123,11 @@ class PreferencesActivity : BaseActivity(), SharedPreferences.OnSharedPreference "appTheme" -> { val theme = sharedPreferences.getNonNullString("appTheme", ThemeUtils.APP_THEME_DEFAULT) Log.d("activeTheme", theme) - themeUtils.setAppNightMode(theme, this) + ThemeUtils.setAppNightMode(theme) restartActivitiesOnExit = true this.restartCurrentActivity() - // MODE_NIGHT_FOLLOW_SYSTEM workaround part 2 :/ - when(theme){ - ThemeUtils.THEME_SYSTEM -> { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - } - } - //workaround end } "statusTextSize", "absoluteTimeView", "showBotOverlay", "animateGifAvatars" -> { restartActivitiesOnExit = true diff --git a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java index 39c21cdc1..b135d8d7b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java +++ b/app/src/main/java/com/keylesspalace/tusky/TuskyApplication.java @@ -17,6 +17,7 @@ package com.keylesspalace.tusky; import android.app.Application; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Configuration; import android.preference.PreferenceManager; @@ -30,6 +31,7 @@ import com.keylesspalace.tusky.di.AppInjector; import com.keylesspalace.tusky.util.EmojiCompatFont; import com.keylesspalace.tusky.util.LocaleManager; import com.keylesspalace.tusky.util.NotificationPullJobCreator; +import com.keylesspalace.tusky.util.ThemeUtils; import com.uber.autodispose.AutoDisposePlugins; import org.conscrypt.Conscrypt; @@ -91,6 +93,7 @@ public class TuskyApplication extends Application implements HasAndroidInjector initAppInjector(); initEmojiCompat(); + initNightMode(); JobManager.create(this).addJobCreator(notificationPullJobCreator); @@ -133,6 +136,12 @@ public class TuskyApplication extends Application implements HasAndroidInjector AppInjector.INSTANCE.init(this); } + protected void initNightMode() { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + String theme = preferences.getString("appTheme", ThemeUtils.APP_THEME_DEFAULT); + ThemeUtils.setAppNightMode(theme); + } + public ServiceLocator getServiceLocator() { return serviceLocator; } diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index 6cbdc7d08..5a082cfe1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -324,7 +324,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { } else { inactiveId = ThemeUtils.getDrawableId(reblogButton.getContext(), R.attr.status_reblog_inactive_drawable, R.drawable.reblog_inactive_dark); - activeId = R.drawable.reblog_active; + activeId = R.drawable.ic_reblog_active_24dp; } reblogButton.setInactiveImage(inactiveId); reblogButton.setActiveImage(activeId); diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java b/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java index 93a1b3226..9436b7a56 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java +++ b/app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.java @@ -26,29 +26,21 @@ import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatDelegate; -import android.provider.Settings; import android.util.TypedValue; -import javax.inject.Inject; -import javax.inject.Singleton; - /** * Provides runtime compatibility to obtain theme information and re-theme views, especially where * the ability to do so is not supported in resource files. */ -@Singleton public class ThemeUtils { - @Inject - public ThemeUtils(){} - public static final String APP_THEME_DEFAULT = ThemeUtils.THEME_NIGHT; private static final String THEME_NIGHT = "night"; private static final String THEME_DAY = "day"; private static final String THEME_BLACK = "black"; private static final String THEME_AUTO = "auto"; - public static final String THEME_SYSTEM = "auto_system"; + private static final String THEME_SYSTEM = "auto_system"; public static Drawable getDrawable(@NonNull Context context, @AttrRes int attribute, @DrawableRes int fallbackDrawable) { @@ -62,8 +54,9 @@ public class ThemeUtils { return context.getDrawable(resourceId); } - public static @DrawableRes int getDrawableId(@NonNull Context context, @AttrRes int attribute, - @DrawableRes int fallbackDrawableId) { + @DrawableRes + public static int getDrawableId(@NonNull Context context, @AttrRes int attribute, + @DrawableRes int fallbackDrawableId) { TypedValue value = new TypedValue(); if (context.getTheme().resolveAttribute(attribute, value, true)) { return value.resourceId; @@ -72,7 +65,8 @@ public class ThemeUtils { } } - public static @ColorInt int getColor(@NonNull Context context, @AttrRes int attribute) { + @ColorInt + public static int getColor(@NonNull Context context, @AttrRes int attribute) { TypedValue value = new TypedValue(); if (context.getTheme().resolveAttribute(attribute, value, true)) { return value.data; @@ -81,14 +75,16 @@ public class ThemeUtils { } } - public static @ColorRes int getColorId(@NonNull Context context, @AttrRes int attribute) { + @ColorRes + public static int getColorId(@NonNull Context context, @AttrRes int attribute) { TypedValue value = new TypedValue(); context.getTheme().resolveAttribute(attribute, value, true); return value.resourceId; } /** this can be replaced with drawableTint in xml once minSdkVersion >= 23 */ - public static @Nullable Drawable getTintedDrawable(@NonNull Context context, @DrawableRes int drawableId, @AttrRes int colorAttr) { + @Nullable + public static Drawable getTintedDrawable(@NonNull Context context, @DrawableRes int drawableId, @AttrRes int colorAttr) { Drawable drawable = context.getDrawable(drawableId); if(drawable == null) { return null; @@ -101,30 +97,21 @@ public class ThemeUtils { drawable.setColorFilter(getColor(context, attribute), PorterDuff.Mode.SRC_IN); } - public void setAppNightMode(String flavor, Context context) { + public static void setAppNightMode(String flavor) { switch (flavor) { default: case THEME_NIGHT: + case THEME_BLACK: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); break; case THEME_DAY: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); break; - case THEME_BLACK: - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); - break; case THEME_AUTO: - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO); + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME); break; case THEME_SYSTEM: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); - - //stupid workaround to make MODE_NIGHT_FOLLOW_SYSTEM work :( - if((Settings.System.getInt(context.getContentResolver(), "display_night_theme", 0) == 1)) { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); - } else if ((Settings.System.getInt(context.getContentResolver(), "display_night_theme", 0) == 0)) { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); - } break; } } diff --git a/app/src/main/res/drawable/ic_reblog_active_24dp.xml b/app/src/main/res/drawable/ic_reblog_active_24dp.xml new file mode 100644 index 000000000..8d28a4005 --- /dev/null +++ b/app/src/main/res/drawable/ic_reblog_active_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_reblog_dark_18dp.xml b/app/src/main/res/drawable/ic_reblog_dark_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_reblog_dark_18dp.xml rename to app/src/main/res/drawable/ic_reblog_dark_24dp.xml diff --git a/app/src/main/res/drawable/ic_reblog_light_18dp.xml b/app/src/main/res/drawable/ic_reblog_light_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_reblog_light_18dp.xml rename to app/src/main/res/drawable/ic_reblog_light_24dp.xml diff --git a/app/src/main/res/drawable/reblog_active.xml b/app/src/main/res/drawable/reblog_active.xml deleted file mode 100644 index d27942e55..000000000 --- a/app/src/main/res/drawable/reblog_active.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/item_status.xml b/app/src/main/res/layout/item_status.xml index 2a9614b96..a0e2b8515 100644 --- a/app/src/main/res/layout/item_status.xml +++ b/app/src/main/res/layout/item_status.xml @@ -435,7 +435,7 @@ app:layout_constraintEnd_toStartOf="@id/status_favourite" app:layout_constraintStart_toEndOf="@id/status_reply" app:layout_constraintTop_toTopOf="@id/status_reply" - sparkbutton:activeImage="@drawable/reblog_active" + sparkbutton:activeImage="@drawable/ic_reblog_active_24dp" sparkbutton:iconSize="28dp" sparkbutton:inactiveImage="?attr/status_reblog_inactive_drawable" sparkbutton:primaryColor="@color/tusky_blue" diff --git a/app/src/main/res/layout/item_status_detailed.xml b/app/src/main/res/layout/item_status_detailed.xml index 01db587ea..8db4d0d9e 100644 --- a/app/src/main/res/layout/item_status_detailed.xml +++ b/app/src/main/res/layout/item_status_detailed.xml @@ -525,7 +525,7 @@ app:layout_constraintEnd_toStartOf="@id/status_favourite" app:layout_constraintStart_toEndOf="@id/status_reply" app:layout_constraintTop_toTopOf="@id/status_reply" - sparkbutton:activeImage="@drawable/reblog_active" + sparkbutton:activeImage="@drawable/ic_reblog_active_24dp" sparkbutton:iconSize="28dp" sparkbutton:inactiveImage="?attr/status_reblog_inactive_drawable" sparkbutton:primaryColor="@color/tusky_blue" diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 8212c850b..2733e1e6d 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -30,7 +30,7 @@ @color/toolbar_background_dark @color/toolbar_icon_dark @style/TuskyImageButton.Dark - @drawable/ic_reblog_dark_18dp + @drawable/ic_reblog_dark_24dp @drawable/reblog_inactive_dark @drawable/reblog_private_dark @drawable/reblog_direct_dark diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 22353321f..919a5417f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -80,7 +80,7 @@ @color/toolbar_background_light @color/toolbar_icon_light @style/TuskyImageButton.Light - @drawable/ic_reblog_light_18dp + @drawable/ic_reblog_light_24dp @drawable/reblog_inactive_light @drawable/reblog_private_light @drawable/reblog_direct_light diff --git a/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt b/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt index 343ac1e15..bb924ee4b 100644 --- a/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/ComposeActivityTest.kt @@ -26,14 +26,12 @@ import com.keylesspalace.tusky.entity.Account import com.keylesspalace.tusky.entity.Emoji import com.keylesspalace.tusky.entity.Instance import com.keylesspalace.tusky.network.MastodonApi -import com.keylesspalace.tusky.util.ThemeUtils import okhttp3.Request import org.junit.Assert import org.junit.Assert.* import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mockito import org.mockito.Mockito.`when` import org.mockito.Mockito.mock import org.robolectric.Robolectric @@ -58,7 +56,6 @@ class ComposeActivityTest { private lateinit var activity: ComposeActivity private lateinit var accountManagerMock: AccountManager private lateinit var apiMock: MastodonApi - private lateinit var themeUtilsMock: ThemeUtils private val account = AccountEntity( id = 1, @@ -85,9 +82,9 @@ class ComposeActivityTest { val controller = Robolectric.buildActivity(ComposeActivity::class.java) activity = controller.get() - accountManagerMock = Mockito.mock(AccountManager::class.java) + accountManagerMock = mock(AccountManager::class.java) - apiMock = Mockito.mock(MastodonApi::class.java) + apiMock = mock(MastodonApi::class.java) `when`(apiMock.getCustomEmojis()).thenReturn(object: Call> { override fun isExecuted(): Boolean { return false @@ -125,12 +122,9 @@ class ComposeActivityTest { val dbMock = mock(AppDatabase::class.java) `when`(dbMock.instanceDao()).thenReturn(instanceDaoMock) - themeUtilsMock = Mockito.mock(ThemeUtils::class.java) - activity.mastodonApi = apiMock activity.accountManager = accountManagerMock activity.database = dbMock - activity.themeUtils = themeUtilsMock `when`(accountManagerMock.activeAccount).thenReturn(account) @@ -185,7 +179,7 @@ class ComposeActivityTest { fun whenTextContainsNoUrl_everyCharacterIsCounted() { val content = "This is test content please ignore thx " insertSomeTextInContent(content) - Assert.assertEquals(activity.calculateTextLength(), content.length) + assertEquals(activity.calculateTextLength(), content.length) } @Test @@ -193,7 +187,7 @@ class ComposeActivityTest { val url = "https://www.google.dk/search?biw=1920&bih=990&tbm=isch&sa=1&ei=bmDrWuOoKMv6kwWOkIaoDQ&q=indiana+jones+i+hate+snakes+animated&oq=indiana+jones+i+hate+snakes+animated&gs_l=psy-ab.3...54174.55443.0.55553.9.7.0.0.0.0.255.333.1j0j1.2.0....0...1c.1.64.psy-ab..7.0.0....0.40G-kcDkC6A#imgdii=PSp15hQjN1JqvM:&imgrc=H0hyE2JW5wrpBM:" val additionalContent = "Check out this @image #search result: " insertSomeTextInContent(additionalContent + url) - Assert.assertEquals(activity.calculateTextLength(), additionalContent.length + ComposeActivity.MAXIMUM_URL_LENGTH) + assertEquals(activity.calculateTextLength(), additionalContent.length + ComposeActivity.MAXIMUM_URL_LENGTH) } @Test diff --git a/app/src/test/java/com/keylesspalace/tusky/FakeTuskyApplication.kt b/app/src/test/java/com/keylesspalace/tusky/FakeTuskyApplication.kt index c99effea7..640f6826b 100644 --- a/app/src/test/java/com/keylesspalace/tusky/FakeTuskyApplication.kt +++ b/app/src/test/java/com/keylesspalace/tusky/FakeTuskyApplication.kt @@ -16,6 +16,10 @@ class FakeTuskyApplication : TuskyApplication() { // No-op } + override fun initNightMode() { + // No-op + } + override fun getServiceLocator(): ServiceLocator { return locator } diff --git a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt index 704586442..2e627d965 100644 --- a/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/FilterTest.kt @@ -37,7 +37,6 @@ class FilterTest { val activity = controller.get() activity.accountManager = mock() - activity.themeUtils = mock() val apiMock = Mockito.mock(MastodonApi::class.java) Mockito.`when`(apiMock.getFilters()).thenReturn(object: Call> { override fun isExecuted(): Boolean { diff --git a/build.gradle b/build.gradle index 98df4e943..c77e27fa4 100644 --- a/build.gradle +++ b/build.gradle @@ -7,8 +7,8 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta06' - classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta07' + classpath 'com.android.tools.build:gradle:3.5.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } From 5c15f9d12e9d073ec1a8f0dc9b363c21ffc88df1 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 3 Oct 2019 12:40:38 +0000 Subject: [PATCH 03/86] Translated using Weblate (Polish) Currently translated at 100.0% (7 of 7 strings) Translation: Tusky/Tusky-app Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/pl/ --- fastlane/metadata/android/pl/changelogs/68.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 fastlane/metadata/android/pl/changelogs/68.txt diff --git a/fastlane/metadata/android/pl/changelogs/68.txt b/fastlane/metadata/android/pl/changelogs/68.txt new file mode 100644 index 000000000..fc217ee14 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/68.txt @@ -0,0 +1,3 @@ +Tusky v9.1 + +Ta aktualizacja zapewnia kompatybilność z Mastodonem 3 i poprawia szybkość i stabilność aplikacji. From 39331d77b89e6870ff5a5eb8760147af830f4113 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 3 Oct 2019 21:11:19 +0200 Subject: [PATCH 04/86] fix follow message being cut off with large font (#1519) --- app/src/main/res/layout/item_follow.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/item_follow.xml b/app/src/main/res/layout/item_follow.xml index 1af4f06c9..bed3795e0 100644 --- a/app/src/main/res/layout/item_follow.xml +++ b/app/src/main/res/layout/item_follow.xml @@ -36,8 +36,9 @@ android:contentDescription="@string/action_view_profile" android:scaleType="centerCrop" android:textSize="?attr/status_text_medium" + app:layout_constraintBottom_toBottomOf="@id/notification_username" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/notification_text" + app:layout_constraintTop_toTopOf="@id/notification_display_name" tools:src="@drawable/avatar_default" /> From f0a2dd4c6aae3ff7fef25f76100f2214670c1596 Mon Sep 17 00:00:00 2001 From: Mostafa Ahangarha Date: Sat, 5 Oct 2019 10:08:00 +0330 Subject: [PATCH 05/86] Added URL for translation in README.md (#1509) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0df8ae3ce..840e80eaa 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ The nightly build from master is [available on Google Play](https://play.google. If you have any bug reports, feature requests or questions please open an issue or send us a toot at [Tusky@mastodon.social](https://mastodon.social/@Tusky)! +For translating Tusky into your language, visit https://weblate.tusky.app/ + ### Head of development This app was developed by [Vavassor@mastodon.social](https://mastodon.social/@Vavassor). From 1e0515f4abc615485809c39e8b6b4967e8db6bf0 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Thu, 10 Oct 2019 18:43:48 +0200 Subject: [PATCH 06/86] fix avatars with non-square aspect ratio display (#1528) --- .../com/keylesspalace/tusky/util/ImageLoadingHelper.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ImageLoadingHelper.kt b/app/src/main/java/com/keylesspalace/tusky/util/ImageLoadingHelper.kt index 77a765a1e..1ab3e3747 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/ImageLoadingHelper.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/ImageLoadingHelper.kt @@ -5,12 +5,12 @@ package com.keylesspalace.tusky.util import android.widget.ImageView import androidx.annotation.Px import com.bumptech.glide.Glide -import com.bumptech.glide.load.resource.bitmap.FitCenter +import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.keylesspalace.tusky.R -private val fitCenterTransformation = FitCenter() +private val centerCropTransformation = CenterCrop() fun loadAvatar(url: String?, imageView: ImageView, @Px radius: Int, animate: Boolean) { @@ -23,7 +23,7 @@ fun loadAvatar(url: String?, imageView: ImageView, @Px radius: Int, animate: Boo Glide.with(imageView) .load(url) .transform( - fitCenterTransformation, + centerCropTransformation, RoundedCorners(radius) ) .placeholder(R.drawable.avatar_default) @@ -34,7 +34,7 @@ fun loadAvatar(url: String?, imageView: ImageView, @Px radius: Int, animate: Boo .asBitmap() .load(url) .transform( - fitCenterTransformation, + centerCropTransformation, RoundedCorners(radius) ) .placeholder(R.drawable.avatar_default) From 53523674d2890851a29c77ed9d27488e1a78d846 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 10 Oct 2019 16:43:55 +0000 Subject: [PATCH 07/86] Translated using Weblate (Slovenian) Currently translated at 99.5% (399 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/sl/ Translated using Weblate (English (Australia)) Currently translated at 99.3% (398 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/en_AU/ Translated using Weblate (Russian) Currently translated at 100.0% (401 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ru/ --- app/src/main/res/values-en-rAU/strings.xml | 49 +++++++++++++++++++++- app/src/main/res/values-ru/strings.xml | 8 +++- app/src/main/res/values-sl/strings.xml | 6 ++- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml index a6b3daec9..e0ec75b67 100644 --- a/app/src/main/res/values-en-rAU/strings.xml +++ b/app/src/main/res/values-en-rAU/strings.xml @@ -1,2 +1,47 @@ - - \ No newline at end of file + +Login with Mastodon + What\'s an instance\? + + Favourites + Drafts + Log Out + Preferences + Account Preferences + Edit profile + Search + About + Lists + Lists + An error occurred. + A network error occurred! Please check your connection and try again! + This cannot be empty. + Invalid domain entered + Failed authenticating with that instance. + Couldn\'t find a web browser to use. + An unidentified authorisation error occurred. + Authorisation was denied. + Failed getting a login token. + The status is too long! + The file must be less than 8MB. + Video files must be less than 40MB. + That type of file cannot be uploaded. + That file could not be opened. + Permission to read media is required. + Permission to store media is required. + Images and videos cannot both be attached to the same status. + The upload failed. + Error sending toot. + + Home + Notifications + Local + Federated + Direct Messages + Tabs + Toot + Posts + With replies + Pinned + Follows + Followers + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 218373dad..896ebd5d3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -540,4 +540,10 @@ Вариант %d Изменить - +Отложенные записи + Изменить + Отложенные записи + Отложить запись + Сброс + Нажмите для выбора времени отправки. + diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 9f798f20f..5429d458b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -518,4 +518,8 @@ Izbira %d Uredi - +Načrtovani tuti + Uredi + Načrtovani tuti + Ponastavi + From 5ab141b1ca4c06644e2945fe7f40dfe49ad5529a Mon Sep 17 00:00:00 2001 From: Juanjo Salvador Date: Thu, 10 Oct 2019 16:43:56 +0000 Subject: [PATCH 08/86] Translated using Weblate (Spanish) Currently translated at 100.0% (401 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/es/ --- app/src/main/res/values-es/strings.xml | 30 +++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ee81a1706..8f36f190e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -18,14 +18,14 @@ Se requiere permiso para descargar al almacenamiento. No se pueden adjuntar imágenes y vídeos en el mismo estado. La subida falló. - Error al publicar. + Error al enviar estado. Inicio Notificaciones Local Federada Mensajes Directos Pestañas - Publicación + Estado #%s Estados Con respuestas @@ -50,8 +50,8 @@ Ocultar Nada aquí. Nada por aquí. ¡Arrastra hacia abajo para recargar! - %s impulsó tu toot - %s marcó como favorito tu post + %s impulsó tu estado + %s marcó como favorito tu estado %s te siguió Reportar @%s ¿Información adicional? @@ -61,7 +61,7 @@ Favorito Más Redactar - Iniciar sesión + Iniciar sesión con Mastodon Cerrar sesión ¿Seguro que quiere cerrar la sesión de %1$s? Seguir @@ -110,7 +110,7 @@ Abrir como %s Compartir como… Compartir URL… - Compartir contenido… + Compartir estado… Compartir medios a… ¡Enviado! El usuario ya no está bloqueado @@ -143,7 +143,7 @@ Descargar ¿Cancelar petición de amistad? ¿Dejar de seguir esta cuenta? - ¿Eliminar este toot? + ¿Eliminar este estado\? Público: Mostrar en historias públicas Oculto: No mostrar en historias públicas Privado: Sólo visible para seguidores @@ -260,8 +260,8 @@ Tendrá que admitir los seguidores manualmente ¿Guardar borrador? Enviando estado… - Error enviando estado - Enviando estado + Error al enviar el estado + Enviando estados Envío cancelado Una copia del estado se ha guardado en borradores Redactar @@ -370,7 +370,7 @@ Descargando contenido - ¿Borrar y devolver a borradores este toot\? + ¿Borrar y devolver a borradores este estado\? encuestas que han terminado Notificaciones sobre encuestas que han terminado @@ -445,7 +445,7 @@ La cuenta es de otro servidor. ¿Enviar una copia anónima del reporte\? Mostrar filtro de notificaciones -Mostrar siempre toots marcados con avisos de contenido +Mostrar siempre estados marcados con avisos de contenido Cuentas Error al buscar @@ -463,4 +463,10 @@ Opción %d Editar - +Estados programados + Editar + Estados programados + Programar estado + Reiniciar + Pulsa aquí para configurar un estado programado. + From 565c59c9d2fa72183eb885248417b04cfe36700c Mon Sep 17 00:00:00 2001 From: Vegard Skjefstad Date: Thu, 10 Oct 2019 16:43:56 +0000 Subject: [PATCH 09/86] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (401 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/nb_NO/ --- app/src/main/res/values-no-rNB/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index c19485f53..b7fbaed13 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -504,4 +504,10 @@ Valg %d Endre - +Planlagte toots + Rediger + Planlagte toots + Planlegg toot + Tilbakestill + Klikk her for å konfigurere planlagt toot. + From 5819e2de7ba17fd164766d687a0258c9eb808874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Thu, 10 Oct 2019 16:43:56 +0000 Subject: [PATCH 10/86] Translated using Weblate (Occitan) Currently translated at 100.0% (401 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/oc/ --- app/src/main/res/values-oc/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 04b46c24d..292b8ec5d 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -474,4 +474,10 @@ Opcion %d Modificar - +Tuts planificats + Modificar + Tuts planificats + Planificar de tuts + Escafar + Tocatz aquí per configurar los tuts planificats. + From 1e7afb3ac3949203aea320a6812f795c5980d805 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 10 Oct 2019 16:43:56 +0000 Subject: [PATCH 11/86] Translated using Weblate (English (Australia)) Currently translated at 99.3% (398 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/en_AU/ --- app/src/main/res/values-en-rAU/strings.xml | 455 ++++++++++++++++++++- 1 file changed, 454 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml index e0ec75b67..9ba69cca0 100644 --- a/app/src/main/res/values-en-rAU/strings.xml +++ b/app/src/main/res/values-en-rAU/strings.xml @@ -44,4 +44,457 @@ Pinned Follows Followers - + Muted users + Blocked users + Hidden domains + Follow Requests + Edit your profile + Scheduled toots + Licenses + + %s boosted + Sensitive content + Media hidden + Show More + Show Less + Expand + Collapse + + Nothing here. + Nothing here. Pull down to refresh! + + %s boosted your toot + %s favourited your toot + %s followed you + + Report @%s + Additional comments\? + + Quick Reply + Reply + Boost + Remove boost + Favourite + Remove favourite + More + Compose + Are you sure you want to log out of the account %1$s\? + Follow + Unfollow + Block + Unblock + Hide boosts + Show boosts + Report + Edit + Delete + Delete and re-draft + TOOT + TOOT! + Retry + Close + Profile + Favourites + Muted users + Blocked users + Hidden domains + Follow Requests + Media + Open in browser + Add media + Add poll + Take photo + Share + Mute + Unmute + Mute %s + Mention + Hide media + Open drawer + Save + Edit + Undo + Accept + Reject + Drafts + Scheduled toots + Toot visibility + Content warning + Emoji keyboard + Schedule Toot + Reset + Add Tab + Links + Mentions + Hashtags + Open boost author + Show boosts + Show favourites + + Hashtags + Mentions + Links + Open media #%d + + Downloading %1$s + + Copy the link + Open as %s + Share as … + Download media + Downloading media + + Share toot URL to… + Share toot to… + Share media to… + + Sent! + User unblocked + User unmuted + %s unhidden + + Sent! + Reply sent successfully. + + Which instance\? + What\'s happening\? + Tap here to configure scheduled toot. + Content warning + Display name + Bio + Search… + + No results + + Reply… + Avatar + Header + + Connecting… + + The address or domain of any instance can be entered here, such as mastodon.social, icosahedron.website, social.tchncs.de, and more! +\n +\nIf you don\'t yet have an account, you can enter the name of the instance you\'d like to join and create an account there. +\n +\nAn instance is a single place where your account is hosted, but you can easily communicate with and follow folks on other instances as though you were on the same site. +\n +\nMore info can be found at joinmastodon.org. + Finishing Media Upload + Uploading… + Download + Revoke the follow request\? + Unfollow this account\? + Delete this toot\? + Delete and re-draft this toot\? + Are you sure you want to block all of %s\? You will not see content from that domain in any public timelines or in your notifications. Your followers from that domain will be removed. + Hide entire domain + + Public: Post to public timelines + Unlisted: Do not show in public timelines + Followers-Only: Post to followers only + Direct: Post to mentioned users only + + Notifications + Notifications + Alerts + Notify with a sound + Notify with vibration + Notify with light + Notify me when + mentioned + followed + my posts are boosted + my posts are favourited + polls have ended + Appearance + App Theme + Timelines + Filters + + Dark + Light + Black + Automatic at sunset + Use System Design + + Browser + Use Chrome Custom Tabs + Hide compose button while scrolling + Language + Show indicator for bots + Animate GIF avatars + + Timeline filtering + Tabs + Show boosts + Show replies + Download media previews + Proxy + HTTP proxy + Enable HTTP proxy + HTTP proxy server + HTTP proxy port + + Default post privacy + Always mark media as sensitive + Publishing (synced with server) + Failed to sync settings + + Public + Unlisted + Followers-only + + Status text size + + Smallest + Small + Medium + Large + Largest + + New Mentions + Notifications about new mentions + New Followers + Notifications about new followers + Boosts + Notifications when your toots get boosted + Favourites + Notifications when your toots get marked as favourite + Polls + Notifications about polls that have ended + + + %s mentioned you + %1$s, %2$s, %3$s and %4$d others + %1$s, %2$s, and %3$s + %1$s and %2$s + %d new interactions + + Locked Account + + Tusky %s + Tusky is free and open-source software. It is licensed under the GNU General Public License Version 3. You can view the license here: https://www.gnu.org/licenses/gpl-3.0.en.html + Project website: +\n https://tusky.app + Bug reports & feature requests: +\n https://github.com/tuskyapp/Tusky/issues + Tusky\'s Profile + + Share content of toot + Share link to toot + Images + Video + + Follow requested + + no content + + in %dy + in %dd + in %dh + in %dm + in %ds + %dy + %dd + %dh + %dm + %ds + + Follows you + Always show sensitive content + Always expand toots marked with content warnings + Media + Replying to @%s + load more + + Public timelines + Conversations + Add filter + Edit filter + Remove + Update + Whole word + When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word + Phrase to filter + + Add Account + Add new Mastodon Account + + List timeline + Could not create list + Could not rename list + Could not delete list + Create a list + Rename the list + Delete the list + Edit the list + Search for people you follow + Add account to the list + Remove account from the list + + Posting with account %1$s + + Failed to set caption + Describe for visually impaired +\n(%d character limit) + Set caption + Remove + Lock account + Requires you to manually approve followers + Save draft\? + Sending Toot… + Error sending toot + Sending Toots + Sending cancelled + A copy of the toot has been saved to your drafts + Compose + + Your instance %s does not have any custom emojis + Copied to clipboard + Emoji style + System default + You\'ll need to download these emoji sets first + Performing lookup… + Expand/Collapse all statuses + Open toot + App restart required + You\'ll need to restart Tusky in order to apply these changes + Later + Restart + Your device\'s default emoji set + The Blob emojis known from Android 4.4–7.1 + Mastodon\'s standard emoji set + Google\'s current emoji set + + Download failed + + Bot + %1$s has moved to: + + Boost to original audience + Unboost + + Tusky contains code and assets from the following open source projects: + Licensed under the Apache License (copy below) + CC-BY 4.0 + CC-BY-SA 4.0 + + Profile metadata + add data + Label + Content + + Use absolute time + + Information below may reflect the user\'s profile incompletely. Press to open full profile in browser. + + Unpin + Pin + + + %1$s Favourite + %1$s Favourites + + + + %s Boost + %s Boosts + + + Boosted by + Favourited by + + %1$s + %1$s and %2$s + %1$s, %2$s and %3$d more + maximum of %1$d tabs reached + + + Media: %s + Content warning: %s + No description + Reblogged + Favourited + Public + Unlisted + Followers + Direct + Poll with choices: %1$s, %2$s, %3$s, %4$s; %5$s + + List name + + Edit hashtag + Hashtag without # + Hashtag + Clear + Filter + Apply + + Compose Toot + Compose + + Are you sure you want to permanently clear all your notifications\? + Actions for image %s + + %1$s • %2$s + + %s vote + %s votes + + %s left + ends at %s + closed + <b>%1$d%%</b> %2$s + + Vote + + A poll you have voted in has ended + A poll you created has ended + + + %d day + %d days + + + %d hour + %d hours + + + %d minute + %d minutes + + + %d second + %d seconds + + + Continue + Back + Done + Successfully reported @%s + Additional comments + Forward to %s + Failed to report + Failed to fetch statuses + The report will be sent to your server moderator. You can provide an explanation of why you are reporting this account below: + The account is from another server. Send an anonymised copy of the report there as well\? + Accounts + Failed to search + + Show Notifications filter + + + Poll + 5 minutes + 30 minutes + 1 hour + 6 hours + 1 day + 3 days + 7 days + Add choice + Multiple choices + Choice %d + Edit + + From 47eed59f33bc8541df058700c6addb00458e48e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Gera?= Date: Thu, 10 Oct 2019 16:43:56 +0000 Subject: [PATCH 12/86] Translated using Weblate (Hungarian) Currently translated at 100.0% (401 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/hu/ --- app/src/main/res/values-hu/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index bb036b679..de72540d7 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -467,4 +467,10 @@ Válasz %d Szerkesztés - +Időzített tülkök + Szerkesztés + Időzített tülkök + Tülk Időzítése + Visszaállítás + Ide nyúlj az időzített tülkök beállításához. + From ab32ef6e2938e5b09a1cb728b9889df4a0903abb Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Thu, 10 Oct 2019 16:43:56 +0000 Subject: [PATCH 13/86] Translated using Weblate (Arabic) Currently translated at 100.0% (401 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/ar/ --- app/src/main/res/values-ar/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ba1c52861..1e00fead7 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -483,4 +483,12 @@ عندما تكون الكلمة أو العبارة أبجدية رقمية فقط ، فلن يتم تطبيقها إلا إذا كانت مطابقة للكلمة بأكملها %1$s • %2$s + التبويقات المبَرمَجة + تعديل + التبويقات المبَرمَجة + برمجة تبويق + صفّر + اضغط هنا لضبط برمجة التبويق. + <b>%1$d%%</b> %2$s + From 342946175ad4553a08dae05af0745af2aa51c388 Mon Sep 17 00:00:00 2001 From: knuxify Date: Thu, 10 Oct 2019 16:43:56 +0000 Subject: [PATCH 14/86] Translated using Weblate (Polish) Currently translated at 100.0% (401 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ --- app/src/main/res/values-pl/strings.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 272c3a9da..055f2f995 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -481,4 +481,10 @@ Opcja %d Edytuj - +Zaplanowane wpisy + Edytuj + Zaplanowane wpisy + Zaplanuj wpis + Resetuj + Dotknij tutaj, żeby skonfigurować zaplanowany wpis. + From 27cb9aed549447ce470fc1f1764a97dc057dddeb Mon Sep 17 00:00:00 2001 From: Mickson Date: Thu, 10 Oct 2019 16:43:56 +0000 Subject: [PATCH 15/86] Translated using Weblate (Polish) Currently translated at 100.0% (401 of 401 strings) Translation: Tusky/Tusky Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/pl/ --- app/src/main/res/values-pl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 055f2f995..eb23d2e7f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -291,7 +291,7 @@ #%s Ukryte domeny \@%s - Usuń podbicie + Cofnij podbicie Ukryte domeny Dodaj głosowanie Wycisz %s From 7d4cc59c596be91b8e18b9fb832dc1e6555bff9b Mon Sep 17 00:00:00 2001 From: Connyduck Date: Thu, 10 Oct 2019 21:11:37 +0000 Subject: [PATCH 16/86] Deleted translation using Weblate (English (Australia)) --- app/src/main/res/values-en-rAU/strings.xml | 500 --------------------- 1 file changed, 500 deletions(-) delete mode 100644 app/src/main/res/values-en-rAU/strings.xml diff --git a/app/src/main/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml deleted file mode 100644 index 9ba69cca0..000000000 --- a/app/src/main/res/values-en-rAU/strings.xml +++ /dev/null @@ -1,500 +0,0 @@ - -Login with Mastodon - What\'s an instance\? - - Favourites - Drafts - Log Out - Preferences - Account Preferences - Edit profile - Search - About - Lists - Lists - An error occurred. - A network error occurred! Please check your connection and try again! - This cannot be empty. - Invalid domain entered - Failed authenticating with that instance. - Couldn\'t find a web browser to use. - An unidentified authorisation error occurred. - Authorisation was denied. - Failed getting a login token. - The status is too long! - The file must be less than 8MB. - Video files must be less than 40MB. - That type of file cannot be uploaded. - That file could not be opened. - Permission to read media is required. - Permission to store media is required. - Images and videos cannot both be attached to the same status. - The upload failed. - Error sending toot. - - Home - Notifications - Local - Federated - Direct Messages - Tabs - Toot - Posts - With replies - Pinned - Follows - Followers - Muted users - Blocked users - Hidden domains - Follow Requests - Edit your profile - Scheduled toots - Licenses - - %s boosted - Sensitive content - Media hidden - Show More - Show Less - Expand - Collapse - - Nothing here. - Nothing here. Pull down to refresh! - - %s boosted your toot - %s favourited your toot - %s followed you - - Report @%s - Additional comments\? - - Quick Reply - Reply - Boost - Remove boost - Favourite - Remove favourite - More - Compose - Are you sure you want to log out of the account %1$s\? - Follow - Unfollow - Block - Unblock - Hide boosts - Show boosts - Report - Edit - Delete - Delete and re-draft - TOOT - TOOT! - Retry - Close - Profile - Favourites - Muted users - Blocked users - Hidden domains - Follow Requests - Media - Open in browser - Add media - Add poll - Take photo - Share - Mute - Unmute - Mute %s - Mention - Hide media - Open drawer - Save - Edit - Undo - Accept - Reject - Drafts - Scheduled toots - Toot visibility - Content warning - Emoji keyboard - Schedule Toot - Reset - Add Tab - Links - Mentions - Hashtags - Open boost author - Show boosts - Show favourites - - Hashtags - Mentions - Links - Open media #%d - - Downloading %1$s - - Copy the link - Open as %s - Share as … - Download media - Downloading media - - Share toot URL to… - Share toot to… - Share media to… - - Sent! - User unblocked - User unmuted - %s unhidden - - Sent! - Reply sent successfully. - - Which instance\? - What\'s happening\? - Tap here to configure scheduled toot. - Content warning - Display name - Bio - Search… - - No results - - Reply… - Avatar - Header - - Connecting… - - The address or domain of any instance can be entered here, such as mastodon.social, icosahedron.website, social.tchncs.de, and more! -\n -\nIf you don\'t yet have an account, you can enter the name of the instance you\'d like to join and create an account there. -\n -\nAn instance is a single place where your account is hosted, but you can easily communicate with and follow folks on other instances as though you were on the same site. -\n -\nMore info can be found at joinmastodon.org. - Finishing Media Upload - Uploading… - Download - Revoke the follow request\? - Unfollow this account\? - Delete this toot\? - Delete and re-draft this toot\? - Are you sure you want to block all of %s\? You will not see content from that domain in any public timelines or in your notifications. Your followers from that domain will be removed. - Hide entire domain - - Public: Post to public timelines - Unlisted: Do not show in public timelines - Followers-Only: Post to followers only - Direct: Post to mentioned users only - - Notifications - Notifications - Alerts - Notify with a sound - Notify with vibration - Notify with light - Notify me when - mentioned - followed - my posts are boosted - my posts are favourited - polls have ended - Appearance - App Theme - Timelines - Filters - - Dark - Light - Black - Automatic at sunset - Use System Design - - Browser - Use Chrome Custom Tabs - Hide compose button while scrolling - Language - Show indicator for bots - Animate GIF avatars - - Timeline filtering - Tabs - Show boosts - Show replies - Download media previews - Proxy - HTTP proxy - Enable HTTP proxy - HTTP proxy server - HTTP proxy port - - Default post privacy - Always mark media as sensitive - Publishing (synced with server) - Failed to sync settings - - Public - Unlisted - Followers-only - - Status text size - - Smallest - Small - Medium - Large - Largest - - New Mentions - Notifications about new mentions - New Followers - Notifications about new followers - Boosts - Notifications when your toots get boosted - Favourites - Notifications when your toots get marked as favourite - Polls - Notifications about polls that have ended - - - %s mentioned you - %1$s, %2$s, %3$s and %4$d others - %1$s, %2$s, and %3$s - %1$s and %2$s - %d new interactions - - Locked Account - - Tusky %s - Tusky is free and open-source software. It is licensed under the GNU General Public License Version 3. You can view the license here: https://www.gnu.org/licenses/gpl-3.0.en.html - Project website: -\n https://tusky.app - Bug reports & feature requests: -\n https://github.com/tuskyapp/Tusky/issues - Tusky\'s Profile - - Share content of toot - Share link to toot - Images - Video - - Follow requested - - no content - - in %dy - in %dd - in %dh - in %dm - in %ds - %dy - %dd - %dh - %dm - %ds - - Follows you - Always show sensitive content - Always expand toots marked with content warnings - Media - Replying to @%s - load more - - Public timelines - Conversations - Add filter - Edit filter - Remove - Update - Whole word - When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word - Phrase to filter - - Add Account - Add new Mastodon Account - - List timeline - Could not create list - Could not rename list - Could not delete list - Create a list - Rename the list - Delete the list - Edit the list - Search for people you follow - Add account to the list - Remove account from the list - - Posting with account %1$s - - Failed to set caption - Describe for visually impaired -\n(%d character limit) - Set caption - Remove - Lock account - Requires you to manually approve followers - Save draft\? - Sending Toot… - Error sending toot - Sending Toots - Sending cancelled - A copy of the toot has been saved to your drafts - Compose - - Your instance %s does not have any custom emojis - Copied to clipboard - Emoji style - System default - You\'ll need to download these emoji sets first - Performing lookup… - Expand/Collapse all statuses - Open toot - App restart required - You\'ll need to restart Tusky in order to apply these changes - Later - Restart - Your device\'s default emoji set - The Blob emojis known from Android 4.4–7.1 - Mastodon\'s standard emoji set - Google\'s current emoji set - - Download failed - - Bot - %1$s has moved to: - - Boost to original audience - Unboost - - Tusky contains code and assets from the following open source projects: - Licensed under the Apache License (copy below) - CC-BY 4.0 - CC-BY-SA 4.0 - - Profile metadata - add data - Label - Content - - Use absolute time - - Information below may reflect the user\'s profile incompletely. Press to open full profile in browser. - - Unpin - Pin - - - %1$s Favourite - %1$s Favourites - - - - %s Boost - %s Boosts - - - Boosted by - Favourited by - - %1$s - %1$s and %2$s - %1$s, %2$s and %3$d more - maximum of %1$d tabs reached - - - Media: %s - Content warning: %s - No description - Reblogged - Favourited - Public - Unlisted - Followers - Direct - Poll with choices: %1$s, %2$s, %3$s, %4$s; %5$s - - List name - - Edit hashtag - Hashtag without # - Hashtag - Clear - Filter - Apply - - Compose Toot - Compose - - Are you sure you want to permanently clear all your notifications\? - Actions for image %s - - %1$s • %2$s - - %s vote - %s votes - - %s left - ends at %s - closed - <b>%1$d%%</b> %2$s - - Vote - - A poll you have voted in has ended - A poll you created has ended - - - %d day - %d days - - - %d hour - %d hours - - - %d minute - %d minutes - - - %d second - %d seconds - - - Continue - Back - Done - Successfully reported @%s - Additional comments - Forward to %s - Failed to report - Failed to fetch statuses - The report will be sent to your server moderator. You can provide an explanation of why you are reporting this account below: - The account is from another server. Send an anonymised copy of the report there as well\? - Accounts - Failed to search - - Show Notifications filter - - - Poll - 5 minutes - 30 minutes - 1 hour - 6 hours - 1 day - 3 days - 7 days - Add choice - Multiple choices - Choice %d - Edit - - From a308b4c139399623d1e2bdf7f2b101f36427cf90 Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Fri, 11 Oct 2019 17:35:22 +0200 Subject: [PATCH 17/86] Don't interpret html inside poll options. (#1527) * Don't interpret html inside poll options. Closes #1362 * Update translations * Mark poll_percent_format as untranslatable --- .../com/keylesspalace/tusky/adapter/PollAdapter.kt | 6 ++---- .../tusky/adapter/StatusBaseViewHolder.java | 7 +++---- .../keylesspalace/tusky/util/NotificationHelper.java | 8 +++++--- .../com/keylesspalace/tusky/util/StatusViewHelper.kt | 5 +++-- .../com/keylesspalace/tusky/viewdata/PollViewData.kt | 11 +++++++++++ app/src/main/res/values-bn-rIN/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 2 -- app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-no-rNB/strings.xml | 1 - app/src/main/res/values-oc/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 3 --- app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 3 --- app/src/main/res/values-zh-rHK/strings.xml | 5 +---- app/src/main/res/values-zh-rMO/strings.xml | 5 +---- app/src/main/res/values-zh-rSG/strings.xml | 3 --- app/src/main/res/values-zh-rTW/strings.xml | 5 +---- app/src/main/res/values/donottranslate.xml | 2 +- app/src/main/res/values/strings.xml | 2 -- 29 files changed, 28 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt index adfc681f8..0adc0c371 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt @@ -29,6 +29,7 @@ import com.keylesspalace.tusky.util.CustomEmojiHelper import com.keylesspalace.tusky.util.HtmlUtils import com.keylesspalace.tusky.util.visible import com.keylesspalace.tusky.viewdata.PollOptionViewData +import com.keylesspalace.tusky.viewdata.buildDescription import com.keylesspalace.tusky.viewdata.calculatePercent class PollAdapter: RecyclerView.Adapter() { @@ -71,10 +72,7 @@ class PollAdapter: RecyclerView.Adapter() { when(mode) { RESULT -> { val percent = calculatePercent(option.votesCount, voteCount) - - val pollOptionText = holder.resultTextView.context.getString(R.string.poll_option_format, percent, option.title) - - val emojifiedPollOptionText = CustomEmojiHelper.emojifyText(HtmlUtils.fromHtml(pollOptionText), emojis, holder.resultTextView) + val emojifiedPollOptionText = CustomEmojiHelper.emojifyText(buildDescription(option.title, percent, holder.resultTextView.context), emojis, holder.resultTextView) holder.resultTextView.text = EmojiCompat.get().process(emojifiedPollOptionText) val level = percent * 100 diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index 5a082cfe1..1d9789758 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -52,6 +52,8 @@ import at.connyduck.sparkbutton.SparkButton; import at.connyduck.sparkbutton.SparkEventListener; import kotlin.collections.CollectionsKt; +import static com.keylesspalace.tusky.viewdata.PollViewDataKt.buildDescription; + public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { public static class Key { public static final String KEY_CREATED = "created"; @@ -775,10 +777,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder { for (int i = 0; i < args.length; i++) { if (i < options.size()) { int percent = PollViewDataKt.calculatePercent(options.get(i).getVotesCount(), poll.getVotesCount()); - args[i] = HtmlUtils.fromHtml(context.getString( - R.string.poll_option_format, - percent, - options.get(i).getTitle())); + args[i] = buildDescription(options.get(i).getTitle(), percent, context); } else { args[i] = ""; } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java b/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java index 805079a7a..39f19c30a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java +++ b/app/src/main/java/com/keylesspalace/tusky/util/NotificationHelper.java @@ -69,6 +69,8 @@ import java.util.concurrent.ExecutionException; import io.reactivex.Single; import io.reactivex.schedulers.Schedulers; +import static com.keylesspalace.tusky.viewdata.PollViewDataKt.buildDescription; + public class NotificationHelper { private static int notificationId = 0; @@ -627,9 +629,9 @@ public class NotificationHelper { builder.append('\n'); Poll poll = notification.getStatus().getPoll(); for(PollOption option: poll.getOptions()) { - int percent = PollViewDataKt.calculatePercent(option.getVotesCount(), poll.getVotesCount()); - CharSequence optionText = HtmlUtils.fromHtml(context.getString(R.string.poll_option_format, percent, option.getTitle())); - builder.append(optionText); + builder.append(buildDescription(option.getTitle(), + PollViewDataKt.calculatePercent(option.getVotesCount(), poll.getVotesCount()), + context)); builder.append('\n'); } return builder.toString(); diff --git a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt index fc0b7c9d2..85e89802a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt @@ -30,6 +30,7 @@ import com.keylesspalace.tusky.entity.Emoji import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.view.MediaPreviewImageView import com.keylesspalace.tusky.viewdata.PollViewData +import com.keylesspalace.tusky.viewdata.buildDescription import com.keylesspalace.tusky.viewdata.calculatePercent import java.text.NumberFormat import java.text.SimpleDateFormat @@ -283,8 +284,8 @@ class StatusViewHelper(private val itemView: View) { if (i < options.size) { val percent = calculatePercent(options[i].votesCount, poll.votesCount) - val pollOptionText = pollResults[i].context.getString(R.string.poll_option_format, percent, options[i].title) - pollResults[i].text = CustomEmojiHelper.emojifyText(HtmlUtils.fromHtml(pollOptionText), emojis, pollResults[i]) + val pollOptionText = buildDescription(options[i].title, percent, pollResults[i].context) + pollResults[i].text = CustomEmojiHelper.emojifyText(pollOptionText, emojis, pollResults[i]) pollResults[i].visibility = View.VISIBLE val level = percent * 100 diff --git a/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt b/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt index 3b893f8b0..dff0c9f60 100644 --- a/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt +++ b/app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt @@ -15,8 +15,13 @@ package com.keylesspalace.tusky.viewdata +import android.content.Context +import android.text.SpannableStringBuilder +import android.text.Spanned +import com.keylesspalace.tusky.R import com.keylesspalace.tusky.entity.Poll import com.keylesspalace.tusky.entity.PollOption +import com.keylesspalace.tusky.util.HtmlUtils import java.util.* import kotlin.math.roundToInt @@ -44,6 +49,12 @@ fun calculatePercent(fraction: Int, total: Int): Int { } } +fun buildDescription(title: String, percent: Int, context: Context): Spanned { + return SpannableStringBuilder(HtmlUtils.fromHtml(context.getString(R.string.poll_percent_format, percent))) + .append(" ") + .append(title) +} + fun Poll?.toViewData(): PollViewData? { if (this == null) return null return PollViewData( diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index e5d857a13..734bb0066 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -440,7 +440,6 @@ %s বাকি %s এ শেষ হবে বন্ধ - <b>%1$d%%</b> %2$s ভোট diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index da6720c72..970feda81 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -465,7 +465,6 @@ Advertència: %s - <b>%1$d%%</b> %2$s Toot fixat Toot no fixat diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d909a3c26..b504e9e29 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -392,7 +392,6 @@ zbývá %s končí v %s uzavřena - <b>%1$d%%</b> %2$s Hlasovat diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 94f753748..10bc414be 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -376,7 +376,6 @@ %s verbleibend endet um %s Geschlossen - <b>%1$d%%</b> %2$s Abstimmen diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index d62aa4286..8583ba322 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -391,7 +391,6 @@ %s restas finiĝos je %s finiĝita - <b>%1$d%%</b> %2$s Voĉdoni diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8f36f190e..d6f9a9b9e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -416,8 +416,6 @@ Abrir autor del impulso Mostrar impulsos - <b>%1$d%%</b> %2$s - Dominios ocultos Dominios ocultos Silenciar %s diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 757a94744..5ad03675f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -421,7 +421,6 @@ Actions pour l’image %s %1$s • %2$s - <b>%1$d%%</b> %2$s Un sondage auquel vous avez participé vient de se terminer diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index de72540d7..ff4828cb8 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -413,7 +413,6 @@ %s maradt vége %s véget ért - <b>%1$d%%</b> %2$s Szavazás diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 05caa435b..8c3d6ded3 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -450,7 +450,6 @@ %s 남음 %s에 종료 마감됨 - %1$d%% %2$s 투표 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index c1dd409df..0d3c744e7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -390,7 +390,6 @@ %s over eindigt op %s gesloten - <b>%1$d%%</b> %2$s Stemmen diff --git a/app/src/main/res/values-no-rNB/strings.xml b/app/src/main/res/values-no-rNB/strings.xml index b7fbaed13..d148b1d7b 100644 --- a/app/src/main/res/values-no-rNB/strings.xml +++ b/app/src/main/res/values-no-rNB/strings.xml @@ -410,7 +410,6 @@ %s igjen avsluttes %s stengt - <b>%1$d%%</b> %2$s Stem diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 292b8ec5d..fa8238a53 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -405,7 +405,6 @@ %1$s • %2$s - <b>%1$d%%</b> %2$s Un sondatge ont avètz votat es acabat Un sondatge qu’avètz creat es acabat diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index eb23d2e7f..b92f1f1cc 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -424,7 +424,6 @@ Zostało %s kończy się %s zakończone - <b>%1$d%%</b> %2$s Głosuj diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5f47f0703..8fa93a55a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -400,7 +400,6 @@ %s restando termina em %s Terminou - <b>%1$d%%</b> %2$s Votar diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 896ebd5d3..04abce13e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -482,9 +482,6 @@ %s завершится %s завершён - - - <b>%1$d%%</b> %2$s Голосовать diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 5429d458b..81781eed0 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -417,7 +417,6 @@ še %s se konča ob %s zaprto - <b>%1$d%%</b> %2$s Glasovanje diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7bc6c2ee2..54cf81b63 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -388,7 +388,6 @@ %s kvar avslutas %s stängd - <b>%1$d%%</b> %2$s Rösta diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 18ff9dd99..943baa514 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -459,9 +459,6 @@ 剩余 %s %s 结束 已结束 - - - <b>%1$d%%</b> %2$s 投票 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 942e5c8c1..bd74cdc51 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -454,10 +454,7 @@ 剩餘 %s %s 結束 已結束 - - - <b>%1$d%%</b> %2$s - + 投票 你參與的投票已結束 diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml index 942e5c8c1..bd74cdc51 100644 --- a/app/src/main/res/values-zh-rMO/strings.xml +++ b/app/src/main/res/values-zh-rMO/strings.xml @@ -454,10 +454,7 @@ 剩餘 %s %s 結束 已結束 - - - <b>%1$d%%</b> %2$s - + 投票 你參與的投票已結束 diff --git a/app/src/main/res/values-zh-rSG/strings.xml b/app/src/main/res/values-zh-rSG/strings.xml index 31d3ce773..c022514b1 100644 --- a/app/src/main/res/values-zh-rSG/strings.xml +++ b/app/src/main/res/values-zh-rSG/strings.xml @@ -459,9 +459,6 @@ 剩余 %s %s 结束 已结束 - - - <b>%1$d%%</b> %2$s 投票 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 81c9263ea..bc4684c38 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -453,10 +453,7 @@ 剩餘 %s %s 結束 已結束 - - - <b>%1$d%%</b> %2$s - + 投票 你參與的投票已結束 diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 103aeffd9..aca83f892 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -138,5 +138,5 @@ 604800 - + <b>%1$d%%</b> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f71993680..a1f78a520 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -484,8 +484,6 @@ %s left ends at %s closed - - <b>%1$d%%</b> %2$s Vote From 44bb1999afa6081901e41309e5227f3ca2766d2b Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Fri, 11 Oct 2019 17:51:47 +0200 Subject: [PATCH 18/86] When opening a post via "Open As", if post lookup from the target instance fails, display an error instead of opening the post in the browser. (#1531) Addresses #1526 --- .../tusky/BottomSheetActivity.kt | 19 ++++++++++++++++--- .../com/keylesspalace/tusky/MainActivity.java | 2 +- .../tusky/fragment/SFragment.java | 3 ++- app/src/main/res/values/strings.xml | 1 + .../tusky/BottomSheetActivityTest.kt | 15 +++++++++++++++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/BottomSheetActivity.kt b/app/src/main/java/com/keylesspalace/tusky/BottomSheetActivity.kt index e370ec70a..c7389e323 100644 --- a/app/src/main/java/com/keylesspalace/tusky/BottomSheetActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/BottomSheetActivity.kt @@ -19,6 +19,7 @@ import android.content.Intent import android.os.Bundle import android.view.View import android.widget.LinearLayout +import android.widget.Toast import androidx.annotation.VisibleForTesting import androidx.lifecycle.Lifecycle import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -62,7 +63,7 @@ abstract class BottomSheetActivity : BaseActivity() { } - open fun viewUrl(url: String) { + open fun viewUrl(url: String, lookupFallbackBehavior: PostLookupFallbackBehavior = PostLookupFallbackBehavior.OPEN_IN_BROWSER) { if (!looksLikeMastodonUrl(url)) { openLink(url) return @@ -88,11 +89,11 @@ abstract class BottomSheetActivity : BaseActivity() { return@subscribe } - openLink(url) + performUrlFallbackAction(url, lookupFallbackBehavior) }, { if (!getCancelSearchRequested(url)) { onEndSearch(url) - openLink(url) + performUrlFallbackAction(url, lookupFallbackBehavior) } }) @@ -113,6 +114,13 @@ abstract class BottomSheetActivity : BaseActivity() { startActivityWithSlideInAnimation(intent) } + protected open fun performUrlFallbackAction(url: String, fallbackBehavior: PostLookupFallbackBehavior) { + when (fallbackBehavior) { + PostLookupFallbackBehavior.OPEN_IN_BROWSER -> openLink(url) + PostLookupFallbackBehavior.DISPLAY_ERROR -> Toast.makeText(this, getString(R.string.post_lookup_error_format, url), Toast.LENGTH_SHORT).show() + } + } + @VisibleForTesting fun onBeginSearch(url: String) { searchUrl = url @@ -187,3 +195,8 @@ fun looksLikeMastodonUrl(urlString: String): Boolean { path.matches("^/notice/\\d+$".toRegex()) || path.matches("^/objects/[-a-f0-9]+$".toRegex()) } + +enum class PostLookupFallbackBehavior { + OPEN_IN_BROWSER, + DISPLAY_ERROR, +} diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java index c10bbff84..1f85b0348 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java @@ -311,7 +311,7 @@ public final class MainActivity extends BottomSheetActivity implements ActionBut if (intent != null) { String statusUrl = intent.getStringExtra(STATUS_URL); if (statusUrl != null) { - viewUrl(statusUrl); + viewUrl(statusUrl, PostLookupFallbackBehavior.DISPLAY_ERROR); } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java index 81fa8a8d5..0a4246012 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.java @@ -45,6 +45,7 @@ import com.keylesspalace.tusky.BottomSheetActivity; import com.keylesspalace.tusky.ComposeActivity; import com.keylesspalace.tusky.MainActivity; import com.keylesspalace.tusky.R; +import com.keylesspalace.tusky.PostLookupFallbackBehavior; import com.keylesspalace.tusky.ViewMediaActivity; import com.keylesspalace.tusky.ViewTagActivity; import com.keylesspalace.tusky.components.report.ReportActivity; @@ -134,7 +135,7 @@ public abstract class SFragment extends BaseFragment implements Injectable { } public void onViewUrl(String url) { - bottomSheetActivity.viewUrl(url); + bottomSheetActivity.viewUrl(url, PostLookupFallbackBehavior.OPEN_IN_BROWSER); } protected void reply(Status status) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a1f78a520..cff97ad37 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -536,5 +536,6 @@ Multiple choices Choice %d Edit + Error looking up post %s diff --git a/app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt b/app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt index 2db1cd0d7..da80f784a 100644 --- a/app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/BottomSheetActivityTest.kt @@ -214,6 +214,16 @@ class BottomSheetActivityTest { Assert.assertEquals(nonMastodonQuery, activity.link) } + @Test + fun search_withNoResults_appliesRequestedFallbackBehavior() { + for (fallbackBehavior in listOf(PostLookupFallbackBehavior.OPEN_IN_BROWSER, PostLookupFallbackBehavior.DISPLAY_ERROR)) { + activity.viewUrl(nonMastodonQuery, fallbackBehavior) + testScheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS) + Assert.assertEquals(nonMastodonQuery, activity.link) + Assert.assertEquals(fallbackBehavior, activity.fallbackBehavior) + } + } + @Test fun search_withCancellation_doesNotLoadUrl_forAccount() { activity.viewUrl(accountQuery) @@ -263,6 +273,7 @@ class BottomSheetActivityTest { var statusId: String? = null var accountId: String? = null var link: String? = null + var fallbackBehavior: PostLookupFallbackBehavior? = null init { mastodonApi = api @@ -282,5 +293,9 @@ class BottomSheetActivityTest { this.statusId = statusId } + override fun performUrlFallbackAction(url: String, fallbackBehavior: PostLookupFallbackBehavior) { + this.link = url + this.fallbackBehavior = fallbackBehavior + } } } \ No newline at end of file From bee10bf37525626bff4db588070c43616e8a56bf Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Sat, 12 Oct 2019 20:00:29 +0200 Subject: [PATCH 19/86] Refactor theming (#1529) * fix toolbars * use toolbar in MainActivity * update AccountActivity appbar * update material design library * remove unneeded tabs styling * fix black theme --- app/build.gradle | 2 +- .../keylesspalace/tusky/AccountActivity.kt | 42 +++++++----- .../com/keylesspalace/tusky/MainActivity.java | 7 +- .../com/keylesspalace/tusky/entity/Account.kt | 3 +- .../preference/AccountPreferencesFragment.kt | 6 +- .../preference/PreferencesFragment.kt | 10 +-- .../tusky/view/ComposeScheduleView.java | 3 +- app/src/main/res/color/tab_icon_color.xml | 5 -- .../res/drawable-night/avatar_background.xml | 6 -- .../main/res/drawable/avatar_background.xml | 6 -- app/src/main/res/drawable/ic_menu_24dp.xml | 10 --- app/src/main/res/layout/activity_account.xml | 13 ++-- app/src/main/res/layout/activity_main.xml | 65 ++++++++----------- app/src/main/res/layout/activity_search.xml | 6 +- app/src/main/res/layout/toolbar_basic.xml | 3 +- app/src/main/res/values-night/styles.xml | 3 +- app/src/main/res/values/attrs.xml | 3 +- app/src/main/res/values/colors.xml | 2 - app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/styles.xml | 11 ++-- 20 files changed, 86 insertions(+), 122 deletions(-) delete mode 100644 app/src/main/res/color/tab_icon_color.xml delete mode 100644 app/src/main/res/drawable-night/avatar_background.xml delete mode 100644 app/src/main/res/drawable/avatar_background.xml delete mode 100644 app/src/main/res/drawable/ic_menu_24dp.xml diff --git a/app/build.gradle b/app/build.gradle index d0f5750e4..38150c17a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -100,7 +100,7 @@ dependencies { implementation 'androidx.browser:browser:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation 'androidx.legacy:legacy-support-v13:1.0.0' - implementation 'com.google.android.material:material:1.1.0-alpha10' + implementation 'com.google.android.material:material:1.1.0-beta01' implementation 'androidx.exifinterface:exifinterface:1.0.0' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.preference:preference:1.1.0' diff --git a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt index e1d2f3ba6..30a758872 100644 --- a/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/AccountActivity.kt @@ -18,6 +18,7 @@ package com.keylesspalace.tusky import android.animation.ArgbEvaluator import android.content.Context import android.content.Intent +import android.content.res.ColorStateList import android.graphics.Color import android.graphics.PorterDuff import android.os.Bundle @@ -40,6 +41,8 @@ import com.bumptech.glide.Glide import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.CollapsingToolbarLayout import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.google.android.material.shape.MaterialShapeDrawable +import com.google.android.material.shape.ShapeAppearanceModel import com.google.android.material.snackbar.Snackbar import com.google.android.material.tabs.TabLayout import com.keylesspalace.tusky.adapter.AccountFieldAdapter @@ -86,8 +89,6 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI @ColorInt private var toolbarColor: Int = 0 @ColorInt - private var backgroundColor: Int = 0 - @ColorInt private var statusBarColorTransparent: Int = 0 @ColorInt private var statusBarColorOpaque: Int = 0 @@ -107,6 +108,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + loadResources() makeNotificationBarTransparent() setContentView(R.layout.activity_account) @@ -119,7 +121,6 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI animateAvatar = sharedPrefs.getBoolean("animateGifAvatars", false) hideFab = sharedPrefs.getBoolean("fabHide", false) - loadResources() setupToolbar() setupTabs() setupAccountViews() @@ -135,8 +136,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI * Load colors and dimensions from resources */ private fun loadResources() { - toolbarColor = ThemeUtils.getColor(this, R.attr.toolbar_background_color) - backgroundColor = ThemeUtils.getColor(this, android.R.attr.colorBackground) + toolbarColor = ThemeUtils.getColor(this, R.attr.colorSurface) statusBarColorTransparent = ContextCompat.getColor(this, R.color.header_background_filter) statusBarColorOpaque = ThemeUtils.getColor(this, R.attr.colorPrimaryDark) avatarSize = resources.getDimension(R.dimen.account_activity_avatar_size) @@ -211,9 +211,6 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI }) } - /** - * Setup toolbar - */ private fun setupToolbar() { // set toolbar top margin according to system window insets accountCoordinatorLayout.setOnApplyWindowInsetsListener { _, insets -> @@ -236,6 +233,23 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI ThemeUtils.setDrawableTint(this, accountToolbar.navigationIcon, R.attr.account_toolbar_icon_tint_uncollapsed) ThemeUtils.setDrawableTint(this, accountToolbar.overflowIcon, R.attr.account_toolbar_icon_tint_uncollapsed) + val appBarElevation = resources.getDimension(R.dimen.actionbar_elevation) + + val toolbarBackground = MaterialShapeDrawable.createWithElevationOverlay(this, appBarElevation) + toolbarBackground.fillColor = ColorStateList.valueOf(Color.TRANSPARENT) + accountToolbar.background = toolbarBackground + + accountHeaderInfoContainer.background = MaterialShapeDrawable.createWithElevationOverlay(this, appBarElevation) + + val avatarBackground = MaterialShapeDrawable.createWithElevationOverlay(this, appBarElevation).apply { + fillColor = ColorStateList.valueOf(toolbarColor) + elevation = appBarElevation + shapeAppearanceModel = ShapeAppearanceModel.builder() + .setAllCornerSizes(resources.getDimension(R.dimen.account_avatar_background_radius)) + .build() + } + accountAvatarImageView.background = avatarBackground + // Add a listener to change the toolbar icon color when it enters/exits its collapsed state. accountAppBarLayout.addOnOffsetChangedListener(object : AppBarLayout.OnOffsetChangedListener { @@ -281,16 +295,14 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI accountAvatarImageView.visible(scaledAvatarSize > 0) - var transparencyPercent = abs(verticalOffset) / titleVisibleHeight.toFloat() - if (transparencyPercent > 1) transparencyPercent = 1f + val transparencyPercent = (abs(verticalOffset) / titleVisibleHeight.toFloat()).coerceAtMost(1f) window.statusBarColor = argbEvaluator.evaluate(transparencyPercent, statusBarColorTransparent, statusBarColorOpaque) as Int val evaluatedToolbarColor = argbEvaluator.evaluate(transparencyPercent, Color.TRANSPARENT, toolbarColor) as Int - val evaluatedTabBarColor = argbEvaluator.evaluate(transparencyPercent, backgroundColor, toolbarColor) as Int - accountToolbar.setBackgroundColor(evaluatedToolbarColor) - accountHeaderInfoContainer.setBackgroundColor(evaluatedTabBarColor) - accountTabLayout.setBackgroundColor(evaluatedTabBarColor) + + toolbarBackground.fillColor = ColorStateList.valueOf(evaluatedToolbarColor) + swipeToRefreshLayout.isEnabled = verticalOffset == 0 } }) @@ -300,7 +312,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI private fun makeNotificationBarTransparent() { val decorView = window.decorView decorView.systemUiVisibility = decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - window.statusBarColor = Color.TRANSPARENT + window.statusBarColor = statusBarColorTransparent } /** diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java index 1f85b0348..a532b539a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.java @@ -24,7 +24,6 @@ import android.os.Handler; import android.preference.PreferenceManager; import android.util.Log; import android.view.KeyEvent; -import android.widget.ImageButton; import android.widget.ImageView; import androidx.annotation.Nullable; @@ -178,7 +177,6 @@ public final class MainActivity extends BottomSheetActivity implements ActionBut setContentView(R.layout.activity_main); composeButton = findViewById(R.id.floating_btn); - ImageButton drawerToggle = findViewById(R.id.drawer_toggle); tabLayout = findViewById(R.id.tab_layout); viewPager = findViewById(R.id.pager); @@ -189,10 +187,6 @@ public final class MainActivity extends BottomSheetActivity implements ActionBut setupDrawer(); - // Setup the navigation drawer toggle button. - ThemeUtils.setDrawableTint(this, drawerToggle.getDrawable(), R.attr.toolbar_icon_tint); - drawerToggle.setOnClickListener(v -> drawer.openDrawer()); - /* Fetch user info while we're doing other things. This has to be done after setting up the * drawer, though, because its callback touches the header in the drawer. */ fetchUserInfo(); @@ -401,6 +395,7 @@ public final class MainActivity extends BottomSheetActivity implements ActionBut .withHasStableIds(true) .withSelectedItem(-1) .withDrawerItems(listItems) + .withToolbar(findViewById(R.id.main_toolbar)) .withOnDrawerItemClickListener((view, position, drawerItem) -> { if (drawerItem != null) { long drawerItemIdentifier = drawerItem.getIdentifier(); diff --git a/app/src/main/java/com/keylesspalace/tusky/entity/Account.kt b/app/src/main/java/com/keylesspalace/tusky/entity/Account.kt index d1121f5bc..71518573e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/entity/Account.kt +++ b/app/src/main/java/com/keylesspalace/tusky/entity/Account.kt @@ -61,8 +61,7 @@ data class Account( if (other !is Account) { return false } - val account = other as Account? - return account?.id == this.id + return other.id == this.id } fun deepEquals(other: Account): Boolean { diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt index 0ab9e1369..dfc44fa61 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/AccountPreferencesFragment.kt @@ -92,9 +92,9 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), publicFiltersPreference = requirePreference("publicFilters") threadFiltersPreference = requirePreference("threadFilters") - notificationPreference.icon = IconicsDrawable(notificationPreference.context, GoogleMaterial.Icon.gmd_notifications).sizePx(iconSize).color(ThemeUtils.getColor(notificationPreference.context, R.attr.toolbar_icon_tint)) + notificationPreference.icon = IconicsDrawable(notificationPreference.context, GoogleMaterial.Icon.gmd_notifications).sizePx(iconSize).color(ThemeUtils.getColor(notificationPreference.context, R.attr.preference_icon_tint)) mutedUsersPreference.icon = getTintedIcon(R.drawable.ic_mute_24dp) - blockedUsersPreference.icon = IconicsDrawable(blockedUsersPreference.context, GoogleMaterial.Icon.gmd_block).sizePx(iconSize).color(ThemeUtils.getColor(blockedUsersPreference.context, R.attr.toolbar_icon_tint)) + blockedUsersPreference.icon = IconicsDrawable(blockedUsersPreference.context, GoogleMaterial.Icon.gmd_block).sizePx(iconSize).color(ThemeUtils.getColor(blockedUsersPreference.context, R.attr.preference_icon_tint)) mutedDomainsPreference.icon = getTintedIcon(R.drawable.ic_mute_24dp) notificationPreference.onPreferenceClickListener = this @@ -289,7 +289,7 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(), private fun getTintedIcon(iconId: Int): Drawable? { val drawable = context?.getDrawable(iconId) - ThemeUtils.setDrawableTint(context, drawable, R.attr.toolbar_icon_tint) + ThemeUtils.setDrawableTint(context, drawable, R.attr.preference_icon_tint) return drawable } diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt index 95b9251fc..d631b84ac 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt @@ -38,13 +38,13 @@ class PreferencesFragment : PreferenceFragmentCompat() { addPreferencesFromResource(R.xml.preferences) val themePreference: Preference = requirePreference("appTheme") - themePreference.icon = IconicsDrawable(themePreference.context, GoogleMaterial.Icon.gmd_palette).sizePx(iconSize).color(ThemeUtils.getColor(themePreference.context, R.attr.toolbar_icon_tint)) + themePreference.icon = IconicsDrawable(themePreference.context, GoogleMaterial.Icon.gmd_palette).sizePx(iconSize).color(ThemeUtils.getColor(themePreference.context, R.attr.preference_icon_tint)) val emojiPreference: Preference = requirePreference("emojiCompat") - emojiPreference.icon = IconicsDrawable(emojiPreference.context, GoogleMaterial.Icon.gmd_sentiment_satisfied).sizePx(iconSize).color(ThemeUtils.getColor(emojiPreference.context, R.attr.toolbar_icon_tint)) + emojiPreference.icon = IconicsDrawable(emojiPreference.context, GoogleMaterial.Icon.gmd_sentiment_satisfied).sizePx(iconSize).color(ThemeUtils.getColor(emojiPreference.context, R.attr.preference_icon_tint)) val textSizePreference: Preference = requirePreference("statusTextSize") - textSizePreference.icon = IconicsDrawable(textSizePreference.context, GoogleMaterial.Icon.gmd_format_size).sizePx(iconSize).color(ThemeUtils.getColor(textSizePreference.context, R.attr.toolbar_icon_tint)) + textSizePreference.icon = IconicsDrawable(textSizePreference.context, GoogleMaterial.Icon.gmd_format_size).sizePx(iconSize).color(ThemeUtils.getColor(textSizePreference.context, R.attr.preference_icon_tint)) val timelineFilterPreferences: Preference = requirePreference("timelineFilterPreferences") timelineFilterPreferences.setOnPreferenceClickListener { @@ -67,11 +67,11 @@ class PreferencesFragment : PreferenceFragmentCompat() { } val languagePreference: Preference = requirePreference("language") - languagePreference.icon = IconicsDrawable(languagePreference.context, GoogleMaterial.Icon.gmd_translate).sizePx(iconSize).color(ThemeUtils.getColor(languagePreference.context, R.attr.toolbar_icon_tint)) + languagePreference.icon = IconicsDrawable(languagePreference.context, GoogleMaterial.Icon.gmd_translate).sizePx(iconSize).color(ThemeUtils.getColor(languagePreference.context, R.attr.preference_icon_tint)) val botIndicatorPreference = requirePreference("showBotOverlay") val botDrawable = botIndicatorPreference.context.getDrawable(R.drawable.ic_bot_24dp) - ThemeUtils.setDrawableTint(context, botDrawable, R.attr.toolbar_icon_tint) + ThemeUtils.setDrawableTint(context, botDrawable, R.attr.preference_icon_tint) botIndicatorPreference.icon = botDrawable } diff --git a/app/src/main/java/com/keylesspalace/tusky/view/ComposeScheduleView.java b/app/src/main/java/com/keylesspalace/tusky/view/ComposeScheduleView.java index 8efe68639..dc58f86ec 100644 --- a/app/src/main/java/com/keylesspalace/tusky/view/ComposeScheduleView.java +++ b/app/src/main/java/com/keylesspalace/tusky/view/ComposeScheduleView.java @@ -120,7 +120,8 @@ public class ComposeScheduleView extends ConstraintLayout { private void openPickDateDialog() { long yesterday = Calendar.getInstance().getTimeInMillis() - 24 * 60 * 60 * 1000; CalendarConstraints calendarConstraints = new CalendarConstraints.Builder() - .setValidator(new DateValidatorPointForward(yesterday)) + .setValidator( + DateValidatorPointForward.from(yesterday)) .build(); if (scheduleDateTime == null) { scheduleDateTime = Calendar.getInstance(TimeZone.getDefault()); diff --git a/app/src/main/res/color/tab_icon_color.xml b/app/src/main/res/color/tab_icon_color.xml deleted file mode 100644 index 8edd8d373..000000000 --- a/app/src/main/res/color/tab_icon_color.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-night/avatar_background.xml b/app/src/main/res/drawable-night/avatar_background.xml deleted file mode 100644 index 4fb7dbda1..000000000 --- a/app/src/main/res/drawable-night/avatar_background.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_background.xml b/app/src/main/res/drawable/avatar_background.xml deleted file mode 100644 index 848919782..000000000 --- a/app/src/main/res/drawable/avatar_background.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_menu_24dp.xml b/app/src/main/res/drawable/ic_menu_24dp.xml deleted file mode 100644 index 8ec2ddf73..000000000 --- a/app/src/main/res/drawable/ic_menu_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_account.xml b/app/src/main/res/layout/activity_account.xml index e0ba686de..b1e563a09 100644 --- a/app/src/main/res/layout/activity_account.xml +++ b/app/src/main/res/layout/activity_account.xml @@ -17,16 +17,15 @@ android:id="@+id/accountAppBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?android:colorBackground" android:elevation="@dimen/actionbar_elevation"> - @@ -318,7 +314,9 @@ android:layout_gravity="top" android:background="@android:color/transparent" app:layout_collapseMode="pin" + app:contentInsetStartWithNavigation="0dp" app:layout_scrollFlags="scroll|enterAlways" /> + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 43745036c..92ae21bdf 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,49 +7,38 @@ android:layout_height="match_parent" tools:context="com.keylesspalace.tusky.MainActivity"> - + android:layout_height="wrap_content" + android:elevation="@dimen/actionbar_elevation"> - - - - - + app:contentInsetStartWithNavigation="0dp"> - + + + + + + + + + + android:layout_height="?attr/actionBarSize" /> diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 2733e1e6d..3e3a12ae9 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -27,8 +27,7 @@ @color/window_background_dark @color/custom_tab_toolbar_dark - @color/toolbar_background_dark - @color/toolbar_icon_dark + @color/toolbar_icon_dark @style/TuskyImageButton.Dark @drawable/ic_reblog_dark_24dp @drawable/reblog_inactive_dark diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 7477a44b8..29dbcdeba 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -12,8 +12,7 @@ - - + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cdd9ff025..378090440 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -19,7 +19,6 @@ #ffffff #d9e1e8 #9baec8 - #4c5368 #d9e1e8 #444b5d #2f3441 @@ -46,7 +45,6 @@ #CC000000 #3c3c3c #5f636f - #f6f7f7 #7C000000 #BFBFBF #b0b0b0 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index a5ba6214d..c2f1bdd91 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -40,6 +40,8 @@ 4.5dp 3dp 160dp + 14dp + 5dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 919a5417f..581c5b149 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -63,6 +63,8 @@ @color/color_primary_dark_light + @style/Widget.MaterialComponents.AppBarLayout.Surface + @color/color_background_light @color/color_primary_light @color/window_background_light @@ -77,8 +79,7 @@ @color/window_background_light @color/custom_tab_toolbar_light - @color/toolbar_background_light - @color/toolbar_icon_light + @color/toolbar_icon_light @style/TuskyImageButton.Light @drawable/ic_reblog_light_24dp @drawable/reblog_inactive_light @@ -156,9 +157,6 @@ ?attr/status_text_medium true 3dp - ?attr/tab_icon_selected_tint - ?android:attr/textColorSecondary - ?attr/tab_icon_selected_tint