Compare commits

...

19 Commits

Author SHA1 Message Date
Umut Solmaz 2d705609df Translated using Weblate (Turkish)
Currently translated at 100.0% (127 of 127 strings)

Translation: Funkwhale/Funkwhale For Android
Translate-URL: https://translate.funkwhale.audio/projects/funkwhale/ffa/tr/
2024-05-07 15:50:34 +00:00
josé m 5de5adfda0 Translated using Weblate (Galician)
Currently translated at 100.0% (127 of 127 strings)

Translation: Funkwhale/Funkwhale For Android
Translate-URL: https://translate.funkwhale.audio/projects/funkwhale/ffa/gl/
2024-05-07 15:50:30 +00:00
Umut Solmaz 93123f2df6 Added translation using Weblate (Turkish) 2024-05-06 14:36:45 +00:00
Bruno-Van-den-Bosch 52a45bc5df Translated using Weblate (Dutch)
Currently translated at 100.0% (127 of 127 strings)

Translation: Funkwhale/Funkwhale For Android
Translate-URL: https://translate.funkwhale.audio/projects/funkwhale/ffa/nl/
2024-04-12 13:50:30 +00:00
Renovate Bot bea9c5b75a chore(deps): update dependency io.insert-koin:koin-test to v3.5.3
Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/347>
2024-02-22 19:01:22 +00:00
Renovate Bot 3ebf11a6f6 chore(deps): update dependency io.insert-koin:koin-core to v3.5.3
Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/346>
2024-02-22 18:24:22 +00:00
Hugh Daschbach 5ee798abfb Remember hostname of last login.
Seed the login screen with saved host name, checkboxes.

Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/342>
2024-02-22 18:15:04 +00:00
Hugh Daschbach 6f24535b79 Auto logout on unrecoverable authentication error.
When an unrecoverable authentication error occurs, automatically log
the user out.  This seems better than leaving the user wondering why
the UI is unresponsive or why each track they try to play fails with a
quickly disappearing toast.

Unrecoverable authentication errors typically mean the server has
timed out the session out or the session token has been deleted on the
server.  Tokens expire after 14 days without use.

Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/342>
2024-02-22 18:15:04 +00:00
Hugh Daschbach 467556d75c Suppress some authentication noise in the log.
Most of this was added to debug issue !102.  So these are vestigial.

The exception here is the handling of AuthorizationException type 2.
These are produced by racing authentication requests and are
successfully managed.  So we need not report these.

Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/342>
2024-02-22 18:15:04 +00:00
Renovate Bot 10035aa5fe chore(deps): update dependency io.insert-koin:koin-android to v3.5.3
Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/345>
2024-02-22 09:44:21 +00:00
Georg Krause 8b9a1201af fix(copy): Use correct spelling of favorites
Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/344>
2024-02-22 09:35:03 +00:00
Hugh Daschbach 2088e06a68 Do not close NowPlayingBottomSheet between tracks.
If the user opens the NowPlayingBottomSheet whilst playing a non empty
queue, leave the BottomSheet open at the end of the playing track.

Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/343>
2024-02-21 21:59:28 -08:00
Renovate Bot 22a72d9e83 chore(deps): update dependency androidx.preference:preference-ktx to v1.2.1
Part-of: <https://dev.funkwhale.audio/funkwhale/funkwhale-android/-/merge_requests/341>
2024-01-25 22:44:39 +00:00
Bruno-Van-den-Bosch 2bdf904804 Translated using Weblate (Dutch)
Currently translated at 100.0% (127 of 127 strings)

Translation: Funkwhale/Funkwhale For Android
Translate-URL: https://translate.funkwhale.audio/projects/funkwhale/ffa/nl/
2023-12-30 12:07:45 +00:00
mittwerk 042d6b4d6e Translated using Weblate (Russian)
Currently translated at 100.0% (127 of 127 strings)

Translation: Funkwhale/Funkwhale For Android
Translate-URL: https://translate.funkwhale.audio/projects/funkwhale/ffa/ru/
2023-12-30 12:07:44 +00:00
mittwerk 67aa47a4cb Translated using Weblate (Russian)
Currently translated at 100.0% (127 of 127 strings)

Translation: Funkwhale/Funkwhale For Android
Translate-URL: https://translate.funkwhale.audio/projects/funkwhale/ffa/ru/
2023-12-17 14:50:32 +00:00
Hugh Daschbach 01c676acd8 Update build tools path.
Gradle now fetches command line tools 30.0.3.
2023-12-14 22:14:31 -08:00
Hugh Daschbach b27e4c85ee Adjustments for Gradle 8 build environment.
Gradle 8 requires JDK version 11.
Update build class path to pick up new Gradle version.
2023-12-14 22:13:18 -08:00
Renovate Bot c061c64c3d chore(deps): update dependency gradle to v8 2023-12-12 13:08:10 +00:00
21 changed files with 233 additions and 59 deletions

View File

@ -39,7 +39,7 @@ cache: &global_cache
before_script:
- git fetch --unshallow --tags
after_script:
- export versionCode=`$ANDROID_HOME/build-tools/30.0.2/aapt dump badging $apk_file | grep versionCode | awk '{print $3}' | sed s/versionCode=//g | sed s/\'//g`
- export versionCode=`$ANDROID_HOME/build-tools/30.0.3/aapt dump badging $apk_file | grep versionCode | awk '{print $3}' | sed s/versionCode=//g | sed s/\'//g`
- apt update && apt install gettext-base
- cat $metadata_template | envsubst > $metadata_file
extends: .gradle-default

View File

@ -36,8 +36,8 @@ androidGitVersion {
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
namespace = "audio.funkwhale.ffa"
@ -47,7 +47,7 @@ android {
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
jvmTarget = JavaVersion.VERSION_17.toString()
}
buildFeatures {
@ -177,7 +177,7 @@ dependencies {
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion")
implementation("androidx.coordinatorlayout:coordinatorlayout:1.2.0")
implementation("androidx.preference:preference-ktx:1.2.0")
implementation("androidx.preference:preference-ktx:1.2.1")
implementation("androidx.recyclerview:recyclerview:1.2.1")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
implementation("com.google.android.material:material:1.9.0") {
@ -189,9 +189,9 @@ dependencies {
implementation("com.google.android.exoplayer:exoplayer-ui:2.18.1")
implementation("com.google.android.exoplayer:extension-mediasession:2.18.1")
implementation("io.insert-koin:koin-core:3.5.0")
implementation("io.insert-koin:koin-android:3.5.0")
testImplementation("io.insert-koin:koin-test:3.5.0")
implementation("io.insert-koin:koin-core:3.5.3")
implementation("io.insert-koin:koin-android:3.5.3")
testImplementation("io.insert-koin:koin-test:3.5.3")
implementation("com.github.PaulWoitaschek.ExoPlayer-Extensions:extension-opus:789a4f83169cff5c7a91655bb828fde2cfde671a") {
isTransitive = false

View File

@ -1,9 +1,11 @@
package audio.funkwhale.ffa.activities
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.net.Uri
import android.os.Bundle
import android.text.Editable
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
import androidx.appcompat.app.AppCompatActivity
@ -64,6 +66,13 @@ class LoginActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
with(binding) {
val preferences = getPreferences(Context.MODE_PRIVATE)
val hn = preferences?.getString("hostname", "")
if (hn != null && !hn.isEmpty()) {
hostname.text = Editable.Factory.getInstance().newEditable(hn)
}
cleartext.setChecked(preferences?.getBoolean("cleartext", false) ?: false)
anonymous.setChecked(preferences?.getBoolean("anonymous", false) ?: false)
login.setOnClickListener {
var hostname = hostname.text.toString().trim().trim('/')
@ -96,6 +105,12 @@ class LoginActivity : AppCompatActivity() {
hostnameField.error = message
}
if (hostnameField.error == null) {
val preferences = getPreferences(Context.MODE_PRIVATE)
preferences?.edit()?.putString("hostname", hostname)?.commit()
preferences?.edit()?.putBoolean("cleartext", cleartext.isChecked)?.commit()
preferences?.edit()?.putBoolean("anonymous", anonymous.isChecked)?.commit()
}
}
}
}

View File

@ -53,9 +53,6 @@ fun Request.authorize(context: Context, oAuth: OAuth): Request {
this@authorize.apply {
if (!Settings.isAnonymous()) {
oAuth.state().let { state ->
state.accessTokenExpirationTime?.let {
Log.i("Request.authorize()", "Accesstoken expiration: ${Date(it).format()}")
}
val old = state.accessToken
val auth = ClientSecretPost(oAuth.state().clientSecret)
val done = CompletableDeferred<Boolean>()
@ -64,10 +61,10 @@ fun Request.authorize(context: Context, oAuth: OAuth): Request {
state.performActionWithFreshTokens(tokenService, auth) { token, _, e ->
if (e != null) {
Log.e("Request.authorize()", "performActionWithFreshToken failed: $e")
Log.e("Request.authorize()", Log.getStackTraceString(e))
}
if (token == old) {
Log.i("Request.authorize()", "Accesstoken not renewed")
if (e.type != 2 || e.code != 2002) {
Log.e("Request.authorize()", Log.getStackTraceString(e))
EventBus.send(Event.LogOut)
}
}
if (token != old && token != null) {
state.save()
@ -150,4 +147,4 @@ inline fun <T, U, V, W, R> LiveData<T>.mergeWith(
}
}
public fun String?.toIntOrElse(default: Int): Int = this?.toIntOrNull(radix = 10) ?: default
public fun String?.toIntOrElse(default: Int): Int = this?.toIntOrNull(radix = 10) ?: default

View File

@ -83,7 +83,7 @@ class OAuth(private val authorizationServiceFactory: AuthorizationServiceFactory
refreshAccessToken(state, context)
} else {
state.isAuthorized
}.also { it.logInfo("tryRefreshAccessToken()") }
}
}
return false
}
@ -103,6 +103,7 @@ class OAuth(private val authorizationServiceFactory: AuthorizationServiceFactory
if (e != null) {
Log.e("OAuth", "performTokenRequest failed: $e")
Log.e("OAuth", Log.getStackTraceString(e))
EventBus.send(Event.LogOut)
} else {
state.apply {
Log.i("OAuth", "applying new authState")

View File

@ -74,7 +74,9 @@ class NowPlayingBottomSheet @JvmOverloads constructor(
override fun show() {
behavior.isHideable = false
close()
if (behavior.state == BottomSheetBehavior.STATE_HIDDEN) {
close()
}
}
override fun hide() {

View File

@ -65,7 +65,7 @@
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_margin="8dp"
android:contentDescription="@string/control_add_to_favorties"
android:contentDescription="@string/control_add_to_favorites"
android:src="@drawable/favorite"
app:layout_constraintBottom_toBottomOf="@+id/current_playing_details_artist"
app:layout_constraintEnd_toEndOf="parent"
@ -158,4 +158,4 @@
app:layout_constraintTop_toBottomOf="@+id/now_playing_details_progress"
app:tint="@color/controlForeground" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
</layout>

View File

@ -81,7 +81,7 @@
<string name="radio_random_title">Ausazkoa</string>
<string name="radio_random_description">Ausaz hautatutakoak, agian zerbait berria aurkituko duzu!</string>
<string name="radio_less_listened_title">Gutxien entzundakoak</string>
<string name="control_add_to_favorties">Gehitu gogokoenetara</string>
<string name="control_add_to_favorites">Gehitu gogokoenetara</string>
<string name="playlist_added_to">%s zerrendan gehitu da</string>
<string name="filters">Iragazkiak</string>
<string name="fiters_all">Musika guztia</string>
@ -135,4 +135,4 @@
<string name="track_info_details_track_title">Pistaren izenburua</string>
<string name="control_toggle">Aldatu erreproduzitzea</string>
<string name="radio_favorites_description">Erreproduzitu abesti gogokoenak amaierarik gabeko begizta alai batean.</string>
</resources>
</resources>

View File

@ -136,6 +136,6 @@
<string name="settings_auto_skip_backwards_on_pause_summary">Nombre de secondes à revenir en arrière lorsque la lecture est en pause</string>
<string name="playlist">Liste de lecture</string>
<string name="hello_blank_fragment">Bonjour, fragment vide</string>
<string name="control_add_to_favorties">Ajouter aux favoris</string>
<string name="control_add_to_favorites">Ajouter aux favoris</string>
<string name="control_repeat_mode">Mode répétition</string>
</resources>
</resources>

View File

@ -133,5 +133,6 @@
<string name="settings_auto_skip_backwards_on_pause_summary">Número de segundos a rebobinar cando se pausou a reprodución</string>
<string name="playlist">Lista de reprodución</string>
<string name="control_repeat_mode">Modo repetición</string>
<string name="control_add_to_favorties">Engadir a favoritos</string>
<string name="control_add_to_favorites">Engadir a favoritos</string>
<string name="hello_blank_fragment">Borrar esta cadea</string>
</resources>

View File

@ -133,4 +133,7 @@
</plurals>
<string name="login_cleartext">Sta cleartext verkeer toe (HTTP)</string>
<string name="settings_media_quality_summary_size">Lichtst beschikbaar nummer zal worden afgespeeld</string>
<string name="control_repeat_mode">Herhalingsmodus</string>
<string name="control_add_to_favorties">Toevoegen aan favorieten</string>
<string name="control_add_to_favorites">Toevoegen aan favorieten</string>
</resources>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="login_error_hostname">Это не может быть понято как действительный URL</string>
<string name="login_error_hostname">Это не может быть воспринято как действительный URL</string>
<plurals name="downloads_description">
<item quantity="one">Загрузка %1$d трека</item>
<item quantity="few">Загрузка %1$d треков</item>
@ -11,19 +11,19 @@
<item quantity="few">%1$d трека • %2$s</item>
<item quantity="many">%1$d треков • %2$s</item>
</plurals>
<string name="logout_content">Вы действительно хотите выйти из этого инстанса Funkwhale\?</string>
<string name="logout_content">Вы действительно хотите выйти из этого экземпляра Funkwhale\?</string>
<string name="logout_title">Выйти</string>
<string name="radio_less_listened_description">Проигрывает треки которые вы обычно не слушаете. Пришло время восстановить баланс.</string>
<string name="radio_less_listened_title">Малопрослушиваемые</string>
<string name="radio_random_description">Полностью случайный выбор, может вы обнаружите для себя новые треки\?</string>
<string name="radio_random_description">Совершенно случайные подборки, может быть, вы откроете для себя что-то новое\?</string>
<string name="radio_random_title">Случайный порядок</string>
<string name="radio_favorites_description">Проигрывает ваши любимые мелодии по кругу и никогда не заканчивается.</string>
<string name="radio_your_content_description">Подобрано из вашей библиотеки</string>
<string name="radio_favorites_description">Воспроизвести любимые мелодии в бесконечном цикле счастья.</string>
<string name="radio_your_content_description">Подборки из ваших собственных библиотек</string>
<string name="radio_your_content_title">Ваш контент</string>
<string name="radio_user_radios">Пользовательское радио</string>
<string name="radio_instance_radios">Радио инстанса</string>
<string name="radio_playback_error">Произошла ошибка при попытке воспроизвести радио</string>
<string name="track_info_details_track_instance">Инстанс Funkwhale</string>
<string name="radio_instance_radios">Радио экземпляра</string>
<string name="radio_playback_error">При попытке воспроизвести это радио произошла ошибка</string>
<string name="track_info_details_track_instance">Экземпляр Funkwhale</string>
<string name="track_info_details_track_bitrate">Битрейт</string>
<string name="track_info_details_track_position">Позиция в альбоме</string>
<string name="track_info_details_track_duration">Продолжительность</string>
@ -39,14 +39,14 @@
<string name="alt_track_info">Информация о треке</string>
<string name="alt_more_options">Больше параметров</string>
<string name="alt_album_cover">Обложка альбома</string>
<string name="alt_artist_art">Изображение исполнителя</string>
<string name="alt_app_logo">Иконка приложения</string>
<string name="alt_artist_art">Рисунок исполнителя</string>
<string name="alt_app_logo">Логотип приложения</string>
<plurals name="album_count">
<item quantity="one">%d альбом</item>
<item quantity="few">%d альбома</item>
<item quantity="many">%d альбомов</item>
</plurals>
<string name="error_playback">Этот трек не будет проигран</string>
<string name="error_playback">Этот трек не может быть воспроизведен</string>
<string name="control_next">Следующий трек</string>
<string name="control_previous">Прошлый трек</string>
<string name="control_toggle">Переключить воспроизведение</string>
@ -60,7 +60,7 @@
<string name="playback_shuffle">Перемешать</string>
<string name="playback_media_controls_description">Управление воспроизведением медиа</string>
<string name="playback_media_controls">Управление медиа</string>
<string name="favorites">Любимые</string>
<string name="favorites">Избранное</string>
<string name="radios">Радио</string>
<string name="playlists">Плейлисты</string>
<string name="tracks">Треки</string>
@ -76,7 +76,7 @@
<string name="settings_information_repository_description">Funkwhale для Android™</string>
<string name="settings_information_repository_title">Репозиторий</string>
<string name="settings_information">Информация</string>
<string name="settings_night_mode_system_summary">Тёмный режим будет следовать настройкам системы</string>
<string name="settings_night_mode_system_summary">Ночной режим будет соответствовать системным настройкам</string>
<string name="settings_night_mode_system">Как указано в настройках системы</string>
<string name="settings_night_mode_off_summary">Светлый режим всегда будет включен</string>
<string name="settings_night_mode_off">Всегда выключен (светлый режим)</string>
@ -98,7 +98,7 @@
<string name="settings_media_quality">Качество медиа</string>
<string name="settings_general">Основные</string>
<string name="search_no_results">По вашему запросу ничего не найдено</string>
<string name="search_welcome">Введите ваш поисковый запрос и нажмите Enter для поиска вашей коллекции</string>
<string name="search_welcome">Введите условия поиска выше и нажмите клавишу Enter, чтобы найти коллекцию</string>
<string name="search_placeholder">Поиск исполнителей, альбомов и треков</string>
<string name="title_oss_licences">Лицензии открытого исходного кода</string>
<string name="title_settings">Настройки</string>
@ -106,14 +106,14 @@
<string name="toolbar_search">Поиск</string>
<string name="login_error_userinfo">Мы не смогли получить информацию о вашем аккаунте</string>
<string name="login_error_hostname_https">Имя хоста Funkwhale должно быть защищено с помощью HTTPS</string>
<string name="login_logging_in">Происходит вход</string>
<string name="login_logging_in">Входим</string>
<string name="login_submit">Войти</string>
<string name="login_password">Пароль</string>
<string name="login_username">Имя пользователя</string>
<string name="login_anonymous">Анонимная аутентификация</string>
<string name="login_cleartext">Разрешить незашифрованный трафик (HTTP)</string>
<string name="login_hostname">Доменное имя</string>
<string name="login_welcome">Введите данные вашего инстанса Funkwhale для доступа к контенту</string>
<string name="login_hostname">Имя домена</string>
<string name="login_welcome">Пожалуйста, введите данные вашего экземпляра Funkwhale, чтобы получить доступ к его содержимому</string>
<string name="playlist_add_to_new">Новый плейлист…</string>
<string name="filters_followed">Подписки на контент</string>
<string name="filters_my_music">Моя музыка</string>
@ -125,11 +125,17 @@
<string name="playback_queue_save">Сохранить</string>
<string name="playback_queue_clear">Очистить</string>
<string name="playback_play">Играть</string>
<string name="settings_play_order_in_order_summary">Предпочитаемый порядок проигрывания альбомов</string>
<string name="settings_play_order_in_order_summary">Вы предпочитаете слушать альбомы в порядке</string>
<string name="settings_play_order_in_order">Проигрывать альбомы в порядке</string>
<string name="settings_play_order_shuffle_summary">Перемешивать трэки в альбомах</string>
<string name="settings_play_order_shuffle_summary">Вы предпочитаете перетасовывать дорожки альбомов</string>
<string name="settings_play_order_shuffle">Перемешать альбомы</string>
<string name="settings_play_order">Предпочитаемый порядок</string>
<string name="login_error">Ошибка входа: %s</string>
<string name="login_error_funkwhale_not_found">Сервер Funkwhale не найден</string>
<string name="control_add_to_favorties">Добавить в избранное</string>
<string name="hello_blank_fragment">Привет пустой фрагмент</string>
<string name="playlist">Плейлист</string>
<string name="control_repeat_mode">Режим повтора</string>
<string name="settings_auto_skip_backwards_on_pause">Откатиться назад при паузе</string>
<string name="settings_auto_skip_backwards_on_pause_summary">Количество секунд для отката назад, когда воспроизведение приостановлено</string>
</resources>

View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="login_hostname">Sunucu adı</string>
<string name="login_cleartext">ık metin trafiğine izin ver (HTTP)</string>
<string name="login_username">Kullanıcı Adı</string>
<string name="login_password">Parola</string>
<string name="login_submit">Giriş</string>
<string name="login_logging_in">Oturum aç</string>
<string name="login_error">Giriş başarısız oldu: %s</string>
<string name="login_error_hostname">Bu geçerli bir Bağlantı olarak anlaşılamaz</string>
<string name="login_error_hostname_https">Funkwhale ana sunucu adı HTTPS aracılığıyla güvenli olmalıdır</string>
<string name="toolbar_search">Ara</string>
<string name="title_downloads">İndirilenler</string>
<string name="title_settings">Ayarlar</string>
<string name="title_oss_licences">ık kaynak lisansları</string>
<string name="search_placeholder">Sanatçıları, albümleri ve parçaları arayın</string>
<string name="search_no_results">Sorgunuz için sonuç bulunamadı</string>
<string name="settings_general">Genel</string>
<string name="settings_media_quality">Ortam kalitesi</string>
<string name="settings_media_quality_quality">En iyi kalite</string>
<string name="settings_media_quality_size">En küçük boyut</string>
<string name="settings_media_quality_summary_quality">Mevcut en iyi sürüm oynatılacaktır</string>
<string name="settings_media_quality_summary_size">Mevcut en küçük parça çalınacaktır</string>
<string name="settings_bandwidth_limitation">Bant genişliği sınırlaması</string>
<string name="settings_bandwidth_limitation_unlimited">Sınırsız</string>
<string name="settings_bandwidth_limitation_limited">Sınırlı</string>
<string name="settings_bandwidth_limitation_summary_limited">Uç nokta 320kbps maksimum bit hızına uygun içerik sunacaktır</string>
<string name="settings_media_cache_size">Medya önbellek boyutu</string>
<string name="settings_media_cache_size_summary">Çevrimdışı oynatma için parçaları depolamak üzere %d GB kullanılacaktır</string>
<string name="settings_play_order">Tercih edilen oynatma sırası</string>
<string name="settings_play_order_in_order">Albümleri sırayla çalın</string>
<string name="settings_play_order_in_order_summary">Albümleri sırayla çalmayı tercih ediyorsunuz</string>
<string name="settings_auto_skip_backwards_on_pause">Duraklatırken geriye doğru atlama</string>
<string name="settings_other">Diğer</string>
<string name="settings_night_mode">Karanlık</string>
<string name="settings_night_mode_on">Her zaman açık (karanlık)</string>
<string name="settings_night_mode_on_summary">Karanlık tema her zaman açık olacak</string>
<string name="settings_night_mode_off">Her zaman kapalı (açık)</string>
<string name="settings_night_mode_off_summary">ık tema her zaman açık olacak</string>
<string name="settings_night_mode_system">Sistem ayarlarını takip edin</string>
<string name="settings_play_order_shuffle">Karıştır albümleri</string>
<string name="settings_information">Bilgi</string>
<string name="settings_information_repository_title">Depo</string>
<string name="settings_version_title">Sürüm</string>
<string name="settings_information_license_title">Lisans</string>
<string name="settings_information_license_description">MIT lisans</string>
<string name="settings_crash_report_title">Kilitlenme günlüklerini kopyalama</string>
<string name="settings_crash_report_copied">Son çökme raporu panonuza kopyalandı</string>
<string name="settings_logout">Çıkış yapınız</string>
<string name="artists">Sanatçılar</string>
<string name="albums">Albümler</string>
<string name="tracks">Parçalar</string>
<string name="playlists">Çalma Listeleri</string>
<string name="radios">Radyolar</string>
<string name="favorites">Gözdeler</string>
<string name="playback_media_controls">Ortam kontrolleri</string>
<string name="playback_media_controls_description">Ortam oynatmayı kontrol etme</string>
<string name="playback_play">Oynat</string>
<string name="playback_shuffle">Karıştır</string>
<string name="playback_queue">Kuyruk</string>
<string name="playback_queue_empty">Kuyruk boş</string>
<string name="playback_queue_remove_item">Kaldır</string>
<string name="playback_queue_add_item">Kuyruğa ekle</string>
<string name="playback_queue_download">İndir</string>
<string name="playback_queue_clear">Temizle</string>
<string name="playback_queue_save">Kaydet</string>
<string name="manage_add_to_favorites">Gözdelerine ekle</string>
<string name="control_toggle">Oynatmayı aç kapat</string>
<string name="control_previous">Önceki parça</string>
<string name="control_next">Sonraki parça</string>
<string name="control_repeat_mode">Tekrar modu</string>
<string name="control_add_to_favorites">Gözdelere ekle</string>
<plurals name="album_count">
<item quantity="one">%d albüm</item>
<item quantity="other">%d albümler</item>
</plurals>
<string name="alt_app_logo">Uygulama logosu</string>
<string name="alt_artist_art">Sanatçı sanatı</string>
<string name="alt_album_cover">Albüm kapağı</string>
<string name="alt_more_options">Daha fazla seçenek</string>
<string name="alt_track_info">Parça hakkında bilgi</string>
<string name="track_info_artist">Sanatçıya git</string>
<string name="track_info_album">Albüme git</string>
<string name="track_info_details">Bilgi</string>
<string name="track_info_details_artist">Sanatçı</string>
<string name="track_info_details_album">Albüm</string>
<string name="track_info_details_track_title">Parça başlığı</string>
<string name="track_info_details_track_copyright">Telif Hakkı</string>
<string name="track_info_details_track_license">Lisans</string>
<string name="login_error_funkwhale_not_found">Funkwhale kapsülü bulunamadı</string>
<string name="track_info_details_track_duration">Süre</string>
<string name="track_info_details_track_position">Albüm konumu</string>
<string name="track_info_details_track_bitrate">BitHızı</string>
<string name="track_info_details_track_instance">Funkwhale örneği</string>
<string name="radio_playback_error">Bu radyoyu oynatmaya çalışırken bir hata oluştu</string>
<string name="radio_instance_radios">Örnek radyolar</string>
<string name="radio_user_radios">Kullanıcı radyoları</string>
<string name="radio_your_content_title">İçeriğiniz</string>
<string name="radio_your_content_description">Kendi kütüphanelerinizden seçtikleriniz</string>
<string name="radio_random_title">Rastgele</string>
<string name="radio_random_description">Tamamen rastgele seçimler, belki yeni şeyler keşfedersiniz\?</string>
<string name="radio_less_listened_title">Daha az dinlendi</string>
<string name="radio_less_listened_description">Genelde dinlemediğiniz parçaları dinleyin. Biraz denge sağlamanın zamanı geldi.</string>
<string name="logout_title">Çıkış yapınız</string>
<plurals name="playlist_description">
<item quantity="one">%1$d parça • %2$s</item>
<item quantity="other">%1$d parçalar • %2$s</item>
</plurals>
<string name="playlist_add_to">Oynatma listesine ekle</string>
<string name="playlist_add_to_new">Yeni oynatma listesi…</string>
<string name="playlist_add_to_create">Oynatma listesi oluştur</string>
<string name="playlist_added_to">Oynatma listesi %s eklendi</string>
<string name="filters">Süzgeçler</string>
<string name="fiters_all">Tüm müzikler</string>
<string name="filters_my_music">Benim müzikler</string>
<string name="filters_followed">Takip edilen içerik</string>
<string name="login_welcome">İçeriğine erişmek için lütfen Funkwhale örneğinizin ayrıntılarını girin</string>
<string name="login_anonymous">Anonim kimlik doğrulama</string>
<string name="logout_content">Bu Funkwhale örneğinden çıkmak istediğinizden emin misiniz\?</string>
<plurals name="downloads_description">
<item quantity="one">Parça %1$d indiriliyor</item>
<item quantity="other">Parçalar %1$d indiriliyor</item>
</plurals>
<string name="login_error_userinfo">Kullanıcınız hakkında bilgi alamadık</string>
<string name="settings_play_order_shuffle_summary">Albüm parçalarını karıştırmayı tercih ediyorsunuz</string>
<string name="hello_blank_fragment">Merhaba boş parça</string>
<string name="settings_auto_skip_backwards_on_pause_summary">Oynatma duraklatıldığında geriye doğru atlanacak saniye sayısı</string>
<string name="settings_information_repository_description">Android™ için Funkwhale</string>
<string name="settings_crash_report_description">Yalnızca çökmeden önceki son 5 dakikaya ait günlükler toplanacaktır</string>
<string name="track_info_details_title">Parça detayları</string>
<string name="search_welcome">Arama kelimerinizi yukarıya yazın ve koleksiyonunuzda arama yapmak için enter tuşuna basın</string>
<string name="settings_bandwidth_limitation_summary_unlimited">Özgün içerik kod dönüştürme olmadan getirilecektir</string>
<string name="settings_night_mode_system_summary">Gece teması sistem ayarlarını takip edecek</string>
<string name="playback_queue_play_next">Sonrakini oynat</string>
<string name="error_playback">Bu parça çalınamadı</string>
<string name="radio_favorites_description">Hiç bitmeyen bir mutluluk döngüsünde en sevdiğiniz şarkıları çalın.</string>
<string name="playlist">Oynatma listesi</string>
</resources>

View File

@ -82,7 +82,7 @@
<string name="control_previous">Previous track</string>
<string name="control_next">Next track</string>
<string name="control_repeat_mode">Repeat mode</string>
<string name="control_add_to_favorties">Add to favorties</string>
<string name="control_add_to_favorites">Add to favorites</string>
<string name="error_playback">This track could not be played</string>
<plurals name="album_count">
<item quantity="one">%d album</item>

View File

@ -13,7 +13,7 @@ buildscript {
val navVersion: String by extra
dependencies {
classpath("com.android.tools.build:gradle:7.4.2")
classpath("com.android.tools.build:gradle:8.1.2")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.20")
classpath("com.github.bjoernq:unmockplugin:0.7.9")
classpath("com.github.ben-manes:gradle-versions-plugin:0.46.0")

View File

@ -0,0 +1 @@
Log user out when authorization token expires (#154)

View File

@ -0,0 +1 @@
Remember server settings in login dialog (#154)

View File

@ -4,3 +4,6 @@ kotlin.code.style=official
android.useAndroidX=true
android.enableJetifier=true
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false

Binary file not shown.

View File

@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

29
gradlew vendored
View File

@ -83,10 +83,8 @@ done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -133,10 +131,13 @@ location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \