v1.0.7 - 카테고리 On/Off 설정, REQUEST_INSTALL_PACKAGES 권한
This commit is contained in:
@@ -13,8 +13,8 @@ android {
|
|||||||
applicationId "com.example.tvmon"
|
applicationId "com.example.tvmon"
|
||||||
minSdk 28
|
minSdk 28
|
||||||
targetSdk 34
|
targetSdk 34
|
||||||
versionCode 7
|
versionCode 8
|
||||||
versionName "1.0.6"
|
versionName "1.0.7"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||||
|
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.type.tv"
|
android:name="android.hardware.type.tv"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import com.example.tvmon.data.model.Content
|
|||||||
import com.example.tvmon.data.repository.CategoryCacheRepository
|
import com.example.tvmon.data.repository.CategoryCacheRepository
|
||||||
import com.example.tvmon.data.repository.WatchHistoryRepository
|
import com.example.tvmon.data.repository.WatchHistoryRepository
|
||||||
import com.example.tvmon.data.scraper.TvmonScraper
|
import com.example.tvmon.data.scraper.TvmonScraper
|
||||||
|
import com.example.tvmon.util.CategoryPreferences
|
||||||
import com.example.tvmon.ui.detail.DetailsActivity
|
import com.example.tvmon.ui.detail.DetailsActivity
|
||||||
import com.example.tvmon.ui.presenter.ContentCardPresenter
|
import com.example.tvmon.ui.presenter.ContentCardPresenter
|
||||||
import com.example.tvmon.ui.settings.SettingsActivity
|
import com.example.tvmon.ui.settings.SettingsActivity
|
||||||
@@ -100,14 +101,19 @@ private fun setupUI() {
|
|||||||
var successCount = 0
|
var successCount = 0
|
||||||
var failCount = 0
|
var failCount = 0
|
||||||
|
|
||||||
|
val context = requireContext()
|
||||||
|
val enabledCategories = CategoryPreferences.getEnabledCategories(context)
|
||||||
|
|
||||||
val deferredRows = coroutineScope {
|
val deferredRows = coroutineScope {
|
||||||
TvmonScraper.CATEGORIES.values.map { category ->
|
TvmonScraper.CATEGORIES.values
|
||||||
Log.w(TAG, "Loading category: ${category.key} - ${category.name}")
|
.filter { enabledCategories.contains(it.key) }
|
||||||
async {
|
.map { category ->
|
||||||
val row = loadCategoryRow(category)
|
Log.w(TAG, "Loading category: ${category.key} - ${category.name}")
|
||||||
category.key to row
|
async {
|
||||||
|
val row = loadCategoryRow(category)
|
||||||
|
category.key to row
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (deferred in deferredRows) {
|
for (deferred in deferredRows) {
|
||||||
|
|||||||
@@ -4,12 +4,15 @@ import android.app.AlertDialog
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.widget.Button
|
import android.widget.Button
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.Switch
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.example.tvmon.R
|
import com.example.tvmon.R
|
||||||
import com.example.tvmon.util.ApkDownloader
|
import com.example.tvmon.util.ApkDownloader
|
||||||
|
import com.example.tvmon.util.CategoryPreferences
|
||||||
import com.example.tvmon.util.UpdateChecker
|
import com.example.tvmon.util.UpdateChecker
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
@@ -28,9 +31,25 @@ class SettingsActivity : AppCompatActivity() {
|
|||||||
private lateinit var btnClearCache: Button
|
private lateinit var btnClearCache: Button
|
||||||
private lateinit var btnCheckUpdate: Button
|
private lateinit var btnCheckUpdate: Button
|
||||||
private lateinit var btnBack: Button
|
private lateinit var btnBack: Button
|
||||||
|
private lateinit var categoryTogglesContainer: LinearLayout
|
||||||
|
|
||||||
private var latestVersionInfo: com.example.tvmon.util.VersionInfo? = null
|
private var latestVersionInfo: com.example.tvmon.util.VersionInfo? = null
|
||||||
|
|
||||||
|
private val categories = listOf(
|
||||||
|
"popular" to "인기영상",
|
||||||
|
"movie" to "영화",
|
||||||
|
"kor_movie" to "한국영화",
|
||||||
|
"drama" to "드라마",
|
||||||
|
"ent" to "예능프로그램",
|
||||||
|
"sisa" to "시사/다큐",
|
||||||
|
"world" to "해외드라마",
|
||||||
|
"ott_ent" to "해외 (예능/다큐)",
|
||||||
|
"ani_movie" to "[극장판] 애니메이션",
|
||||||
|
"animation" to "일반 애니메이션",
|
||||||
|
"old_ent" to "추억의 예능",
|
||||||
|
"old_drama" to "추억의 드라마"
|
||||||
|
)
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
@@ -43,6 +62,7 @@ class SettingsActivity : AppCompatActivity() {
|
|||||||
setContentView(R.layout.activity_settings)
|
setContentView(R.layout.activity_settings)
|
||||||
|
|
||||||
initViews()
|
initViews()
|
||||||
|
setupCategoryToggles()
|
||||||
loadSettings()
|
loadSettings()
|
||||||
setupListeners()
|
setupListeners()
|
||||||
}
|
}
|
||||||
@@ -53,6 +73,23 @@ class SettingsActivity : AppCompatActivity() {
|
|||||||
btnClearCache = findViewById(R.id.btn_clear_cache)
|
btnClearCache = findViewById(R.id.btn_clear_cache)
|
||||||
btnCheckUpdate = findViewById(R.id.btn_check_update)
|
btnCheckUpdate = findViewById(R.id.btn_check_update)
|
||||||
btnBack = findViewById(R.id.btn_back)
|
btnBack = findViewById(R.id.btn_back)
|
||||||
|
categoryTogglesContainer = findViewById(R.id.category_toggles_container)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupCategoryToggles() {
|
||||||
|
for ((key, name) in categories) {
|
||||||
|
val toggleView = layoutInflater.inflate(R.layout.item_category_toggle, categoryTogglesContainer, false)
|
||||||
|
val toggle = toggleView.findViewById<Switch>(R.id.switch_category)
|
||||||
|
val label = toggleView.findViewById<TextView>(R.id.tv_category_name)
|
||||||
|
|
||||||
|
label.text = name
|
||||||
|
toggle.isChecked = CategoryPreferences.isCategoryEnabled(this, key)
|
||||||
|
toggle.setOnCheckedChangeListener { _, isChecked ->
|
||||||
|
CategoryPreferences.setCategoryEnabled(this, key, isChecked)
|
||||||
|
}
|
||||||
|
|
||||||
|
categoryTogglesContainer.addView(toggleView)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadSettings() {
|
private fun loadSettings() {
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package com.example.tvmon.util
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
|
||||||
|
object CategoryPreferences {
|
||||||
|
private const val PREFS_NAME = "category_prefs"
|
||||||
|
private const val KEY_PREFIX = "category_enabled_"
|
||||||
|
|
||||||
|
private fun getPrefs(context: Context): SharedPreferences {
|
||||||
|
return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isCategoryEnabled(context: Context, categoryKey: String): Boolean {
|
||||||
|
return getPrefs(context).getBoolean(KEY_PREFIX + categoryKey, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setCategoryEnabled(context: Context, categoryKey: String, enabled: Boolean) {
|
||||||
|
getPrefs(context).edit().putBoolean(KEY_PREFIX + categoryKey, enabled).apply()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getEnabledCategories(context: Context): Set<String> {
|
||||||
|
val prefs = getPrefs(context)
|
||||||
|
val enabled = mutableSetOf<String>()
|
||||||
|
|
||||||
|
val categories = listOf("popular", "movie", "kor_movie", "drama", "ent", "sisa",
|
||||||
|
"world", "ott_ent", "ani_movie", "animation", "old_ent", "old_drama")
|
||||||
|
|
||||||
|
for (key in categories) {
|
||||||
|
if (prefs.getBoolean(KEY_PREFIX + key, true)) {
|
||||||
|
enabled.add(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return enabled
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -67,6 +67,24 @@
|
|||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Category Toggle Header -->
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="카테고리 표시"
|
||||||
|
android:textColor="@color/netflix_light_gray"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:padding="16dp"
|
||||||
|
android:layout_marginTop="16dp" />
|
||||||
|
|
||||||
|
<!-- Category Toggles Container -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/category_toggles_container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingStart="16dp" />
|
||||||
|
|
||||||
<!-- Cache Delete Buttons -->
|
<!-- Cache Delete Buttons -->
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
24
tvmon-app/app/src/main/res/layout/item_category_toggle.xml
Normal file
24
tvmon-app/app/src/main/res/layout/item_category_toggle.xml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="12dp"
|
||||||
|
android:gravity="center_vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_category_name"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
android:id="@+id/switch_category"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:thumbTint="@color/accent"
|
||||||
|
android:trackTint="@color/netflix_medium_gray" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
Reference in New Issue
Block a user