创建 SP 工具类,管理所有(除 ChannelUtils 以外)用户偏好设置

This commit is contained in:
WoooKong 2024-02-19 12:23:05 +08:00
parent e7780434d7
commit f94d136a03
8 changed files with 113 additions and 78 deletions

View File

@ -38,5 +38,10 @@
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<provider
android:name=".InitializerProvider"
android:authorities="${applicationId}.InitializerProvider"
android:exported="false"
android:initOrder="900" />
</application> </application>
</manifest> </manifest>

View File

@ -7,8 +7,7 @@ import android.content.Intent
class BootReceiver : BroadcastReceiver() { class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
val sp = context.getSharedPreferences("MainActivity", Context.MODE_PRIVATE) if (SP.bootStartup) {
if (sp.getBoolean(MainActivity.BOOT_STARTUP, true)) {
context.startActivity( context.startActivity(
Intent(context, MainActivity::class.java) Intent(context, MainActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

View File

@ -0,0 +1,39 @@
package com.lizongying.mytv
import android.content.ContentProvider
import android.content.ContentValues
import android.net.Uri
internal class InitializerProvider : ContentProvider() {
// Happens before Application#onCreate.It's fine to init something here
override fun onCreate(): Boolean {
SP.init(context!!)
return true
}
override fun query(
uri: Uri,
projection: Array<out String>?,
selection: String?,
selectionArgs: Array<out String>?,
sortOrder: String?,
) = unsupported()
override fun getType(uri: Uri) = unsupported()
override fun insert(uri: Uri, values: ContentValues?) = unsupported()
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?) =
unsupported()
override fun update(
uri: Uri,
values: ContentValues?,
selection: String?,
selectionArgs: Array<out String>?,
) = unsupported()
private fun unsupported(errorMessage: String? = null): Nothing =
throw UnsupportedOperationException(errorMessage)
}

View File

@ -1,7 +1,5 @@
package com.lizongying.mytv package com.lizongying.mytv
import android.content.Context
import android.content.SharedPreferences
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.pm.Signature import android.content.pm.Signature
@ -43,11 +41,6 @@ class MainActivity : FragmentActivity() {
private val delayHideMain: Long = 5000 private val delayHideMain: Long = 5000
private val delayHideSetting: Long = 10000 private val delayHideSetting: Long = 10000
lateinit var sharedPref: SharedPreferences
private var channelReversal = false
private var channelNum = true
private var bootStartup = true
private var versionName = "" private var versionName = ""
init { init {
@ -79,19 +72,13 @@ class MainActivity : FragmentActivity() {
.commit() .commit()
} }
gestureDetector = GestureDetector(this, GestureListener()) gestureDetector = GestureDetector(this, GestureListener())
sharedPref = getPreferences(Context.MODE_PRIVATE)
channelReversal = sharedPref.getBoolean(CHANNEL_REVERSAL, channelReversal)
channelNum = sharedPref.getBoolean(CHANNEL_NUM, channelNum)
bootStartup = sharedPref.getBoolean(BOOT_STARTUP, bootStartup)
versionName = getPackageInfo().versionName versionName = getPackageInfo().versionName
settingFragment = SettingFragment(versionName, channelReversal, channelNum, bootStartup) settingFragment = SettingFragment(versionName, SP.channelReversal, SP.channelNum, SP.bootStartup)
} }
fun showInfoFragment(tvViewModel: TVViewModel) { fun showInfoFragment(tvViewModel: TVViewModel) {
infoFragment.show(tvViewModel) infoFragment.show(tvViewModel)
if (channelNum) { if (SP.channelNum) {
channelFragment.show(tvViewModel) channelFragment.show(tvViewModel)
} }
} }
@ -105,7 +92,7 @@ class MainActivity : FragmentActivity() {
return return
} }
if (channelNum) { if (SP.channelNum) {
channelFragment.show(channel) channelFragment.show(channel)
} }
} }
@ -223,30 +210,6 @@ class MainActivity : FragmentActivity() {
} }
} }
fun saveChannelReversal(channelReversal: Boolean) {
with(sharedPref.edit()) {
putBoolean(CHANNEL_REVERSAL, channelReversal)
apply()
}
this.channelReversal = channelReversal
}
fun saveChannelNum(channelNum: Boolean) {
with(sharedPref.edit()) {
putBoolean(CHANNEL_NUM, channelNum)
apply()
}
this.channelNum = channelNum
}
fun saveBootStartup(bootStartup: Boolean) {
with(sharedPref.edit()) {
putBoolean(BOOT_STARTUP, bootStartup)
apply()
}
this.bootStartup = bootStartup
}
private fun showSetting() { private fun showSetting() {
if (!mainFragment.isHidden) { if (!mainFragment.isHidden) {
return return
@ -271,7 +234,7 @@ class MainActivity : FragmentActivity() {
private fun channelUp() { private fun channelUp() {
if (mainFragment.isHidden) { if (mainFragment.isHidden) {
if (channelReversal) { if (SP.channelReversal) {
next() next()
return return
} }
@ -288,7 +251,7 @@ class MainActivity : FragmentActivity() {
private fun channelDown() { private fun channelDown() {
if (mainFragment.isHidden) { if (mainFragment.isHidden) {
if (channelReversal) { if (SP.channelReversal) {
prev() prev()
return return
} }
@ -520,7 +483,7 @@ class MainActivity : FragmentActivity() {
override fun onResume() { override fun onResume() {
Log.i(TAG, "onResume") Log.i(TAG, "onResume")
super.onResume() super.onResume()
if (!mainFragment.isHidden){ if (!mainFragment.isHidden) {
handler.postDelayed(hideMain, delayHideMain) handler.postDelayed(hideMain, delayHideMain)
} }
} }
@ -531,10 +494,7 @@ class MainActivity : FragmentActivity() {
handler.removeCallbacks(hideMain) handler.removeCallbacks(hideMain)
} }
companion object { private companion object {
private const val TAG = "MainActivity" const val TAG = "MainActivity"
private const val CHANNEL_REVERSAL = "channel_reversal"
private const val CHANNEL_NUM = "channel_num"
const val BOOT_STARTUP = "boot_startup"
} }
} }

View File

@ -1,6 +1,5 @@
package com.lizongying.mytv package com.lizongying.mytv
import android.content.SharedPreferences
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
@ -34,8 +33,6 @@ class MainFragment : BrowseSupportFragment() {
var tvListViewModel = TVListViewModel() var tvListViewModel = TVListViewModel()
private lateinit var sharedPref: SharedPreferences
private var lastVideoUrl = "" private var lastVideoUrl = ""
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
@ -58,7 +55,6 @@ class MainFragment : BrowseSupportFragment() {
super.onActivityCreated(savedInstanceState) super.onActivityCreated(savedInstanceState)
activity?.let { request.initYSP(it) } activity?.let { request.initYSP(it) }
sharedPref = (activity as? MainActivity)?.sharedPref!!
loadRows() loadRows()
@ -156,7 +152,7 @@ class MainFragment : BrowseSupportFragment() {
adapter = rowsAdapter adapter = rowsAdapter
itemPosition = sharedPref.getInt(POSITION, 0) itemPosition = SP.itemPosition
if (itemPosition >= tvListViewModel.size()) { if (itemPosition >= tvListViewModel.size()) {
itemPosition = 0 itemPosition = 0
} }
@ -322,11 +318,8 @@ class MainFragment : BrowseSupportFragment() {
override fun onStop() { override fun onStop() {
Log.i(TAG, "onStop") Log.i(TAG, "onStop")
super.onStop() super.onStop()
with(sharedPref.edit()) { SP.itemPosition = itemPosition
putInt(POSITION, itemPosition) Log.i(TAG, "position saved")
apply()
}
Log.i(TAG, "$POSITION saved")
} }
override fun onDestroy() { override fun onDestroy() {
@ -337,6 +330,5 @@ class MainFragment : BrowseSupportFragment() {
companion object { companion object {
private const val TAG = "MainFragment" private const val TAG = "MainFragment"
private const val POSITION = "position"
} }
} }

View File

@ -0,0 +1,49 @@
package com.lizongying.mytv
import android.content.Context
import android.content.SharedPreferences
object SP {
// Name of the sp file TODO Should use a meaningful name and do migrations
private const val SP_FILE_NAME = "MainActivity"
// if Change channel with up and down in reversed order or not
private const val KEY_CHANNEL_REVERSAL = "channel_reversal"
// If use channel num to select channel or not
private const val KEY_CHANNEL_NUM = "channel_num"
// If start app on device boot or not
private const val KEY_BOOT_STARTUP = "boot_startup"
// Position in list of the selected channel item
private const val KEY_POSITION = "position"
// guid
private const val KEY_GUID = "guid"
// guid
private lateinit var sp: SharedPreferences
/**
* The method must be invoked as early as possible(At least before using the keys)
*/
fun init(context: Context) {
sp = context.getSharedPreferences(SP_FILE_NAME, Context.MODE_PRIVATE)
}
var channelReversal: Boolean
get() = sp.getBoolean(KEY_CHANNEL_REVERSAL, false)
set(value) = sp.edit().putBoolean(KEY_CHANNEL_REVERSAL, value).apply()
var channelNum: Boolean
get() = sp.getBoolean(KEY_CHANNEL_NUM, true)
set(value) = sp.edit().putBoolean(KEY_CHANNEL_NUM, value).apply()
var bootStartup: Boolean
// TODO Its more friendly to change the default value to false
get() = sp.getBoolean(KEY_BOOT_STARTUP, true)
set(value) = sp.edit().putBoolean(KEY_BOOT_STARTUP, value).apply()
var itemPosition: Int
get() = sp.getInt(KEY_POSITION, 0)
set(value) = sp.edit().putInt(KEY_POSITION, value).apply()
var guid: String
get() = sp.getString(KEY_GUID, "") ?: ""
set(value) = sp.edit().putString(KEY_GUID, value).apply()
}

View File

@ -35,19 +35,19 @@ class SettingFragment(private val versionName: String,
val switchChannelReversal = _binding?.switchChannelReversal val switchChannelReversal = _binding?.switchChannelReversal
switchChannelReversal?.isChecked = channelReversal switchChannelReversal?.isChecked = channelReversal
switchChannelReversal?.setOnCheckedChangeListener { _, isChecked -> switchChannelReversal?.setOnCheckedChangeListener { _, isChecked ->
(activity as MainActivity).saveChannelReversal(isChecked) SP.channelReversal = isChecked
} }
val switchChannelNum = _binding?.switchChannelNum val switchChannelNum = _binding?.switchChannelNum
switchChannelNum?.isChecked = channelNum switchChannelNum?.isChecked = channelNum
switchChannelNum?.setOnCheckedChangeListener { _, isChecked -> switchChannelNum?.setOnCheckedChangeListener { _, isChecked ->
(activity as MainActivity).saveChannelNum(isChecked) SP.channelNum = isChecked
} }
val switchBootStartup = _binding?.switchBootStartup val switchBootStartup = _binding?.switchBootStartup
switchBootStartup?.isChecked = bootStartup switchBootStartup?.isChecked = bootStartup
switchBootStartup?.setOnCheckedChangeListener { _, isChecked -> switchBootStartup?.setOnCheckedChangeListener { _, isChecked ->
(activity as MainActivity).saveBootStartup(isChecked) SP.bootStartup = isChecked
} }
return binding.root return binding.root

View File

@ -1,9 +1,9 @@
package com.lizongying.mytv.api package com.lizongying.mytv.api
import android.content.Context import android.content.Context
import android.content.SharedPreferences
import com.lizongying.mytv.Encryptor import com.lizongying.mytv.Encryptor
import com.lizongying.mytv.MainActivity import com.lizongying.mytv.MainActivity
import com.lizongying.mytv.SP
import com.lizongying.mytv.Utils.getDateTimestamp import com.lizongying.mytv.Utils.getDateTimestamp
import com.lizongying.mytv.models.TVViewModel import com.lizongying.mytv.models.TVViewModel
import kotlin.math.floor import kotlin.math.floor
@ -51,14 +51,11 @@ class YSP(var context: Context) {
private var signature = "" private var signature = ""
private var encryptor: Encryptor? = null private var encryptor: Encryptor? = null
private lateinit var sharedPref: SharedPreferences
init { init {
if (context is MainActivity) { if (context is MainActivity) {
encryptor = Encryptor() encryptor = Encryptor()
encryptor!!.init(context) encryptor!!.init(context)
sharedPref = (context as MainActivity).sharedPref
} }
guid = getGuid() guid = getGuid()
@ -94,23 +91,17 @@ class YSP(var context: Context) {
} }
fun getGuid(): String { fun getGuid(): String {
var guid = sharedPref.getString("guid", "") var guid = SP.guid
if (guid == null || guid.length < 18) { if (guid.length < 18) {
guid = generateGuid() guid = generateGuid()
with(sharedPref.edit()) { SP.guid = guid
putString("guid", guid)
apply()
}
} }
return guid return guid
} }
private fun newGuid(): String { private fun newGuid(): String {
guid = generateGuid() guid = generateGuid()
with(sharedPref.edit()) { SP.guid = guid
putString("guid", guid)
apply()
}
return guid return guid
} }