From a98154101bb130ad24571076e6834c62d69e2e13 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Mon, 16 Sep 2024 20:57:15 +0200 Subject: [PATCH 1/9] revert MainActivity launchMode again (#4685) This fixes - The problem where Tusky drops your draft when you switch apps while composing - The problem where MainActivity does not restart when switching theme in preferences This adds back a bug where one can have multiple instances of MainActivity which can behave weirdly when the active account was switched after they were created. This bug is (unlike the timeline mixup one) transient though, it will go away when restarting the app. As a small mitigation MainActivity is finished when forwarding to ComposeActivity (Tusky 25 behavior). --- app/src/main/AndroidManifest.xml | 1 - app/src/main/java/com/keylesspalace/tusky/MainActivity.kt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 668d0ba30..db8ee5182 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,7 +42,6 @@ android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize" android:exported="true" - android:launchMode="singleTask" android:theme="@style/SplashTheme"> diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt index 1e6c1e4b6..af2ba7ac3 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt @@ -576,6 +576,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider { } } startActivity(composeIntent) + finish() } private fun setupDrawer( From c887c8213c725f1b2cdb571f70a29859ff980f55 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Mon, 16 Sep 2024 20:57:27 +0200 Subject: [PATCH 2/9] fix new warnings, regenerate lint-baseline.xml (#4684) Mostly "StringFormatTrivial" which I think is new, but it makes totally sense to fix --- app/lint-baseline.xml | 101 ++++++------------ .../com/keylesspalace/tusky/BaseActivity.java | 1 - .../keylesspalace/tusky/StatusListActivity.kt | 2 +- .../java/com/keylesspalace/tusky/TabData.kt | 2 +- .../tusky/adapter/PlaceholderViewHolder.kt | 1 - .../compose/ComposeAutoCompleteAdapter.kt | 20 +--- .../tusky/components/compose/MediaUploader.kt | 8 +- .../compose/view/ComposeScheduleView.kt | 8 +- .../tusky/components/drafts/DraftHelper.kt | 2 +- .../tusky/components/login/LoginActivity.kt | 2 +- .../search/adapter/SearchHashtagsAdapter.kt | 3 +- .../NotificationFetcher.kt | 2 +- .../components/timeline/TimelineFragment.kt | 7 -- .../viewmodel/CachedTimelineViewModel.kt | 1 - .../viewmodel/NetworkTimelineViewModel.kt | 1 - .../timeline/viewmodel/TimelineViewModel.kt | 2 - .../trending/TrendingTagViewHolder.kt | 9 +- .../tusky/fragment/ViewImageFragment.kt | 1 - .../tusky/fragment/ViewVideoFragment.kt | 1 - .../tusky/network/FilterModel.kt | 2 +- .../keylesspalace/tusky/util/NumberUtils.kt | 8 +- .../tusky/util/StatusViewHelper.kt | 2 +- app/src/main/res/values-hu/strings.xml | 4 +- app/src/main/res/values/donottranslate.xml | 2 +- 24 files changed, 68 insertions(+), 124 deletions(-) diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index aa4ba092c..fe77d2c8d 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -1,5 +1,5 @@ - + @@ -19,7 +19,7 @@ errorLine2=" ~~~~~~~~~~~"> @@ -53,14 +53,14 @@ + message="Overriding `@layout/exo_player_control_view` which is marked as private in androidx.media3:media3-ui:1.4.1. If deliberate, use tools:override="true", otherwise pick a different name."> + errorLine1=" <string name="notification_summary_report_format">%1$s · %2$d posts attached</string>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + errorLine1=" <string name="pref_title_http_proxy_port_message">Port should be between %1$d and %2$d</string>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -241,7 +241,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -252,7 +252,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -263,7 +263,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -384,7 +384,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -428,7 +428,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> @@ -545,11 +545,11 @@ + errorLine1=" ShortcutManagerCompat.setDynamicShortcuts(context, shortcuts)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -725,7 +725,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> @@ -758,7 +758,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> @@ -850,37 +850,4 @@ column="9"/> - - - - - - - - - - - - diff --git a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java index c8cab13d6..2231e7cea 100644 --- a/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/BaseActivity.java @@ -31,7 +31,6 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.ViewModelProvider; diff --git a/app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt b/app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt index ca501aeba..2ffcc894b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/StatusListActivity.kt @@ -75,7 +75,7 @@ class StatusListActivity : BottomSheetActivity() { val title = when (kind) { Kind.FAVOURITES -> getString(R.string.title_favourites) Kind.BOOKMARKS -> getString(R.string.title_bookmarks) - Kind.TAG -> getString(R.string.title_tag).format(hashtag) + Kind.TAG -> getString(R.string.hashtag_format, hashtag) Kind.PUBLIC_TRENDING_STATUSES -> getString(R.string.title_public_trending_statuses) else -> intent.getStringExtra(EXTRA_LIST_TITLE) } diff --git a/app/src/main/java/com/keylesspalace/tusky/TabData.kt b/app/src/main/java/com/keylesspalace/tusky/TabData.kt index 7dccd4955..caefa0dac 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TabData.kt +++ b/app/src/main/java/com/keylesspalace/tusky/TabData.kt @@ -118,7 +118,7 @@ fun createTabDataFromId(id: String, arguments: List = emptyList()): TabD arguments = arguments, title = { context -> arguments.joinToString(separator = " ") { - context.getString(R.string.title_tag, it) + context.getString(R.string.hashtag_format, it) } } ) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/PlaceholderViewHolder.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/PlaceholderViewHolder.kt index 88dead0e6..d64780a60 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/PlaceholderViewHolder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/PlaceholderViewHolder.kt @@ -18,7 +18,6 @@ import androidx.recyclerview.widget.RecyclerView import com.keylesspalace.tusky.databinding.ItemStatusPlaceholderBinding import com.keylesspalace.tusky.interfaces.StatusActionListener import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.visible /** diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt index 25d78d3af..4b608d3b9 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt @@ -57,9 +57,9 @@ class ComposeAutoCompleteAdapter( override fun convertResultToString(resultValue: Any): CharSequence { return when (resultValue) { - is AutocompleteResult.AccountResult -> formatUsername(resultValue) - is AutocompleteResult.HashtagResult -> formatHashtag(resultValue) - is AutocompleteResult.EmojiResult -> formatEmoji(resultValue) + is AutocompleteResult.AccountResult -> "@${resultValue.account.username}" + is AutocompleteResult.HashtagResult -> "#${resultValue.hashtag}" + is AutocompleteResult.EmojiResult -> ":${resultValue.emoji.shortcode}:" else -> "" } } @@ -122,7 +122,7 @@ class ComposeAutoCompleteAdapter( } is ItemAutocompleteHashtagBinding -> { val result = getItem(position) as AutocompleteResult.HashtagResult - binding.root.text = formatHashtag(result) + binding.root.text = context.getString(R.string.hashtag_format, result.hashtag) } is ItemAutocompleteEmojiBinding -> { val emojiResult = getItem(position) as AutocompleteResult.EmojiResult @@ -162,17 +162,5 @@ class ComposeAutoCompleteAdapter( private const val ACCOUNT_VIEW_TYPE = 0 private const val HASHTAG_VIEW_TYPE = 1 private const val EMOJI_VIEW_TYPE = 2 - - private fun formatUsername(result: AutocompleteResult.AccountResult): String { - return String.format("@%s", result.account.username) - } - - private fun formatHashtag(result: AutocompleteResult.HashtagResult): String { - return String.format("#%s", result.hashtag) - } - - private fun formatEmoji(result: AutocompleteResult.EmojiResult): String { - return String.format(":%s:", result.emoji.shortcode) - } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt index 96d687cd0..d61f46a68 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt @@ -265,12 +265,8 @@ class MediaUploader @Inject constructor( } val map = MimeTypeMap.getSingleton() val fileExtension = map.getExtensionFromMimeType(mimeType) - val filename = "%s_%d_%s.%s".format( - context.getString(R.string.app_name), - System.currentTimeMillis(), - randomAlphanumericString(10), - fileExtension - ) + val filename = + "${context.getString(R.string.app_name)}_${System.currentTimeMillis()}_${randomAlphanumericString(10)}.$fileExtension" if (mimeType == null) mimeType = "multipart/form-data" diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt index c7f6a503f..b061d6298 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt @@ -14,6 +14,7 @@ * see . */ package com.keylesspalace.tusky.components.compose.view +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater @@ -80,11 +81,8 @@ class ComposeScheduleView } val scheduled = scheduleDateTimeUtc!!.time - binding.scheduledDateTime.text = String.format( - "%s %s", - dateFormat.format(scheduled), - timeFormat.format(scheduled) - ) + @SuppressLint("SetTextI18n") + binding.scheduledDateTime.text = "${dateFormat.format(scheduled)} ${timeFormat.format(scheduled)}" verifyScheduledTime(scheduled) } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt index e68896029..742f1adaf 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftHelper.kt @@ -178,7 +178,7 @@ class DraftHelper @Inject constructor( map.getExtensionFromMimeType(mimeType) } - val filename = String.format("Tusky_Draft_Media_%s_%d.%s", timeStamp, index, fileExtension) + val filename = "Tusky_Draft_Media_${timeStamp}_$index.$fileExtension" val file = File(folder, filename) if (scheme == "https") { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt index 014893e59..6cc909732 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt @@ -257,7 +257,7 @@ class LoginActivity : BaseActivity() { getString(R.string.error_authorization_unknown) } else { // Use error returned by the server or fall back to the generic message - Log.e(TAG, "%s %s".format(getString(R.string.error_authorization_denied), error)) + Log.e(TAG, getString(R.string.error_authorization_denied) + " " + error) error.ifBlank { getString(R.string.error_authorization_denied) } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchHashtagsAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchHashtagsAdapter.kt index 052ccc9b9..d31a48683 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchHashtagsAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/search/adapter/SearchHashtagsAdapter.kt @@ -19,6 +19,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil +import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemHashtagBinding import com.keylesspalace.tusky.entity.HashTag import com.keylesspalace.tusky.interfaces.LinkListener @@ -37,7 +38,7 @@ class SearchHashtagsAdapter(private val linkListener: LinkListener) : override fun onBindViewHolder(holder: BindingHolder, position: Int) { getItem(position)?.let { (name) -> - holder.binding.root.text = String.format("#%s", name) + holder.binding.root.text = holder.binding.root.context.getString(R.string.hashtag_format, name) holder.binding.root.setOnClickListener { linkListener.onViewTag(name) } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationFetcher.kt b/app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationFetcher.kt index 20b52923c..13ea0d909 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationFetcher.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationFetcher.kt @@ -162,7 +162,7 @@ class NotificationFetcher @Inject constructor( * than the marker. */ private suspend fun fetchNewNotifications(account: AccountEntity): List { - val authHeader = String.format("Bearer %s", account.accessToken) + val authHeader = "Bearer ${account.accessToken}" // Figure out where to read from. Choose the most recent notification ID from: // diff --git a/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt index bc0d75dbd..a4d98648f 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt @@ -604,13 +604,6 @@ class TimelineFragment : viewModel.removeStatusWithId(status.id) } - private fun actionButtonPresent(): Boolean { - return viewModel.kind != TimelineViewModel.Kind.TAG && - viewModel.kind != TimelineViewModel.Kind.FAVOURITES && - viewModel.kind != TimelineViewModel.Kind.BOOKMARKS && - activity is ActionButtonActivity - } - private var talkBackWasEnabled = false override fun onPause() { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt index 95015be26..2685fda14 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/CachedTimelineViewModel.kt @@ -70,7 +70,6 @@ class CachedTimelineViewModel @Inject constructor( private val db: AppDatabase ) : TimelineViewModel( timelineCases, - api, eventHub, accountManager, sharedPreferences, diff --git a/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/NetworkTimelineViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/NetworkTimelineViewModel.kt index 61552e95e..41b5eb0bf 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/NetworkTimelineViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/NetworkTimelineViewModel.kt @@ -72,7 +72,6 @@ class NetworkTimelineViewModel @Inject constructor( filterModel: FilterModel ) : TimelineViewModel( timelineCases, - api, eventHub, accountManager, sharedPreferences, diff --git a/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/TimelineViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/TimelineViewModel.kt index 5bfc16cd5..015725660 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/TimelineViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/timeline/viewmodel/TimelineViewModel.kt @@ -31,7 +31,6 @@ import com.keylesspalace.tusky.db.AccountManager import com.keylesspalace.tusky.entity.Filter import com.keylesspalace.tusky.entity.Poll import com.keylesspalace.tusky.network.FilterModel -import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.usecase.TimelineCases import com.keylesspalace.tusky.viewdata.StatusViewData @@ -41,7 +40,6 @@ import kotlinx.coroutines.launch abstract class TimelineViewModel( protected val timelineCases: TimelineCases, - private val api: MastodonApi, private val eventHub: EventHub, protected val accountManager: AccountManager, private val sharedPreferences: SharedPreferences, diff --git a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt index ac1e8c72d..36a65f4fe 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt @@ -20,13 +20,16 @@ import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemTrendingCellBinding import com.keylesspalace.tusky.util.formatNumber import com.keylesspalace.tusky.viewdata.TrendingViewData +import java.text.NumberFormat class TrendingTagViewHolder( private val binding: ItemTrendingCellBinding ) : RecyclerView.ViewHolder(binding.root) { + private val numberFormat: NumberFormat = NumberFormat.getNumberInstance() + fun setup(tagViewData: TrendingViewData.Tag, onViewTag: (String) -> Unit) { - binding.tag.text = binding.root.context.getString(R.string.title_tag, tagViewData.name) + binding.tag.text = binding.root.context.getString(R.string.hashtag_format, tagViewData.name) binding.graph.maxTrendingValue = tagViewData.maxTrendingValue binding.graph.primaryLineData = tagViewData.usage @@ -37,8 +40,8 @@ class TrendingTagViewHolder( val totalAccounts = tagViewData.accounts.sum() binding.totalAccounts.text = formatNumber(totalAccounts, 1000) - binding.currentUsage.text = tagViewData.usage.last().toString() - binding.currentAccounts.text = tagViewData.usage.last().toString() + binding.currentUsage.text = numberFormat.format(tagViewData.usage.last()) + binding.currentAccounts.text = numberFormat.format(tagViewData.usage.last()) itemView.setOnClickListener { onViewTag(tagViewData.name) diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt index 9a62e1cc7..c3a176cb0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt @@ -37,7 +37,6 @@ import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.FragmentViewImageBinding import com.keylesspalace.tusky.entity.Attachment import com.keylesspalace.tusky.util.getParcelableCompat -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.util.visible import com.ortiz.touchview.OnTouchCoordinatesListener diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt index d9ae9ff45..d450d0f28 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt @@ -53,7 +53,6 @@ import com.keylesspalace.tusky.ViewMediaActivity import com.keylesspalace.tusky.databinding.FragmentViewVideoBinding import com.keylesspalace.tusky.entity.Attachment import com.keylesspalace.tusky.util.getParcelableCompat -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.unsafeLazy import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.util.visible diff --git a/app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt b/app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt index c45070852..355212589 100644 --- a/app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/network/FilterModel.kt @@ -104,7 +104,7 @@ class FilterModel @Inject constructor( val phrase = filter.phrase val quotedPhrase = Pattern.quote(phrase) return if (filter.wholeWord && ALPHANUMERIC.matcher(phrase).matches()) { - String.format("(^|\\W)%s($|\\W)", quotedPhrase) + "(^|\\W)$quotedPhrase($|\\W)" } else { quotedPhrase } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/NumberUtils.kt b/app/src/main/java/com/keylesspalace/tusky/util/NumberUtils.kt index 29a2ec67c..83bc1ab57 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/NumberUtils.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/NumberUtils.kt @@ -3,6 +3,7 @@ package com.keylesspalace.tusky.util import java.text.NumberFormat +import java.util.Locale import kotlin.math.abs import kotlin.math.ln import kotlin.math.pow @@ -24,5 +25,10 @@ fun formatNumber(num: Long, min: Int = 100000): String { val exp = (ln(absNum.toDouble()) / ln_1k).toInt() // Suffixes here are locale-agnostic - return String.format("%.1f%c", num / 1000.0.pow(exp.toDouble()), "KMGTPE"[exp - 1]) + return String.format( + Locale.getDefault(), + "%.1f%c", + num / 1000.0.pow(exp.toDouble()), + "KMGTPE"[exp - 1] + ) } 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 ee575ce66..c9f213de2 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt @@ -237,7 +237,7 @@ class StatusViewHelper(private val itemView: View) { var labelText = getLabelTypeText(context, attachments[0].type) if (sensitive) { val sensitiveText = context.getString(R.string.post_sensitive_media_title) - labelText += String.format(" (%s)", sensitiveText) + labelText += " ($sensitiveText)" } mediaLabel.text = labelText diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 2ab00f98e..9273718d2 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -501,7 +501,7 @@ Beszélgetés törlése Könyvjelző törlése Jóváhagyás megjelenítése kedvencnek jelölés előtt - %1$d szerkesztette a bejegyzését + %1$s szerkesztette a bejegyzését szerkesztették a bejegyzést, mellyel dolgod volt %1$s regisztrált valaki regisztrált @@ -710,4 +710,4 @@ Önmegtolások megjelenítése Valaki a saját bejegyzését tolja meg Értesítésszűrő megjelenítése - \ No newline at end of file + diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index f4272d17f..3484db0ca 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -8,7 +8,7 @@ \@ # - #%1$s + #%1$s :%1$s: %1$s * From dc6639753d784f27c81a6812917d25942d12d4bc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 21:09:50 +0200 Subject: [PATCH 3/9] chore(deps): update dependency gradle to v8.10.2 (#4697) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | [gradle](https://gradle.org) ([source](https://redirect.github.com/gradle/gradle)) | patch | `8.10.1` -> `8.10.2` | --- > [!WARNING] > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Release Notes
gradle/gradle (gradle) ### [`v8.10.2`](https://redirect.github.com/gradle/gradle/compare/v8.10.1...v8.10.2) [Compare Source](https://redirect.github.com/gradle/gradle/compare/v8.10.1...v8.10.2)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/tuskyapp/Tusky). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0aaefbcaf..df97d72b8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 41960f2eed42f3e833b0534f72fb012e8361cabd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 21:10:14 +0200 Subject: [PATCH 4/9] fix(deps): update dependency androidx.lifecycle:lifecycle-viewmodel-ktx to v2.8.6 (#4691) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [androidx.lifecycle:lifecycle-viewmodel-ktx](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.6) ([source](https://cs.android.com/androidx/platform/frameworks/support)) | `2.8.5` -> `2.8.6` | [![age](https://developer.mend.io/api/mc/badges/age/maven/androidx.lifecycle:lifecycle-viewmodel-ktx/2.8.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/androidx.lifecycle:lifecycle-viewmodel-ktx/2.8.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/androidx.lifecycle:lifecycle-viewmodel-ktx/2.8.5/2.8.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/androidx.lifecycle:lifecycle-viewmodel-ktx/2.8.5/2.8.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- > [!WARNING] > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/tuskyapp/Tusky). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 139 +++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd606a334..6055b70ea 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ androidx-exifinterface = "1.3.7" androidx-fragment = "1.8.3" androidx-hilt = "1.2.0" androidx-junit = "1.2.1" -androidx-lifecycle = "2.8.5" +androidx-lifecycle = "2.8.6" androidx-media3 = "1.4.1" androidx-paging = "3.3.2" androidx-preference = "1.2.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index f50f3f220..4b0a34086 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -853,6 +853,14 @@ + + + + + + + + @@ -893,6 +901,14 @@ + + + + + + + + @@ -939,6 +955,14 @@ + + + + + + + + @@ -987,6 +1011,14 @@ + + + + + + + + @@ -1035,6 +1067,14 @@ + + + + + + + + @@ -1080,6 +1120,14 @@ + + + + + + + + @@ -1120,6 +1168,14 @@ + + + + + + + + @@ -1165,6 +1221,14 @@ + + + + + + + + @@ -1222,6 +1286,14 @@ + + + + + + + + @@ -1262,6 +1334,14 @@ + + + + + + + + @@ -1328,6 +1408,14 @@ + + + + + + + + @@ -1368,6 +1456,14 @@ + + + + + + + + @@ -1408,6 +1504,14 @@ + + + + + + + + @@ -1468,6 +1572,17 @@ + + + + + + + + + + + @@ -1508,6 +1623,14 @@ + + + + + + + + @@ -1580,6 +1703,14 @@ + + + + + + + + @@ -1626,6 +1757,14 @@ + + + + + + + + From 20e8af53e199db05b102ed48c2f4995a61dff9cf Mon Sep 17 00:00:00 2001 From: Deleted User Date: Tue, 17 Sep 2024 10:07:11 +0000 Subject: [PATCH 5/9] Translated using Weblate (German) Currently translated at 100.0% (36 of 36 strings) Translation: Tusky/Tusky description Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/de/ --- fastlane/metadata/android/de/changelogs/124.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 fastlane/metadata/android/de/changelogs/124.txt diff --git a/fastlane/metadata/android/de/changelogs/124.txt b/fastlane/metadata/android/de/changelogs/124.txt new file mode 100644 index 000000000..47cd08537 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/124.txt @@ -0,0 +1,7 @@ +Tusky 26.1 + +- 2 neue Einstellungen für die »Antwortsichtbarkeit«: »Von Standard-Beitragssichtbarkeit übernehmen« und »Direkt«. +- Tusky enthält ISRG-Root-Zertifikate, um auf Geräten mit Android 7 und Servern, die Let's Encrypt verwenden, zu funktionieren. +- Tusky vermischt nicht länger Timelines und/oder Benachrichtigungen mit anderen Konten. + +Alle Änderungen sind auf https://github.com/tuskyapp/Tusky/blob/develop/CHANGELOG.md einsehbar (nur Englisch) From 13a9e9eb376ce651bdaf6a59d413cc128f777d5b Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Fri, 27 Sep 2024 16:20:22 +0200 Subject: [PATCH 6/9] fix crash in ViewImageFragment (#4686) From Play console crash logs. Well, let's put another band aid on this code.... ``` Exception java.lang.IllegalStateException: at androidx.fragment.app.Fragment.requireActivity (Fragment.java:1005) at com.keylesspalace.tusky.fragment.ViewImageFragment.getPhotoActionsListener (ViewImageFragment.java:59) at com.keylesspalace.tusky.fragment.ViewImageFragment.access$getPhotoActionsListener (ViewImageFragment.java:49) at com.keylesspalace.tusky.fragment.ViewImageFragment$onViewCreated$singleTapDetector$1.onSingleTapConfirmed (ViewImageFragment.kt:116) at android.view.GestureDetector$GestureHandler.handleMessage (GestureDetector.java:379) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:230) at android.os.Looper.loop (Looper.java:319) at android.app.ActivityThread.main (ActivityThread.java:8919) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:578) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1103) ``` --- .../com/keylesspalace/tusky/fragment/ViewImageFragment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt index c3a176cb0..a386d5524 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt @@ -112,7 +112,9 @@ class ViewImageFragment : ViewMediaFragment() { object : GestureDetector.SimpleOnGestureListener() { override fun onDown(e: MotionEvent) = true override fun onSingleTapConfirmed(e: MotionEvent): Boolean { - photoActionsListener.onPhotoTap() + if (isAdded) { + photoActionsListener.onPhotoTap() + } return false } } From 4cc14bed054f86d91222ab4ab3cc6c78b448e020 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:13:37 +0200 Subject: [PATCH 7/9] chore(deps): update dependency com.android.application to v8.6.1 (#4688) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [com.android.application](https://developer.android.com/studio/build) ([source](https://android.googlesource.com/platform/tools/base)) | `8.6.0` -> `8.6.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.android.application/8.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/com.android.application/8.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/com.android.application/8.6.0/8.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.android.application/8.6.0/8.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- > [!WARNING] > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/tuskyapp/Tusky). --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Conny Duck --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 507 +++++++++++++++++++++++++++++++ 2 files changed, 508 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6055b70ea..afb862e98 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.6.0" +agp = "8.6.1" androidx-activity = "1.9.2" androidx-appcompat = "1.7.0" androidx-browser = "1.8.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 4b0a34086..21803938e 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -490,6 +490,14 @@ + + + + + + + + @@ -538,6 +546,14 @@ + + + + + + + + @@ -586,6 +602,14 @@ + + + + + + + + @@ -2775,6 +2799,14 @@ + + + + + + + + @@ -2823,6 +2855,14 @@ + + + + + + + + @@ -2853,6 +2893,11 @@ + + + + + @@ -2901,6 +2946,14 @@ + + + + + + + + @@ -2949,6 +3002,14 @@ + + + + + + + + @@ -2997,6 +3058,14 @@ + + + + + + + + @@ -3045,6 +3114,14 @@ + + + + + + + + @@ -3093,6 +3170,14 @@ + + + + + + + + @@ -3141,6 +3226,14 @@ + + + + + + + + @@ -3189,6 +3282,14 @@ + + + + + + + + @@ -3237,6 +3338,14 @@ + + + + + + + + @@ -3285,6 +3394,14 @@ + + + + + + + + @@ -3333,6 +3450,14 @@ + + + + + + + + @@ -3381,6 +3506,14 @@ + + + + + + + + @@ -3429,6 +3562,14 @@ + + + + + + + + @@ -3513,6 +3654,20 @@ + + + + + + + + + + + + + + @@ -3561,6 +3716,14 @@ + + + + + + + + @@ -3609,6 +3772,14 @@ + + + + + + + + @@ -3657,6 +3828,14 @@ + + + + + + + + @@ -3705,6 +3884,14 @@ + + + + + + + + @@ -3753,6 +3940,14 @@ + + + + + + + + @@ -3801,6 +3996,14 @@ + + + + + + + + @@ -3849,6 +4052,14 @@ + + + + + + + + @@ -3913,6 +4124,14 @@ + + + + + + + + @@ -3961,6 +4180,14 @@ + + + + + + + + @@ -4009,6 +4236,14 @@ + + + + + + + + @@ -4057,6 +4292,14 @@ + + + + + + + + @@ -4129,6 +4372,14 @@ + + + + + + + + @@ -4177,6 +4428,14 @@ + + + + + + + + @@ -4225,6 +4484,14 @@ + + + + + + + + @@ -4273,6 +4540,14 @@ + + + + + + + + @@ -4321,6 +4596,14 @@ + + + + + + + + @@ -4369,6 +4652,14 @@ + + + + + + + + @@ -4417,6 +4708,14 @@ + + + + + + + + @@ -4465,6 +4764,14 @@ + + + + + + + + @@ -4513,6 +4820,14 @@ + + + + + + + + @@ -4561,6 +4876,14 @@ + + + + + + + + @@ -4609,6 +4932,14 @@ + + + + + + + + @@ -4657,6 +4988,14 @@ + + + + + + + + @@ -4705,6 +5044,14 @@ + + + + + + + + @@ -4753,6 +5100,14 @@ + + + + + + + + @@ -4801,6 +5156,14 @@ + + + + + + + + @@ -4849,6 +5212,14 @@ + + + + + + + + @@ -4897,6 +5268,14 @@ + + + + + + + + @@ -4945,6 +5324,14 @@ + + + + + + + + @@ -4993,6 +5380,14 @@ + + + + + + + + @@ -5041,6 +5436,14 @@ + + + + + + + + @@ -5089,6 +5492,14 @@ + + + + + + + + @@ -5137,6 +5548,14 @@ + + + + + + + + @@ -5185,6 +5604,14 @@ + + + + + + + + @@ -5233,6 +5660,14 @@ + + + + + + + + @@ -5281,6 +5716,14 @@ + + + + + + + + @@ -5329,6 +5772,14 @@ + + + + + + + + @@ -5377,6 +5828,14 @@ + + + + + + + + @@ -5425,6 +5884,14 @@ + + + + + + + + @@ -5473,6 +5940,14 @@ + + + + + + + + @@ -5521,6 +5996,14 @@ + + + + + + + + @@ -5569,6 +6052,14 @@ + + + + + + + + @@ -5617,6 +6108,14 @@ + + + + + + + + @@ -5665,6 +6164,14 @@ + + + + + + + + From d00ad17603715bda0b1795db0347e3ea7d67389a Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Sat, 28 Sep 2024 07:43:18 +0200 Subject: [PATCH 8/9] remove wrong statuses attribute from Announcement model (#4699) https://docs.joinmastodon.org/entities/Announcement/ The statuses in this model are not full statuses but we expect them, so parsing a response that contains one fails. `com.squareup.moshi.JsonDataException: Required value 'account' missing at $[0].statuses[1]` Since we don't even use the attribute, we can just remove it to fix the bug. Closes #4696 --- app/src/main/java/com/keylesspalace/tusky/entity/Announcement.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/entity/Announcement.kt b/app/src/main/java/com/keylesspalace/tusky/entity/Announcement.kt index 792c2423b..0ad45e2ef 100644 --- a/app/src/main/java/com/keylesspalace/tusky/entity/Announcement.kt +++ b/app/src/main/java/com/keylesspalace/tusky/entity/Announcement.kt @@ -30,7 +30,6 @@ data class Announcement( @Json(name = "updated_at") val updatedAt: Date, val read: Boolean = false, val mentions: List, - val statuses: List, val tags: List, val emojis: List, val reactions: List From c9355d9b002a0fd1b502c36d2874d222ed4b67b7 Mon Sep 17 00:00:00 2001 From: Jichi Zhang Date: Sat, 28 Sep 2024 07:49:38 +0200 Subject: [PATCH 9/9] Recreate activities on screenLayout change (#4689) Fixes #4255 Tested on Pixel 9 Pro Fold. Before https://github.com/user-attachments/assets/dd4d3a06-fb9f-4d89-94c3-401875cfe6f7 After https://github.com/user-attachments/assets/dac01631-1add-48f4-9cb9-7365b3da2c9c --- app/src/main/AndroidManifest.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index db8ee5182..aac7218d0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,7 +40,6 @@ @@ -114,9 +113,7 @@ android:name=".ViewMediaActivity" android:theme="@style/TuskyBaseTheme" android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize" /> - +