Uses fragments instead of activities

This commit is contained in:
Super12138 2024-09-08 10:45:24 +08:00
parent 33532fe75a
commit 7954ea4a4f
44 changed files with 619 additions and 576 deletions

View file

@ -17,41 +17,19 @@
tools:targetApi="35">
<activity
android:name=".views.main.MainActivity"
android:name=".views.activities.MainActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".views.settings.SettingsActivity"
android:exported="false"
android:label="@string/settings_label"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />
</intent-filter>
</activity>
<activity
android:name=".views.all.AllTasksActivity"
android:exported="false"
android:label="@string/all_tasks_label"
android:launchMode="singleTask" />
<activity
android:name=".views.about.AboutActivity"
android:exported="false"
android:label="@string/about_label"
android:launchMode="singleTask" />
<activity
android:name=".views.welcome.WelcomeActivity"
android:exported="false"
android:label="@string/welcome_label"
android:launchMode="singleTask" />
<activity
android:name=".views.crash.CrashActivity"
android:name=".views.activities.CrashActivity"
android:exported="false" />
</application>

View file

@ -3,11 +3,8 @@ package cn.super12138.todo
import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import android.content.Intent
import cn.super12138.todo.constant.GlobalValues
import cn.super12138.todo.logic.dao.ToDoRoomDB
import cn.super12138.todo.views.crash.CrashHandler
import cn.super12138.todo.views.welcome.WelcomeActivity
import cn.super12138.todo.views.activities.CrashHandler
import com.google.android.material.color.DynamicColors
class ToDoApp : Application() {
@ -28,12 +25,5 @@ class ToDoApp : Application() {
Thread.setDefaultUncaughtExceptionHandler(crashHandler)
db = database
if (!GlobalValues.welcomePage) {
val intent = Intent(this, WelcomeActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
startActivity(intent)
}
}
}

View file

@ -5,7 +5,6 @@ import android.os.Bundle
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.view.WindowCompat
import androidx.viewbinding.ViewBinding
import cn.super12138.todo.constant.GlobalValues
@ -19,7 +18,7 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
super.onCreate(savedInstanceState)
// 确保 Navigation Bar 区域会被显示
WindowCompat.setDecorFitsSystemWindows(window, false)
// WindowCompat.setDecorFitsSystemWindows(window, false)
binding = getViewBinding()
setContentView(binding.root)

View file

@ -1,12 +1,18 @@
package cn.super12138.todo.views.welcome.pages
package cn.super12138.todo.views
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBinding
import com.google.android.material.color.MaterialColors
import com.google.android.material.transition.MaterialSharedAxis
open class BasePage : Fragment() {
abstract class BaseFragment<T : ViewBinding> : Fragment() {
private var _binding: T? = null
protected val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ true)
@ -15,10 +21,30 @@ open class BasePage : Fragment() {
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ false)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = getViewBinding(inflater, container, false)
return binding.root
}
// https://github.com/material-components/material-components-android/issues/1984#issuecomment-1089710991
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Overlap colors.
view.setBackgroundColor(MaterialColors.getColor(view, android.R.attr.colorBackground))
}
abstract fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): T
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.crash
package cn.super12138.todo.views.activities
import android.os.Build
import android.os.Bundle

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.crash
package cn.super12138.todo.views.activities
import android.content.Context
import android.content.Intent

View file

@ -0,0 +1,60 @@
package cn.super12138.todo.views.activities
// 2023.11.18立项
import android.app.ComponentCaller
import android.content.Intent
import android.os.Bundle
import android.view.WindowManager
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import cn.super12138.todo.R
import cn.super12138.todo.constant.GlobalValues
import cn.super12138.todo.databinding.ActivityMainBinding
import cn.super12138.todo.views.BaseActivity
import cn.super12138.todo.views.fragments.SettingsParentFragment
import cn.super12138.todo.views.fragments.welcome.WelcomeFragment
class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!GlobalValues.welcomePage) {
startFragment(WelcomeFragment())
}
when (GlobalValues.secureMode) {
true -> window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
false -> window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
handleIntent(intent)
}
override fun onNewIntent(intent: Intent, caller: ComponentCaller) {
super.onNewIntent(intent, caller)
handleIntent(intent)
}
override fun getViewBinding(): ActivityMainBinding {
return ActivityMainBinding.inflate(layoutInflater)
}
fun startFragment(fragment: Fragment, args: (Bundle.() -> Unit)? = null) {
supportFragmentManager.commit {
addToBackStack(System.currentTimeMillis().toString())
hide(supportFragmentManager.fragments.last())
add(
R.id.app_container,
fragment.apply { args?.let { arguments = Bundle().apply(it) } }
)
}
}
private fun handleIntent(intent: Intent) {
when (intent.action) {
Intent.ACTION_APPLICATION_PREFERENCES -> startFragment(SettingsParentFragment())
}
}
}

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.all
package cn.super12138.todo.views.adapters
import android.view.LayoutInflater
import android.view.View
@ -15,7 +15,7 @@ import cn.super12138.todo.constant.Constants.DEFAULT_VIEW_TYPE
import cn.super12138.todo.constant.Constants.EMPTY_VIEW_TYPE
import cn.super12138.todo.logic.model.ToDo
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.todo.ToDoAdapter.DefaultViewHolder
import cn.super12138.todo.views.fragments.InfoBottomSheet
class AllTasksAdapter(
private val todoList: MutableList<ToDo>,
@ -61,6 +61,8 @@ class AllTasksAdapter(
if (todo.state == 1) {
holder.itemBackground.background =
ContextCompat.getDrawable(ToDoApp.context, R.drawable.bg_item_complete)
} else {
holder.itemBackground.background = null
}
holder.itemView.setOnClickListener {

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.todo
package cn.super12138.todo.views.adapters
import android.view.LayoutInflater
import android.view.View
@ -16,8 +16,9 @@ import cn.super12138.todo.constant.GlobalValues
import cn.super12138.todo.logic.model.ToDo
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.utils.showToast
import cn.super12138.todo.views.bottomsheet.ToDoBottomSheet
import cn.super12138.todo.views.progress.ProgressViewModel
import cn.super12138.todo.views.fragments.ToDoBottomSheet
import cn.super12138.todo.views.viewmodels.ProgressViewModel
import cn.super12138.todo.views.viewmodels.ToDoViewModel
class ToDoAdapter(
private val todoList: MutableList<ToDo>,

View file

@ -1,54 +0,0 @@
package cn.super12138.todo.views.all
import android.os.Bundle
import android.view.WindowManager
import androidx.activity.viewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import cn.super12138.todo.ToDoApp
import cn.super12138.todo.constant.GlobalValues
import cn.super12138.todo.databinding.ActivityAllTasksBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseActivity
import me.zhanghai.android.fastscroll.FastScrollerBuilder
class AllTasksActivity : BaseActivity<ActivityAllTasksBinding>() {
private val viewModel by viewModels<AllTasksViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
when (GlobalValues.secureMode) {
true -> window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
false -> window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
val todoListAll = viewModel.todoListAll
val layoutManager = LinearLayoutManager(ToDoApp.context)
binding.allTasksList.layoutManager = layoutManager
val adapter = AllTasksAdapter(todoListAll, supportFragmentManager)
binding.allTasksList.adapter = adapter
FastScrollerBuilder(binding.allTasksList).apply {
useMd2Style()
build()
}
binding.toolBar.setNavigationOnClickListener {
VibrationUtils.performHapticFeedback(it)
finish()
}
viewModel.refreshData.observe(this, Observer {
binding.allTasksList.adapter?.notifyItemRangeChanged(0, todoListAll.size + 1)
})
}
override fun getViewBinding(): ActivityAllTasksBinding {
return ActivityAllTasksBinding.inflate(layoutInflater)
}
}

View file

@ -1,27 +1,30 @@
package cn.super12138.todo.views.about
package cn.super12138.todo.views.fragments
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import cn.super12138.todo.constant.Constants
import cn.super12138.todo.databinding.ActivityAboutBinding
import cn.super12138.todo.databinding.FragmentAboutBinding
import cn.super12138.todo.utils.VersionUtils
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.utils.showToast
import cn.super12138.todo.views.BaseActivity
import cn.super12138.todo.views.BaseFragment
class AboutActivity : BaseActivity<ActivityAboutBinding>() {
class AboutFragment : BaseFragment<FragmentAboutBinding>() {
private var clickCount = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.appVersion.text = VersionUtils.getAppVersion(this)
binding.appVersion.text = VersionUtils.getAppVersion(requireActivity())
binding.toolBar.setNavigationOnClickListener {
VibrationUtils.performHapticFeedback(it)
finish()
requireActivity().supportFragmentManager.popBackStack()
}
binding.checkUpdate.setOnClickListener {
@ -58,7 +61,7 @@ class AboutActivity : BaseActivity<ActivityAboutBinding>() {
5 -> {
clickCount = 0
// GlobalValues.springFestivalTheme = !GlobalValues.springFestivalTheme
"\uD83C\uDF68".showToast()
"🍂".showToast()
/*when (java.util.Calendar.getInstance(Locale.getDefault())
.get(java.util.Calendar.MONTH) + 1) {
3, 4, 5 ->
@ -72,7 +75,11 @@ class AboutActivity : BaseActivity<ActivityAboutBinding>() {
}
}
override fun getViewBinding(): ActivityAboutBinding {
return ActivityAboutBinding.inflate(layoutInflater)
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): FragmentAboutBinding {
return FragmentAboutBinding.inflate(inflater, container, attachToRoot)
}
}

View file

@ -0,0 +1,53 @@
package cn.super12138.todo.views.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import cn.super12138.todo.ToDoApp
import cn.super12138.todo.databinding.FragmentAllTasksBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseFragment
import cn.super12138.todo.views.adapters.AllTasksAdapter
import cn.super12138.todo.views.viewmodels.AllTasksViewModel
import me.zhanghai.android.fastscroll.FastScrollerBuilder
class AllTasksFragment : BaseFragment<FragmentAllTasksBinding>() {
private val viewModel by viewModels<AllTasksViewModel>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val todoListAll = viewModel.todoListAll
val layoutManager = LinearLayoutManager(ToDoApp.context)
binding.allTasksList.layoutManager = layoutManager
val adapter = AllTasksAdapter(todoListAll, childFragmentManager)
binding.allTasksList.adapter = adapter
FastScrollerBuilder(binding.allTasksList).apply {
useMd2Style()
build()
}
binding.toolBar.setNavigationOnClickListener {
VibrationUtils.performHapticFeedback(it)
requireActivity().supportFragmentManager.popBackStack()
}
viewModel.refreshData.observe(viewLifecycleOwner, Observer {
binding.allTasksList.adapter?.notifyItemRangeChanged(0, todoListAll.size + 1)
})
}
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): FragmentAllTasksBinding {
return FragmentAllTasksBinding.inflate(inflater, container, attachToRoot)
}
}

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.all
package cn.super12138.todo.views.fragments
import android.os.Bundle
import android.view.LayoutInflater

View file

@ -0,0 +1,41 @@
package cn.super12138.todo.views.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import cn.super12138.todo.R
import cn.super12138.todo.databinding.FragmentMainBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseFragment
import cn.super12138.todo.views.activities.MainActivity
class MainFragment : BaseFragment<FragmentMainBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.toolBar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.item_settings -> {
(requireActivity() as MainActivity).startFragment(SettingsParentFragment())
VibrationUtils.performHapticFeedback(binding.toolBar)
true
}
else -> false
}
}
// setSupportActionBar(binding.toolbar)
}
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): FragmentMainBinding {
return FragmentMainBinding.inflate(inflater, container, attachToRoot)
}
}

View file

@ -1,29 +1,19 @@
package cn.super12138.todo.views.progress
package cn.super12138.todo.views.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import cn.super12138.todo.R
import cn.super12138.todo.databinding.FragmentProgressBinding
import cn.super12138.todo.views.BaseFragment
import cn.super12138.todo.views.viewmodels.ProgressViewModel
class ProgressFragment : Fragment() {
class ProgressFragment : BaseFragment<FragmentProgressBinding>() {
private val viewModel: ProgressViewModel by viewModels({ requireActivity() })
private lateinit var binding: FragmentProgressBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentProgressBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@ -51,4 +41,12 @@ class ProgressFragment : Fragment() {
viewModel.updateProgress()
}
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): FragmentProgressBinding {
return FragmentProgressBinding.inflate(inflater, container, attachToRoot)
}
}

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.settings
package cn.super12138.todo.views.fragments
import android.content.Context
import android.content.Intent
@ -21,10 +21,8 @@ import cn.super12138.todo.databinding.DialogRestoreBinding
import cn.super12138.todo.logic.Repository
import cn.super12138.todo.logic.dao.ToDoRoom
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.about.AboutActivity
import cn.super12138.todo.views.all.AllTasksActivity
import cn.super12138.todo.views.main.MainActivity
import cn.super12138.todo.views.welcome.WelcomeActivity
import cn.super12138.todo.views.activities.MainActivity
import cn.super12138.todo.views.fragments.welcome.WelcomeFragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.google.gson.Gson
@ -39,6 +37,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
val mainActivity = requireActivity() as MainActivity
val gson = Gson()
findPreference<ListPreference>(Constants.PREF_DARK_MODE)?.apply {
@ -173,15 +172,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
findPreference<Preference>(Constants.PREF_ALL_TASKS)?.apply {
setOnPreferenceClickListener {
startActivity(Intent(context, AllTasksActivity::class.java))
VibrationUtils.performHapticFeedback(view)
true
}
}
findPreference<Preference>(Constants.PREF_ABOUT)?.apply {
setOnPreferenceClickListener {
startActivity(Intent(context, AboutActivity::class.java))
mainActivity.startFragment(AllTasksFragment())
VibrationUtils.performHapticFeedback(view)
true
}
@ -189,10 +180,15 @@ class SettingsFragment : PreferenceFragmentCompat() {
findPreference<Preference>(Constants.PREF_REENTER_WELCOME_ACTIVITY)?.apply {
setOnPreferenceClickListener {
val intent = Intent(context, WelcomeActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
}
startActivity(intent)
mainActivity.startFragment(WelcomeFragment())
VibrationUtils.performHapticFeedback(view)
true
}
}
findPreference<Preference>(Constants.PREF_ABOUT)?.apply {
setOnPreferenceClickListener {
mainActivity.startFragment(AboutFragment())
VibrationUtils.performHapticFeedback(view)
true
}

View file

@ -0,0 +1,29 @@
package cn.super12138.todo.views.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentSettingsBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseFragment
class SettingsParentFragment : BaseFragment<FragmentSettingsBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.toolBar.setNavigationOnClickListener {
VibrationUtils.performHapticFeedback(it)
requireActivity().supportFragmentManager.popBackStack()
}
}
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): FragmentSettingsBinding {
return FragmentSettingsBinding.inflate(inflater, container, attachToRoot)
}
}

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.bottomsheet
package cn.super12138.todo.views.fragments
import android.os.Bundle
import android.view.LayoutInflater
@ -15,8 +15,8 @@ import cn.super12138.todo.utils.TextUtils
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.utils.showToast
import cn.super12138.todo.utils.toEditable
import cn.super12138.todo.views.progress.ProgressViewModel
import cn.super12138.todo.views.todo.ToDoViewModel
import cn.super12138.todo.views.viewmodels.ProgressViewModel
import cn.super12138.todo.views.viewmodels.ToDoViewModel
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.todo
package cn.super12138.todo.views.fragments
import android.os.Bundle
import android.view.LayoutInflater
@ -18,8 +18,9 @@ import cn.super12138.todo.ToDoApp
import cn.super12138.todo.databinding.FragmentTodoBinding
import cn.super12138.todo.logic.Repository
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.bottomsheet.ToDoBottomSheet
import cn.super12138.todo.views.progress.ProgressViewModel
import cn.super12138.todo.views.adapters.ToDoAdapter
import cn.super12138.todo.views.viewmodels.ProgressViewModel
import cn.super12138.todo.views.viewmodels.ToDoViewModel
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.launch
import me.zhanghai.android.fastscroll.FastScrollerBuilder

View file

@ -1,33 +1,37 @@
package cn.super12138.todo.views.welcome
package cn.super12138.todo.views.fragments.welcome
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import cn.super12138.todo.R
import cn.super12138.todo.constant.GlobalValues
import cn.super12138.todo.databinding.ActivityWelcomeBinding
import cn.super12138.todo.databinding.FragmentWelcomeBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.utils.setOnIntervalClickListener
import cn.super12138.todo.views.BaseActivity
import cn.super12138.todo.views.main.MainActivity
import cn.super12138.todo.views.welcome.pages.IntroPage
import cn.super12138.todo.views.welcome.pages.ProgressPage
import cn.super12138.todo.views.welcome.pages.ToDoBtnPage
import cn.super12138.todo.views.welcome.pages.ToDoItemPage
import cn.super12138.todo.views.BaseFragment
import cn.super12138.todo.views.activities.MainActivity
import cn.super12138.todo.views.fragments.MainFragment
import cn.super12138.todo.views.fragments.welcome.pages.IntroPage
import cn.super12138.todo.views.fragments.welcome.pages.ProgressPage
import cn.super12138.todo.views.fragments.welcome.pages.ToDoBtnPage
import cn.super12138.todo.views.fragments.welcome.pages.ToDoItemPage
import cn.super12138.todo.views.viewmodels.WelcomeViewModel
import kotlinx.coroutines.launch
class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
class WelcomeFragment : BaseFragment<FragmentWelcomeBinding>() {
private val viewModel by viewModels<WelcomeViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val previousBtn = binding.previousBtn
val nextBtn = binding.nextBtn
@ -35,6 +39,19 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
val currentPage = viewModel.currentPage // 0: Intro 1: Progress 2: ToDo Btn 3: ToDo Item
// 返回回调
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (currentPage.value == 0) {
requireActivity().finishAffinity()
} else {
childFragmentManager.popBackStack()
viewModel.decreasePage()
}
}
}
centerBtn.setOnIntervalClickListener {
VibrationUtils.performHapticFeedback(it)
@ -44,9 +61,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
if (currentPage.value == 3) {
GlobalValues.welcomePage = true
finish()
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
(requireActivity() as MainActivity).startFragment(MainFragment())
} else {
viewModel.setCurrentPage(1)
nextPage(1)
@ -56,7 +71,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
previousBtn.setOnIntervalClickListener {
VibrationUtils.performHapticFeedback(it)
supportFragmentManager.popBackStack()
childFragmentManager.popBackStack()
viewModel.decreasePage()
}
@ -66,6 +81,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
nextPage(currentPage.value + 1)
callback.isEnabled = false
viewModel.increasePage()
}
@ -77,7 +93,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
centerBtn.apply {
text = getString(R.string.start)
icon = AppCompatResources.getDrawable(
this@WelcomeActivity,
requireContext(),
R.drawable.ic_arrow_forward
)
show()
@ -96,7 +112,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
centerBtn.apply {
text = getString(R.string.enter_app)
icon = AppCompatResources.getDrawable(
this@WelcomeActivity,
requireContext(),
R.drawable.ic_focus
)
show()
@ -114,21 +130,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
}
}
}
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (currentPage.value == 0) {
finish()
} else {
supportFragmentManager.popBackStack()
viewModel.decreasePage()
}
}
})
}
override fun getViewBinding(): ActivityWelcomeBinding {
return ActivityWelcomeBinding.inflate(layoutInflater)
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
}
private fun getCurrentPage(pageIndex: Int): Fragment {
@ -142,10 +144,18 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
}
private fun nextPage(page: Int) {
supportFragmentManager.commit {
childFragmentManager.commit {
addToBackStack(System.currentTimeMillis().toString())
hide(supportFragmentManager.fragments.last())
hide(childFragmentManager.fragments.last())
add(R.id.welcome_page_container, getCurrentPage(page))
}
}
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): FragmentWelcomeBinding {
return FragmentWelcomeBinding.inflate(inflater, container, attachToRoot)
}
}

View file

@ -0,0 +1,16 @@
package cn.super12138.todo.views.fragments.welcome.pages
import android.view.LayoutInflater
import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentWelcomeIntroBinding
import cn.super12138.todo.views.BaseFragment
class IntroPage : BaseFragment<FragmentWelcomeIntroBinding>() {
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): FragmentWelcomeIntroBinding {
return FragmentWelcomeIntroBinding.inflate(inflater, container, attachToRoot)
}
}

View file

@ -0,0 +1,16 @@
package cn.super12138.todo.views.fragments.welcome.pages
import android.view.LayoutInflater
import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentWelcomeProgressBinding
import cn.super12138.todo.views.BaseFragment
class ProgressPage : BaseFragment<FragmentWelcomeProgressBinding>() {
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
attachToRoot: Boolean
): FragmentWelcomeProgressBinding {
return FragmentWelcomeProgressBinding.inflate(inflater, container, attachToRoot)
}
}

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.welcome.pages
package cn.super12138.todo.views.fragments.welcome.pages
import android.os.Bundle
import android.view.LayoutInflater
@ -6,18 +6,15 @@ import android.view.View
import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentWelcomeTodoBtnBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseFragment
class ToDoBtnPage : BasePage() {
private lateinit var binding: FragmentWelcomeTodoBtnBinding
override fun onCreateView(
class ToDoBtnPage : BaseFragment<FragmentWelcomeTodoBtnBinding>() {
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentWelcomeTodoBtnBinding.inflate(inflater, container, false)
return binding.root
attachToRoot: Boolean
): FragmentWelcomeTodoBtnBinding {
return FragmentWelcomeTodoBtnBinding.inflate(inflater, container, attachToRoot)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.welcome.pages
package cn.super12138.todo.views.fragments.welcome.pages
import android.os.Bundle
import android.view.LayoutInflater
@ -6,18 +6,15 @@ import android.view.View
import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentWelcomeTodoItemBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseFragment
class ToDoItemPage : BasePage() {
private lateinit var binding: FragmentWelcomeTodoItemBinding
override fun onCreateView(
class ToDoItemPage : BaseFragment<FragmentWelcomeTodoItemBinding>() {
override fun getViewBinding(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentWelcomeTodoItemBinding.inflate(inflater, container, false)
return binding.root
attachToRoot: Boolean
): FragmentWelcomeTodoItemBinding {
return FragmentWelcomeTodoItemBinding.inflate(inflater, container, attachToRoot)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View file

@ -1,53 +0,0 @@
package cn.super12138.todo.views.main
// 2023.11.18立项
import android.content.Intent
import android.os.Bundle
import android.view.WindowManager
import cn.super12138.todo.R
import cn.super12138.todo.constant.GlobalValues
import cn.super12138.todo.databinding.ActivityMainBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseActivity
import cn.super12138.todo.views.settings.SettingsActivity
import cn.super12138.todo.views.welcome.WelcomeActivity
class MainActivity : BaseActivity<ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if(!GlobalValues.welcomePage) finish()
binding.toolBar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.item_settings -> {
val intent = Intent(this@MainActivity, SettingsActivity::class.java)
startActivity(intent)
VibrationUtils.performHapticFeedback(binding.toolBar)
true
}
else -> false
}
}
// setSupportActionBar(binding.toolbar)
when (GlobalValues.secureMode) {
true -> window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
false -> window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
if (!GlobalValues.welcomePage) {
val intent = Intent(this, WelcomeActivity::class.java)
startActivity(intent)
}
}
override fun getViewBinding(): ActivityMainBinding {
return ActivityMainBinding.inflate(layoutInflater)
}
}

View file

@ -1,31 +0,0 @@
package cn.super12138.todo.views.settings
import android.os.Bundle
import cn.super12138.todo.R
import cn.super12138.todo.databinding.ActivitySettingsBinding
import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseActivity
class SettingsActivity : BaseActivity<ActivitySettingsBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(R.id.settings_frame, SettingsFragment())
.commit()
}
supportActionBar?.setDisplayHomeAsUpEnabled(true)
binding.toolBar.setNavigationOnClickListener {
VibrationUtils.performHapticFeedback(it)
finish()
}
}
override fun getViewBinding(): ActivitySettingsBinding {
return ActivitySettingsBinding.inflate(layoutInflater)
}
}

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.all
package cn.super12138.todo.views.viewmodels
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.progress
package cn.super12138.todo.views.viewmodels
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.todo
package cn.super12138.todo.views.viewmodels
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

View file

@ -1,4 +1,4 @@
package cn.super12138.todo.views.welcome
package cn.super12138.todo.views.viewmodels
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow

View file

@ -1,21 +0,0 @@
package cn.super12138.todo.views.welcome.pages
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentWelcomeIntroBinding
class IntroPage : BasePage() {
private lateinit var binding: FragmentWelcomeIntroBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentWelcomeIntroBinding.inflate(inflater, container, false)
return binding.root
}
}

View file

@ -1,21 +0,0 @@
package cn.super12138.todo.views.welcome.pages
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentWelcomeProgressBinding
class ProgressPage : BasePage() {
private lateinit var binding: FragmentWelcomeProgressBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentWelcomeProgressBinding.inflate(inflater, container, false)
return binding.root
}
}

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.main.MainActivity">
tools:context=".views.activities.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
@ -19,6 +19,7 @@
android:layout_height="?attr/actionBarSize"
app:menu="@menu/main"
app:title="@string/app_name" />
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
@ -30,16 +31,15 @@
<androidx.fragment.app.FragmentContainerView
android:id="@+id/progress_frag"
android:name="cn.super12138.todo.views.progress.ProgressFragment"
android:name="cn.super12138.todo.views.fragments.ProgressFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="3"
android:minHeight="160dp"
tools:layout="@layout/fragment_progress" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/todo_frag"
android:name="cn.super12138.todo.views.todo.ToDoFragment"
android:name="cn.super12138.todo.views.fragments.ToDoFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.main.MainActivity">
tools:context=".views.activities.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
@ -35,14 +35,14 @@
<androidx.fragment.app.FragmentContainerView
android:id="@+id/progress_frag"
android:name="cn.super12138.todo.views.progress.ProgressFragment"
android:name="cn.super12138.todo.views.fragments.ProgressFragment"
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_height="270dp"
tools:layout="@layout/fragment_progress" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/todo_frag"
android:name="cn.super12138.todo.views.todo.ToDoFragment"
android:name="cn.super12138.todo.views.fragments.ToDoFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_todo" />

View file

@ -1,177 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.about.AboutActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:liftOnScroll="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:navigationIcon="@drawable/ic_arrow_back"
app:title="@string/about_label" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.card.MaterialCardView
style="?attr/materialCardViewElevatedStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
android:layout_marginBottom="20dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/app_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Elevated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="128dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:contentDescription="@string/app_name"
android:src="@mipmap/ic_launcher" />
</com.google.android.material.card.MaterialCardView>
<TextView
android:id="@+id/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/app_name"
android:textAlignment="center"
android:textColor="?attr/colorOnSurface"
android:textSize="20sp" />
<TextView
android:id="@+id/app_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="7dp"
android:textAlignment="center"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/check_update"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/check_update_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:contentDescription="@string/check_update"
app:srcCompat="@drawable/ic_update" />
<TextView
android:id="@+id/check_update_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="@string/check_update"
android:textColor="?attr/colorOnSurface"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/open_source"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/github_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:contentDescription="@string/view_source"
app:srcCompat="@drawable/ic_github" />
<TextView
android:id="@+id/open_source_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="@string/view_source"
android:textColor="?attr/colorOnSurface"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/developer_info"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center_horizontal|center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/developer_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:contentDescription="@string/author"
app:srcCompat="@drawable/ic_person" />
<TextView
android:id="@+id/developer_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="@string/author"
android:textColor="?attr/colorOnSurface"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.crash.CrashActivity">
tools:context=".views.activities.CrashActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"

View file

@ -1,48 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.main.MainActivity">
tools:context=".views.activities.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:liftOnScrollTargetViewId="@id/progress_frag">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:menu="@menu/main"
app:title="@string/app_name" />
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
<androidx.fragment.app.FragmentContainerView
android:id="@+id/app_container"
android:name="cn.super12138.todo.views.fragments.MainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
android:fitsSystemWindows="true"
tools:layout="@layout/fragment_main" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/progress_frag"
android:name="cn.super12138.todo.views.progress.ProgressFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:minHeight="160dp"
tools:layout="@layout/fragment_progress" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/todo_frag"
android:name="cn.super12138.todo.views.todo.ToDoFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
tools:layout="@layout/fragment_todo" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.fragments.AboutFragment">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:liftOnScroll="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:navigationIcon="@drawable/ic_arrow_back"
app:title="@string/about_label" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<com.google.android.material.card.MaterialCardView
style="?attr/materialCardViewElevatedStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
android:layout_marginBottom="20dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/app_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Elevated"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="128dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:contentDescription="@string/app_name"
android:src="@mipmap/ic_launcher" />
</com.google.android.material.card.MaterialCardView>
<TextView
android:id="@+id/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/app_name"
android:textAlignment="center"
android:textColor="?attr/colorOnSurface"
android:textSize="20sp" />
<TextView
android:id="@+id/app_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="7dp"
android:textAlignment="center"
android:textSize="11sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/check_update"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/check_update_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:contentDescription="@string/check_update"
app:srcCompat="@drawable/ic_update" />
<TextView
android:id="@+id/check_update_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="@string/check_update"
android:textColor="?attr/colorOnSurface"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/open_source"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/github_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:contentDescription="@string/view_source"
app:srcCompat="@drawable/ic_github" />
<TextView
android:id="@+id/open_source_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="@string/view_source"
android:textColor="?attr/colorOnSurface"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/developer_info"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center_horizontal|center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/developer_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:contentDescription="@string/author"
app:srcCompat="@drawable/ic_person" />
<TextView
android:id="@+id/developer_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="@string/author"
android:textColor="?attr/colorOnSurface"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -5,13 +5,12 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.about.AboutActivity">
tools:context=".views.fragments.AboutFragment">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:liftOnScroll="true"
app:liftOnScrollTargetViewId="@+id/all_tasks_list">
<com.google.android.material.appbar.MaterialToolbar

View file

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.activities.MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:liftOnScroll="false"
app:liftOnScrollTargetViewId="@id/progress_frag">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:menu="@menu/main"
app:title="@string/app_name" />
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/progress_frag"
android:name="cn.super12138.todo.views.fragments.ProgressFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:minHeight="160dp"
tools:layout="@layout/fragment_progress" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/todo_frag"
android:name="cn.super12138.todo.views.fragments.ToDoFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
tools:layout="@layout/fragment_todo" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -2,7 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="280dp"
android:layout_height="270dp"
android:animateLayoutChanges="true">
<com.google.android.material.progressindicator.CircularProgressIndicator

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".views.settings.SettingsActivity">
tools:context=".views.fragments.SettingsParentFragment">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
@ -27,15 +27,10 @@
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
<androidx.fragment.app.FragmentContainerView
android:id="@+id/settings_container"
android:name="cn.super12138.todo.views.fragments.SettingsFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/settings_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
android:layout_height="match_parent" />
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -7,7 +7,7 @@
<androidx.fragment.app.FragmentContainerView
android:id="@+id/welcome_page_container"
android:name="cn.super12138.todo.views.welcome.pages.IntroPage"
android:name="cn.super12138.todo.views.fragments.welcome.pages.IntroPage"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/control_area"

View file

@ -22,7 +22,7 @@
<androidx.fragment.app.FragmentContainerView
android:id="@+id/welcome_progress"
android:name="cn.super12138.todo.views.progress.ProgressFragment"
android:name="cn.super12138.todo.views.fragments.ProgressFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout="@layout/fragment_progress" />