mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	found memory leak that is not fixed but fixes search
This commit is contained in:
		
							parent
							
								
									a6c96c9647
								
							
						
					
					
						commit
						8ff87e5108
					
				
					 12 changed files with 100 additions and 88 deletions
				
			
		|  | @ -7,29 +7,23 @@ import android.content.pm.PackageManager | ||||||
| import android.content.res.ColorStateList | import android.content.res.ColorStateList | ||||||
| import android.os.Build | import android.os.Build | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.widget.Toast | import android.view.WindowManager | ||||||
| import androidx.appcompat.app.AppCompatActivity | import androidx.appcompat.app.AppCompatActivity | ||||||
| import androidx.navigation.NavOptions | import androidx.navigation.NavOptions | ||||||
| import androidx.navigation.findNavController | import androidx.navigation.findNavController | ||||||
| import androidx.navigation.fragment.NavHostFragment | import androidx.navigation.fragment.NavHostFragment | ||||||
| import androidx.navigation.ui.AppBarConfiguration |  | ||||||
| import androidx.navigation.ui.setupWithNavController |  | ||||||
| import com.google.android.gms.cast.framework.CastButtonFactory | import com.google.android.gms.cast.framework.CastButtonFactory | ||||||
| import com.google.android.material.bottomnavigation.BottomNavigationView | import com.google.android.material.bottomnavigation.BottomNavigationView | ||||||
| import com.lagradost.cloudstream3.UIHelper.checkWrite | import com.lagradost.cloudstream3.UIHelper.checkWrite | ||||||
| import com.lagradost.cloudstream3.UIHelper.getResourceColor | import com.lagradost.cloudstream3.UIHelper.getResourceColor | ||||||
| import com.lagradost.cloudstream3.UIHelper.hasPIPPermission | import com.lagradost.cloudstream3.UIHelper.hasPIPPermission | ||||||
| import com.lagradost.cloudstream3.UIHelper.isUsingMobileData |  | ||||||
| import com.lagradost.cloudstream3.UIHelper.requestRW | import com.lagradost.cloudstream3.UIHelper.requestRW | ||||||
| import com.lagradost.cloudstream3.UIHelper.shouldShowPIPMode | import com.lagradost.cloudstream3.UIHelper.shouldShowPIPMode | ||||||
| import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver | import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver | ||||||
| import com.lagradost.cloudstream3.ui.download.DownloadChildFragment | import com.lagradost.cloudstream3.ui.download.DownloadChildFragment | ||||||
| import com.lagradost.cloudstream3.utils.DataStore.getKey | import com.lagradost.cloudstream3.utils.DataStore.getKey | ||||||
| import com.lagradost.cloudstream3.utils.DataStore.getKeys |  | ||||||
| import com.lagradost.cloudstream3.utils.DataStore.removeKey | import com.lagradost.cloudstream3.utils.DataStore.removeKey | ||||||
| import com.lagradost.cloudstream3.utils.DataStore.removeKeys |  | ||||||
| import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos | import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos | ||||||
| import com.lagradost.cloudstream3.utils.VideoDownloadManager |  | ||||||
| import kotlinx.android.synthetic.main.fragment_result.* | import kotlinx.android.synthetic.main.fragment_result.* | ||||||
| 
 | 
 | ||||||
| const val VLC_PACKAGE = "org.videolan.vlc" | const val VLC_PACKAGE = "org.videolan.vlc" | ||||||
|  | @ -57,14 +51,7 @@ class MainActivity : AppCompatActivity() { | ||||||
|         var isInPlayer: Boolean = false |         var isInPlayer: Boolean = false | ||||||
|         var canShowPipMode: Boolean = false |         var canShowPipMode: Boolean = false | ||||||
|         var isInPIPMode: Boolean = false |         var isInPIPMode: Boolean = false | ||||||
|         lateinit var mainContext: MainActivity |  | ||||||
|         lateinit var navOptions: NavOptions |         lateinit var navOptions: NavOptions | ||||||
| 
 |  | ||||||
|         //https://github.com/anggrayudi/SimpleStorage/blob/4eb6306efb6cdfae4e34f170c8b9d4e135b04d51/sample/src/main/java/com/anggrayudi/storage/sample/activity/MainActivity.kt#L624 |  | ||||||
|         const val REQUEST_CODE_STORAGE_ACCESS = 1 |  | ||||||
|         const val REQUEST_CODE_PICK_FOLDER = 2 |  | ||||||
|         const val REQUEST_CODE_PICK_FILE = 3 |  | ||||||
|         const val REQUEST_CODE_ASK_PERMISSIONS = 4 |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private fun enterPIPMode() { |     private fun enterPIPMode() { | ||||||
|  | @ -149,7 +136,7 @@ class MainActivity : AppCompatActivity() { | ||||||
| 
 | 
 | ||||||
|     override fun onCreate(savedInstanceState: Bundle?) { |     override fun onCreate(savedInstanceState: Bundle?) { | ||||||
|         super.onCreate(savedInstanceState) |         super.onCreate(savedInstanceState) | ||||||
|         mainContext = this |         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) | ||||||
| 
 | 
 | ||||||
|         setContentView(R.layout.activity_main) |         setContentView(R.layout.activity_main) | ||||||
|         val navView: BottomNavigationView = findViewById(R.id.nav_view) |         val navView: BottomNavigationView = findViewById(R.id.nav_view) | ||||||
|  | @ -174,9 +161,9 @@ class MainActivity : AppCompatActivity() { | ||||||
| 
 | 
 | ||||||
|         navView.setOnNavigationItemSelectedListener { item -> |         navView.setOnNavigationItemSelectedListener { item -> | ||||||
|             when (item.itemId) { |             when (item.itemId) { | ||||||
|                // R.id.navigation_home -> { |                 R.id.navigation_home -> { | ||||||
|                    // navController.navigate(R.id.navigation_home, null, navOptions) |                     navController.navigate(R.id.navigation_home, null, navOptions) | ||||||
|                 //} |                 } | ||||||
|                 R.id.navigation_search -> { |                 R.id.navigation_search -> { | ||||||
|                     navController.navigate(R.id.navigation_search, null, navOptions) |                     navController.navigate(R.id.navigation_search, null, navOptions) | ||||||
|                 } |                 } | ||||||
|  | @ -232,7 +219,6 @@ class MainActivity : AppCompatActivity() { | ||||||
|         }*/ |         }*/ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|         /* |         /* | ||||||
|         val castContext = CastContext.getSharedInstance(applicationContext) |         val castContext = CastContext.getSharedInstance(applicationContext) | ||||||
|          fun buildMediaQueueItem(video: String): MediaQueueItem { |          fun buildMediaQueueItem(video: String): MediaQueueItem { | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ import androidx.core.graphics.alpha | ||||||
| import androidx.core.graphics.blue | import androidx.core.graphics.blue | ||||||
| import androidx.core.graphics.green | import androidx.core.graphics.green | ||||||
| import androidx.core.graphics.red | import androidx.core.graphics.red | ||||||
|  | import androidx.fragment.app.Fragment | ||||||
| import androidx.fragment.app.FragmentActivity | import androidx.fragment.app.FragmentActivity | ||||||
| import androidx.preference.PreferenceManager | import androidx.preference.PreferenceManager | ||||||
| import com.google.android.gms.cast.framework.CastContext | import com.google.android.gms.cast.framework.CastContext | ||||||
|  | @ -68,6 +69,14 @@ object UIHelper { | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     fun Fragment.hideKeyboard() { | ||||||
|  |         view.let { | ||||||
|  |             if (it != null) { | ||||||
|  |                 activity?.hideKeyboard(it) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     @ColorInt |     @ColorInt | ||||||
|     fun Context.getResourceColor(@AttrRes resource: Int, alphaFactor: Float = 1f): Int { |     fun Context.getResourceColor(@AttrRes resource: Int, alphaFactor: Float = 1f): Int { | ||||||
|         val typedArray = obtainStyledAttributes(intArrayOf(resource)) |         val typedArray = obtainStyledAttributes(intArrayOf(resource)) | ||||||
|  |  | ||||||
|  | @ -105,7 +105,7 @@ object DownloadButtonSetup { | ||||||
|         downloadView: View, |         downloadView: View, | ||||||
|         downloadImageChangeCallback: (Pair<Int, String>) -> Unit, |         downloadImageChangeCallback: (Pair<Int, String>) -> Unit, | ||||||
|         clickCallback: (DownloadClickEvent) -> Unit, |         clickCallback: (DownloadClickEvent) -> Unit, | ||||||
|     ) { |     ): () -> Unit { | ||||||
|         var lastState: VideoDownloadManager.DownloadType? = null |         var lastState: VideoDownloadManager.DownloadType? = null | ||||||
|         var currentBytes = setupCurrentBytes ?: 0 |         var currentBytes = setupCurrentBytes ?: 0 | ||||||
|         var totalBytes = setupTotalBytes ?: 0 |         var totalBytes = setupTotalBytes ?: 0 | ||||||
|  | @ -174,7 +174,7 @@ object DownloadButtonSetup { | ||||||
|         fixDownloadedBytes(currentBytes, totalBytes, false) |         fixDownloadedBytes(currentBytes, totalBytes, false) | ||||||
|         changeDownloadImage(VideoDownloadManager.getDownloadState(data.id)) |         changeDownloadImage(VideoDownloadManager.getDownloadState(data.id)) | ||||||
| 
 | 
 | ||||||
|         VideoDownloadManager.downloadProgressEvent += { downloadData -> |         val downloadProgressEventListener = { downloadData: Triple<Int, Long, Long> -> | ||||||
|             if (data.id == downloadData.first) { |             if (data.id == downloadData.first) { | ||||||
|                 if (downloadData.second != currentBytes || downloadData.third != totalBytes) { // TO PREVENT WASTING UI TIME |                 if (downloadData.second != currentBytes || downloadData.third != totalBytes) { // TO PREVENT WASTING UI TIME | ||||||
|                     Coroutines.runOnMainThread { |                     Coroutines.runOnMainThread { | ||||||
|  | @ -184,7 +184,7 @@ object DownloadButtonSetup { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         VideoDownloadManager.downloadStatusEvent += { downloadData -> |         val downloadStatusEventListener = { downloadData: Pair<Int, VideoDownloadManager.DownloadType> -> | ||||||
|             if (data.id == downloadData.first) { |             if (data.id == downloadData.first) { | ||||||
|                 if (lastState != downloadData.second || needImageUpdate) { // TO PREVENT WASTING UI TIME |                 if (lastState != downloadData.second || needImageUpdate) { // TO PREVENT WASTING UI TIME | ||||||
|                     Coroutines.runOnMainThread { |                     Coroutines.runOnMainThread { | ||||||
|  | @ -194,6 +194,9 @@ object DownloadButtonSetup { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         VideoDownloadManager.downloadProgressEvent += downloadProgressEventListener | ||||||
|  |         VideoDownloadManager.downloadStatusEvent += downloadStatusEventListener | ||||||
|  | 
 | ||||||
|         downloadView.setOnClickListener { |         downloadView.setOnClickListener { | ||||||
|             if (currentBytes <= 0) { |             if (currentBytes <= 0) { | ||||||
|                 clickCallback.invoke(DownloadClickEvent(DOWNLOAD_ACTION_DOWNLOAD, data)) |                 clickCallback.invoke(DownloadClickEvent(DOWNLOAD_ACTION_DOWNLOAD, data)) | ||||||
|  | @ -220,6 +223,11 @@ object DownloadButtonSetup { | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         return { | ||||||
|  |             VideoDownloadManager.downloadProgressEvent -= downloadProgressEventListener | ||||||
|  |             VideoDownloadManager.downloadStatusEvent -= downloadStatusEventListener | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun setUpMaterialButton( |     fun setUpMaterialButton( | ||||||
|  | @ -230,8 +238,8 @@ object DownloadButtonSetup { | ||||||
|         textView: TextView?, |         textView: TextView?, | ||||||
|         data: VideoDownloadHelper.DownloadEpisodeCached, |         data: VideoDownloadHelper.DownloadEpisodeCached, | ||||||
|         clickCallback: (DownloadClickEvent) -> Unit, |         clickCallback: (DownloadClickEvent) -> Unit, | ||||||
|     ) { |     ): () -> Unit { | ||||||
|         setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadButton, { |         return setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadButton, { | ||||||
|             downloadButton?.setIconResource(it.first) |             downloadButton?.setIconResource(it.first) | ||||||
|             downloadButton?.text = it.second |             downloadButton?.text = it.second | ||||||
|         }, clickCallback) |         }, clickCallback) | ||||||
|  | @ -245,8 +253,8 @@ object DownloadButtonSetup { | ||||||
|         textView: TextView?, |         textView: TextView?, | ||||||
|         data: VideoDownloadHelper.DownloadEpisodeCached, |         data: VideoDownloadHelper.DownloadEpisodeCached, | ||||||
|         clickCallback: (DownloadClickEvent) -> Unit, |         clickCallback: (DownloadClickEvent) -> Unit, | ||||||
|     ) { |     ): () -> Unit { | ||||||
|         setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadImage, { |         return setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadImage, { | ||||||
|             downloadImage?.setImageResource(it.first) |             downloadImage?.setImageResource(it.first) | ||||||
|         }, clickCallback) |         }, clickCallback) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_DOWNLOAD | ||||||
| import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup | import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup | ||||||
| import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick | import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick | ||||||
| import com.lagradost.cloudstream3.ui.download.DownloadClickEvent | import com.lagradost.cloudstream3.ui.download.DownloadClickEvent | ||||||
|  | import com.lagradost.cloudstream3.utils.Event | ||||||
| import com.lagradost.cloudstream3.utils.VideoDownloadHelper | import com.lagradost.cloudstream3.utils.VideoDownloadHelper | ||||||
| import com.lagradost.cloudstream3.utils.VideoDownloadManager | import com.lagradost.cloudstream3.utils.VideoDownloadManager | ||||||
| import kotlinx.android.synthetic.main.result_episode.view.episode_holder | import kotlinx.android.synthetic.main.result_episode.view.episode_holder | ||||||
|  | @ -46,8 +47,8 @@ class EpisodeAdapter( | ||||||
|     private val hasDownloadSupport: Boolean, |     private val hasDownloadSupport: Boolean, | ||||||
|     private val clickCallback: (EpisodeClickEvent) -> Unit, |     private val clickCallback: (EpisodeClickEvent) -> Unit, | ||||||
|     private val downloadClickCallback: (DownloadClickEvent) -> Unit, |     private val downloadClickCallback: (DownloadClickEvent) -> Unit, | ||||||
| ) : | ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { | ||||||
|     RecyclerView.Adapter<RecyclerView.ViewHolder>() { | 
 | ||||||
|     @LayoutRes |     @LayoutRes | ||||||
|     private var layout: Int = 0 |     private var layout: Int = 0 | ||||||
|     fun updateLayout() { |     fun updateLayout() { | ||||||
|  |  | ||||||
|  | @ -38,6 +38,7 @@ import com.lagradost.cloudstream3.UIHelper.checkWrite | ||||||
| import com.lagradost.cloudstream3.UIHelper.colorFromAttribute | import com.lagradost.cloudstream3.UIHelper.colorFromAttribute | ||||||
| import com.lagradost.cloudstream3.UIHelper.fixPaddingStatusbar | import com.lagradost.cloudstream3.UIHelper.fixPaddingStatusbar | ||||||
| import com.lagradost.cloudstream3.UIHelper.getStatusBarHeight | import com.lagradost.cloudstream3.UIHelper.getStatusBarHeight | ||||||
|  | import com.lagradost.cloudstream3.UIHelper.hideKeyboard | ||||||
| import com.lagradost.cloudstream3.UIHelper.isAppInstalled | import com.lagradost.cloudstream3.UIHelper.isAppInstalled | ||||||
| import com.lagradost.cloudstream3.UIHelper.isCastApiAvailable | import com.lagradost.cloudstream3.UIHelper.isCastApiAvailable | ||||||
| import com.lagradost.cloudstream3.UIHelper.isConnectedToChromecast | import com.lagradost.cloudstream3.UIHelper.isConnectedToChromecast | ||||||
|  | @ -65,6 +66,9 @@ import jp.wasabeef.glide.transformations.BlurTransformation | ||||||
| import kotlinx.android.synthetic.main.fragment_result.* | import kotlinx.android.synthetic.main.fragment_result.* | ||||||
| import kotlinx.coroutines.Job | import kotlinx.coroutines.Job | ||||||
| import java.io.File | import java.io.File | ||||||
|  | import java.util.* | ||||||
|  | import kotlin.collections.ArrayList | ||||||
|  | import kotlin.collections.HashMap | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| const val MAX_SYNO_LENGH = 300 | const val MAX_SYNO_LENGH = 300 | ||||||
|  | @ -220,6 +224,9 @@ class ResultFragment : Fragment() { | ||||||
|     @SuppressLint("SetTextI18n") |     @SuppressLint("SetTextI18n") | ||||||
|     override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |     override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | ||||||
|         super.onViewCreated(view, savedInstanceState) |         super.onViewCreated(view, savedInstanceState) | ||||||
|  |         activity?.window?.decorView?.clearFocus() | ||||||
|  |         hideKeyboard() | ||||||
|  | 
 | ||||||
|         activity?.fixPaddingStatusbar(result_scroll) |         activity?.fixPaddingStatusbar(result_scroll) | ||||||
|         activity?.fixPaddingStatusbar(result_barstatus) |         activity?.fixPaddingStatusbar(result_barstatus) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ import android.widget.FrameLayout | ||||||
| import android.widget.ImageView | import android.widget.ImageView | ||||||
| import android.widget.TextView | import android.widget.TextView | ||||||
| import androidx.appcompat.app.AppCompatActivity | import androidx.appcompat.app.AppCompatActivity | ||||||
|  | import androidx.cardview.widget.CardView | ||||||
| import androidx.recyclerview.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import com.bumptech.glide.Glide | import com.bumptech.glide.Glide | ||||||
| import com.bumptech.glide.load.model.GlideUrl | import com.bumptech.glide.load.model.GlideUrl | ||||||
|  | @ -56,17 +57,17 @@ class SearchAdapter( | ||||||
|     constructor(itemView: View, _activity: Activity, resView: AutofitRecyclerView) : RecyclerView.ViewHolder(itemView) { |     constructor(itemView: View, _activity: Activity, resView: AutofitRecyclerView) : RecyclerView.ViewHolder(itemView) { | ||||||
|         val activity = _activity |         val activity = _activity | ||||||
|         val cardView: ImageView = itemView.imageView |         val cardView: ImageView = itemView.imageView | ||||||
|         val cardText: TextView = itemView.imageText |         private val cardText: TextView = itemView.imageText | ||||||
|         val text_type: TextView? = itemView.text_type |         private val textType: TextView? = itemView.text_type | ||||||
|         // val search_result_lang: ImageView? = itemView.search_result_lang |         // val search_result_lang: ImageView? = itemView.search_result_lang | ||||||
| 
 | 
 | ||||||
|         val text_is_dub: View? = itemView.text_is_dub |         private val textIsDub: View? = itemView.text_is_dub | ||||||
|         val text_is_sub: View? = itemView.text_is_sub |         private val textIsSub: View? = itemView.text_is_sub | ||||||
| 
 | 
 | ||||||
|         //val cardTextExtra: TextView? = itemView.imageTextExtra |         //val cardTextExtra: TextView? = itemView.imageTextExtra | ||||||
|         //val imageTextProvider: TextView? = itemView.imageTextProvider |         //val imageTextProvider: TextView? = itemView.imageTextProvider | ||||||
|         val bg = itemView.backgroundCard |         private val bg: CardView = itemView.backgroundCard | ||||||
|         val compactView = itemView.context.getGridIsCompact() |         private val compactView = itemView.context.getGridIsCompact() | ||||||
|         private val coverHeight: Int = if (compactView) 80.toPx else (resView.itemWidth / 0.68).roundToInt() |         private val coverHeight: Int = if (compactView) 80.toPx else (resView.itemWidth / 0.68).roundToInt() | ||||||
| 
 | 
 | ||||||
|         fun bind(card: Any) { |         fun bind(card: Any) { | ||||||
|  | @ -80,7 +81,7 @@ class SearchAdapter( | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 text_type?.text = when (card.type) { |                 textType?.text = when (card.type) { | ||||||
|                     TvType.Anime -> "Anime" |                     TvType.Anime -> "Anime" | ||||||
|                     TvType.Movie -> "Movie" |                     TvType.Movie -> "Movie" | ||||||
|                     TvType.ONA -> "ONA" |                     TvType.ONA -> "ONA" | ||||||
|  | @ -88,8 +89,8 @@ class SearchAdapter( | ||||||
|                 } |                 } | ||||||
|                 // search_result_lang?.visibility = View.GONE |                 // search_result_lang?.visibility = View.GONE | ||||||
| 
 | 
 | ||||||
|                 text_is_dub?.visibility = View.GONE |                 textIsDub?.visibility = View.GONE | ||||||
|                 text_is_sub?.visibility = View.GONE |                 textIsSub?.visibility = View.GONE | ||||||
| 
 | 
 | ||||||
|                 cardText.text = card.name |                 cardText.text = card.name | ||||||
| 
 | 
 | ||||||
|  | @ -114,11 +115,11 @@ class SearchAdapter( | ||||||
|                         if (card.dubStatus?.size == 1) { |                         if (card.dubStatus?.size == 1) { | ||||||
|                             //search_result_lang?.visibility = View.VISIBLE |                             //search_result_lang?.visibility = View.VISIBLE | ||||||
|                             if (card.dubStatus.contains(DubStatus.Dubbed)) { |                             if (card.dubStatus.contains(DubStatus.Dubbed)) { | ||||||
|                                 text_is_dub?.visibility = View.VISIBLE |                                 textIsDub?.visibility = View.VISIBLE | ||||||
|                                 //search_result_lang?.setColorFilter(ContextCompat.getColor(activity, R.color.dubColor)) |                                 //search_result_lang?.setColorFilter(ContextCompat.getColor(activity, R.color.dubColor)) | ||||||
|                             } else if (card.dubStatus.contains(DubStatus.Subbed)) { |                             } else if (card.dubStatus.contains(DubStatus.Subbed)) { | ||||||
|                                 //search_result_lang?.setColorFilter(ContextCompat.getColor(activity, R.color.subColor)) |                                 //search_result_lang?.setColorFilter(ContextCompat.getColor(activity, R.color.subColor)) | ||||||
|                                 text_is_sub?.visibility = View.VISIBLE |                                 textIsSub?.visibility = View.VISIBLE | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|  | @ -1,10 +1,13 @@ | ||||||
| package com.lagradost.cloudstream3.ui.search | package com.lagradost.cloudstream3.ui.search | ||||||
| 
 | 
 | ||||||
|  | import android.content.Context | ||||||
| import android.content.res.Configuration | import android.content.res.Configuration | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
|  | import android.view.WindowManager | ||||||
|  | import android.view.inputmethod.InputMethodManager | ||||||
| import android.widget.ImageView | import android.widget.ImageView | ||||||
| import android.widget.Toast | import android.widget.Toast | ||||||
| import androidx.appcompat.app.AlertDialog | import androidx.appcompat.app.AlertDialog | ||||||
|  | @ -36,7 +39,9 @@ class SearchFragment : Fragment() { | ||||||
|     ): View? { |     ): View? { | ||||||
|         searchViewModel = |         searchViewModel = | ||||||
|             ViewModelProvider(this).get(SearchViewModel::class.java) |             ViewModelProvider(this).get(SearchViewModel::class.java) | ||||||
| 
 |         activity?.window?.setSoftInputMode( | ||||||
|  |             WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | ||||||
|  |         ) | ||||||
|         return inflater.inflate(R.layout.fragment_search, container, false) |         return inflater.inflate(R.layout.fragment_search, container, false) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -125,9 +130,9 @@ class SearchFragment : Fragment() { | ||||||
|         observe(searchViewModel.searchResponse) { |         observe(searchViewModel.searchResponse) { | ||||||
|             when (it) { |             when (it) { | ||||||
|                 is Resource.Success -> { |                 is Resource.Success -> { | ||||||
|                     it?.value?.let { data -> |                     it.value.let { data -> | ||||||
|                         (cardSpace.adapter as SearchAdapter).cardList = data |                         (cardSpace?.adapter as SearchAdapter?)?.cardList = data | ||||||
|                         (cardSpace.adapter as SearchAdapter).notifyDataSetChanged() |                         cardSpace?.adapter?.notifyDataSetChanged() | ||||||
|                     } |                     } | ||||||
|                     searchExitIcon.alpha = 1f |                     searchExitIcon.alpha = 1f | ||||||
|                     search_loading_bar.alpha = 0f |                     search_loading_bar.alpha = 0f | ||||||
|  | @ -144,6 +149,18 @@ class SearchFragment : Fragment() { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         allApi.providersActive = requireActivity().getApiSettings() |         allApi.providersActive = requireActivity().getApiSettings() | ||||||
|  | 
 | ||||||
|  |         main_search.setOnQueryTextFocusChangeListener { searchView, b -> | ||||||
|  |             if (b) { | ||||||
|  |                 // https://stackoverflow.com/questions/12022715/unable-to-show-keyboard-automatically-in-the-searchview | ||||||
|  |                 searchView?.postDelayed({ | ||||||
|  |                     val imm: InputMethodManager? = | ||||||
|  |                         requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager? | ||||||
|  |                     imm?.showSoftInput(view.findFocus(), 0) | ||||||
|  |                 }, 200) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         main_search.onActionViewExpanded() | ||||||
|         //searchViewModel.search("iron man") |         //searchViewModel.search("iron man") | ||||||
|         //(activity as AppCompatActivity).loadResult("https://shiro.is/overlord-dubbed", "overlord-dubbed", "Shiro") |         //(activity as AppCompatActivity).loadResult("https://shiro.is/overlord-dubbed", "overlord-dubbed", "Shiro") | ||||||
| /* | /* | ||||||
|  |  | ||||||
|  | @ -14,8 +14,16 @@ class SearchViewModel : ViewModel() { | ||||||
|     val searchResponse: LiveData<Resource<ArrayList<Any>>> get() = _searchResponse |     val searchResponse: LiveData<Resource<ArrayList<Any>>> get() = _searchResponse | ||||||
|     var searchCounter = 0 |     var searchCounter = 0 | ||||||
| 
 | 
 | ||||||
|  |     private fun clearSearch() { | ||||||
|  |         _searchResponse.postValue(Resource.Success(ArrayList())) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fun search(query: String) = viewModelScope.launch { |     fun search(query: String) = viewModelScope.launch { | ||||||
|         searchCounter++ |         searchCounter++ | ||||||
|  |         if(query.length <= 1) { | ||||||
|  |             clearSearch() | ||||||
|  |             return@launch | ||||||
|  |         } | ||||||
|         val localSearchCounter = searchCounter |         val localSearchCounter = searchCounter | ||||||
|         _searchResponse.postValue(Resource.Loading()) |         _searchResponse.postValue(Resource.Loading()) | ||||||
|         val data = safeApiCall { |         val data = safeApiCall { | ||||||
|  | @ -27,6 +35,10 @@ class SearchViewModel : ViewModel() { | ||||||
| 
 | 
 | ||||||
|     fun quickSearch(query: String) = viewModelScope.launch { |     fun quickSearch(query: String) = viewModelScope.launch { | ||||||
|         searchCounter++ |         searchCounter++ | ||||||
|  |         if(query.length <= 1) { | ||||||
|  |             clearSearch() | ||||||
|  |             return@launch | ||||||
|  |         } | ||||||
|         val localSearchCounter = searchCounter |         val localSearchCounter = searchCounter | ||||||
|         _searchResponse.postValue(Resource.Loading()) |         _searchResponse.postValue(Resource.Loading()) | ||||||
|         val data = safeApiCall { |         val data = safeApiCall { | ||||||
|  |  | ||||||
|  | @ -1,33 +0,0 @@ | ||||||
| package com.lagradost.cloudstream3.utils |  | ||||||
| 
 |  | ||||||
| import com.google.android.exoplayer2.database.ExoDatabaseProvider |  | ||||||
| import com.google.android.exoplayer2.offline.DownloadManager |  | ||||||
| import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory |  | ||||||
| import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor |  | ||||||
| import com.google.android.exoplayer2.upstream.cache.SimpleCache |  | ||||||
| import com.lagradost.cloudstream3.MainActivity |  | ||||||
| import java.util.concurrent.Executor |  | ||||||
| 
 |  | ||||||
| object ExoPlayerHelper { |  | ||||||
|     private val context = MainActivity.mainContext |  | ||||||
|     val databaseProvider = ExoDatabaseProvider(context) |  | ||||||
|     val downloadExecutor = Executor { obj: Runnable -> obj.run() } |  | ||||||
|     val dataSourceFactory = DefaultHttpDataSourceFactory() |  | ||||||
| 
 |  | ||||||
|     val downloadCache: SimpleCache by lazy { |  | ||||||
|         SimpleCache( |  | ||||||
|             context.cacheDir, |  | ||||||
|             LeastRecentlyUsedCacheEvictor(20 * 1024 * 1024), |  | ||||||
|             databaseProvider |  | ||||||
|         ) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     val downloadManager: DownloadManager by lazy { |  | ||||||
|         DownloadManager(context, |  | ||||||
|             databaseProvider, |  | ||||||
|             downloadCache, |  | ||||||
|             dataSourceFactory, |  | ||||||
|             downloadExecutor) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -526,7 +526,6 @@ object VideoDownloadManager { | ||||||
|         var count: Int |         var count: Int | ||||||
|         var bytesDownloaded = resumeLength |         var bytesDownloaded = resumeLength | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|         var isPaused = false |         var isPaused = false | ||||||
|         var isStopped = false |         var isStopped = false | ||||||
|         var isDone = false |         var isDone = false | ||||||
|  | @ -561,7 +560,8 @@ object VideoDownloadManager { | ||||||
|             ) |             ) | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         downloadEvent += { event -> | 
 | ||||||
|  |         val downloadEventListener = { event: Pair<Int, DownloadActionType> -> | ||||||
|             if (event.first == ep.id) { |             if (event.first == ep.id) { | ||||||
|                 when (event.second) { |                 when (event.second) { | ||||||
|                     DownloadActionType.Pause -> { |                     DownloadActionType.Pause -> { | ||||||
|  | @ -579,6 +579,8 @@ object VideoDownloadManager { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         downloadEvent += downloadEventListener | ||||||
|  | 
 | ||||||
|         // UPDATE DOWNLOAD NOTIFICATION |         // UPDATE DOWNLOAD NOTIFICATION | ||||||
|         val notificationCoroutine = main { |         val notificationCoroutine = main { | ||||||
|             while (true) { |             while (true) { | ||||||
|  | @ -620,6 +622,12 @@ object VideoDownloadManager { | ||||||
|         connectionInputStream.close() |         connectionInputStream.close() | ||||||
|         notificationCoroutine.cancel() |         notificationCoroutine.cancel() | ||||||
| 
 | 
 | ||||||
|  |         try { | ||||||
|  |             downloadEvent -= downloadEventListener | ||||||
|  |         } catch (e: Exception) { | ||||||
|  |             e.printStackTrace() | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         try { |         try { | ||||||
|             downloadStatus.remove(ep.id) |             downloadStatus.remove(ep.id) | ||||||
|         } catch (e: Exception) { |         } catch (e: Exception) { | ||||||
|  |  | ||||||
|  | @ -1,16 +1,14 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android"> | <menu xmlns:android="http://schemas.android.com/apk/res/android"> | ||||||
| <!-- | 
 | ||||||
|     <item |     <item | ||||||
|             android:id="@+id/navigation_home" |             android:id="@+id/navigation_home" | ||||||
|             android:icon="@drawable/ic_home_black_24dp" |             android:icon="@drawable/ic_home_black_24dp" | ||||||
|             android:title="@string/title_home"/> |             android:title="@string/title_home"/> | ||||||
| --> |  | ||||||
|     <item |     <item | ||||||
|             android:id="@+id/navigation_search" |             android:id="@+id/navigation_search" | ||||||
|             android:icon="@drawable/search_icon" |             android:icon="@drawable/search_icon" | ||||||
|             android:title="@string/title_search"/> |             android:title="@string/title_search"/> | ||||||
| 
 |  | ||||||
|     <item |     <item | ||||||
|             android:id="@+id/navigation_downloads" |             android:id="@+id/navigation_downloads" | ||||||
|             android:icon="@drawable/netflix_download" |             android:icon="@drawable/netflix_download" | ||||||
|  |  | ||||||
|  | @ -3,14 +3,14 @@ | ||||||
|             xmlns:app="http://schemas.android.com/apk/res-auto" |             xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|             xmlns:tools="http://schemas.android.com/tools" |             xmlns:tools="http://schemas.android.com/tools" | ||||||
|             android:id="@+id/mobile_navigation" |             android:id="@+id/mobile_navigation" | ||||||
|             app:startDestination="@+id/navigation_search"> |             app:startDestination="@+id/navigation_home"> | ||||||
| 
 | 
 | ||||||
|    <!-- <fragment |     <fragment | ||||||
|             android:id="@+id/navigation_home" |             android:id="@+id/navigation_home" | ||||||
|             android:name="com.lagradost.cloudstream3.ui.home.HomeFragment" |             android:name="com.lagradost.cloudstream3.ui.home.HomeFragment" | ||||||
|             android:label="@string/title_home" |             android:label="@string/title_home" | ||||||
|             tools:layout="@layout/fragment_home"/> |             tools:layout="@layout/fragment_home"/> | ||||||
| --> | 
 | ||||||
|     <fragment |     <fragment | ||||||
|             android:id="@+id/navigation_search" |             android:id="@+id/navigation_search" | ||||||
|             android:name="com.lagradost.cloudstream3.ui.search.SearchFragment" |             android:name="com.lagradost.cloudstream3.ui.search.SearchFragment" | ||||||
|  | @ -26,13 +26,11 @@ | ||||||
|             android:id="@+id/navigation_settings" |             android:id="@+id/navigation_settings" | ||||||
|             android:layout_height="match_parent" |             android:layout_height="match_parent" | ||||||
|             android:name="com.lagradost.cloudstream3.ui.settings.SettingsFragment" |             android:name="com.lagradost.cloudstream3.ui.settings.SettingsFragment" | ||||||
|             android:label="@string/title_settings" |             android:label="@string/title_settings"/> | ||||||
|     /> |  | ||||||
| 
 | 
 | ||||||
|     <fragment |     <fragment | ||||||
|             android:id="@+id/navigation_download_child" |             android:id="@+id/navigation_download_child" | ||||||
|             android:layout_height="match_parent" |             android:layout_height="match_parent" | ||||||
|             android:name="com.lagradost.cloudstream3.ui.download.DownloadChildFragment" |             android:name="com.lagradost.cloudstream3.ui.download.DownloadChildFragment" | ||||||
|             android:label="@string/title_settings" |             android:label="@string/title_settings"/> | ||||||
|     /> |  | ||||||
| </navigation> | </navigation> | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue