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.os.Build | ||||
| import android.os.Bundle | ||||
| import android.widget.Toast | ||||
| import android.view.WindowManager | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import androidx.navigation.NavOptions | ||||
| import androidx.navigation.findNavController | ||||
| 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.material.bottomnavigation.BottomNavigationView | ||||
| import com.lagradost.cloudstream3.UIHelper.checkWrite | ||||
| import com.lagradost.cloudstream3.UIHelper.getResourceColor | ||||
| import com.lagradost.cloudstream3.UIHelper.hasPIPPermission | ||||
| import com.lagradost.cloudstream3.UIHelper.isUsingMobileData | ||||
| import com.lagradost.cloudstream3.UIHelper.requestRW | ||||
| import com.lagradost.cloudstream3.UIHelper.shouldShowPIPMode | ||||
| import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver | ||||
| import com.lagradost.cloudstream3.ui.download.DownloadChildFragment | ||||
| 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.removeKeys | ||||
| import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos | ||||
| import com.lagradost.cloudstream3.utils.VideoDownloadManager | ||||
| import kotlinx.android.synthetic.main.fragment_result.* | ||||
| 
 | ||||
| const val VLC_PACKAGE = "org.videolan.vlc" | ||||
|  | @ -57,14 +51,7 @@ class MainActivity : AppCompatActivity() { | |||
|         var isInPlayer: Boolean = false | ||||
|         var canShowPipMode: Boolean = false | ||||
|         var isInPIPMode: Boolean = false | ||||
|         lateinit var mainContext: MainActivity | ||||
|         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() { | ||||
|  | @ -149,7 +136,7 @@ class MainActivity : AppCompatActivity() { | |||
| 
 | ||||
|     override fun onCreate(savedInstanceState: Bundle?) { | ||||
|         super.onCreate(savedInstanceState) | ||||
|         mainContext = this | ||||
|         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) | ||||
| 
 | ||||
|         setContentView(R.layout.activity_main) | ||||
|         val navView: BottomNavigationView = findViewById(R.id.nav_view) | ||||
|  | @ -174,9 +161,9 @@ class MainActivity : AppCompatActivity() { | |||
| 
 | ||||
|         navView.setOnNavigationItemSelectedListener { item -> | ||||
|             when (item.itemId) { | ||||
|                // R.id.navigation_home -> { | ||||
|                    // navController.navigate(R.id.navigation_home, null, navOptions) | ||||
|                 //} | ||||
|                 R.id.navigation_home -> { | ||||
|                     navController.navigate(R.id.navigation_home, null, navOptions) | ||||
|                 } | ||||
|                 R.id.navigation_search -> { | ||||
|                     navController.navigate(R.id.navigation_search, null, navOptions) | ||||
|                 } | ||||
|  | @ -232,7 +219,6 @@ class MainActivity : AppCompatActivity() { | |||
|         }*/ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         /* | ||||
|         val castContext = CastContext.getSharedInstance(applicationContext) | ||||
|          fun buildMediaQueueItem(video: String): MediaQueueItem { | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ import androidx.core.graphics.alpha | |||
| import androidx.core.graphics.blue | ||||
| import androidx.core.graphics.green | ||||
| import androidx.core.graphics.red | ||||
| import androidx.fragment.app.Fragment | ||||
| import androidx.fragment.app.FragmentActivity | ||||
| import androidx.preference.PreferenceManager | ||||
| 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 | ||||
|     fun Context.getResourceColor(@AttrRes resource: Int, alphaFactor: Float = 1f): Int { | ||||
|         val typedArray = obtainStyledAttributes(intArrayOf(resource)) | ||||
|  |  | |||
|  | @ -105,7 +105,7 @@ object DownloadButtonSetup { | |||
|         downloadView: View, | ||||
|         downloadImageChangeCallback: (Pair<Int, String>) -> Unit, | ||||
|         clickCallback: (DownloadClickEvent) -> Unit, | ||||
|     ) { | ||||
|     ): () -> Unit { | ||||
|         var lastState: VideoDownloadManager.DownloadType? = null | ||||
|         var currentBytes = setupCurrentBytes ?: 0 | ||||
|         var totalBytes = setupTotalBytes ?: 0 | ||||
|  | @ -174,7 +174,7 @@ object DownloadButtonSetup { | |||
|         fixDownloadedBytes(currentBytes, totalBytes, false) | ||||
|         changeDownloadImage(VideoDownloadManager.getDownloadState(data.id)) | ||||
| 
 | ||||
|         VideoDownloadManager.downloadProgressEvent += { downloadData -> | ||||
|         val downloadProgressEventListener = { downloadData: Triple<Int, Long, Long> -> | ||||
|             if (data.id == downloadData.first) { | ||||
|                 if (downloadData.second != currentBytes || downloadData.third != totalBytes) { // TO PREVENT WASTING UI TIME | ||||
|                     Coroutines.runOnMainThread { | ||||
|  | @ -184,7 +184,7 @@ object DownloadButtonSetup { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         VideoDownloadManager.downloadStatusEvent += { downloadData -> | ||||
|         val downloadStatusEventListener = { downloadData: Pair<Int, VideoDownloadManager.DownloadType> -> | ||||
|             if (data.id == downloadData.first) { | ||||
|                 if (lastState != downloadData.second || needImageUpdate) { // TO PREVENT WASTING UI TIME | ||||
|                     Coroutines.runOnMainThread { | ||||
|  | @ -194,6 +194,9 @@ object DownloadButtonSetup { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         VideoDownloadManager.downloadProgressEvent += downloadProgressEventListener | ||||
|         VideoDownloadManager.downloadStatusEvent += downloadStatusEventListener | ||||
| 
 | ||||
|         downloadView.setOnClickListener { | ||||
|             if (currentBytes <= 0) { | ||||
|                 clickCallback.invoke(DownloadClickEvent(DOWNLOAD_ACTION_DOWNLOAD, data)) | ||||
|  | @ -220,6 +223,11 @@ object DownloadButtonSetup { | |||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return { | ||||
|             VideoDownloadManager.downloadProgressEvent -= downloadProgressEventListener | ||||
|             VideoDownloadManager.downloadStatusEvent -= downloadStatusEventListener | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun setUpMaterialButton( | ||||
|  | @ -230,8 +238,8 @@ object DownloadButtonSetup { | |||
|         textView: TextView?, | ||||
|         data: VideoDownloadHelper.DownloadEpisodeCached, | ||||
|         clickCallback: (DownloadClickEvent) -> Unit, | ||||
|     ) { | ||||
|         setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadButton, { | ||||
|     ): () -> Unit { | ||||
|         return setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadButton, { | ||||
|             downloadButton?.setIconResource(it.first) | ||||
|             downloadButton?.text = it.second | ||||
|         }, clickCallback) | ||||
|  | @ -245,8 +253,8 @@ object DownloadButtonSetup { | |||
|         textView: TextView?, | ||||
|         data: VideoDownloadHelper.DownloadEpisodeCached, | ||||
|         clickCallback: (DownloadClickEvent) -> Unit, | ||||
|     ) { | ||||
|         setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadImage, { | ||||
|     ): () -> Unit { | ||||
|         return setUpDownloadButton(setupCurrentBytes, setupTotalBytes, progressBar, textView, data, downloadImage, { | ||||
|             downloadImage?.setImageResource(it.first) | ||||
|         }, 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.handleDownloadClick | ||||
| import com.lagradost.cloudstream3.ui.download.DownloadClickEvent | ||||
| import com.lagradost.cloudstream3.utils.Event | ||||
| import com.lagradost.cloudstream3.utils.VideoDownloadHelper | ||||
| import com.lagradost.cloudstream3.utils.VideoDownloadManager | ||||
| import kotlinx.android.synthetic.main.result_episode.view.episode_holder | ||||
|  | @ -46,8 +47,8 @@ class EpisodeAdapter( | |||
|     private val hasDownloadSupport: Boolean, | ||||
|     private val clickCallback: (EpisodeClickEvent) -> Unit, | ||||
|     private val downloadClickCallback: (DownloadClickEvent) -> Unit, | ||||
| ) : | ||||
|     RecyclerView.Adapter<RecyclerView.ViewHolder>() { | ||||
| ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { | ||||
| 
 | ||||
|     @LayoutRes | ||||
|     private var layout: Int = 0 | ||||
|     fun updateLayout() { | ||||
|  |  | |||
|  | @ -38,6 +38,7 @@ import com.lagradost.cloudstream3.UIHelper.checkWrite | |||
| import com.lagradost.cloudstream3.UIHelper.colorFromAttribute | ||||
| import com.lagradost.cloudstream3.UIHelper.fixPaddingStatusbar | ||||
| import com.lagradost.cloudstream3.UIHelper.getStatusBarHeight | ||||
| import com.lagradost.cloudstream3.UIHelper.hideKeyboard | ||||
| import com.lagradost.cloudstream3.UIHelper.isAppInstalled | ||||
| import com.lagradost.cloudstream3.UIHelper.isCastApiAvailable | ||||
| 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.coroutines.Job | ||||
| import java.io.File | ||||
| import java.util.* | ||||
| import kotlin.collections.ArrayList | ||||
| import kotlin.collections.HashMap | ||||
| 
 | ||||
| 
 | ||||
| const val MAX_SYNO_LENGH = 300 | ||||
|  | @ -220,6 +224,9 @@ class ResultFragment : Fragment() { | |||
|     @SuppressLint("SetTextI18n") | ||||
|     override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | ||||
|         super.onViewCreated(view, savedInstanceState) | ||||
|         activity?.window?.decorView?.clearFocus() | ||||
|         hideKeyboard() | ||||
| 
 | ||||
|         activity?.fixPaddingStatusbar(result_scroll) | ||||
|         activity?.fixPaddingStatusbar(result_barstatus) | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ import android.widget.FrameLayout | |||
| import android.widget.ImageView | ||||
| import android.widget.TextView | ||||
| import androidx.appcompat.app.AppCompatActivity | ||||
| import androidx.cardview.widget.CardView | ||||
| import androidx.recyclerview.widget.RecyclerView | ||||
| import com.bumptech.glide.Glide | ||||
| import com.bumptech.glide.load.model.GlideUrl | ||||
|  | @ -56,17 +57,17 @@ class SearchAdapter( | |||
|     constructor(itemView: View, _activity: Activity, resView: AutofitRecyclerView) : RecyclerView.ViewHolder(itemView) { | ||||
|         val activity = _activity | ||||
|         val cardView: ImageView = itemView.imageView | ||||
|         val cardText: TextView = itemView.imageText | ||||
|         val text_type: TextView? = itemView.text_type | ||||
|         private val cardText: TextView = itemView.imageText | ||||
|         private val textType: TextView? = itemView.text_type | ||||
|         // val search_result_lang: ImageView? = itemView.search_result_lang | ||||
| 
 | ||||
|         val text_is_dub: View? = itemView.text_is_dub | ||||
|         val text_is_sub: View? = itemView.text_is_sub | ||||
|         private val textIsDub: View? = itemView.text_is_dub | ||||
|         private val textIsSub: View? = itemView.text_is_sub | ||||
| 
 | ||||
|         //val cardTextExtra: TextView? = itemView.imageTextExtra | ||||
|         //val imageTextProvider: TextView? = itemView.imageTextProvider | ||||
|         val bg = itemView.backgroundCard | ||||
|         val compactView = itemView.context.getGridIsCompact() | ||||
|         private val bg: CardView = itemView.backgroundCard | ||||
|         private val compactView = itemView.context.getGridIsCompact() | ||||
|         private val coverHeight: Int = if (compactView) 80.toPx else (resView.itemWidth / 0.68).roundToInt() | ||||
| 
 | ||||
|         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.Movie -> "Movie" | ||||
|                     TvType.ONA -> "ONA" | ||||
|  | @ -88,8 +89,8 @@ class SearchAdapter( | |||
|                 } | ||||
|                 // search_result_lang?.visibility = View.GONE | ||||
| 
 | ||||
|                 text_is_dub?.visibility = View.GONE | ||||
|                 text_is_sub?.visibility = View.GONE | ||||
|                 textIsDub?.visibility = View.GONE | ||||
|                 textIsSub?.visibility = View.GONE | ||||
| 
 | ||||
|                 cardText.text = card.name | ||||
| 
 | ||||
|  | @ -114,11 +115,11 @@ class SearchAdapter( | |||
|                         if (card.dubStatus?.size == 1) { | ||||
|                             //search_result_lang?.visibility = View.VISIBLE | ||||
|                             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)) | ||||
|                             } else if (card.dubStatus.contains(DubStatus.Subbed)) { | ||||
|                                 //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 | ||||
| 
 | ||||
| import android.content.Context | ||||
| import android.content.res.Configuration | ||||
| import android.os.Bundle | ||||
| import android.view.LayoutInflater | ||||
| import android.view.View | ||||
| import android.view.ViewGroup | ||||
| import android.view.WindowManager | ||||
| import android.view.inputmethod.InputMethodManager | ||||
| import android.widget.ImageView | ||||
| import android.widget.Toast | ||||
| import androidx.appcompat.app.AlertDialog | ||||
|  | @ -36,7 +39,9 @@ class SearchFragment : Fragment() { | |||
|     ): View? { | ||||
|         searchViewModel = | ||||
|             ViewModelProvider(this).get(SearchViewModel::class.java) | ||||
| 
 | ||||
|         activity?.window?.setSoftInputMode( | ||||
|             WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | ||||
|         ) | ||||
|         return inflater.inflate(R.layout.fragment_search, container, false) | ||||
|     } | ||||
| 
 | ||||
|  | @ -125,9 +130,9 @@ class SearchFragment : Fragment() { | |||
|         observe(searchViewModel.searchResponse) { | ||||
|             when (it) { | ||||
|                 is Resource.Success -> { | ||||
|                     it?.value?.let { data -> | ||||
|                         (cardSpace.adapter as SearchAdapter).cardList = data | ||||
|                         (cardSpace.adapter as SearchAdapter).notifyDataSetChanged() | ||||
|                     it.value.let { data -> | ||||
|                         (cardSpace?.adapter as SearchAdapter?)?.cardList = data | ||||
|                         cardSpace?.adapter?.notifyDataSetChanged() | ||||
|                     } | ||||
|                     searchExitIcon.alpha = 1f | ||||
|                     search_loading_bar.alpha = 0f | ||||
|  | @ -144,6 +149,18 @@ class SearchFragment : Fragment() { | |||
|             } | ||||
|         } | ||||
|         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") | ||||
|         //(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 | ||||
|     var searchCounter = 0 | ||||
| 
 | ||||
|     private fun clearSearch() { | ||||
|         _searchResponse.postValue(Resource.Success(ArrayList())) | ||||
|     } | ||||
| 
 | ||||
|     fun search(query: String) = viewModelScope.launch { | ||||
|         searchCounter++ | ||||
|         if(query.length <= 1) { | ||||
|             clearSearch() | ||||
|             return@launch | ||||
|         } | ||||
|         val localSearchCounter = searchCounter | ||||
|         _searchResponse.postValue(Resource.Loading()) | ||||
|         val data = safeApiCall { | ||||
|  | @ -27,6 +35,10 @@ class SearchViewModel : ViewModel() { | |||
| 
 | ||||
|     fun quickSearch(query: String) = viewModelScope.launch { | ||||
|         searchCounter++ | ||||
|         if(query.length <= 1) { | ||||
|             clearSearch() | ||||
|             return@launch | ||||
|         } | ||||
|         val localSearchCounter = searchCounter | ||||
|         _searchResponse.postValue(Resource.Loading()) | ||||
|         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 bytesDownloaded = resumeLength | ||||
| 
 | ||||
| 
 | ||||
|         var isPaused = false | ||||
|         var isStopped = false | ||||
|         var isDone = false | ||||
|  | @ -561,7 +560,8 @@ object VideoDownloadManager { | |||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         downloadEvent += { event -> | ||||
| 
 | ||||
|         val downloadEventListener = { event: Pair<Int, DownloadActionType> -> | ||||
|             if (event.first == ep.id) { | ||||
|                 when (event.second) { | ||||
|                     DownloadActionType.Pause -> { | ||||
|  | @ -579,6 +579,8 @@ object VideoDownloadManager { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         downloadEvent += downloadEventListener | ||||
| 
 | ||||
|         // UPDATE DOWNLOAD NOTIFICATION | ||||
|         val notificationCoroutine = main { | ||||
|             while (true) { | ||||
|  | @ -620,6 +622,12 @@ object VideoDownloadManager { | |||
|         connectionInputStream.close() | ||||
|         notificationCoroutine.cancel() | ||||
| 
 | ||||
|         try { | ||||
|             downloadEvent -= downloadEventListener | ||||
|         } catch (e: Exception) { | ||||
|             e.printStackTrace() | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|             downloadStatus.remove(ep.id) | ||||
|         } catch (e: Exception) { | ||||
|  |  | |||
|  | @ -1,16 +1,14 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
| <!-- | ||||
| 
 | ||||
|     <item | ||||
|             android:id="@+id/navigation_home" | ||||
|             android:icon="@drawable/ic_home_black_24dp" | ||||
|             android:title="@string/title_home"/> | ||||
| --> | ||||
|     <item | ||||
|             android:id="@+id/navigation_search" | ||||
|             android:icon="@drawable/search_icon" | ||||
|             android:title="@string/title_search"/> | ||||
| 
 | ||||
|     <item | ||||
|             android:id="@+id/navigation_downloads" | ||||
|             android:icon="@drawable/netflix_download" | ||||
|  |  | |||
|  | @ -3,14 +3,14 @@ | |||
|             xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|             xmlns:tools="http://schemas.android.com/tools" | ||||
|             android:id="@+id/mobile_navigation" | ||||
|             app:startDestination="@+id/navigation_search"> | ||||
|             app:startDestination="@+id/navigation_home"> | ||||
| 
 | ||||
|    <!-- <fragment | ||||
|     <fragment | ||||
|             android:id="@+id/navigation_home" | ||||
|             android:name="com.lagradost.cloudstream3.ui.home.HomeFragment" | ||||
|             android:label="@string/title_home" | ||||
|             tools:layout="@layout/fragment_home"/> | ||||
| --> | ||||
| 
 | ||||
|     <fragment | ||||
|             android:id="@+id/navigation_search" | ||||
|             android:name="com.lagradost.cloudstream3.ui.search.SearchFragment" | ||||
|  | @ -26,13 +26,11 @@ | |||
|             android:id="@+id/navigation_settings" | ||||
|             android:layout_height="match_parent" | ||||
|             android:name="com.lagradost.cloudstream3.ui.settings.SettingsFragment" | ||||
|             android:label="@string/title_settings" | ||||
|     /> | ||||
|             android:label="@string/title_settings"/> | ||||
| 
 | ||||
|     <fragment | ||||
|             android:id="@+id/navigation_download_child" | ||||
|             android:layout_height="match_parent" | ||||
|             android:name="com.lagradost.cloudstream3.ui.download.DownloadChildFragment" | ||||
|             android:label="@string/title_settings" | ||||
|     /> | ||||
|             android:label="@string/title_settings"/> | ||||
| </navigation> | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue