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"> tools:targetApi="35">
<activity <activity
android:name=".views.main.MainActivity" android:name=".views.activities.MainActivity"
android:exported="true" android:exported="true"
android:launchMode="singleTask"> android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".views.settings.SettingsActivity" android:name=".views.activities.CrashActivity"
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:exported="false" /> android:exported="false" />
</application> </application>

View file

@ -3,11 +3,8 @@ package cn.super12138.todo
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Application import android.app.Application
import android.content.Context 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.logic.dao.ToDoRoomDB
import cn.super12138.todo.views.crash.CrashHandler import cn.super12138.todo.views.activities.CrashHandler
import cn.super12138.todo.views.welcome.WelcomeActivity
import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColors
class ToDoApp : Application() { class ToDoApp : Application() {
@ -28,12 +25,5 @@ class ToDoApp : Application() {
Thread.setDefaultUncaughtExceptionHandler(crashHandler) Thread.setDefaultUncaughtExceptionHandler(crashHandler)
db = database 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 android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.core.view.WindowCompat
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.constant.GlobalValues
@ -19,7 +18,7 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// 确保 Navigation Bar 区域会被显示 // 确保 Navigation Bar 区域会被显示
WindowCompat.setDecorFitsSystemWindows(window, false) // WindowCompat.setDecorFitsSystemWindows(window, false)
binding = getViewBinding() binding = getViewBinding()
setContentView(binding.root) 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.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBinding
import com.google.android.material.color.MaterialColors import com.google.android.material.color.MaterialColors
import com.google.android.material.transition.MaterialSharedAxis 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?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ true) enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ true)
@ -15,10 +21,30 @@ open class BasePage : Fragment() {
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, /* forward= */ false) 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 // https://github.com/material-components/material-components-android/issues/1984#issuecomment-1089710991
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
// Overlap colors. // Overlap colors.
view.setBackgroundColor(MaterialColors.getColor(view, android.R.attr.colorBackground)) 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.Build
import android.os.Bundle 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.Context
import android.content.Intent 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.LayoutInflater
import android.view.View 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.constant.Constants.EMPTY_VIEW_TYPE
import cn.super12138.todo.logic.model.ToDo import cn.super12138.todo.logic.model.ToDo
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.todo.ToDoAdapter.DefaultViewHolder import cn.super12138.todo.views.fragments.InfoBottomSheet
class AllTasksAdapter( class AllTasksAdapter(
private val todoList: MutableList<ToDo>, private val todoList: MutableList<ToDo>,
@ -61,6 +61,8 @@ class AllTasksAdapter(
if (todo.state == 1) { if (todo.state == 1) {
holder.itemBackground.background = holder.itemBackground.background =
ContextCompat.getDrawable(ToDoApp.context, R.drawable.bg_item_complete) ContextCompat.getDrawable(ToDoApp.context, R.drawable.bg_item_complete)
} else {
holder.itemBackground.background = null
} }
holder.itemView.setOnClickListener { 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.LayoutInflater
import android.view.View 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.logic.model.ToDo
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.utils.showToast import cn.super12138.todo.utils.showToast
import cn.super12138.todo.views.bottomsheet.ToDoBottomSheet import cn.super12138.todo.views.fragments.ToDoBottomSheet
import cn.super12138.todo.views.progress.ProgressViewModel import cn.super12138.todo.views.viewmodels.ProgressViewModel
import cn.super12138.todo.views.viewmodels.ToDoViewModel
class ToDoAdapter( class ToDoAdapter(
private val todoList: MutableList<ToDo>, 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.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle 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.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.VersionUtils
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.utils.showToast 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 private var clickCount = 0
override fun onCreate(savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.appVersion.text = VersionUtils.getAppVersion(this) binding.appVersion.text = VersionUtils.getAppVersion(requireActivity())
binding.toolBar.setNavigationOnClickListener { binding.toolBar.setNavigationOnClickListener {
VibrationUtils.performHapticFeedback(it) VibrationUtils.performHapticFeedback(it)
finish() requireActivity().supportFragmentManager.popBackStack()
} }
binding.checkUpdate.setOnClickListener { binding.checkUpdate.setOnClickListener {
@ -58,7 +61,7 @@ class AboutActivity : BaseActivity<ActivityAboutBinding>() {
5 -> { 5 -> {
clickCount = 0 clickCount = 0
// GlobalValues.springFestivalTheme = !GlobalValues.springFestivalTheme // GlobalValues.springFestivalTheme = !GlobalValues.springFestivalTheme
"\uD83C\uDF68".showToast() "🍂".showToast()
/*when (java.util.Calendar.getInstance(Locale.getDefault()) /*when (java.util.Calendar.getInstance(Locale.getDefault())
.get(java.util.Calendar.MONTH) + 1) { .get(java.util.Calendar.MONTH) + 1) {
3, 4, 5 -> 3, 4, 5 ->
@ -72,7 +75,11 @@ class AboutActivity : BaseActivity<ActivityAboutBinding>() {
} }
} }
override fun getViewBinding(): ActivityAboutBinding { override fun getViewBinding(
return ActivityAboutBinding.inflate(layoutInflater) 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.os.Bundle
import android.view.LayoutInflater 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.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.databinding.FragmentProgressBinding 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 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -51,4 +41,12 @@ class ProgressFragment : Fragment() {
viewModel.updateProgress() 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.Context
import android.content.Intent 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.Repository
import cn.super12138.todo.logic.dao.ToDoRoom import cn.super12138.todo.logic.dao.ToDoRoom
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.about.AboutActivity import cn.super12138.todo.views.activities.MainActivity
import cn.super12138.todo.views.all.AllTasksActivity import cn.super12138.todo.views.fragments.welcome.WelcomeFragment
import cn.super12138.todo.views.main.MainActivity
import cn.super12138.todo.views.welcome.WelcomeActivity
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.gson.Gson import com.google.gson.Gson
@ -39,6 +37,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey) setPreferencesFromResource(R.xml.preferences, rootKey)
val mainActivity = requireActivity() as MainActivity
val gson = Gson() val gson = Gson()
findPreference<ListPreference>(Constants.PREF_DARK_MODE)?.apply { findPreference<ListPreference>(Constants.PREF_DARK_MODE)?.apply {
@ -173,15 +172,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
findPreference<Preference>(Constants.PREF_ALL_TASKS)?.apply { findPreference<Preference>(Constants.PREF_ALL_TASKS)?.apply {
setOnPreferenceClickListener { setOnPreferenceClickListener {
startActivity(Intent(context, AllTasksActivity::class.java)) mainActivity.startFragment(AllTasksFragment())
VibrationUtils.performHapticFeedback(view)
true
}
}
findPreference<Preference>(Constants.PREF_ABOUT)?.apply {
setOnPreferenceClickListener {
startActivity(Intent(context, AboutActivity::class.java))
VibrationUtils.performHapticFeedback(view) VibrationUtils.performHapticFeedback(view)
true true
} }
@ -189,10 +180,15 @@ class SettingsFragment : PreferenceFragmentCompat() {
findPreference<Preference>(Constants.PREF_REENTER_WELCOME_ACTIVITY)?.apply { findPreference<Preference>(Constants.PREF_REENTER_WELCOME_ACTIVITY)?.apply {
setOnPreferenceClickListener { setOnPreferenceClickListener {
val intent = Intent(context, WelcomeActivity::class.java).apply { mainActivity.startFragment(WelcomeFragment())
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP VibrationUtils.performHapticFeedback(view)
} true
startActivity(intent) }
}
findPreference<Preference>(Constants.PREF_ABOUT)?.apply {
setOnPreferenceClickListener {
mainActivity.startFragment(AboutFragment())
VibrationUtils.performHapticFeedback(view) VibrationUtils.performHapticFeedback(view)
true 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.os.Bundle
import android.view.LayoutInflater 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.VibrationUtils
import cn.super12138.todo.utils.showToast import cn.super12138.todo.utils.showToast
import cn.super12138.todo.utils.toEditable import cn.super12138.todo.utils.toEditable
import cn.super12138.todo.views.progress.ProgressViewModel import cn.super12138.todo.views.viewmodels.ProgressViewModel
import cn.super12138.todo.views.todo.ToDoViewModel import cn.super12138.todo.views.viewmodels.ToDoViewModel
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment 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.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -18,8 +18,9 @@ import cn.super12138.todo.ToDoApp
import cn.super12138.todo.databinding.FragmentTodoBinding import cn.super12138.todo.databinding.FragmentTodoBinding
import cn.super12138.todo.logic.Repository import cn.super12138.todo.logic.Repository
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.bottomsheet.ToDoBottomSheet import cn.super12138.todo.views.adapters.ToDoAdapter
import cn.super12138.todo.views.progress.ProgressViewModel import cn.super12138.todo.views.viewmodels.ProgressViewModel
import cn.super12138.todo.views.viewmodels.ToDoViewModel
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.zhanghai.android.fastscroll.FastScrollerBuilder 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.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.commit import androidx.fragment.app.commit
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.constant.GlobalValues 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.VibrationUtils
import cn.super12138.todo.utils.setOnIntervalClickListener import cn.super12138.todo.utils.setOnIntervalClickListener
import cn.super12138.todo.views.BaseActivity import cn.super12138.todo.views.BaseFragment
import cn.super12138.todo.views.main.MainActivity import cn.super12138.todo.views.activities.MainActivity
import cn.super12138.todo.views.welcome.pages.IntroPage import cn.super12138.todo.views.fragments.MainFragment
import cn.super12138.todo.views.welcome.pages.ProgressPage import cn.super12138.todo.views.fragments.welcome.pages.IntroPage
import cn.super12138.todo.views.welcome.pages.ToDoBtnPage import cn.super12138.todo.views.fragments.welcome.pages.ProgressPage
import cn.super12138.todo.views.welcome.pages.ToDoItemPage 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 import kotlinx.coroutines.launch
class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() { class WelcomeFragment : BaseFragment<FragmentWelcomeBinding>() {
private val viewModel by viewModels<WelcomeViewModel>() private val viewModel by viewModels<WelcomeViewModel>()
override fun onCreate(savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onViewCreated(view, savedInstanceState)
val previousBtn = binding.previousBtn val previousBtn = binding.previousBtn
val nextBtn = binding.nextBtn 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 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 { centerBtn.setOnIntervalClickListener {
VibrationUtils.performHapticFeedback(it) VibrationUtils.performHapticFeedback(it)
@ -44,9 +61,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
if (currentPage.value == 3) { if (currentPage.value == 3) {
GlobalValues.welcomePage = true GlobalValues.welcomePage = true
finish() (requireActivity() as MainActivity).startFragment(MainFragment())
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
} else { } else {
viewModel.setCurrentPage(1) viewModel.setCurrentPage(1)
nextPage(1) nextPage(1)
@ -56,7 +71,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
previousBtn.setOnIntervalClickListener { previousBtn.setOnIntervalClickListener {
VibrationUtils.performHapticFeedback(it) VibrationUtils.performHapticFeedback(it)
supportFragmentManager.popBackStack() childFragmentManager.popBackStack()
viewModel.decreasePage() viewModel.decreasePage()
} }
@ -66,6 +81,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
nextPage(currentPage.value + 1) nextPage(currentPage.value + 1)
callback.isEnabled = false
viewModel.increasePage() viewModel.increasePage()
} }
@ -77,7 +93,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
centerBtn.apply { centerBtn.apply {
text = getString(R.string.start) text = getString(R.string.start)
icon = AppCompatResources.getDrawable( icon = AppCompatResources.getDrawable(
this@WelcomeActivity, requireContext(),
R.drawable.ic_arrow_forward R.drawable.ic_arrow_forward
) )
show() show()
@ -96,7 +112,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
centerBtn.apply { centerBtn.apply {
text = getString(R.string.enter_app) text = getString(R.string.enter_app)
icon = AppCompatResources.getDrawable( icon = AppCompatResources.getDrawable(
this@WelcomeActivity, requireContext(),
R.drawable.ic_focus R.drawable.ic_focus
) )
show() show()
@ -114,21 +130,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
} }
} }
} }
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
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)
} }
private fun getCurrentPage(pageIndex: Int): Fragment { private fun getCurrentPage(pageIndex: Int): Fragment {
@ -142,10 +144,18 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
} }
private fun nextPage(page: Int) { private fun nextPage(page: Int) {
supportFragmentManager.commit { childFragmentManager.commit {
addToBackStack(System.currentTimeMillis().toString()) addToBackStack(System.currentTimeMillis().toString())
hide(supportFragmentManager.fragments.last()) hide(childFragmentManager.fragments.last())
add(R.id.welcome_page_container, getCurrentPage(page)) 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.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -6,18 +6,15 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentWelcomeTodoBtnBinding import cn.super12138.todo.databinding.FragmentWelcomeTodoBtnBinding
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseFragment
class ToDoBtnPage : BasePage() { class ToDoBtnPage : BaseFragment<FragmentWelcomeTodoBtnBinding>() {
private lateinit var binding: FragmentWelcomeTodoBtnBinding override fun getViewBinding(
override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? attachToRoot: Boolean
): View { ): FragmentWelcomeTodoBtnBinding {
binding = FragmentWelcomeTodoBtnBinding.inflate(inflater, container, false) return FragmentWelcomeTodoBtnBinding.inflate(inflater, container, attachToRoot)
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 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.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -6,18 +6,15 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import cn.super12138.todo.databinding.FragmentWelcomeTodoItemBinding import cn.super12138.todo.databinding.FragmentWelcomeTodoItemBinding
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
import cn.super12138.todo.views.BaseFragment
class ToDoItemPage : BasePage() { class ToDoItemPage : BaseFragment<FragmentWelcomeTodoItemBinding>() {
private lateinit var binding: FragmentWelcomeTodoItemBinding override fun getViewBinding(
override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? attachToRoot: Boolean
): View { ): FragmentWelcomeTodoItemBinding {
binding = FragmentWelcomeTodoItemBinding.inflate(inflater, container, false) return FragmentWelcomeTodoItemBinding.inflate(inflater, container, attachToRoot)
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 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.MutableLiveData
import androidx.lifecycle.ViewModel 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.MutableLiveData
import androidx.lifecycle.ViewModel 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.MutableLiveData
import androidx.lifecycle.ViewModel 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 androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow 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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".views.main.MainActivity"> tools:context=".views.activities.MainActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -19,6 +19,7 @@
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
app:menu="@menu/main" app:menu="@menu/main"
app:title="@string/app_name" /> app:title="@string/app_name" />
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<LinearLayout <LinearLayout
@ -30,16 +31,15 @@
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView
android:id="@+id/progress_frag" 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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="3" android:layout_weight="3"
android:minHeight="160dp"
tools:layout="@layout/fragment_progress" /> tools:layout="@layout/fragment_progress" />
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView
android:id="@+id/todo_frag" 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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="2" android:layout_weight="2"

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".views.main.MainActivity"> tools:context=".views.activities.MainActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -35,14 +35,14 @@
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView
android:id="@+id/progress_frag" 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_width="match_parent"
android:layout_height="180dp" android:layout_height="270dp"
tools:layout="@layout/fragment_progress" /> tools:layout="@layout/fragment_progress" />
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView
android:id="@+id/todo_frag" 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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:layout="@layout/fragment_todo" /> 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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".views.crash.CrashActivity"> tools:context=".views.activities.CrashActivity">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -1,48 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <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" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".views.main.MainActivity"> tools:context=".views.activities.MainActivity">
<com.google.android.material.appbar.AppBarLayout <androidx.fragment.app.FragmentContainerView
android:layout_width="match_parent" android:id="@+id/app_container"
android:layout_height="wrap_content" android:name="cn.super12138.todo.views.fragments.MainFragment"
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
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fillViewport="true" android:fitsSystemWindows="true"
android:orientation="vertical" tools:layout="@layout/fragment_main" />
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<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> </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_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".views.about.AboutActivity"> tools:context=".views.fragments.AboutFragment">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
app:liftOnScroll="true"
app:liftOnScrollTargetViewId="@+id/all_tasks_list"> app:liftOnScrollTargetViewId="@+id/all_tasks_list">
<com.google.android.material.appbar.MaterialToolbar <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" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="280dp" android:layout_height="270dp"
android:animateLayoutChanges="true"> android:animateLayoutChanges="true">
<com.google.android.material.progressindicator.CircularProgressIndicator <com.google.android.material.progressindicator.CircularProgressIndicator

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
tools:context=".views.settings.SettingsActivity"> tools:context=".views.fragments.SettingsParentFragment">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -27,15 +27,10 @@
android:fillViewport="true" android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"> 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_width="match_parent"
android:layout_height="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>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -7,7 +7,7 @@
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView
android:id="@+id/welcome_page_container" 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_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/control_area" app:layout_constraintBottom_toTopOf="@+id/control_area"

View file

@ -22,7 +22,7 @@
<androidx.fragment.app.FragmentContainerView <androidx.fragment.app.FragmentContainerView
android:id="@+id/welcome_progress" 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_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
tools:layout="@layout/fragment_progress" /> tools:layout="@layout/fragment_progress" />