package com.lagradost.cloudstream3.ui.settings import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import androidx.annotation.StringRes import androidx.core.view.children import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar import com.lagradost.cloudstream3.BuildConfig import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.MainSettingsBinding import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.syncproviders.AccountManager import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.accountManagers import com.lagradost.cloudstream3.ui.home.HomeFragment import com.lagradost.cloudstream3.ui.result.txt import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR import com.lagradost.cloudstream3.ui.settings.Globals.TV import com.lagradost.cloudstream3.ui.settings.Globals.isLayout import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.UIHelper import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper import com.lagradost.cloudstream3.utils.UIHelper.navigate import com.lagradost.cloudstream3.utils.UIHelper.setImage import com.lagradost.cloudstream3.utils.UIHelper.toPx import java.io.File import java.text.DateFormat import java.text.SimpleDateFormat import java.util.Date import java.util.Locale import java.util.TimeZone class SettingsFragment : Fragment() { companion object { fun PreferenceFragmentCompat?.getPref(id: Int): Preference? { if (this == null) return null return try { findPreference(getString(id)) } catch (e: Exception) { logError(e) null } } /** * On TV you cannot properly scroll to the bottom of settings, this fixes that. * */ fun PreferenceFragmentCompat.setPaddingBottom() { if (isLayout(TV or EMULATOR)) { listView?.setPadding(0, 0, 0, 100.toPx) } } fun PreferenceFragmentCompat.setToolBarScrollFlags() { if (isLayout(TV or EMULATOR)) { val settingsAppbar = view?.findViewById(R.id.settings_toolbar) settingsAppbar?.updateLayoutParams { scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL } } } fun Fragment?.setToolBarScrollFlags() { if (isLayout(TV or EMULATOR)) { val settingsAppbar = this?.view?.findViewById(R.id.settings_toolbar) settingsAppbar?.updateLayoutParams { scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL } } } fun Fragment?.setUpToolbar(title: String) { if (this == null) return val settingsToolbar = view?.findViewById(R.id.settings_toolbar) ?: return settingsToolbar.apply { setTitle(title) setNavigationIcon(R.drawable.ic_baseline_arrow_back_24) setNavigationOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() } } UIHelper.fixPaddingStatusbar(settingsToolbar) } fun Fragment?.setUpToolbar(@StringRes title: Int) { if (this == null) return val settingsToolbar = view?.findViewById(R.id.settings_toolbar) ?: return settingsToolbar.apply { setTitle(title) setNavigationIcon(R.drawable.ic_baseline_arrow_back_24) children.firstOrNull { it is ImageView }?.tag = getString(R.string.tv_no_focus_tag) setNavigationOnClickListener { activity?.onBackPressedDispatcher?.onBackPressed() } } UIHelper.fixPaddingStatusbar(settingsToolbar) } fun getFolderSize(dir: File): Long { var size: Long = 0 dir.listFiles()?.let { for (file in it) { size += if (file.isFile) { // System.out.println(file.getName() + " " + file.length()); file.length() } else getFolderSize(file) } } return size } } override fun onDestroyView() { binding = null super.onDestroyView() } var binding: MainSettingsBinding? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View { val localBinding = MainSettingsBinding.inflate(inflater, container, false) binding = localBinding return localBinding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { fun navigate(id: Int) { activity?.navigate(id, Bundle()) } /** used to debug leaks showToast(activity,"${VideoDownloadManager.downloadStatusEvent.size} : ${VideoDownloadManager.downloadProgressEvent.size}") **/ fun hasProfilePictureFromAccountManagers(accountManagers: List): Boolean { for (syncApi in accountManagers) { val login = syncApi.loginInfo() val pic = login?.profilePicture ?: continue if (binding?.settingsProfilePic?.setImage( pic, errorImageDrawable = HomeFragment.errorProfilePic ) == true ) { binding?.settingsProfileText?.text = login.name return true // sync profile exists } } return false // not syncing } // display local account information if not syncing if (!hasProfilePictureFromAccountManagers(accountManagers)) { val activity = activity ?: return val currentAccount = try { DataStoreHelper.accounts.firstOrNull { it.keyIndex == DataStoreHelper.selectedKeyIndex } ?: activity.let { DataStoreHelper.getDefaultAccount(activity) } } catch (t: IllegalStateException) { Log.e("AccountManager", "Activity not found", t) null } binding?.settingsProfilePic?.setImage(currentAccount?.image) binding?.settingsProfileText?.text = currentAccount?.name } binding?.apply { listOf( settingsGeneral to R.id.action_navigation_global_to_navigation_settings_general, settingsPlayer to R.id.action_navigation_global_to_navigation_settings_player, settingsCredits to R.id.action_navigation_global_to_navigation_settings_account, settingsUi to R.id.action_navigation_global_to_navigation_settings_ui, settingsProviders to R.id.action_navigation_global_to_navigation_settings_providers, settingsUpdates to R.id.action_navigation_global_to_navigation_settings_updates, settingsExtensions to R.id.action_navigation_global_to_navigation_settings_extensions, ).forEach { (view, navigationId) -> view.apply { setOnClickListener { navigate(navigationId) } if (isLayout(TV)) { isFocusable = true isFocusableInTouchMode = true } } } // Default focus on TV if (isLayout(TV)) { settingsGeneral.requestFocus() } } val appVersion = getString(R.string.app_version) val commitInfo = getString(R.string.commit_hash) val buildTimestamp = SimpleDateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.getDefault() ).apply { timeZone = TimeZone.getTimeZone("UTC") }.format(Date(BuildConfig.BUILD_DATE)).replace("UTC", "") binding?.buildDate?.text = buildTimestamp binding?.appVersionInfo?.setOnLongClickListener { clipboardHelper(txt(R.string.extension_version), "$appVersion $commitInfo $buildTimestamp") true } } }