Add customizable device name (#61)

* Add ability to name your device

* Update device name real time

* Remove unnecessary deviceInfo and apiClientFactory

Co-authored-by: Jarne Demeulemeester <32322857+jarnedemeulemeester@users.noreply.github.com>
This commit is contained in:
lsrom 2021-10-31 11:43:02 +01:00 committed by GitHub
parent d0673bc82b
commit 8c90031165
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 73 additions and 6 deletions

View file

@ -2,10 +2,20 @@ package dev.jdtech.jellyfin.api
import android.content.Context import android.content.Context
import dev.jdtech.jellyfin.BuildConfig import dev.jdtech.jellyfin.BuildConfig
import org.jellyfin.sdk.api.client.extensions.* import org.jellyfin.sdk.api.client.extensions.devicesApi
import org.jellyfin.sdk.api.client.extensions.itemsApi
import org.jellyfin.sdk.api.client.extensions.mediaInfoApi
import org.jellyfin.sdk.api.client.extensions.playStateApi
import org.jellyfin.sdk.api.client.extensions.sessionApi
import org.jellyfin.sdk.api.client.extensions.systemApi
import org.jellyfin.sdk.api.client.extensions.tvShowsApi
import org.jellyfin.sdk.api.client.extensions.userApi
import org.jellyfin.sdk.api.client.extensions.userLibraryApi
import org.jellyfin.sdk.api.client.extensions.userViewsApi
import org.jellyfin.sdk.api.client.extensions.videosApi
import org.jellyfin.sdk.createJellyfin import org.jellyfin.sdk.createJellyfin
import org.jellyfin.sdk.model.ClientInfo import org.jellyfin.sdk.model.ClientInfo
import java.util.* import java.util.UUID
/** /**
* Jellyfin API class using org.jellyfin.sdk:jellyfin-platform-android * Jellyfin API class using org.jellyfin.sdk:jellyfin-platform-android
@ -15,14 +25,20 @@ import java.util.*
* @constructor Creates a new [JellyfinApi] instance * @constructor Creates a new [JellyfinApi] instance
*/ */
class JellyfinApi(androidContext: Context, baseUrl: String) { class JellyfinApi(androidContext: Context, baseUrl: String) {
val jellyfin = createJellyfin { val jellyfin = createJellyfin {
clientInfo = clientInfo = ClientInfo(
ClientInfo(name = androidContext.applicationInfo.loadLabel(androidContext.packageManager).toString(), version = BuildConfig.VERSION_NAME) name = androidContext.applicationInfo.loadLabel(androidContext.packageManager)
.toString(),
version = BuildConfig.VERSION_NAME
)
context = androidContext context = androidContext
} }
val api = jellyfin.createApi(baseUrl = baseUrl) val api = jellyfin.createApi(baseUrl = baseUrl)
var userId: UUID? = null var userId: UUID? = null
val devicesApi = api.devicesApi
val systemApi = api.systemApi val systemApi = api.systemApi
val userApi = api.userApi val userApi = api.userApi
val viewsApi = api.userViewsApi val viewsApi = api.userViewsApi

View file

@ -3,14 +3,25 @@ package dev.jdtech.jellyfin.fragments
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatDelegate.* import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.preference.EditTextPreference
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.R
import dev.jdtech.jellyfin.viewmodels.SettingsViewModel
@AndroidEntryPoint
class SettingsFragment: PreferenceFragmentCompat() {
private val viewModel: SettingsViewModel by viewModels()
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.fragment_settings, rootKey) setPreferencesFromResource(R.xml.fragment_settings, rootKey)
@ -41,5 +52,10 @@ class SettingsFragment : PreferenceFragmentCompat() {
findNavController().navigate(SettingsFragmentDirections.actionSettingsFragmentToAboutLibraries()) findNavController().navigate(SettingsFragmentDirections.actionSettingsFragmentToAboutLibraries())
true true
} }
findPreference<EditTextPreference>("deviceName")?.setOnPreferenceChangeListener { _, name ->
viewModel.updateDeviceName(name.toString())
true
}
} }
} }

View file

@ -0,0 +1,24 @@
package dev.jdtech.jellyfin.viewmodels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.jdtech.jellyfin.api.JellyfinApi
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
import org.jellyfin.sdk.model.api.DeviceOptions
import javax.inject.Inject
@HiltViewModel
internal class SettingsViewModel @Inject internal constructor(
private val api: JellyfinApi
) : ViewModel() {
fun updateDeviceName(name: String) {
api.jellyfin.deviceInfo?.id?.let { id ->
viewModelScope.launch(IO) {
api.devicesApi.updateDeviceOptions(id, DeviceOptions(name))
}
}
}
}

View file

@ -48,6 +48,8 @@
<string name="settings_category_player">Přehrávač</string> <string name="settings_category_player">Přehrávač</string>
<string name="manage_servers">Spravovat servery</string> <string name="manage_servers">Spravovat servery</string>
<string name="settings_category_appearance">Vzhled</string> <string name="settings_category_appearance">Vzhled</string>
<string name="settings_category_device">Zařízení</string>
<string name="device_name">Název zařízení</string>
<string name="theme">Téma</string> <string name="theme">Téma</string>
<string name="error_preparing_player_items">Chyba při načítání přehrávání.</string> <string name="error_preparing_player_items">Chyba při načítání přehrávání.</string>
<string name="view_details">Zobrazit detaily</string> <string name="view_details">Zobrazit detaily</string>

View file

@ -50,6 +50,8 @@
<string name="settings_category_player">Player</string> <string name="settings_category_player">Player</string>
<string name="manage_servers">Manage servers</string> <string name="manage_servers">Manage servers</string>
<string name="settings_category_appearance">Appearance</string> <string name="settings_category_appearance">Appearance</string>
<string name="settings_category_device">Device</string>
<string name="device_name">Device name</string>
<string name="theme">Theme</string> <string name="theme">Theme</string>
<string name="error_preparing_player_items">Error preparing player items.</string> <string name="error_preparing_player_items">Error preparing player items.</string>
<string name="view_details">View details</string> <string name="view_details">View details</string>

View file

@ -55,6 +55,13 @@
app:summary="@string/force_software_decoding_summary"/> app:summary="@string/force_software_decoding_summary"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory app:title="@string/settings_category_device">
<EditTextPreference
app:key="deviceName"
app:title="@string/device_name"
app:useSimpleSummaryProvider="true"/>
</PreferenceCategory>
<PreferenceCategory app:title="@string/about"> <PreferenceCategory app:title="@string/about">
<Preference <Preference