diff --git a/README.md b/README.md index 75d1dc16..ef42c1c7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# **Dantotsu** (🚧 ALPHA 🚧) - -> ⚠️ **WARNING**: This project is in alpha stage. Things may not work as expected. +# **Dantotsu**

@@ -26,14 +24,14 @@ Dantotsu is crafted from the ashes of Saikou and based on simplistic yet state-o | Type | Status | | ---------------- | ------- | | Anime Extensions | Working | -| Manga Extensions | "Working" | +| Manga Extensions | Working | | Light Novel Extensions | Not Working | ## APP FEATURES -- Easy and functional way to both, watch anime and read manga, ad-free. +- Easy and functional way to both, watch anime and read manga. - A completely open source app with a nice UI & Animations :) @@ -59,14 +57,16 @@ add your own extensions in the settings menu (Dantotsu has no affiliation with a ## Planned Stuff -- get app out of alpha +- TV Support -- Accent Color Change (RIP Hot Pink Supremacy.) +- LN Support + +- Offline Viewing ## Rejected Stuff (still rejected) -- Sources of any language except English +- Official support of any language except English - News Section in the App diff --git a/app/build.gradle b/app/build.gradle index d27a4fbc..8e394e12 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { minSdk 23 targetSdk 34 versionCode ((System.currentTimeMillis() / 60000).toInteger()) - versionName "0.1.5" + versionName "1.0.0" signingConfig signingConfigs.debug } diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml index 3c0d72af..e74ebc2f 100644 --- a/app/src/debug/res/values/strings.xml +++ b/app/src/debug/res/values/strings.xml @@ -1,4 +1,4 @@ - Dantotsu α + Dantotsu \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 00000000..20a7f23e Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index f175ff5c..25a415f9 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -188,6 +188,9 @@ fun Activity.hideStatusBar() { open class BottomSheetDialogFragment : BottomSheetDialogFragment() { override fun onStart() { super.onStart() + val window = dialog?.window + val decorView: View = window?.decorView ?: return + decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN if (this.resources.configuration.orientation != Configuration.ORIENTATION_PORTRAIT) { val behavior = BottomSheetBehavior.from(requireView().parent as View) behavior.state = BottomSheetBehavior.STATE_EXPANDED diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt index 488f3e59..73334e60 100644 --- a/app/src/main/java/ani/dantotsu/MainActivity.kt +++ b/app/src/main/java/ani/dantotsu/MainActivity.kt @@ -90,7 +90,7 @@ class MainActivity : AppCompatActivity() { val bottomBar = findViewById(R.id.navbar) val backgroundDrawable = bottomBar.background as GradientDrawable val currentColor = backgroundDrawable.color?.defaultColor ?: 0 - val semiTransparentColor = (currentColor and 0x00FFFFFF) or 0x80000000.toInt() + val semiTransparentColor = (currentColor and 0x00FFFFFF) or 0xE8000000.toInt() backgroundDrawable.setColor(semiTransparentColor) bottomBar.background = backgroundDrawable } @@ -125,24 +125,40 @@ class MainActivity : AppCompatActivity() { binding.root.isMotionEventSplittingEnabled = false lifecycleScope.launch { - val splash = SplashScreenBinding.inflate(layoutInflater) - binding.root.addView(splash.root) - (splash.splashImage.drawable as Animatable).start() + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + val splash = SplashScreenBinding.inflate(layoutInflater) + binding.root.addView(splash.root) + (splash.splashImage.drawable as Animatable).start() - // Wait for 2 seconds (2000 milliseconds) - delay(2000) + delay(1200) - // Now perform the animation - ObjectAnimator.ofFloat( - splash.root, - View.TRANSLATION_Y, - 0f, - -splash.root.height.toFloat() - ).apply { - interpolator = AnticipateInterpolator() - duration = 200L - doOnEnd { binding.root.removeView(splash.root) } - start() + ObjectAnimator.ofFloat( + splash.root, + View.TRANSLATION_Y, + 0f, + -splash.root.height.toFloat() + ).apply { + interpolator = AnticipateInterpolator() + duration = 200L + doOnEnd { binding.root.removeView(splash.root) } + start() + } + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + splashScreen.setOnExitAnimationListener { splashScreenView -> + ObjectAnimator.ofFloat( + splashScreenView, + View.TRANSLATION_Y, + 0f, + -splashScreenView.height.toFloat() + ).apply { + interpolator = AnticipateInterpolator() + duration = 200L + doOnEnd { splashScreenView.remove() } + start() + } } } diff --git a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt index 48932305..feba6ac9 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt @@ -54,7 +54,7 @@ class AnimePageAdapter : RecyclerView.Adapter(R.id.animeSearchBar) val currentColor = textInputLayout.boxBackgroundColor - val semiTransparentColor = (currentColor and 0x00FFFFFF) or 0x80000000.toInt() + val semiTransparentColor = (currentColor and 0x00FFFFFF) or 0xA8000000.toInt() textInputLayout.boxBackgroundColor = semiTransparentColor val materialCardView = holder.itemView.findViewById(R.id.animeUserAvatarContainer) materialCardView.setCardBackgroundColor(semiTransparentColor) diff --git a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt index 68ca065a..5422d1cb 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt @@ -53,7 +53,7 @@ class MangaPageAdapter : RecyclerView.Adapter(R.id.mangaSearchBar) val currentColor = textInputLayout.boxBackgroundColor - val semiTransparentColor = (currentColor and 0x00FFFFFF) or 0x80000000.toInt() + val semiTransparentColor= (currentColor and 0x00FFFFFF) or 0xA8000000.toInt() textInputLayout.boxBackgroundColor = semiTransparentColor val materialCardView = holder.itemView.findViewById(R.id.mangaUserAvatarContainer) materialCardView.setCardBackgroundColor(semiTransparentColor) diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt index 04886529..feb75e7a 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt @@ -10,6 +10,7 @@ import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.ImageView import android.widget.LinearLayout +import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import ani.dantotsu.* @@ -177,6 +178,7 @@ class AnimeWatchAdapter( binding.animeWatchChipScroll.smoothScrollTo((chip.left - screenWidth / 2) + (chip.width / 2), 0) } chip.text = "${names[limit * (position)]} - ${names[last - 1]}" + chip.setTextColor(ContextCompat.getColorStateList(fragment.requireContext(), R.color.chip_text_color)) chip.setOnClickListener { selected() diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt index a5a2b19e..36ad53bb 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt @@ -63,7 +63,8 @@ class MangaChapterAdapter( val binding = holder.binding setAnimation(fragment.requireContext(), holder.binding.root, fragment.uiSettings) val ep = arr[position] - binding.itemEpisodeNumber.text = ep.number + val parsedNumber = MangaNameAdapter.findChapterNumber(ep.number)?.toInt() + binding.itemEpisodeNumber.text = parsedNumber?.toString() ?: ep.number if (media.userProgress != null) { if ((MangaNameAdapter.findChapterNumber(ep.number) ?: 9999f) <= media.userProgress!!.toFloat()) binding.itemEpisodeViewedCover.visibility = View.VISIBLE diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt index 37472155..3579d6b9 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.ImageView import android.widget.LinearLayout +import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import ani.dantotsu.* @@ -145,6 +146,7 @@ class MangaReadAdapter( binding.animeWatchChipScroll.smoothScrollTo((chip.left - screenWidth / 2) + (chip.width / 2), 0) } chip.text = "${names[limit * (position)]} - ${names[last - 1]}" + chip.setTextColor(ContextCompat.getColorStateList(fragment.requireContext(), R.color.chip_text_color)) chip.setOnClickListener { selected() diff --git a/app/src/main/java/ani/dantotsu/others/CustomBottomDialog.kt b/app/src/main/java/ani/dantotsu/others/CustomBottomDialog.kt index 19d96cf6..3c758f60 100644 --- a/app/src/main/java/ani/dantotsu/others/CustomBottomDialog.kt +++ b/app/src/main/java/ani/dantotsu/others/CustomBottomDialog.kt @@ -1,6 +1,8 @@ package ani.dantotsu.others +import android.graphics.Color import android.os.Bundle +import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -46,6 +48,12 @@ open class CustomBottomDialog : BottomSheetDialogFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = BottomSheetCustomBinding.inflate(inflater, container, false) + val window = dialog?.window + window?.statusBarColor = Color.TRANSPARENT + val typedValue = TypedValue() + val theme = requireContext().theme + theme.resolveAttribute(com.google.android.material.R.attr.colorSurface, typedValue, true) + window?.navigationBarColor = typedValue.data return binding.root } diff --git a/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt b/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt index e46308a7..868ff51c 100644 --- a/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt +++ b/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt @@ -74,15 +74,16 @@ class ImageViewDialog : BottomSheetDialogFragment() { if (image2 != null) openLinkInBrowser(image2.url) true } + val context = requireContext() - lifecycleScope.launch { + viewLifecycleOwner.lifecycleScope.launch { val binding = _binding ?: return@launch - var bitmap = requireContext().loadBitmap_old(image, trans1 ?: listOf()) - var bitmap2 = if (image2 != null) requireContext().loadBitmap_old(image2, trans2 ?: listOf()) else null + var bitmap = context.loadBitmap_old(image, trans1 ?: listOf()) + var bitmap2 = if (image2 != null) context.loadBitmap_old(image2, trans2 ?: listOf()) else null if (bitmap == null) { - bitmap = requireContext().loadBitmap(image, trans1 ?: listOf()) - bitmap2 = if (image2 != null) requireContext().loadBitmap(image2, trans2 ?: listOf()) else null + bitmap = context.loadBitmap(image, trans1 ?: listOf()) + bitmap2 = if (image2 != null) context.loadBitmap(image2, trans2 ?: listOf()) else null } bitmap = if (bitmap2 != null && bitmap != null) mergeBitmap(bitmap, bitmap2,) else bitmap diff --git a/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt index 28e1482b..2ff5ef23 100644 --- a/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt @@ -49,10 +49,10 @@ class AnimeExtensionsFragment : Fragment(), ): View { _binding = FragmentAnimeExtensionsBinding.inflate(inflater, container, false) - binding.allAnimeExtensionsRecyclerView.isNestedScrollingEnabled = true + binding.allAnimeExtensionsRecyclerView.isNestedScrollingEnabled = false binding.allAnimeExtensionsRecyclerView.adapter = adapter binding.allAnimeExtensionsRecyclerView.layoutManager = LinearLayoutManager(context) - (binding.allAnimeExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = false + (binding.allAnimeExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = true lifecycleScope.launch { viewModel.pagerFlow.collectLatest { @@ -60,6 +60,8 @@ class AnimeExtensionsFragment : Fragment(), } } + viewModel.invalidatePager() // Force a refresh of the pager + return binding.root } diff --git a/app/src/main/java/ani/dantotsu/settings/DevelopersDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/DevelopersDialogFragment.kt index 19aa6580..c1e168ab 100644 --- a/app/src/main/java/ani/dantotsu/settings/DevelopersDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/DevelopersDialogFragment.kt @@ -13,26 +13,8 @@ class DevelopersDialogFragment : BottomSheetDialogFragment() { private val binding get() = _binding!! private val developers = arrayOf( - Developer("vorobyovgabriel","https://avatars.githubusercontent.com/u/99561687?s=120&v=4","Owner","https://github.com/vorobyovgabriel"), - Developer("brahmkshtriya","https://avatars.githubusercontent.com/u/69040506?s=120&v=4","Maintainer","https://github.com/brahmkshatriya"), - Developer("jeelpatel231","https://avatars.githubusercontent.com/u/33726155?s=120&v=4","Contributor","https://github.com/jeelpatel231"), - Developer("blatzar","https://avatars.githubusercontent.com/u/46196380?s=120&v=4","Contributor","https://github.com/Blatzar"), - Developer("bilibox","https://avatars.githubusercontent.com/u/1800580?s=120&v=4","Contributor","https://github.com/Bilibox"), - Developer("sutslec","https://avatars.githubusercontent.com/u/27722281?s=120&v=4","Contributor","https://github.com/Sutslec"), - Developer("4jx","https://avatars.githubusercontent.com/u/79868816?s=120&v=4","Contributor","https://github.com/4JX"), - Developer("xtrm-en","https://avatars.githubusercontent.com/u/26600206?s=120&v=4","Contributor","https://github.com/xtrm-en"), - Developer("scrazzz","https://avatars.githubusercontent.com/u/70033559?s=120&v=4","Contributor","https://github.com/scrazzz"), - Developer("defcoding","https://avatars.githubusercontent.com/u/39608887?s=120&v=4","Contributor","https://github.com/defcoding"), - Developer("adolar0042","https://avatars.githubusercontent.com/u/39769465?s=120&v=4","Contributor","https://github.com/adolar0042"), - Developer("diegopyl1209","https://avatars.githubusercontent.com/u/80992641?s=120&v=4","Contributor","https://github.com/diegopyl1209"), - Developer("sreekrishna2001","https://avatars.githubusercontent.com/u/67505103?s=120&v=4","Contributor","https://github.com/Sreekrishna2001"), - Developer("riimuru","https://avatars.githubusercontent.com/u/57333995?s=120&v=4","Contributor","https://github.com/riimuru"), - Developer("vu nguyen","https://avatars.githubusercontent.com/u/68330291?s=120&v=4","Contributor","https://github.com/hoangvu12"), - Developer("animejeff","https://avatars.githubusercontent.com/u/101831300?s=120&v=4","Contributor","https://github.com/AnimeJeff"), - Developer("antonydp","https://avatars.githubusercontent.com/u/38143733?s=120&v=4","Contributor","https://github.com/antonydp"), - Developer("tobybridle","https://avatars.githubusercontent.com/u/52335751?s=120&v=4","Contributor","https://github.com/TobyBridle"), - Developer("enimax","https://avatars.githubusercontent.com/u/107899019?s=120&v=4","Contributor","https://github.com/enimax-anime"), - Developer("vipulog","https://avatars.githubusercontent.com/u/90324465?s=120&v=4","Contributor","https://github.com/VipulOG") + Developer("rebelonion","https://avatars.githubusercontent.com/u/87634197?v=4","Owner and Maintainer","https://github.com/rebelonion"), + Developer("Wai What", "https://cdn.discordapp.com/avatars/928202695611908126/aeac4c867acbb8c3783356497055a426.webp?size=80", "Icon Designer", ""), ) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { diff --git a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt index 71a5f43b..a4f9a0d6 100644 --- a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt @@ -1,55 +1,26 @@ package ani.dantotsu.settings import android.annotation.SuppressLint -import android.app.NotificationManager -import android.content.Context -import android.content.pm.PackageManager -import android.graphics.drawable.Drawable import android.os.Build.* import android.os.Build.VERSION.* import android.os.Bundle -import android.view.LayoutInflater -import android.view.View +import android.text.Editable +import android.text.TextWatcher import android.view.ViewGroup -import android.widget.ImageView +import android.widget.AutoCompleteTextView import android.widget.LinearLayout -import android.widget.ProgressBar import android.widget.SearchView -import android.widget.TextView import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity -import androidx.core.app.ActivityCompat -import androidx.core.app.NotificationCompat -import androidx.core.content.ContextCompat import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment -import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import ani.dantotsu.* -import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager -import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import ani.dantotsu.databinding.ActivityExtensionsBinding -import ani.dantotsu.home.AnimeFragment -import ani.dantotsu.home.MangaFragment import ani.dantotsu.themes.ThemeManager -import com.bumptech.glide.Glide import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator -import eu.kanade.tachiyomi.data.notification.Notifications -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import rx.android.schedulers.AndroidSchedulers -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get -import uy.kohesive.injekt.injectLazy -import javax.inject.Inject - class ExtensionsActivity : AppCompatActivity() { private val restartMainActivity = object : OnBackPressedCallback(false) { @@ -94,21 +65,20 @@ class ExtensionsActivity : AppCompatActivity() { }.attach() - val searchView: SearchView = findViewById(R.id.searchView) + val searchView: AutoCompleteTextView = findViewById(R.id.searchViewText) - val extensionsHeader: LinearLayout = findViewById(R.id.extensionsHeader) - searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(query: String?): Boolean { - return false + searchView.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) { } - override fun onQueryTextChange(newText: String?): Boolean { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val currentFragment = supportFragmentManager.findFragmentByTag("f${viewPager.currentItem}") if (currentFragment is SearchQueryHandler) { - currentFragment.updateContentBasedOnQuery(newText) + currentFragment.updateContentBasedOnQuery(s?.toString()?.trim()) } - - return true } }) diff --git a/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt index 0cc0d359..a949bd86 100644 --- a/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt @@ -10,6 +10,7 @@ import androidx.core.app.NotificationCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope +import androidx.paging.PagingData import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.R import ani.dantotsu.databinding.FragmentMangaExtensionsBinding @@ -25,6 +26,7 @@ import ani.dantotsu.settings.paging.MangaExtensionAdapter import ani.dantotsu.settings.paging.MangaExtensionsViewModel import ani.dantotsu.settings.paging.MangaExtensionsViewModelFactory import ani.dantotsu.settings.paging.OnMangaInstallClickListener +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest class MangaExtensionsFragment : Fragment(), @@ -50,17 +52,19 @@ class MangaExtensionsFragment : Fragment(), ): View { _binding = FragmentMangaExtensionsBinding.inflate(inflater, container, false) - binding.allMangaExtensionsRecyclerView.isNestedScrollingEnabled = true + binding.allMangaExtensionsRecyclerView.isNestedScrollingEnabled = false binding.allMangaExtensionsRecyclerView.adapter = adapter binding.allMangaExtensionsRecyclerView.layoutManager = LinearLayoutManager(context) - (binding.allMangaExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = false + (binding.allMangaExtensionsRecyclerView.layoutManager as LinearLayoutManager).isItemPrefetchEnabled = true lifecycleScope.launch { - viewModel.pagerFlow.collectLatest { - adapter.submitData(it) + viewModel.pagerFlow.collectLatest { pagingData -> + adapter.submitData(pagingData) } } + viewModel.invalidatePager() // Force a refresh of the pager + return binding.root } diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index d99b1927..d67a16ac 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -105,6 +105,12 @@ OS Version: $CODENAME $RELEASE ($SDK_INT) restartApp() } + binding.settingsUseOLED.isChecked = getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getBoolean("use_oled", false) + binding.settingsUseOLED.setOnCheckedChangeListener { _, isChecked -> + getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit().putBoolean("use_oled", isChecked).apply() + restartApp() + } + val themeString = getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getString("theme", "PURPLE")!! binding.themeSwitcher.setText(themeString.substring(0, 1) + themeString.substring(1).lowercase()) @@ -408,7 +414,7 @@ OS Version: $CODENAME $RELEASE ($SDK_INT) } } - var curTime = loadData("subscriptions_time_r") ?: defaultTime + var curTime = loadData("subscriptions_time_s") ?: defaultTime val timeNames = timeMinutes.map { val mins = it % 60 val hours = it / 60 @@ -421,7 +427,7 @@ OS Version: $CODENAME $RELEASE ($SDK_INT) speedDialog.setSingleChoiceItems(timeNames, curTime) { dialog, i -> curTime = i binding.settingsSubscriptionsTime.text = getString(R.string.subscriptions_checking_time_s, timeNames[i]) - saveData("subscriptions_time_r", curTime) + saveData("subscriptions_time_s", curTime) dialog.dismiss() startSubscription(true) }.show() diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt index 0db7e089..5b5c62b0 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt @@ -3,8 +3,10 @@ package ani.dantotsu.settings import android.app.DownloadManager import android.content.ActivityNotFoundException import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Bundle +import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -26,6 +28,12 @@ class SettingsDialogFragment : BottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val window = dialog?.window + window?.statusBarColor = Color.CYAN + val typedValue = TypedValue() + val theme = requireContext().theme + theme.resolveAttribute(com.google.android.material.R.attr.colorSurface, typedValue, true) + window?.navigationBarColor = typedValue.data if (Anilist.token != null) { binding.settingsLogin.setText(R.string.logout) diff --git a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt index 511bd501..8dec149d 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt @@ -117,12 +117,10 @@ class MangaExtensionAdapter(private val clickListener: OnMangaInstallClickListen companion object { private val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: MangaExtension.Available, newItem: MangaExtension.Available): Boolean { - // Your logic here return oldItem.pkgName == newItem.pkgName } override fun areContentsTheSame(oldItem: MangaExtension.Available, newItem: MangaExtension.Available): Boolean { - // Your logic here return oldItem == newItem } } diff --git a/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt b/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt index de2836d3..0849ca07 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt @@ -40,7 +40,7 @@ class AlarmReceiver : BroadcastReceiver() { PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager - val curTime = loadData("subscriptions_time_r", context) ?: defaultTime + val curTime = loadData("subscriptions_time_s", context) ?: defaultTime if (timeMinutes[curTime] > 0) alarmManager.setRepeating( diff --git a/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt b/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt index 6d00090c..45925ba4 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt @@ -16,8 +16,8 @@ import kotlinx.coroutines.launch @SuppressLint("MissingPermission") class Subscription { companion object { - const val defaultTime = 3 - val timeMinutes = arrayOf(0L, 120, 180, 240, 360, 480, 720, 1440) + const val defaultTime = 1 + val timeMinutes = arrayOf(0L, 720, 1440) private var alreadyStarted = false fun Context.startSubscription(force: Boolean = false) { diff --git a/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionWorker.kt b/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionWorker.kt index ee375e46..8481ed88 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionWorker.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionWorker.kt @@ -22,7 +22,7 @@ class SubscriptionWorker(val context: Context, params: WorkerParameters) : Corou private const val SUBSCRIPTION_WORK_NAME = "work_subscription" fun enqueue(context: Context) { - val curTime = loadData("subscriptions_time_r") ?: defaultTime + val curTime = loadData("subscriptions_time_s") ?: defaultTime if(timeMinutes[curTime]>0L) { val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build() val periodicSyncDataWork = PeriodicWorkRequest.Builder( diff --git a/app/src/main/java/ani/dantotsu/themes/ThemeManager.kt b/app/src/main/java/ani/dantotsu/themes/ThemeManager.kt index 55f126b9..080f4394 100644 --- a/app/src/main/java/ani/dantotsu/themes/ThemeManager.kt +++ b/app/src/main/java/ani/dantotsu/themes/ThemeManager.kt @@ -1,41 +1,41 @@ package ani.dantotsu.themes import android.content.Context +import android.content.res.Configuration import ani.dantotsu.R class ThemeManager(private val context: Context) { fun applyTheme() { + val useOLED = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getBoolean("use_oled", false) && isDarkThemeActive(context) if(context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getBoolean("use_material_you", false)){ return } - when (context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getString("theme", "PURPLE")!!) { - "PURPLE" -> { - context.setTheme(R.style.Theme_Dantotsu_Purple) - } - "BLUE" -> { - context.setTheme(R.style.Theme_Dantotsu_Blue) - } - "GREEN" -> { - context.setTheme(R.style.Theme_Dantotsu_Green) - } - "PINK" -> { - context.setTheme(R.style.Theme_Dantotsu_Pink) - } - "RED" -> { - context.setTheme(R.style.Theme_Dantotsu_Red) - } - "LAVENDER" -> { - context.setTheme(R.style.Theme_Dantotsu_Lavender) - } - "MONOCHROME (BETA)" -> { - context.setTheme(R.style.Theme_Dantotsu_Monochrome) - } - else -> { - context.setTheme(R.style.Theme_Dantotsu_Purple) - } + val theme = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getString("theme", "PURPLE")!! + + val themeToApply = when (theme) { + "PURPLE" -> if (useOLED) R.style.Theme_Dantotsu_PurpleOLED else R.style.Theme_Dantotsu_Purple + "BLUE" -> if (useOLED) R.style.Theme_Dantotsu_BlueOLED else R.style.Theme_Dantotsu_Blue + "GREEN" -> if (useOLED) R.style.Theme_Dantotsu_GreenOLED else R.style.Theme_Dantotsu_Green + "PINK" -> if (useOLED) R.style.Theme_Dantotsu_PinkOLED else R.style.Theme_Dantotsu_Pink + "RED" -> if (useOLED) R.style.Theme_Dantotsu_RedOLED else R.style.Theme_Dantotsu_Red + "LAVENDER" -> if (useOLED) R.style.Theme_Dantotsu_LavenderOLED else R.style.Theme_Dantotsu_Lavender + "MONOCHROME (BETA)" -> if (useOLED) R.style.Theme_Dantotsu_MonochromeOLED else R.style.Theme_Dantotsu_Monochrome + else -> if (useOLED) R.style.Theme_Dantotsu_PurpleOLED else R.style.Theme_Dantotsu_Purple + } + + context.setTheme(themeToApply) + } + + private fun isDarkThemeActive(context: Context): Boolean { + return when (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { + Configuration.UI_MODE_NIGHT_YES -> true + Configuration.UI_MODE_NIGHT_NO -> false + Configuration.UI_MODE_NIGHT_UNDEFINED -> false + else -> false } } + companion object{ enum class Theme(val theme: String) { PURPLE("PURPLE"), diff --git a/app/src/main/res/color/chip_text_color.xml b/app/src/main/res/color/chip_text_color.xml new file mode 100644 index 00000000..7cc1a4af --- /dev/null +++ b/app/src/main/res/color/chip_text_color.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/src/main/res/drawable/anim_splash.xml b/app/src/main/res/drawable/anim_splash.xml index 2fa23aa5..f841df4f 100644 --- a/app/src/main/res/drawable/anim_splash.xml +++ b/app/src/main/res/drawable/anim_splash.xml @@ -1,173 +1,377 @@ - + android:name="vector" + android:width="768dp" + android:height="768dp" + android:viewportWidth="768" + android:viewportHeight="768"> - clip-path - android:name="clip" - android:pathData="M32,32m-32,0a32,32 0,1 1,64 0a32,32 0,1 1,-64 0" /> - - - - - - - - - - - - - - - - + android:name="wrapper" + android:pivotX="384" + android:pivotY="384"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + android:valueType="floatType" + android:interpolator="@android:anim/overshoot_interpolator"/> + android:valueType="floatType" + android:interpolator="@android:anim/overshoot_interpolator"/> - + + android:propertyName="rotation" + android:startOffset="350" + android:duration="550" + android:valueFrom="-10" + android:valueTo="0" + android:valueType="floatType" + android:interpolator="@android:anim/overshoot_interpolator"/> + android:valueType="floatType" + android:interpolator="@android:interpolator/fast_out_slow_in"/> + - - - - - - - - - + + android:valueType="floatType" + android:interpolator="@android:anim/overshoot_interpolator"/> - + + + + + + + + + + + + + + + + + + + + + + + + android:valueType="floatType" + android:interpolator="@android:interpolator/fast_out_slow_in"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/card_outline.xml b/app/src/main/res/drawable/card_outline.xml new file mode 100644 index 00000000..70356674 --- /dev/null +++ b/app/src/main/res/drawable/card_outline.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 278186ca..2df302a9 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,23 +1,30 @@ - + android:viewportWidth="768" + android:viewportHeight="768"> + + + android:pathData="M128,128h512v511.96h-512z" + android:strokeWidth="0" + android:fillColor="#ff00f4"/> + android:pathData="m128,128v335.26c23.32,3.7 47.23,5.63 71.58,5.63 211.59,0 389.34,-144.9 439.43,-340.89H128Z" + android:strokeWidth="0" + android:fillColor="#7000b8"/> + android:pathData="M384,384m-172.26,0a172.26,172.26 0,1 1,344.52 0a172.26,172.26 0,1 1,-344.52 0" + android:strokeWidth="0" + android:fillColor="#d300e5"/> + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index b3679636..60fae8d8 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,27 +1,22 @@ - + android:viewportWidth="768" + android:viewportHeight="768"> + + + android:pathData="m44.26,128c0,46.25 37.49,83.74 83.74,83.74h256c95.13,0 172.26,77.12 172.26,172.26h0c0,95.13 -77.12,172.26 -172.26,172.26H128c-46.24,0 -83.72,37.47 -83.74,83.71h723.74V128H44.26Z" + android:strokeWidth="0" + android:fillColor="#1f1f30"/> + android:pathData="m481.82,384h0c0,54.03 -43.8,97.82 -97.82,97.82H0v-195.64h384c54.02,0 97.82,43.8 97.82,97.82Z" + android:strokeWidth="0" + android:fillColor="#1f1f30"/> - + android:pathData="m442,366.7l-76.02,-43.89c-13.32,-7.69 -29.96,1.92 -29.96,17.3v87.78c0,15.38 16.65,24.99 29.96,17.3l76.02,-43.89c13.32,-7.69 13.32,-26.91 0,-34.6Z" + android:strokeWidth="0" + android:fillColor="#efe7ff"/> diff --git a/app/src/main/res/drawable/mono.xml b/app/src/main/res/drawable/mono.xml index 7bf506e7..1ee5f5d8 100644 --- a/app/src/main/res/drawable/mono.xml +++ b/app/src/main/res/drawable/mono.xml @@ -1,27 +1,17 @@ - - - - - - + android:width="768dp" + android:height="768dp" + android:viewportWidth="768" + android:viewportHeight="768"> + + + + + diff --git a/app/src/main/res/layout/activity_extensions.xml b/app/src/main/res/layout/activity_extensions.xml index 3f22d75c..172f065b 100644 --- a/app/src/main/res/layout/activity_extensions.xml +++ b/app/src/main/res/layout/activity_extensions.xml @@ -51,13 +51,9 @@ android:text="@string/extensions" android:textSize="28sp" /> - + android:layout_height="80dp" /> @@ -69,13 +65,38 @@ tools:ignore="UseCompoundDrawables"> - + android:layout_height="56dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:layout_marginBottom="8dp" + android:transitionName="@string/search" + app:boxBackgroundColor="@color/bg" + app:boxBackgroundMode="outline" + app:boxCornerRadiusBottomEnd="28dp" + app:boxCornerRadiusBottomStart="28dp" + app:boxCornerRadiusTopEnd="28dp" + app:boxCornerRadiusTopStart="28dp" + app:endIconDrawable="@drawable/ic_round_search_24" + app:hintAnimationEnabled="true"> + + + @@ -84,15 +105,26 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="fixed" + app:tabTextColor="?attr/colorOnBackground" + selectedTabIndicatorColor="?attr/colorPrimary" + app:tabIndicatorColor="?attr/colorPrimary" app:tabGravity="fill"> + android:text="Installed Anime"/> + android:text="Available Anime"/> + + diff --git a/app/src/main/res/layout/activity_manga_reader.xml b/app/src/main/res/layout/activity_manga_reader.xml index 8bd8e543..bd8c890c 100644 --- a/app/src/main/res/layout/activity_manga_reader.xml +++ b/app/src/main/res/layout/activity_manga_reader.xml @@ -133,7 +133,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - app:cardBackgroundColor="#000000" + app:cardBackgroundColor="?attr/colorSurface" app:cardCornerRadius="16dp" app:contentPadding="8dp" app:strokeColor="?attr/colorSecondary" @@ -148,7 +148,7 @@ android:layout_marginEnd="8dp" android:fontFamily="@font/poppins_bold" android:text="@string/app_name" - android:textColor="?android:colorBackground" + android:textColor="?attr/colorOnSurface" android:textSize="16sp" /> @@ -170,7 +170,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - app:cardBackgroundColor="#000000" + app:cardBackgroundColor="?attr/colorSurface" app:cardCornerRadius="16dp" app:contentPadding="8dp" app:strokeColor="?attr/colorSecondary" @@ -185,7 +185,7 @@ android:layout_marginEnd="8dp" android:fontFamily="@font/poppins_bold" android:text="@string/app_name" - android:textColor="?android:colorBackground" + android:textColor="?attr/colorOnSurface" android:textSize="16sp" /> diff --git a/app/src/main/res/layout/activity_media.xml b/app/src/main/res/layout/activity_media.xml index e84267b0..844524a2 100644 --- a/app/src/main/res/layout/activity_media.xml +++ b/app/src/main/res/layout/activity_media.xml @@ -123,6 +123,7 @@ android:text="@string/add" android:textAllCaps="true" android:textColor="?attr/colorPrimary" + app:strokeColor="?attr/colorPrimary" android:textSize="14sp" android:textStyle="bold" app:cornerRadius="16dp" diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 1b5a3b96..c2a01baa 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -161,16 +161,34 @@ + + + app:iconTint="?attr/colorOnPrimaryContainer" /> diff --git a/app/src/main/res/layout/item_episode_list.xml b/app/src/main/res/layout/item_episode_list.xml index 4480d61f..3c91530f 100644 --- a/app/src/main/res/layout/item_episode_list.xml +++ b/app/src/main/res/layout/item_episode_list.xml @@ -8,7 +8,7 @@ android:layout_margin="8dp" android:backgroundTintMode="src_atop" android:longClickable="true" - app:cardBackgroundColor="?attr/colorSurface" + android:background="@drawable/card_outline" app:cardCornerRadius="16dp"> @@ -65,6 +65,7 @@ android:layout_width="12dp" android:layout_height="match_parent" app:srcCompat="@drawable/ic_round_star_24" + app:tint="?attr/colorOnPrimary" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/layout/item_media_large.xml b/app/src/main/res/layout/item_media_large.xml index 6778876f..83fcffa8 100644 --- a/app/src/main/res/layout/item_media_large.xml +++ b/app/src/main/res/layout/item_media_large.xml @@ -74,7 +74,7 @@ android:layout_marginStart="2dp" android:fontFamily="@font/poppins_bold" android:paddingTop="2dp" - android:textColor="@color/bg_white" + android:textColor="?attr/colorOnPrimary" android:textSize="12sp" tools:ignore="TextContrastCheck" tools:text="0.0" /> @@ -84,6 +84,7 @@ android:layout_width="12dp" android:layout_height="match_parent" app:srcCompat="@drawable/ic_round_star_24" + app:tint="?attr/colorOnPrimary" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/layout/item_media_page.xml b/app/src/main/res/layout/item_media_page.xml index dc540bcb..0afa0585 100644 --- a/app/src/main/res/layout/item_media_page.xml +++ b/app/src/main/res/layout/item_media_page.xml @@ -72,7 +72,7 @@ android:layout_marginStart="2dp" android:fontFamily="@font/poppins_bold" android:paddingTop="2dp" - android:textColor="@color/bg_white" + android:textColor="?attr/colorOnPrimary" android:textSize="12sp" tools:ignore="TextContrastCheck" tools:text="0.0" /> @@ -82,6 +82,7 @@ android:layout_width="12dp" android:layout_height="match_parent" app:srcCompat="@drawable/ic_round_star_24" + app:tint="?attr/colorOnPrimary" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/layout/item_media_page_small.xml b/app/src/main/res/layout/item_media_page_small.xml index dd4236a4..2499ea59 100644 --- a/app/src/main/res/layout/item_media_page_small.xml +++ b/app/src/main/res/layout/item_media_page_small.xml @@ -92,7 +92,7 @@ android:layout_marginStart="2dp" android:fontFamily="@font/poppins_bold" android:paddingTop="2dp" - android:textColor="@color/bg_white" + android:textColor="?attr/colorOnPrimary" android:textSize="12sp" tools:ignore="TextContrastCheck" tools:text="0.0" /> @@ -102,6 +102,7 @@ android:layout_width="12dp" android:layout_height="match_parent" app:srcCompat="@drawable/ic_round_star_24" + app:tint="?attr/colorOnPrimary" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/layout/item_search_header.xml b/app/src/main/res/layout/item_search_header.xml index 50713209..320cd2a9 100644 --- a/app/src/main/res/layout/item_search_header.xml +++ b/app/src/main/res/layout/item_search_header.xml @@ -60,6 +60,8 @@ android:layout_weight="1" android:layoutDirection="inherit" android:text="@string/list_only" + android:textColor="?attr/colorOnBackground" + app:buttonTint="?attr/colorPrimary" android:visibility="visible" app:checkedState="indeterminate" tools:ignore="TextContrastCheck,TouchTargetSizeCheck" /> @@ -75,7 +77,8 @@ android:text="@string/adult" android:textAlignment="textEnd" android:visibility="visible" - app:buttonTint="?attr/colorPrimaryContainer" + android:textColor="?attr/colorOnBackground" + app:buttonTint="?attr/colorPrimary" tools:ignore="TextContrastCheck,TouchTargetSizeCheck" /> diff --git a/app/src/main/res/layout/splash_screen.xml b/app/src/main/res/layout/splash_screen.xml index 28b6cc3a..eac727b5 100644 --- a/app/src/main/res/layout/splash_screen.xml +++ b/app/src/main/res/layout/splash_screen.xml @@ -3,7 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?android:colorBackground"> + android:background="@color/bg_black"> @color/bg_white @color/bg_black @color/bg_white - @color/bg_white - @color/bg_black - @color/bg_white - @color/bg_black - @color/bg_white + @color/bg_black + @color/bg_white + @color/bg_black + @color/bg_white + @color/bg_black @color/bg_black @@ -208,4 +208,40 @@ @color/md_1_theme_dark_inverseSurface @color/md_1_theme_dark_inversePrimary + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 6344d4c6..a1e9864b 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,7 @@ @@ -189,13 +192,13 @@