Migrate away from the kotlin-android-extensions

This commit is contained in:
Jonas Lochmann 2021-05-24 02:00:00 +02:00
parent e7687fd511
commit 9fa2104cf1
No known key found for this signature in database
GPG key ID: 8B8C9AEE10FA5B36
21 changed files with 135 additions and 152 deletions

View file

@ -16,14 +16,10 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-parcelize'
apply plugin: "androidx.navigation.safeargs.kotlin" apply plugin: "androidx.navigation.safeargs.kotlin"
apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-kapt'
androidExtensions {
experimental = true
}
android { android {
compileSdkVersion 30 compileSdkVersion 30
defaultConfig { defaultConfig {
@ -49,6 +45,9 @@ android {
// set to empty string to disable this check // set to empty string to disable this check
buildConfigField 'String', 'updateServerBuildsCertificate', '"2170068198547F15129DE8CC46E2A8BF1485A6E5030916E26DDE41AE0E81DAC2"' buildConfigField 'String', 'updateServerBuildsCertificate', '"2170068198547F15129DE8CC46E2A8BF1485A6E5030916E26DDE41AE0E81DAC2"'
} }
buildFeatures {
viewBinding true
}
flavorDimensions 'api', 'channel', 'server' flavorDimensions 'api', 'channel', 'server'
productFlavors { productFlavors {

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -18,7 +18,7 @@ package io.timelimit.android.data.customtypes
import android.os.Parcelable import android.os.Parcelable
import android.text.TextUtils import android.text.TextUtils
import androidx.room.TypeConverter import androidx.room.TypeConverter
import kotlinx.android.parcel.Parcelize import kotlinx.parcelize.Parcelize
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -29,7 +29,7 @@ import io.timelimit.android.data.customtypes.ImmutableBitmaskAdapter
import io.timelimit.android.extensions.MinuteOfDay import io.timelimit.android.extensions.MinuteOfDay
import io.timelimit.android.livedata.ignoreUnchanged import io.timelimit.android.livedata.ignoreUnchanged
import io.timelimit.android.livedata.map import io.timelimit.android.livedata.map
import kotlinx.android.parcel.Parcelize import kotlinx.parcelize.Parcelize
@Entity(tableName = "time_limit_rule") @Entity(tableName = "time_limit_rule")
@TypeConverters(ImmutableBitmaskAdapter::class) @TypeConverters(ImmutableBitmaskAdapter::class)

View file

@ -21,7 +21,7 @@ import androidx.lifecycle.LiveData
import androidx.room.TypeConverter import androidx.room.TypeConverter
import io.timelimit.android.data.model.App import io.timelimit.android.data.model.App
import io.timelimit.android.data.model.AppActivity import io.timelimit.android.data.model.AppActivity
import kotlinx.android.parcel.Parcelize import kotlinx.parcelize.Parcelize
abstract class PlatformIntegration( abstract class PlatformIntegration(
val maximumProtectionLevel: ProtectionLevel val maximumProtectionLevel: ProtectionLevel

View file

@ -23,41 +23,40 @@ import androidx.fragment.app.Fragment
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.Navigation import androidx.navigation.Navigation
import io.timelimit.android.R import io.timelimit.android.R
import io.timelimit.android.databinding.SingleFragmentWrapperBinding
import io.timelimit.android.livedata.liveDataFromNonNullValue import io.timelimit.android.livedata.liveDataFromNonNullValue
import io.timelimit.android.ui.main.ActivityViewModelHolder import io.timelimit.android.ui.main.ActivityViewModelHolder
import io.timelimit.android.ui.main.AuthenticationFab import io.timelimit.android.ui.main.AuthenticationFab
import kotlinx.android.synthetic.main.single_fragment_wrapper.*
abstract class SingleFragmentWrapper: Fragment() { abstract class SingleFragmentWrapper: Fragment() {
val activity: ActivityViewModelHolder by lazy { getActivity() as ActivityViewModelHolder } val activity: ActivityViewModelHolder by lazy { getActivity() as ActivityViewModelHolder }
private lateinit var navController: NavController private lateinit var navController: NavController
protected lateinit var binding: SingleFragmentWrapperBinding
protected val navigation get() = navController protected val navigation get() = navController
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
navController = Navigation.findNavController(container!!) navController = Navigation.findNavController(container!!)
return inflater.inflate(R.layout.single_fragment_wrapper, container, false) binding = SingleFragmentWrapperBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
AuthenticationFab.manageAuthenticationFab( AuthenticationFab.manageAuthenticationFab(
fab = fab, fab = binding.fab,
fragment = this, fragment = this,
shouldHighlight = activity.getActivityViewModel().shouldHighlightAuthenticationButton, shouldHighlight = activity.getActivityViewModel().shouldHighlightAuthenticationButton,
authenticatedUser = activity.getActivityViewModel().authenticatedUser, authenticatedUser = activity.getActivityViewModel().authenticatedUser,
doesSupportAuth = liveDataFromNonNullValue(showAuthButton) doesSupportAuth = liveDataFromNonNullValue(showAuthButton)
) )
fab.setOnClickListener { activity.showAuthenticationScreen() } binding.fab.setOnClickListener { activity.showAuthenticationScreen() }
if (savedInstanceState == null) { if (savedInstanceState == null) {
childFragmentManager.beginTransaction() childFragmentManager.beginTransaction()
.replace(R.id.container, createChildFragment()) .replace(R.id.container, createChildFragment())
.commit() .commit()
} }
return binding.root
} }
abstract fun createChildFragment(): Fragment abstract fun createChildFragment(): Fragment

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -26,8 +26,8 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import io.timelimit.android.R import io.timelimit.android.R
import io.timelimit.android.databinding.ActivityHomescreenBinding
import io.timelimit.android.databinding.ActivityHomescreenItemBinding import io.timelimit.android.databinding.ActivityHomescreenItemBinding
import kotlinx.android.synthetic.main.activity_homescreen.*
class HomescreenActivity: AppCompatActivity() { class HomescreenActivity: AppCompatActivity() {
companion object { companion object {
@ -35,11 +35,13 @@ class HomescreenActivity: AppCompatActivity() {
} }
private val model: HomescreenModel by lazy { ViewModelProvider(this).get(HomescreenModel::class.java) } private val model: HomescreenModel by lazy { ViewModelProvider(this).get(HomescreenModel::class.java) }
private lateinit var binding: ActivityHomescreenBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_homescreen) binding = ActivityHomescreenBinding.inflate(layoutInflater)
setContentView(binding.root)
model.handleLaunchIfNotYetExecuted(intent.getBooleanExtra(FORCE_SELECTION, false)) model.handleLaunchIfNotYetExecuted(intent.getBooleanExtra(FORCE_SELECTION, false))
@ -80,14 +82,14 @@ class HomescreenActivity: AppCompatActivity() {
} }
private fun initOptionList() { private fun initOptionList() {
maincard.visibility = View.VISIBLE binding.maincard.visibility = View.VISIBLE
val options = HomescreenUtil.launcherOptions(this) val options = HomescreenUtil.launcherOptions(this)
launcher_options.removeAllViews() binding.launcherOptions.removeAllViews()
options.forEach { option -> options.forEach { option ->
val view = ActivityHomescreenItemBinding.inflate(LayoutInflater.from(this), launcher_options, true) val view = ActivityHomescreenItemBinding.inflate(LayoutInflater.from(this), binding.launcherOptions, true)
view.label = try { view.label = try {
packageManager.getApplicationLabel( packageManager.getApplicationLabel(
@ -119,18 +121,18 @@ class HomescreenActivity: AppCompatActivity() {
} }
private fun hideOptionList() { private fun hideOptionList() {
maincard.visibility = View.GONE binding.maincard.visibility = View.GONE
launcher_options.removeAllViews() binding.launcherOptions.removeAllViews()
} }
private fun showProgress(progresss: Int) { private fun showProgress(progresss: Int) {
progress_card.visibility = View.VISIBLE binding.progressCard.visibility = View.VISIBLE
progress_bar.progress = progresss binding.progressBar.progress = progresss
} }
private fun hideProgress() { private fun hideProgress() {
progress_card.visibility = View.GONE binding.progressCard.visibility = View.GONE
} }
override fun onResume() { override fun onResume() {

View file

@ -25,6 +25,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import io.timelimit.android.R import io.timelimit.android.R
import io.timelimit.android.databinding.LockActivityBinding
import io.timelimit.android.extensions.showSafe import io.timelimit.android.extensions.showSafe
import io.timelimit.android.logic.BlockingReason import io.timelimit.android.logic.BlockingReason
import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.logic.DefaultAppLogic
@ -36,7 +37,6 @@ import io.timelimit.android.ui.main.ActivityViewModelHolder
import io.timelimit.android.ui.main.AuthenticationFab import io.timelimit.android.ui.main.AuthenticationFab
import io.timelimit.android.ui.manage.child.primarydevice.UpdatePrimaryDeviceDialogFragment import io.timelimit.android.ui.manage.child.primarydevice.UpdatePrimaryDeviceDialogFragment
import io.timelimit.android.ui.util.SyncStatusModel import io.timelimit.android.ui.util.SyncStatusModel
import kotlinx.android.synthetic.main.lock_activity.*
class LockActivity : AppCompatActivity(), ActivityViewModelHolder { class LockActivity : AppCompatActivity(), ActivityViewModelHolder {
companion object { companion object {
@ -88,7 +88,8 @@ class LockActivity : AppCompatActivity(), ActivityViewModelHolder {
val adapter = LockActivityAdapter(supportFragmentManager, this) val adapter = LockActivityAdapter(supportFragmentManager, this)
setContentView(R.layout.lock_activity) val binding = LockActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
syncModel.statusText.observe(this) { supportActionBar?.subtitle = it } syncModel.statusText.observe(this) { supportActionBar?.subtitle = it }
@ -96,7 +97,7 @@ class LockActivity : AppCompatActivity(), ActivityViewModelHolder {
model.init(blockedPackageName, blockedActivityName) model.init(blockedPackageName, blockedActivityName)
pager.adapter = adapter binding.pager.adapter = adapter
model.content.observe(this) { model.content.observe(this) {
if (isResumed && it is LockscreenContent.Blocked.BlockedCategory && it.reason == BlockingReason.RequiresCurrentDevice && !model.didOpenSetCurrentDeviceScreen) { if (isResumed && it is LockscreenContent.Blocked.BlockedCategory && it.reason == BlockingReason.RequiresCurrentDevice && !model.didOpenSetCurrentDeviceScreen) {
@ -109,16 +110,16 @@ class LockActivity : AppCompatActivity(), ActivityViewModelHolder {
} }
AuthenticationFab.manageAuthenticationFab( AuthenticationFab.manageAuthenticationFab(
fab = fab, fab = binding.fab,
shouldHighlight = activityModel.shouldHighlightAuthenticationButton, shouldHighlight = activityModel.shouldHighlightAuthenticationButton,
authenticatedUser = activityModel.authenticatedUser, authenticatedUser = activityModel.authenticatedUser,
activity = this, activity = this,
doesSupportAuth = showAuth doesSupportAuth = showAuth
) )
fab.setOnClickListener { showAuthenticationScreen() } binding.fab.setOnClickListener { showAuthenticationScreen() }
pager.addOnPageChangeListener(object: ViewPager.SimpleOnPageChangeListener() { binding.pager.addOnPageChangeListener(object: ViewPager.SimpleOnPageChangeListener() {
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
super.onPageSelected(position) super.onPageSelected(position)
@ -126,7 +127,7 @@ class LockActivity : AppCompatActivity(), ActivityViewModelHolder {
} }
}) })
tabs.setupWithViewPager(pager) binding.tabs.setupWithViewPager(binding.pager)
model.content.observe(this) { model.content.observe(this) {
val isTimeOver = it is LockscreenContent.Blocked.BlockedCategory && it.blockingHandling.activityBlockingReason == BlockingReason.TimeOver val isTimeOver = it is LockscreenContent.Blocked.BlockedCategory && it.blockingHandling.activityBlockingReason == BlockingReason.TimeOver

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -23,25 +23,19 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import io.timelimit.android.R
import io.timelimit.android.data.model.ChildTask import io.timelimit.android.data.model.ChildTask
import io.timelimit.android.databinding.RecyclerFragmentBinding
import io.timelimit.android.ui.manage.child.tasks.ConfirmTaskDialogFragment import io.timelimit.android.ui.manage.child.tasks.ConfirmTaskDialogFragment
import kotlinx.android.synthetic.main.recycler_fragment.*
class LockTaskFragment: Fragment() { class LockTaskFragment: Fragment() {
private val model: LockModel by activityViewModels() private val model: LockModel by activityViewModels()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.recycler_fragment, container, false) val binding = RecyclerFragmentBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = LockTaskAdapter() val adapter = LockTaskAdapter()
recycler.layoutManager = LinearLayoutManager(requireContext()) binding.recycler.layoutManager = LinearLayoutManager(requireContext())
recycler.adapter = adapter binding.recycler.adapter = adapter
model.blockedCategoryTasks.observe(viewLifecycleOwner) { tasks -> model.blockedCategoryTasks.observe(viewLifecycleOwner) { tasks ->
adapter.content = listOf(LockTaskItem.Introduction) + tasks.map { LockTaskItem.Task(it) } adapter.content = listOf(LockTaskItem.Introduction) + tasks.map { LockTaskItem.Task(it) }
@ -55,5 +49,7 @@ class LockTaskFragment: Fragment() {
ConfirmTaskDialogFragment.newInstance(taskId = task.taskId, taskTitle = task.taskTitle, fromManageScreen = false).show(parentFragmentManager) ConfirmTaskDialogFragment.newInstance(taskId = task.taskId, taskTitle = task.taskTitle, fromManageScreen = false).show(parentFragmentManager)
} }
} }
return binding.root
} }
} }

View file

@ -31,6 +31,7 @@ import io.timelimit.android.async.Threads
import io.timelimit.android.data.Database import io.timelimit.android.data.Database
import io.timelimit.android.data.model.HintsToShow import io.timelimit.android.data.model.HintsToShow
import io.timelimit.android.data.model.TimeLimitRule import io.timelimit.android.data.model.TimeLimitRule
import io.timelimit.android.databinding.FragmentCategoryAppsAndRulesBinding
import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.logic.DefaultAppLogic
import io.timelimit.android.sync.actions.AddCategoryAppsAction import io.timelimit.android.sync.actions.AddCategoryAppsAction
import io.timelimit.android.sync.actions.CreateTimeLimitRuleAction import io.timelimit.android.sync.actions.CreateTimeLimitRuleAction
@ -42,7 +43,6 @@ import io.timelimit.android.ui.manage.category.apps.add.AddCategoryAppsFragment
import io.timelimit.android.ui.manage.category.timelimit_rules.edit.EditTimeLimitRuleDialogFragment import io.timelimit.android.ui.manage.category.timelimit_rules.edit.EditTimeLimitRuleDialogFragment
import io.timelimit.android.ui.manage.category.timelimit_rules.edit.EditTimeLimitRuleDialogFragmentListener import io.timelimit.android.ui.manage.category.timelimit_rules.edit.EditTimeLimitRuleDialogFragmentListener
import io.timelimit.android.ui.manage.child.apps.assign.AssignAppCategoryDialogFragment import io.timelimit.android.ui.manage.child.apps.assign.AssignAppCategoryDialogFragment
import kotlinx.android.synthetic.main.fragment_category_apps_and_rules.*
abstract class CategoryAppsAndRulesFragment: Fragment(), Handlers, EditTimeLimitRuleDialogFragmentListener { abstract class CategoryAppsAndRulesFragment: Fragment(), Handlers, EditTimeLimitRuleDialogFragmentListener {
private val adapter = AppAndRuleAdapter().also { it.handlers = this } private val adapter = AppAndRuleAdapter().also { it.handlers = this }
@ -53,16 +53,12 @@ abstract class CategoryAppsAndRulesFragment: Fragment(), Handlers, EditTimeLimit
abstract val categoryId: String abstract val categoryId: String
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_category_apps_and_rules, container, false) val binding = FragmentCategoryAppsAndRulesBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.init(userId = childId, categoryId = categoryId) model.init(userId = childId, categoryId = categoryId)
recycler.layoutManager = LinearLayoutManager(requireContext()) binding.recycler.layoutManager = LinearLayoutManager(requireContext())
recycler.adapter = adapter binding.recycler.adapter = adapter
model.dateAndUsedTimes.observe(viewLifecycleOwner) { (date, usedTimes) -> model.dateAndUsedTimes.observe(viewLifecycleOwner) { (date, usedTimes) ->
adapter.date = date adapter.date = date
@ -91,7 +87,9 @@ abstract class CategoryAppsAndRulesFragment: Fragment(), Handlers, EditTimeLimit
database.config().setHintsShownSync(HintsToShow.TIME_LIMIT_RULE_INTRODUCTION) database.config().setHintsShownSync(HintsToShow.TIME_LIMIT_RULE_INTRODUCTION)
} }
} }
}).attachToRecyclerView(recycler) }).attachToRecyclerView(binding.recycler)
return binding.root
} }
fun setListContent(items: List<AppAndRuleItem>) { adapter.items = items } fun setListContent(items: List<AppAndRuleItem>) { adapter.items = items }

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -31,6 +31,7 @@ import io.timelimit.android.data.customtypes.ImmutableBitmask
import io.timelimit.android.data.model.Category import io.timelimit.android.data.model.Category
import io.timelimit.android.data.model.HintsToShow import io.timelimit.android.data.model.HintsToShow
import io.timelimit.android.data.model.withConfigCopiedToOtherDates import io.timelimit.android.data.model.withConfigCopiedToOtherDates
import io.timelimit.android.databinding.FragmentBlockedTimeAreasBinding
import io.timelimit.android.livedata.map import io.timelimit.android.livedata.map
import io.timelimit.android.livedata.waitForNonNullValue import io.timelimit.android.livedata.waitForNonNullValue
import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.logic.DefaultAppLogic
@ -38,7 +39,6 @@ import io.timelimit.android.sync.actions.UpdateCategoryBlockedTimesAction
import io.timelimit.android.ui.main.ActivityViewModel import io.timelimit.android.ui.main.ActivityViewModel
import io.timelimit.android.ui.main.getActivityViewModel import io.timelimit.android.ui.main.getActivityViewModel
import io.timelimit.android.ui.mustread.MustReadFragment import io.timelimit.android.ui.mustread.MustReadFragment
import kotlinx.android.synthetic.main.fragment_blocked_time_areas.*
class BlockedTimeAreasFragment : Fragment(), CopyBlockedTimeAreasDialogFragmentListener { class BlockedTimeAreasFragment : Fragment(), CopyBlockedTimeAreasDialogFragmentListener {
companion object { companion object {
@ -59,6 +59,7 @@ class BlockedTimeAreasFragment : Fragment(), CopyBlockedTimeAreasDialogFragmentL
private val items = MutableLiveData<BlockedTimeItems>() private val items = MutableLiveData<BlockedTimeItems>()
private val childId: String get() = requireArguments().getString(CHILD_ID)!! private val childId: String get() = requireArguments().getString(CHILD_ID)!!
private val categoryId: String get() = requireArguments().getString(CATEGORY_ID)!! private val categoryId: String get() = requireArguments().getString(CATEGORY_ID)!!
private lateinit var binding: FragmentBlockedTimeAreasBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -82,10 +83,6 @@ class BlockedTimeAreasFragment : Fragment(), CopyBlockedTimeAreasDialogFragmentL
} }
} }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_blocked_time_areas, container, false)
}
fun updateBlockedTimes(oldMask: ImmutableBitmask, newMask: ImmutableBitmask) { fun updateBlockedTimes(oldMask: ImmutableBitmask, newMask: ImmutableBitmask) {
if ( if (
auth.tryDispatchParentAction( auth.tryDispatchParentAction(
@ -96,7 +93,7 @@ class BlockedTimeAreasFragment : Fragment(), CopyBlockedTimeAreasDialogFragmentL
allowAsChild = true allowAsChild = true
) )
) { ) {
Snackbar.make(coordinator.parent as View, R.string.blocked_time_areas_snackbar_modified, Snackbar.LENGTH_SHORT) Snackbar.make(binding.coordinator.parent as View, R.string.blocked_time_areas_snackbar_modified, Snackbar.LENGTH_SHORT)
.also { .also {
if (auth.isParentAuthenticated()) { if (auth.isParentAuthenticated()) {
it.setAction(R.string.generic_undo) { it.setAction(R.string.generic_undo) {
@ -119,29 +116,29 @@ class BlockedTimeAreasFragment : Fragment(), CopyBlockedTimeAreasDialogFragmentL
} }
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onViewCreated(view, savedInstanceState) binding = FragmentBlockedTimeAreasBinding.inflate(inflater, container, false)
btn_help.setOnClickListener { binding.btnHelp.setOnClickListener {
BlockedTimeAreasHelpDialog().show(parentFragmentManager) BlockedTimeAreasHelpDialog().show(parentFragmentManager)
} }
btn_copy_to_other_days.setOnClickListener { binding.btnCopyToOtherDays.setOnClickListener {
if (auth.requestAuthenticationOrReturnTrue()) { if (auth.requestAuthenticationOrReturnTrue()) {
CopyBlockedTimeAreasDialogFragment.newInstance(this@BlockedTimeAreasFragment).show(parentFragmentManager) CopyBlockedTimeAreasDialogFragment.newInstance(this@BlockedTimeAreasFragment).show(parentFragmentManager)
} }
} }
BlockedTimeAreasLogic.init( BlockedTimeAreasLogic.init(
recycler = recycler, recycler = binding.recycler,
daySpinner = spinner_day, daySpinner = binding.spinnerDay,
detailedModeCheckbox = detailed_mode, detailedModeCheckbox = binding.detailedMode,
checkAuthentication = { checkAuthentication = {
if (auth.isParentAuthenticated()) { if (auth.isParentAuthenticated()) {
BlockedTimeAreasLogic.Authentication.FullyAvailable BlockedTimeAreasLogic.Authentication.FullyAvailable
} else if (auth.isParentOrChildAuthenticated(childId = childId)) { } else if (auth.isParentOrChildAuthenticated(childId = childId)) {
BlockedTimeAreasLogic.Authentication.OnlyAllowAddingLimits( BlockedTimeAreasLogic.Authentication.OnlyAllowAddingLimits(
showHintHook = { Snackbar.make(coordinator.parent as View, R.string.blocked_time_areas_snackbar_child_hint, Snackbar.LENGTH_LONG).show() }, showHintHook = { Snackbar.make(binding.coordinator.parent as View, R.string.blocked_time_areas_snackbar_child_hint, Snackbar.LENGTH_LONG).show() },
showErrorHook = { auth.requestAuthentication() } showErrorHook = { auth.requestAuthentication() }
) )
} else { } else {
@ -154,5 +151,7 @@ class BlockedTimeAreasFragment : Fragment(), CopyBlockedTimeAreasDialogFragmentL
currentData = category.map { it?.blockedMinutesInWeek }, currentData = category.map { it?.blockedMinutesInWeek },
lifecycleOwner = this lifecycleOwner = this
) )
return binding.root
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -28,7 +28,6 @@ import io.timelimit.android.livedata.map
import io.timelimit.android.ui.fragment.ChildFragmentWrapper import io.timelimit.android.ui.fragment.ChildFragmentWrapper
import io.timelimit.android.ui.main.FragmentWithCustomTitle import io.timelimit.android.ui.main.FragmentWithCustomTitle
import io.timelimit.android.ui.manage.child.category.ManageChildCategoriesFragment import io.timelimit.android.ui.manage.child.category.ManageChildCategoriesFragment
import kotlinx.android.synthetic.main.single_fragment_wrapper.*
class ManageChildFragment : ChildFragmentWrapper(), FragmentWithCustomTitle { class ManageChildFragment : ChildFragmentWrapper(), FragmentWithCustomTitle {
private val params: ManageChildFragmentArgs by lazy { ManageChildFragmentArgs.fromBundle(arguments!!) } private val params: ManageChildFragmentArgs by lazy { ManageChildFragmentArgs.fromBundle(arguments!!) }
@ -46,7 +45,7 @@ class ManageChildFragment : ChildFragmentWrapper(), FragmentWithCustomTitle {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if (savedInstanceState == null && params.fromRedirect) { if (savedInstanceState == null && params.fromRedirect) {
Snackbar.make(coordinator, R.string.manage_child_redirected_toast, Snackbar.LENGTH_LONG).show() Snackbar.make(binding.coordinator, R.string.manage_child_redirected_toast, Snackbar.LENGTH_LONG).show()
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -30,6 +30,7 @@ import io.timelimit.android.R
import io.timelimit.android.async.Threads import io.timelimit.android.async.Threads
import io.timelimit.android.data.model.Category import io.timelimit.android.data.model.Category
import io.timelimit.android.data.model.HintsToShow import io.timelimit.android.data.model.HintsToShow
import io.timelimit.android.databinding.RecyclerFragmentBinding
import io.timelimit.android.extensions.safeNavigate import io.timelimit.android.extensions.safeNavigate
import io.timelimit.android.logic.AppLogic import io.timelimit.android.logic.AppLogic
import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.logic.DefaultAppLogic
@ -42,7 +43,6 @@ import io.timelimit.android.ui.manage.child.ManageChildFragmentArgs
import io.timelimit.android.ui.manage.child.ManageChildFragmentDirections import io.timelimit.android.ui.manage.child.ManageChildFragmentDirections
import io.timelimit.android.ui.manage.child.category.create.CreateCategoryDialogFragment import io.timelimit.android.ui.manage.child.category.create.CreateCategoryDialogFragment
import io.timelimit.android.ui.manage.child.category.specialmode.SetCategorySpecialModeFragment import io.timelimit.android.ui.manage.child.category.specialmode.SetCategorySpecialModeFragment
import kotlinx.android.synthetic.main.recycler_fragment.*
class ManageChildCategoriesFragment : Fragment() { class ManageChildCategoriesFragment : Fragment() {
companion object { companion object {
@ -55,9 +55,12 @@ class ManageChildCategoriesFragment : Fragment() {
private val auth: ActivityViewModel by lazy { getActivityViewModel(requireActivity()) } private val auth: ActivityViewModel by lazy { getActivityViewModel(requireActivity()) }
private val logic: AppLogic by lazy { DefaultAppLogic.with(requireContext()) } private val logic: AppLogic by lazy { DefaultAppLogic.with(requireContext()) }
private val model: ManageChildCategoriesModel by viewModels() private val model: ManageChildCategoriesModel by viewModels()
private lateinit var binding: RecyclerFragmentBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.recycler_fragment, container, false) binding = RecyclerFragmentBinding.inflate(inflater, container, false)
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -134,8 +137,8 @@ class ManageChildCategoriesFragment : Fragment() {
} }
} }
recycler.adapter = adapter binding.recycler.adapter = adapter
recycler.layoutManager = LinearLayoutManager(context) binding.recycler.layoutManager = LinearLayoutManager(context)
model.init(params.childId) model.init(params.childId)
model.listContent.observe(viewLifecycleOwner, Observer { adapter.categories = it }) model.listContent.observe(viewLifecycleOwner, Observer { adapter.categories = it })
@ -199,6 +202,6 @@ class ManageChildCategoriesFragment : Fragment() {
database.config().setHintsShownSync(HintsToShow.CATEGORIES_INTRODUCTION) database.config().setHintsShownSync(HintsToShow.CATEGORIES_INTRODUCTION)
} }
} }
}).attachToRecyclerView(recycler) }).attachToRecyclerView(binding.recycler)
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -28,9 +28,9 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import io.timelimit.android.R import io.timelimit.android.R
import io.timelimit.android.data.model.ChildTask import io.timelimit.android.data.model.ChildTask
import io.timelimit.android.databinding.RecyclerFragmentBinding
import io.timelimit.android.sync.actions.UpdateChildTaskAction import io.timelimit.android.sync.actions.UpdateChildTaskAction
import io.timelimit.android.ui.main.getActivityViewModel import io.timelimit.android.ui.main.getActivityViewModel
import kotlinx.android.synthetic.main.recycler_fragment.*
class ManageChildTasksFragment: Fragment(), EditTaskDialogFragment.Listener { class ManageChildTasksFragment: Fragment(), EditTaskDialogFragment.Listener {
companion object { companion object {
@ -54,16 +54,11 @@ class ManageChildTasksFragment: Fragment(), EditTaskDialogFragment.Listener {
} }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.recycler_fragment, container, false) val binding = RecyclerFragmentBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = ChildTaskAdapter() val adapter = ChildTaskAdapter()
recycler.layoutManager = LinearLayoutManager(requireContext()) binding.recycler.layoutManager = LinearLayoutManager(requireContext())
recycler.adapter = adapter binding.recycler.adapter = adapter
model.listContent.observe(viewLifecycleOwner) { adapter.data = it } model.listContent.observe(viewLifecycleOwner) { adapter.data = it }
model.isChildTheCurrentDeviceUser.observe(viewLifecycleOwner) {/* keep the value fresh */} model.isChildTheCurrentDeviceUser.observe(viewLifecycleOwner) {/* keep the value fresh */}
@ -100,7 +95,9 @@ class ManageChildTasksFragment: Fragment(), EditTaskDialogFragment.Listener {
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { model.hideIntro() } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { model.hideIntro() }
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean = throw IllegalStateException() override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean = throw IllegalStateException()
}).attachToRecyclerView(recycler) }).attachToRecyclerView(binding.recycler)
return binding.root
} }
override fun onTaskRemoved(task: ChildTask) { override fun onTaskRemoved(task: ChildTask) {

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -24,12 +24,12 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import io.timelimit.android.R import io.timelimit.android.R
import io.timelimit.android.databinding.AnnoyActivityBinding
import io.timelimit.android.livedata.map import io.timelimit.android.livedata.map
import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.logic.DefaultAppLogic
import io.timelimit.android.ui.manage.device.manage.ManipulationWarningTypeLabel import io.timelimit.android.ui.manage.device.manage.ManipulationWarningTypeLabel
import io.timelimit.android.ui.manage.device.manage.ManipulationWarnings import io.timelimit.android.ui.manage.device.manage.ManipulationWarnings
import io.timelimit.android.util.TimeTextUtil import io.timelimit.android.util.TimeTextUtil
import kotlinx.android.synthetic.main.annoy_activity.*
class AnnoyActivity : AppCompatActivity() { class AnnoyActivity : AppCompatActivity() {
companion object { companion object {
@ -53,7 +53,8 @@ class AnnoyActivity : AppCompatActivity() {
val model = ViewModelProviders.of(this).get(AnnoyModel::class.java) val model = ViewModelProviders.of(this).get(AnnoyModel::class.java)
val logic = DefaultAppLogic.with(this) val logic = DefaultAppLogic.with(this)
setContentView(R.layout.annoy_activity) val binding = AnnoyActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (logic.platformIntegration.setLockTaskPackages(listOf(packageName))) { if (logic.platformIntegration.setLockTaskPackages(listOf(packageName))) {
@ -67,7 +68,7 @@ class AnnoyActivity : AppCompatActivity() {
shutdown() shutdown()
} }
annoy_timer.setText( binding.annoyTimer.setText(
getString(R.string.annoy_timer, TimeTextUtil.seconds(it.toInt(), this@AnnoyActivity)) getString(R.string.annoy_timer, TimeTextUtil.seconds(it.toInt(), this@AnnoyActivity))
) )
}) })
@ -86,10 +87,10 @@ class AnnoyActivity : AppCompatActivity() {
} }
}.observe(this, Observer { }.observe(this, Observer {
if (it.isNullOrEmpty()) { if (it.isNullOrEmpty()) {
annoy_reason.visibility = View.GONE binding.annoyReason.visibility = View.GONE
} else { } else {
annoy_reason.visibility = View.VISIBLE binding.annoyReason.visibility = View.VISIBLE
annoy_reason.setText(it) binding.annoyReason.setText(it)
} }
}) })
} }

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -21,16 +21,15 @@ import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders import androidx.lifecycle.ViewModelProviders
import io.timelimit.android.R
import io.timelimit.android.async.Threads import io.timelimit.android.async.Threads
import io.timelimit.android.data.model.UserType import io.timelimit.android.data.model.UserType
import io.timelimit.android.databinding.ActivityUnlockAfterManipulationBinding
import io.timelimit.android.extensions.showSafe import io.timelimit.android.extensions.showSafe
import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.logic.DefaultAppLogic
import io.timelimit.android.ui.backdoor.BackdoorDialogFragment import io.timelimit.android.ui.backdoor.BackdoorDialogFragment
import io.timelimit.android.ui.login.NewLoginFragment import io.timelimit.android.ui.login.NewLoginFragment
import io.timelimit.android.ui.main.ActivityViewModel import io.timelimit.android.ui.main.ActivityViewModel
import io.timelimit.android.ui.main.ActivityViewModelHolder import io.timelimit.android.ui.main.ActivityViewModelHolder
import kotlinx.android.synthetic.main.activity_unlock_after_manipulation.*
class UnlockAfterManipulationActivity : AppCompatActivity(), ActivityViewModelHolder { class UnlockAfterManipulationActivity : AppCompatActivity(), ActivityViewModelHolder {
private val model: ActivityViewModel by lazy { private val model: ActivityViewModel by lazy {
@ -42,7 +41,9 @@ class UnlockAfterManipulationActivity : AppCompatActivity(), ActivityViewModelHo
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_unlock_after_manipulation)
val binding = ActivityUnlockAfterManipulationBinding.inflate(layoutInflater)
setContentView(binding.root)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
startLockTask() startLockTask()
@ -74,8 +75,8 @@ class UnlockAfterManipulationActivity : AppCompatActivity(), ActivityViewModelHo
} }
}) })
auth_btn.setOnClickListener { showAuthenticationScreen() } binding.authBtn.setOnClickListener { showAuthenticationScreen() }
use_backdoor.setOnClickListener { BackdoorDialogFragment().show(supportFragmentManager) } binding.useBackdoor.setOnClickListener { BackdoorDialogFragment().show(supportFragmentManager) }
} }
override fun showAuthenticationScreen() { override fun showAuthenticationScreen() {

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -23,10 +23,10 @@ import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.timelimit.android.R
import io.timelimit.android.async.Threads import io.timelimit.android.async.Threads
import io.timelimit.android.coroutines.CoroutineFragment import io.timelimit.android.coroutines.CoroutineFragment
import io.timelimit.android.data.model.* import io.timelimit.android.data.model.*
import io.timelimit.android.databinding.FragmentOverviewBinding
import io.timelimit.android.livedata.waitForNonNullValue import io.timelimit.android.livedata.waitForNonNullValue
import io.timelimit.android.logic.AppLogic import io.timelimit.android.logic.AppLogic
import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.logic.DefaultAppLogic
@ -34,7 +34,6 @@ import io.timelimit.android.sync.actions.ReviewChildTaskAction
import io.timelimit.android.ui.main.ActivityViewModel import io.timelimit.android.ui.main.ActivityViewModel
import io.timelimit.android.ui.main.getActivityViewModel import io.timelimit.android.ui.main.getActivityViewModel
import io.timelimit.android.ui.payment.RequiresPurchaseDialogFragment import io.timelimit.android.ui.payment.RequiresPurchaseDialogFragment
import kotlinx.android.synthetic.main.fragment_overview.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class OverviewFragment : CoroutineFragment() { class OverviewFragment : CoroutineFragment() {
@ -44,16 +43,11 @@ class OverviewFragment : CoroutineFragment() {
private val model: OverviewFragmentModel by viewModels() private val model: OverviewFragmentModel by viewModels()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_overview, container, false) val binding = FragmentOverviewBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = OverviewFragmentAdapter() val adapter = OverviewFragmentAdapter()
recycler.adapter = adapter binding.recycler.adapter = adapter
recycler.layoutManager = LinearLayoutManager(requireContext()) binding.recycler.layoutManager = LinearLayoutManager(requireContext())
adapter.handlers = object: OverviewFragmentHandlers { adapter.handlers = object: OverviewFragmentHandlers {
override fun onAddUserClicked() { override fun onAddUserClicked() {
@ -155,7 +149,9 @@ class OverviewFragment : CoroutineFragment() {
} }
} }
} }
).attachToRecyclerView(recycler) ).attachToRecyclerView(binding.recycler)
return binding.root
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -16,7 +16,7 @@
package io.timelimit.android.ui.overview.overview package io.timelimit.android.ui.overview.overview
import android.os.Parcelable import android.os.Parcelable
import kotlinx.android.parcel.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
data class OverviewItemVisibility( data class OverviewItemVisibility(

View file

@ -34,7 +34,6 @@ import io.timelimit.android.ui.main.ActivityViewModel
import io.timelimit.android.ui.main.ActivityViewModelHolder import io.timelimit.android.ui.main.ActivityViewModelHolder
import io.timelimit.android.ui.main.AuthenticationFab import io.timelimit.android.ui.main.AuthenticationFab
import io.timelimit.android.ui.main.FragmentWithCustomTitle import io.timelimit.android.ui.main.FragmentWithCustomTitle
import kotlinx.android.synthetic.main.single_fragment_wrapper.*
class UninstallFragment : Fragment(), FragmentWithCustomTitle { class UninstallFragment : Fragment(), FragmentWithCustomTitle {
companion object { companion object {
@ -79,21 +78,17 @@ class UninstallFragment : Fragment(), FragmentWithCustomTitle {
if (it == null) { navigation.popBackStack() } if (it == null) { navigation.popBackStack() }
} }
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
AuthenticationFab.manageAuthenticationFab( AuthenticationFab.manageAuthenticationFab(
fab = fab, fab = binding.fab,
fragment = this, fragment = this,
shouldHighlight = activity.getActivityViewModel().shouldHighlightAuthenticationButton, shouldHighlight = activity.getActivityViewModel().shouldHighlightAuthenticationButton,
authenticatedUser = activity.getActivityViewModel().authenticatedUser, authenticatedUser = activity.getActivityViewModel().authenticatedUser,
doesSupportAuth = liveDataFromNonNullValue(!BuildConfig.storeCompilant) doesSupportAuth = liveDataFromNonNullValue(!BuildConfig.storeCompilant)
) )
fab.setOnClickListener { activity.showAuthenticationScreen() } binding.fab.setOnClickListener { activity.showAuthenticationScreen() }
return binding.root
} }
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -22,16 +22,12 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.FragmentTransaction
import io.timelimit.android.R import io.timelimit.android.R
import io.timelimit.android.databinding.ParentModeFragmentBinding
import io.timelimit.android.ui.overview.about.AboutFragment import io.timelimit.android.ui.overview.about.AboutFragment
import kotlinx.android.synthetic.main.parent_mode_fragment.*
class ParentModeFragment : Fragment() { class ParentModeFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.parent_mode_fragment, container, false) val binding = ParentModeFragmentBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (savedInstanceState == null) { if (savedInstanceState == null) {
childFragmentManager.beginTransaction() childFragmentManager.beginTransaction()
@ -39,7 +35,7 @@ class ParentModeFragment : Fragment() {
.commitNow() .commitNow()
} }
bottom_navigation_view.setOnNavigationItemSelectedListener { menuItem -> binding.bottomNavigationView.setOnNavigationItemSelectedListener { menuItem ->
if (childFragmentManager.isStateSaved) { if (childFragmentManager.isStateSaved) {
false false
} else { } else {
@ -56,5 +52,7 @@ class ParentModeFragment : Fragment() {
true true
} }
} }
return binding.root
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -38,7 +38,6 @@ import io.timelimit.android.logic.DefaultAppLogic
import io.timelimit.android.ui.mustread.MustReadFragment import io.timelimit.android.ui.mustread.MustReadFragment
import io.timelimit.android.ui.update.UpdateConsentCard import io.timelimit.android.ui.update.UpdateConsentCard
import io.timelimit.android.update.UpdateUtil import io.timelimit.android.update.UpdateUtil
import kotlinx.android.synthetic.main.fragment_setup_local_mode.*
class SetupLocalModeFragment : Fragment() { class SetupLocalModeFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@ -69,7 +68,7 @@ class SetupLocalModeFragment : Fragment() {
binding.nextBtn.setOnClickListener { binding.nextBtn.setOnClickListener {
model.trySetupWithPassword( model.trySetupWithPassword(
set_password_view.readPassword(), binding.setPasswordView.readPassword(),
SetupNetworkTimeVerification.readSelection(binding.networkTimeVerification), SetupNetworkTimeVerification.readSelection(binding.networkTimeVerification),
enableUpdateChecks = binding.update.enableSwitch.isChecked enableUpdateChecks = binding.update.enableSwitch.isChecked
) )

View file

@ -1,5 +1,5 @@
/* /*
* TimeLimit Copyright <C> 2019 Jonas Lochmann * TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -34,7 +34,6 @@ import io.timelimit.android.extensions.safeNavigate
import io.timelimit.android.logic.DefaultAppLogic import io.timelimit.android.logic.DefaultAppLogic
import io.timelimit.android.ui.setup.parentmode.SetupParentmodeDialogFragment import io.timelimit.android.ui.setup.parentmode.SetupParentmodeDialogFragment
import io.timelimit.android.ui.setup.privacy.PrivacyInfoDialogFragment import io.timelimit.android.ui.setup.privacy.PrivacyInfoDialogFragment
import kotlinx.android.synthetic.main.fragment_setup_select_mode.*
class SetupSelectModeFragment : Fragment() { class SetupSelectModeFragment : Fragment() {
companion object { companion object {
@ -44,9 +43,10 @@ class SetupSelectModeFragment : Fragment() {
} }
private lateinit var navigation: NavController private lateinit var navigation: NavController
private lateinit var binding: FragmentSetupSelectModeBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val binding = FragmentSetupSelectModeBinding.inflate(inflater, container, false) binding = FragmentSetupSelectModeBinding.inflate(inflater, container, false)
return binding.root return binding.root
} }
@ -56,43 +56,43 @@ class SetupSelectModeFragment : Fragment() {
navigation = Navigation.findNavController(view) navigation = Navigation.findNavController(view)
btn_local_mode.setOnClickListener { binding.btnLocalMode.setOnClickListener {
navigation.safeNavigate( navigation.safeNavigate(
SetupSelectModeFragmentDirections.actionSetupSelectModeFragmentToSetupDevicePermissionsFragment(), SetupSelectModeFragmentDirections.actionSetupSelectModeFragmentToSetupDevicePermissionsFragment(),
R.id.setupSelectModeFragment R.id.setupSelectModeFragment
) )
} }
btn_parent_mode.setOnClickListener { binding.btnParentMode.setOnClickListener {
PrivacyInfoDialogFragment().apply { PrivacyInfoDialogFragment().apply {
setTargetFragment(this@SetupSelectModeFragment, REQ_SETUP_CONNECTED_PARENT) setTargetFragment(this@SetupSelectModeFragment, REQ_SETUP_CONNECTED_PARENT)
}.show(fragmentManager!!) }.show(parentFragmentManager)
} }
btn_network_child_mode.setOnClickListener { binding.btnNetworkChildMode.setOnClickListener {
PrivacyInfoDialogFragment().apply { PrivacyInfoDialogFragment().apply {
setTargetFragment(this@SetupSelectModeFragment, REQ_SETUP_CONNECTED_CHILD) setTargetFragment(this@SetupSelectModeFragment, REQ_SETUP_CONNECTED_CHILD)
}.show(fragmentManager!!) }.show(parentFragmentManager)
} }
btn_parent_key_mode.setOnClickListener { binding.btnParentKeyMode.setOnClickListener {
SetupParentmodeDialogFragment().apply { SetupParentmodeDialogFragment().apply {
setTargetFragment(this@SetupSelectModeFragment, REQUEST_SETUP_PARENT_MODE) setTargetFragment(this@SetupSelectModeFragment, REQUEST_SETUP_PARENT_MODE)
}.show(parentFragmentManager) }.show(parentFragmentManager)
} }
btn_uninstall.setOnClickListener { binding.btnUninstall.setOnClickListener {
DefaultAppLogic.with(context!!).platformIntegration.disableDeviceAdmin() DefaultAppLogic.with(requireContext()).platformIntegration.disableDeviceAdmin()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
startActivity( startActivity(
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:${context!!.packageName}")) Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:${requireContext().packageName}"))
.addCategory(Intent.CATEGORY_DEFAULT) .addCategory(Intent.CATEGORY_DEFAULT)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
) )
} else { } else {
startActivity( startActivity(
Intent(Intent.ACTION_UNINSTALL_PACKAGE, Uri.parse("package:${context!!.packageName}")) Intent(Intent.ACTION_UNINSTALL_PACKAGE, Uri.parse("package:${requireContext().packageName}"))
) )
} }
} }