Add option to turn on offline mode automatically

This commit is contained in:
Jesper Winters 2023-10-27 15:35:07 +02:00
parent 51f0569665
commit 3db0f57437
8 changed files with 57 additions and 5 deletions

View file

@ -6,6 +6,7 @@ import android.view.View
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewModelScope
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.NavGraph import androidx.navigation.NavGraph
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
@ -22,9 +23,13 @@ import com.google.android.material.navigation.NavigationBarView
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.database.ServerDatabaseDao import dev.jdtech.jellyfin.database.ServerDatabaseDao
import dev.jdtech.jellyfin.databinding.ActivityMainBinding import dev.jdtech.jellyfin.databinding.ActivityMainBinding
import dev.jdtech.jellyfin.repository.JellyfinRepository
import dev.jdtech.jellyfin.utils.restart
import dev.jdtech.jellyfin.viewmodels.MainViewModel import dev.jdtech.jellyfin.viewmodels.MainViewModel
import dev.jdtech.jellyfin.work.SyncWorker import dev.jdtech.jellyfin.work.SyncWorker
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.core.R as CoreR
@ -38,6 +43,9 @@ class MainActivity : AppCompatActivity() {
@Inject @Inject
lateinit var database: ServerDatabaseDao lateinit var database: ServerDatabaseDao
@Inject
lateinit var jellyfinRepository: JellyfinRepository;
@Inject @Inject
lateinit var appPreferences: AppPreferences lateinit var appPreferences: AppPreferences
@ -71,11 +79,15 @@ class MainActivity : AppCompatActivity() {
val navView: NavigationBarView = binding.navView as NavigationBarView val navView: NavigationBarView = binding.navView as NavigationBarView
if (appPreferences.offlineMode) { if (appPreferences.isOffline) {
navView.menu.clear() navView.menu.clear()
navView.inflateMenu(CoreR.menu.bottom_nav_menu_offline) navView.inflateMenu(CoreR.menu.bottom_nav_menu_offline)
} }
if (!appPreferences.isOffline && appPreferences.autoOffline) {
testServerConnection();
}
setSupportActionBar(binding.mainToolbar) setSupportActionBar(binding.mainToolbar)
// Passing each menu ID as a set of Ids because each // Passing each menu ID as a set of Ids because each
@ -181,4 +193,19 @@ class MainActivity : AppCompatActivity() {
setTheme(CoreR.style.Theme_FindroidAMOLED) setTheme(CoreR.style.Theme_FindroidAMOLED)
} }
} }
private fun testServerConnection() {
val activity = this;
lifecycleScope.launch {
try {
jellyfinRepository.getPublicSystemInfo()
// Give the UI a chance to load
delay(100)
} catch (e: Exception) {
Timber.d("------------------- Failed to be online")
appPreferences.isOffline = true;
activity.restart();
}
}
}
} }

View file

@ -8,7 +8,9 @@ import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.AppPreferences import dev.jdtech.jellyfin.AppPreferences
import dev.jdtech.jellyfin.Constants
import dev.jdtech.jellyfin.utils.restart import dev.jdtech.jellyfin.utils.restart
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import dev.jdtech.jellyfin.core.R as CoreR import dev.jdtech.jellyfin.core.R as CoreR

View file

@ -47,8 +47,8 @@ object RepositoryModule {
jellyfinRepositoryOfflineImpl: JellyfinRepositoryOfflineImpl, jellyfinRepositoryOfflineImpl: JellyfinRepositoryOfflineImpl,
appPreferences: AppPreferences, appPreferences: AppPreferences,
): JellyfinRepository { ): JellyfinRepository {
println("Creating new JellyfinRepository") println("Creating new JellyfinRepository, is offline: ${appPreferences.isOffline}")
return when (appPreferences.offlineMode) { return when (appPreferences.isOffline) {
true -> jellyfinRepositoryOfflineImpl true -> jellyfinRepositoryOfflineImpl
false -> jellyfinRepositoryImpl false -> jellyfinRepositoryImpl
} }

View file

@ -44,7 +44,7 @@ constructor(
private fun testServerConnection() { private fun testServerConnection() {
viewModelScope.launch { viewModelScope.launch {
try { try {
if (appPreferences.offlineMode) return@launch if (appPreferences.isOffline) return@launch
repository.getPublicSystemInfo() repository.getPublicSystemInfo()
// Give the UI a chance to load // Give the UI a chance to load
delay(100) delay(100)

View file

@ -177,4 +177,5 @@
<string name="cancel_download_message">Are you sure you want to cancel the download?</string> <string name="cancel_download_message">Are you sure you want to cancel the download?</string>
<string name="stop_download">Stop download</string> <string name="stop_download">Stop download</string>
<string name="privacy_policy_notice">By using Findroid you agree with the <a href='https://raw.githubusercontent.com/jarnedemeulemeester/findroid/main/PRIVACY'>Privacy Policy</a> which states that we do not collect any data</string> <string name="privacy_policy_notice">By using Findroid you agree with the <a href='https://raw.githubusercontent.com/jarnedemeulemeester/findroid/main/PRIVACY'>Privacy Policy</a> which states that we do not collect any data</string>
<string name="turn_on_offline_mode_automatically">Turn on offline mode automatically</string>
</resources> </resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<EditTextPreference <EditTextPreference
app:defaultValue="30000" app:defaultValue="30000"
app:key="pref_network_request_timeout" app:key="pref_network_request_timeout"
@ -15,4 +16,8 @@
app:key="pref_network_socket_timeout" app:key="pref_network_socket_timeout"
app:title="@string/settings_socket_timeout" app:title="@string/settings_socket_timeout"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat
android:defaultValue="false"
app:key="pref_auto_offline"
app:title="@string/turn_on_offline_mode_automatically" />
</PreferenceScreen> </PreferenceScreen>

View file

@ -25,11 +25,27 @@ constructor(
var offlineMode var offlineMode
get() = sharedPreferences.getBoolean(Constants.PREF_OFFLINE_MODE, false) get() = sharedPreferences.getBoolean(Constants.PREF_OFFLINE_MODE, false)
set(value) { set(value) {
isOffline = value
sharedPreferences.edit { sharedPreferences.edit {
putBoolean(Constants.PREF_OFFLINE_MODE, value) putBoolean(Constants.PREF_OFFLINE_MODE, value)
} }
} }
var autoOffline
get() = sharedPreferences.getBoolean(Constants.PREF_AUTO_OFFLINE, false)
set(value) {
sharedPreferences.edit {
putBoolean(Constants.PREF_AUTO_OFFLINE, value)
}
}
private var _isOffline = sharedPreferences.getBoolean(Constants.PREF_OFFLINE_MODE, false);
var isOffline
get() = _isOffline;
set(value) {
_isOffline = value;
}
// Appearance // Appearance
val theme get() = sharedPreferences.getString(Constants.PREF_THEME, null) val theme get() = sharedPreferences.getString(Constants.PREF_THEME, null)
val dynamicColors get() = sharedPreferences.getBoolean(Constants.PREF_DYNAMIC_COLORS, true) val dynamicColors get() = sharedPreferences.getBoolean(Constants.PREF_DYNAMIC_COLORS, true)

View file

@ -12,6 +12,7 @@ object Constants {
// pref // pref
const val PREF_CURRENT_SERVER = "pref_current_server" const val PREF_CURRENT_SERVER = "pref_current_server"
const val PREF_OFFLINE_MODE = "pref_offline_mode" const val PREF_OFFLINE_MODE = "pref_offline_mode"
const val PREF_AUTO_OFFLINE = "pref_auto_offline"
const val PREF_PLAYER_GESTURES = "pref_player_gestures" const val PREF_PLAYER_GESTURES = "pref_player_gestures"
const val PREF_PLAYER_GESTURES_VB = "pref_player_gestures_vb" const val PREF_PLAYER_GESTURES_VB = "pref_player_gestures_vb"
const val PREF_PLAYER_GESTURES_ZOOM = "pref_player_gestures_zoom" const val PREF_PLAYER_GESTURES_ZOOM = "pref_player_gestures_zoom"