From 88c85296c59ed013d05925d785933666e28777af Mon Sep 17 00:00:00 2001 From: archroid Date: Wed, 16 Mar 2022 17:02:42 +0330 Subject: [PATCH 1/6] YT subscriptions importer added --- app/build.gradle | 3 + .../java/com/github/libretube/Settings.kt | 110 ++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/settings.xml | 5 + 4 files changed, 120 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index e2ad81d85..5dcc69da8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,4 +75,7 @@ dependencies { implementation 'com.squareup.retrofit2:converter-scalars:2.1.0' implementation 'com.arthenica:ffmpeg-kit-min:4.5.1.LTS' + + implementation 'com.blankj:utilcode:1.30.0' + } \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/Settings.kt b/app/src/main/java/com/github/libretube/Settings.kt index ef2fd913a..dcbf1494e 100644 --- a/app/src/main/java/com/github/libretube/Settings.kt +++ b/app/src/main/java/com/github/libretube/Settings.kt @@ -1,25 +1,73 @@ package com.github.libretube +import android.Manifest import android.content.Context +import android.net.Uri import android.os.Bundle import android.text.TextUtils import android.util.Log import android.view.View import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import android.content.ContentValues.TAG +import android.content.pm.PackageManager +import android.os.Build +import android.os.Environment +import androidx.core.app.ActivityCompat import androidx.preference.PreferenceManager +import com.blankj.utilcode.util.UriUtils import com.github.libretube.adapters.TrendingAdapter +import com.github.libretube.obj.Subscribe import retrofit2.HttpException import retrofit2.Retrofit import retrofit2.converter.jackson.JacksonConverterFactory import retrofit2.converter.scalars.ScalarsConverterFactory +import java.io.ByteArrayOutputStream import java.io.IOException +import java.util.zip.ZipFile class Settings : PreferenceFragmentCompat() { + + companion object { + lateinit var getContent: ActivityResultLauncher + } + + + override fun onCreate(savedInstanceState: Bundle?) { + getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri -> + + var zipfile = ZipFile(UriUtils.uri2File(uri)) + + var zipentry = + zipfile.getEntry("Takeout/YouTube and YouTube Music/subscriptions/subscriptions.csv") + + var inputStream = zipfile.getInputStream(zipentry) + + val baos = ByteArrayOutputStream() + + inputStream.use { it.copyTo(baos) } + + var subscriptions = baos.toByteArray().decodeToString() + + var subscribedCount = 0 + + for(text in subscriptions.lines()){ + if(text.take(24) != "Channel Id,Channel Url,C" && !text.take(24).isEmpty()){ + subscribe(text.take(24)) + subscribedCount++ + Log.d(TAG, "subscribed: " + text +" total: " + subscribedCount) + } + } + } + super.onCreate(savedInstanceState) + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.settings, rootKey) val instance = findPreference("instance") @@ -45,6 +93,47 @@ class Settings : PreferenceFragmentCompat() { true } + val importFromYt = findPreference("import_from_yt") + importFromYt?.setOnPreferenceClickListener { + + //check StorageAccess + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + Log.d("myz", "" + Build.VERSION.SDK_INT) + if (!Environment.isExternalStorageManager()) { + ActivityCompat.requestPermissions( + this.requireActivity(), arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.MANAGE_EXTERNAL_STORAGE + ), 1 + ) //permission request code is just an int + } + } else { + if (ActivityCompat.checkSelfPermission( + requireContext(), + Manifest.permission.READ_EXTERNAL_STORAGE + ) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission( + requireContext(), + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) != PackageManager.PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions( + this.requireActivity(), + arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ), + 1 + ) + } + } + + getContent.launch("application/zip") + + + true + } + } private fun fetchInstance() { @@ -90,4 +179,25 @@ class Settings : PreferenceFragmentCompat() { if (!isAdded) return // Fragment not attached to an Activity activity?.runOnUiThread(action) } + + + private fun subscribe(channel_id: String){ + fun run() { + lifecycleScope.launchWhenCreated { + val response = try { + val sharedPref = context?.getSharedPreferences("token", Context.MODE_PRIVATE) + RetrofitInstance.api.subscribe(sharedPref?.getString("token","")!!, Subscribe(channel_id)) + }catch(e: IOException) { + println(e) + Log.e(TAG, "IOException, you might not have internet connection") + return@launchWhenCreated + } catch (e: HttpException) { + Log.e(TAG, "HttpException, unexpected response$e") + return@launchWhenCreated + } + } + } + run() + } } + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e843f9122..5563f48b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,4 +29,6 @@ Download Failed! Open in VLC Can\'t open in VLC. Maybe it\'s not installed yet? + Import data from youtube + \ No newline at end of file diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 52f90411a..8bf54d28c 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -30,4 +30,9 @@ app:key="login_register" app:title="@string/login_register" /> + + \ No newline at end of file From fbdad7ee8d689ceeac62f5296021b5fce170f706 Mon Sep 17 00:00:00 2001 From: archroid Date: Thu, 17 Mar 2022 22:27:38 +0330 Subject: [PATCH 2/6] Fixed minor bugs --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5563f48b1..5cabe1100 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,6 +29,6 @@ Download Failed! Open in VLC Can\'t open in VLC. Maybe it\'s not installed yet? - Import data from youtube + Import subscriptions data from youtube \ No newline at end of file From ca6196da5445c7e8dbb9654abb15bb16efe61754 Mon Sep 17 00:00:00 2001 From: archroid Date: Thu, 17 Mar 2022 22:40:18 +0330 Subject: [PATCH 3/6] Fixed minor bugs --- .../java/com/github/libretube/Settings.kt | 33 +++++++++++-------- app/src/main/res/values/strings.xml | 2 +- app/src/main/res/xml/settings.xml | 1 + 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/github/libretube/Settings.kt b/app/src/main/java/com/github/libretube/Settings.kt index dcbf1494e..24da4abe6 100644 --- a/app/src/main/java/com/github/libretube/Settings.kt +++ b/app/src/main/java/com/github/libretube/Settings.kt @@ -40,30 +40,35 @@ class Settings : PreferenceFragmentCompat() { override fun onCreate(savedInstanceState: Bundle?) { - getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri -> + getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> - var zipfile = ZipFile(UriUtils.uri2File(uri)) + if(uri != null){ + var zipfile = ZipFile(UriUtils.uri2File(uri)) - var zipentry = - zipfile.getEntry("Takeout/YouTube and YouTube Music/subscriptions/subscriptions.csv") + var zipentry = + zipfile.getEntry("Takeout/YouTube and YouTube Music/subscriptions/subscriptions.csv") - var inputStream = zipfile.getInputStream(zipentry) + var inputStream = zipfile.getInputStream(zipentry) - val baos = ByteArrayOutputStream() + val baos = ByteArrayOutputStream() - inputStream.use { it.copyTo(baos) } + inputStream.use { it.copyTo(baos) } - var subscriptions = baos.toByteArray().decodeToString() + var subscriptions = baos.toByteArray().decodeToString() - var subscribedCount = 0 + var subscribedCount = 0 - for(text in subscriptions.lines()){ - if(text.take(24) != "Channel Id,Channel Url,C" && !text.take(24).isEmpty()){ - subscribe(text.take(24)) - subscribedCount++ - Log.d(TAG, "subscribed: " + text +" total: " + subscribedCount) + for(text in subscriptions.lines()){ + if(text.take(24) != "Channel Id,Channel Url,C" && !text.take(24).isEmpty()){ + subscribe(text.take(24)) + subscribedCount++ + Log.d(TAG, "subscribed: " + text +" total: " + subscribedCount) + } } + + Toast.makeText(context, "Subscribed to " + subscribedCount + " channels.", Toast.LENGTH_SHORT).show() } + } super.onCreate(savedInstanceState) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5cabe1100..bb9f105fc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,6 +29,6 @@ Download Failed! Open in VLC Can\'t open in VLC. Maybe it\'s not installed yet? - Import subscriptions data from youtube + Import subscriptions from youtube \ No newline at end of file diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 8bf54d28c..b60f9c81e 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -33,6 +33,7 @@ \ No newline at end of file From c0d3522bb8722c1d423245a284447c1f967a30e0 Mon Sep 17 00:00:00 2001 From: archroid Date: Thu, 17 Mar 2022 22:46:09 +0330 Subject: [PATCH 4/6] Fixed minor bugs --- .../java/com/github/libretube/Settings.kt | 80 ++++++++++--------- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/settings.xml | 1 + 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/github/libretube/Settings.kt b/app/src/main/java/com/github/libretube/Settings.kt index 24da4abe6..398eade18 100644 --- a/app/src/main/java/com/github/libretube/Settings.kt +++ b/app/src/main/java/com/github/libretube/Settings.kt @@ -1,33 +1,27 @@ package com.github.libretube import android.Manifest +import android.content.ContentValues.TAG import android.content.Context +import android.content.pm.PackageManager import android.net.Uri +import android.os.Build import android.os.Bundle +import android.os.Environment import android.text.TextUtils import android.util.Log -import android.view.View import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import android.content.ContentValues.TAG -import android.content.pm.PackageManager -import android.os.Build -import android.os.Environment -import androidx.core.app.ActivityCompat -import androidx.preference.PreferenceManager import com.blankj.utilcode.util.UriUtils -import com.github.libretube.adapters.TrendingAdapter import com.github.libretube.obj.Subscribe import retrofit2.HttpException -import retrofit2.Retrofit -import retrofit2.converter.jackson.JacksonConverterFactory -import retrofit2.converter.scalars.ScalarsConverterFactory import java.io.ByteArrayOutputStream import java.io.IOException import java.util.zip.ZipFile @@ -42,7 +36,7 @@ class Settings : PreferenceFragmentCompat() { override fun onCreate(savedInstanceState: Bundle?) { getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> - if(uri != null){ + if (uri != null) { var zipfile = ZipFile(UriUtils.uri2File(uri)) var zipentry = @@ -58,15 +52,19 @@ class Settings : PreferenceFragmentCompat() { var subscribedCount = 0 - for(text in subscriptions.lines()){ - if(text.take(24) != "Channel Id,Channel Url,C" && !text.take(24).isEmpty()){ + for (text in subscriptions.lines()) { + if (text.take(24) != "Channel Id,Channel Url,C" && !text.take(24).isEmpty()) { subscribe(text.take(24)) subscribedCount++ - Log.d(TAG, "subscribed: " + text +" total: " + subscribedCount) + Log.d(TAG, "subscribed: " + text + " total: " + subscribedCount) } } - Toast.makeText(context, "Subscribed to " + subscribedCount + " channels.", Toast.LENGTH_SHORT).show() + Toast.makeText( + context, + "Subscribed to " + subscribedCount + " channels.", + Toast.LENGTH_SHORT + ).show() } } @@ -81,7 +79,7 @@ class Settings : PreferenceFragmentCompat() { RetrofitInstance.url = newValue.toString() RetrofitInstance.lazyMgr.reset() val sharedPref = context?.getSharedPreferences("token", Context.MODE_PRIVATE) - if(sharedPref?.getString("token","")!="") { + if (sharedPref?.getString("token", "") != "") { with(sharedPref!!.edit()) { putString("token", "") apply() @@ -91,12 +89,12 @@ class Settings : PreferenceFragmentCompat() { true } - val login = findPreference("login_register") - login?.setOnPreferenceClickListener { - val newFragment = LoginDialog() - newFragment.show(childFragmentManager, "Login") - true - } + val login = findPreference("login_register") + login?.setOnPreferenceClickListener { + val newFragment = LoginDialog() + newFragment.show(childFragmentManager, "Login") + true + } val importFromYt = findPreference("import_from_yt") importFromYt?.setOnPreferenceClickListener { @@ -139,7 +137,7 @@ class Settings : PreferenceFragmentCompat() { true } - } + } private fun fetchInstance() { lifecycleScope.launchWhenCreated { @@ -150,15 +148,15 @@ class Settings : PreferenceFragmentCompat() { Log.e("settings", "IOException, you might not have internet connection") return@launchWhenCreated } catch (e: HttpException) { - Log.e("settings", "HttpException, unexpected response ${e.toString()}") + Log.e("settings", "HttpException, unexpected response $e") return@launchWhenCreated - } catch (e: Exception){ - Log.e("settings",e.toString()) + } catch (e: Exception) { + Log.e("settings", e.toString()) return@launchWhenCreated } val listEntries: MutableList = ArrayList() val listEntryValues: MutableList = ArrayList() - for(item in response){ + for (item in response) { listEntries.add(item.name!!) listEntryValues.add(item.api_url!!) } @@ -168,17 +166,19 @@ class Settings : PreferenceFragmentCompat() { val instance = findPreference("instance") instance?.entries = entries instance?.entryValues = entryValues - instance?.summaryProvider = Preference.SummaryProvider { preference -> - val text = preference.entry - if (TextUtils.isEmpty(text)) { - "kavin.rocks (Official)" - } else { - text + instance?.summaryProvider = + Preference.SummaryProvider { preference -> + val text = preference.entry + if (TextUtils.isEmpty(text)) { + "kavin.rocks (Official)" + } else { + text + } } - } } } } + private fun Fragment?.runOnUiThread(action: () -> Unit) { this ?: return if (!isAdded) return // Fragment not attached to an Activity @@ -186,14 +186,16 @@ class Settings : PreferenceFragmentCompat() { } - private fun subscribe(channel_id: String){ + private fun subscribe(channel_id: String) { fun run() { lifecycleScope.launchWhenCreated { val response = try { val sharedPref = context?.getSharedPreferences("token", Context.MODE_PRIVATE) - RetrofitInstance.api.subscribe(sharedPref?.getString("token","")!!, Subscribe(channel_id)) - }catch(e: IOException) { - println(e) + RetrofitInstance.api.subscribe( + sharedPref?.getString("token", "")!!, + Subscribe(channel_id) + ) + } catch (e: IOException) { Log.e(TAG, "IOException, you might not have internet connection") return@launchWhenCreated } catch (e: HttpException) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bb9f105fc..2afea7bc9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,5 +30,6 @@ Open in VLC Can\'t open in VLC. Maybe it\'s not installed yet? Import subscriptions from youtube + Dark theme \ No newline at end of file diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index b60f9c81e..a7c2e28cb 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -36,4 +36,5 @@ android:hint="This is my hint" /> + \ No newline at end of file From b52bb3c6e93e25dd3f5c6127cf021c8179ed477e Mon Sep 17 00:00:00 2001 From: archroid Date: Thu, 17 Mar 2022 23:18:43 +0330 Subject: [PATCH 5/6] Added app theme toggle --- .../main/java/com/github/libretube/Settings.kt | 13 ++++++++++++- app/src/main/res/values/array.xml | 13 +++++++++++++ app/src/main/res/values/strings.xml | 2 +- app/src/main/res/xml/settings.xml | 18 ++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/libretube/Settings.kt b/app/src/main/java/com/github/libretube/Settings.kt index 398eade18..5638a1d85 100644 --- a/app/src/main/java/com/github/libretube/Settings.kt +++ b/app/src/main/java/com/github/libretube/Settings.kt @@ -13,12 +13,14 @@ import android.util.Log import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatDelegate import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreferenceCompat import com.blankj.utilcode.util.UriUtils import com.github.libretube.obj.Subscribe import retrofit2.HttpException @@ -100,7 +102,6 @@ class Settings : PreferenceFragmentCompat() { importFromYt?.setOnPreferenceClickListener { //check StorageAccess - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { Log.d("myz", "" + Build.VERSION.SDK_INT) if (!Environment.isExternalStorageManager()) { @@ -137,6 +138,16 @@ class Settings : PreferenceFragmentCompat() { true } + val themeToggle = findPreference("theme_togglee") + themeToggle?.setOnPreferenceChangeListener { _, newValue -> + when (newValue.toString()) { + "A" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + "L" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + "D" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + } + true + } + } private fun fetchInstance() { diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index 1f2f7dfcb..559897445 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -404,4 +404,17 @@ ZM ZW + + + System Default + Light Theme + Dark Theme + + + + A + L + D + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2afea7bc9..f1d1f9c60 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,6 +30,6 @@ Open in VLC Can\'t open in VLC. Maybe it\'s not installed yet? Import subscriptions from youtube - Dark theme + App theme \ No newline at end of file diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index a7c2e28cb..a2035177b 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -37,4 +37,22 @@ /> + + + + + + + + + + + + \ No newline at end of file From 3cc31e73b92a170f805c43b8df1bc2d58bce4985 Mon Sep 17 00:00:00 2001 From: Farbod Date: Fri, 18 Mar 2022 02:02:00 -0700 Subject: [PATCH 6/6] Update Settings.kt --- app/src/main/java/com/github/libretube/Settings.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/github/libretube/Settings.kt b/app/src/main/java/com/github/libretube/Settings.kt index 952bd09c3..5638a1d85 100644 --- a/app/src/main/java/com/github/libretube/Settings.kt +++ b/app/src/main/java/com/github/libretube/Settings.kt @@ -25,7 +25,6 @@ import com.blankj.utilcode.util.UriUtils import com.github.libretube.obj.Subscribe import retrofit2.HttpException import java.io.ByteArrayOutputStream -import retrofit2.HttpException import java.io.IOException import java.util.zip.ZipFile