diff --git a/.idea/misc.xml b/.idea/misc.xml index b0298d6..439e504 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -82,7 +82,9 @@ + + diff --git a/app/build.gradle b/app/build.gradle index 17e18bb..8580714 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -217,13 +217,6 @@ dependencies { implementation project(':library') implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1" - // PlayBack - implementation("com.jaredrummler:colorpicker:1.1.0") // Subtitle Color Picker - implementation("com.github.recloudstream:media-ffmpeg:1.1.0") // Custom FF-MPEG Lib for Audio Codecs - implementation("com.github.teamnewpipe:NewPipeExtractor:v0.24.2") /* For Trailers - ^ Update to Latest Commits if Trailers Misbehave, github.com/TeamNewPipe/NewPipeExtractor/commits/dev */ - implementation("com.github.albfernandez:juniversalchardet:2.5.0") // Subtitle Decoding - } \ No newline at end of file diff --git a/app/release/app-release.apk b/app/release/app-release.apk index 6fdd1ba..b6ebffa 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ diff --git a/app/src/main/java/com/animestudios/animeapp/parsers/AniWorld.kt b/app/src/main/java/com/animestudios/animeapp/parsers/AniWorld.kt index ccd5999..98c2b70 100644 --- a/app/src/main/java/com/animestudios/animeapp/parsers/AniWorld.kt +++ b/app/src/main/java/com/animestudios/animeapp/parsers/AniWorld.kt @@ -44,8 +44,8 @@ class AniWorld : AnimeParser() { val episodeLinkElement = episodeRow.select("td.season1EpisodeID a[itemprop=url]").first() val episodeTitleElement = episodeRow.select("td.seasonEpisodeTitle a").first() - val episodeLink: String = episodeLinkElement.attr("href") - val episodeTitle: String = episodeTitleElement.text() + val episodeLink: String = episodeLinkElement!!.attr("href") + val episodeTitle: String = episodeTitleElement!!.text() episodeList.add(Episode(count.toString(), episodeLink, episodeTitle)) diff --git a/app/src/main/java/com/animestudios/animeapp/ui/screen/browse/page/genre/GenreFragment.kt b/app/src/main/java/com/animestudios/animeapp/ui/screen/browse/page/genre/GenreFragment.kt index 37254c4..66f9d04 100644 --- a/app/src/main/java/com/animestudios/animeapp/ui/screen/browse/page/genre/GenreFragment.kt +++ b/app/src/main/java/com/animestudios/animeapp/ui/screen/browse/page/genre/GenreFragment.kt @@ -7,11 +7,14 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.GridLayoutManager +import com.animestudios.animeapp.R import com.animestudios.animeapp.anilist.api.common.Anilist import com.animestudios.animeapp.databinding.FragmentGenreBinding import com.animestudios.animeapp.readData import com.animestudios.animeapp.settings.UISettings +import com.animestudios.animeapp.tools.animationTransaction import com.animestudios.animeapp.ui.screen.browse.page.genre.adapter.GenreAdapter import com.animestudios.animeapp.viewmodel.imp.GenresViewModelImp import dagger.hilt.android.AndroidEntryPoint @@ -46,6 +49,16 @@ class GenreFragment : Fragment() { val screenWidth = resources.displayMetrics.run { widthPixels / density } val adapter = GenreAdapter(true) + adapter.setItemListener { + val bundle = Bundle() + bundle.putString("type", "ANIME") + bundle.putString("genre", it) + bundle.putString("sortBy", "Trending") + bundle.putBoolean("search", true) + findNavController().navigate( + R.id.searchScreen, bundle, animationTransaction().build() + ) + } model.doneListener = { MainScope().launch { binding.mediaInfoGenresProgressBar.visibility = View.GONE diff --git a/app/src/main/java/com/animestudios/animeapp/ui/screen/browse/page/genre/adapter/GenreAdapter.kt b/app/src/main/java/com/animestudios/animeapp/ui/screen/browse/page/genre/adapter/GenreAdapter.kt index 9cf8518..696bf47 100644 --- a/app/src/main/java/com/animestudios/animeapp/ui/screen/browse/page/genre/adapter/GenreAdapter.kt +++ b/app/src/main/java/com/animestudios/animeapp/ui/screen/browse/page/genre/adapter/GenreAdapter.kt @@ -2,18 +2,25 @@ package com.animestudios.animeapp.ui.screen.browse.page.genre.adapter import android.view.LayoutInflater import android.view.ViewGroup +import android.widget.Toast import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.RecyclerView +import com.animestudios.animeapp.anilist.api.common.Anilist import com.animestudios.animeapp.databinding.GenresItemBinding -import com.animestudios.animeapp.readData import com.animestudios.animeapp.loadImage import com.animestudios.animeapp.px +import com.animestudios.animeapp.readData import com.animestudios.animeapp.settings.UISettings class GenreAdapter(private val big: Boolean = false) : RecyclerView.Adapter() { var genres = mutableMapOf() var pos = arrayListOf() + private lateinit var initItemListener: (String,) -> Unit + fun setItemListener(listener: (String) -> Unit) { + initItemListener = listener + } + private val uiSettings = readData("ui_settings") ?: UISettings() @@ -23,6 +30,35 @@ class GenreAdapter(private val big: Boolean = false) : val genre = genres[pos[bindingAdapterPosition]] binding.genreTitle.text = pos[bindingAdapterPosition] binding.genreImage.loadImage(genre) + binding.root.setOnClickListener { + initItemListener.invoke(pos[adapterPosition]) + if (pos[bindingAdapterPosition].lowercase() == "hentai") { + if (!Anilist.adult) Toast.makeText( + itemView.context, + "Turn on 18+ Content from your Anilist Settings", + Toast.LENGTH_SHORT + ).show() + } + // ContextCompat.startActivity( + // itemView.context, + // Intent(itemView.context, SearchScreen::class.java) + // .putExtra("type", type) + // .putExtra("genre", pos[bindingAdapterPosition]) + // .putExtra("sortBy", "Trending") + // .putExtra("search", true) + // .also { + // if (pos[bindingAdapterPosition].lowercase() == "hentai") { + // if (!Anilist.adult) Toast.makeText( + // itemView.context, + // "Turn on 18+ Content from your Anilist Settings", + // Toast.LENGTH_SHORT + // ).show() + // it.putExtra("hentai", true) + // } + // }, + // null + // ) + } } } diff --git a/app/src/main/java/com/animestudios/animeapp/ui/screen/search/SearchScreen.kt b/app/src/main/java/com/animestudios/animeapp/ui/screen/search/SearchScreen.kt index 62201bf..3d4cd35 100644 --- a/app/src/main/java/com/animestudios/animeapp/ui/screen/search/SearchScreen.kt +++ b/app/src/main/java/com/animestudios/animeapp/ui/screen/search/SearchScreen.kt @@ -94,6 +94,11 @@ class SearchScreen : Fragment() { "ANIME", isAdult = false, onList = false, + genres = requireActivity().intent.getStringExtra("genre") + ?.let { mutableListOf(it) }, + tags = requireActivity().intent.getStringExtra("tag")?.let { mutableListOf(it) }, + sort = requireActivity().intent.getStringExtra("sortBy"), + results = mutableListOf(), hasNextPage = false ) @@ -125,62 +130,7 @@ class SearchScreen : Fragment() { speechRecognizer = SpeechRecognizer.createSpeechRecognizer(requireActivity()) binding.micSearch.setOnClickListener { - - if (ContextCompat.checkSelfPermission( - requireActivity(), - Manifest.permission.RECORD_AUDIO - ) != PackageManager.PERMISSION_GRANTED - ) { - checkPermission(); - } - // Initialize SpeechRecognizer - speechRecognizer.setRecognitionListener(object : RecognitionListener { - override fun onReadyForSpeech(params: Bundle?) { - // Called when the speech recognition service is ready for user input - } - - override fun onBeginningOfSpeech() { - // Called when the user starts speaking - } - - override fun onRmsChanged(rmsdB: Float) { - TODO("Not yet implemented") - } - - override fun onBufferReceived(buffer: ByteArray?) { - TODO("Not yet implemented") - } - - override fun onEndOfSpeech() { - // Called when the user stops speaking - } - - override fun onResults(results: Bundle?) { - // Called when speech recognition results are available - val matches = results?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) - if (!matches.isNullOrEmpty()) { - val recognizedText = matches[0] - // Handle the recognized text as needed - snackString(recognizedText) - } - } - - override fun onPartialResults(partialResults: Bundle?) { - TODO("Not yet implemented") - } - - override fun onEvent(eventType: Int, params: Bundle?) { - TODO("Not yet implemented") - } - - // Implement other methods as needed - - override fun onError(error: Int) { - // Called when there is an error in speech recognition - } - }) -// speechRecognizer.startListening() - + setUpVoiceMicSearch() } // hideNavigation() @@ -311,6 +261,65 @@ class SearchScreen : Fragment() { mediaAdaptor.notifyDataSetChanged() } + + private fun setUpVoiceMicSearch() { + if (ContextCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.RECORD_AUDIO + ) != PackageManager.PERMISSION_GRANTED + ) { + checkPermission(); + } + // Initialize SpeechRecognizer + speechRecognizer.setRecognitionListener(object : RecognitionListener { + override fun onReadyForSpeech(params: Bundle?) { + // Called when the speech recognition service is ready for user input + } + + override fun onBeginningOfSpeech() { + // Called when the user starts speaking + } + + override fun onRmsChanged(rmsdB: Float) { + } + + override fun onBufferReceived(buffer: ByteArray?) { + } + + override fun onEndOfSpeech() { + // Called when the user stops speaking + } + + override fun onResults(results: Bundle?) { + // Called when speech recognition results are available + val matches = results?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) + if (!matches.isNullOrEmpty()) { + val recognizedText = matches[0] + // Handle the recognized text as needed + model.searchResults.search=recognizedText + progressAdapter.notifyDataSetChanged() + search() + snackString(recognizedText) + } + } + + override fun onPartialResults(partialResults: Bundle?) { + TODO("Not yet implemented") + } + + override fun onEvent(eventType: Int, params: Bundle?) { + TODO("Not yet implemented") + } + + // Implement other methods as needed + + override fun onError(error: Int) { + // Called when there is an error in speech recognition + } + }) + speechRecognizer.startListening(requireActivity().intent) + } + private fun initProgress(headerAdaptor: SearchAdapter) { val notSet = model.notSet progressAdapter = ProgressAdapter(searched = model.searched) @@ -324,6 +333,7 @@ class SearchScreen : Fragment() { } } else headerAdaptor.requestFocus?.run() + if (requireActivity().intent.getBooleanExtra("search", false)) search() } } diff --git a/app/src/main/res/layout/fragment_profile_screen.xml b/app/src/main/res/layout/fragment_profile_screen.xml index 5e7178f..8327024 100644 --- a/app/src/main/res/layout/fragment_profile_screen.xml +++ b/app/src/main/res/layout/fragment_profile_screen.xml @@ -80,7 +80,6 @@ android:layout_marginBottom="4dp" android:visibility="gone" android:scaleType="centerCrop" - android:src="@drawable/kbot09" app:layout_constraintBottom_toBottomOf="@+id/profile_bg" app:layout_constraintEnd_toEndOf="@+id/profile_bg" app:layout_constraintStart_toStartOf="@+id/profile_bg" /> @@ -94,7 +93,7 @@ android:layout_height="wrap_content" android:layout_marginTop="12dp" android:fontFamily="@font/inter_bold" - android:text="KBOT09" + android:text="User" android:textColor="@color/white" android:textSize="20sp" app:layout_constraintEnd_toEndOf="@+id/circleImageView"