mirror of
https://codeberg.org/timelimit/timelimit-android.git
synced 2025-10-03 17:59:51 +02:00
Add unprovisioned check at setup
This commit is contained in:
parent
420be75751
commit
79e9c2a30f
5 changed files with 81 additions and 13 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
|
* TimeLimit Copyright <C> 2019 - 2022 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,6 +29,7 @@ import io.timelimit.android.data.model.*
|
||||||
import io.timelimit.android.integration.platform.NewPermissionStatus
|
import io.timelimit.android.integration.platform.NewPermissionStatus
|
||||||
import io.timelimit.android.integration.platform.ProtectionLevel
|
import io.timelimit.android.integration.platform.ProtectionLevel
|
||||||
import io.timelimit.android.integration.platform.RuntimePermissionStatus
|
import io.timelimit.android.integration.platform.RuntimePermissionStatus
|
||||||
|
import io.timelimit.android.ui.setup.SetupUnprovisionedCheck
|
||||||
import io.timelimit.android.ui.user.create.DefaultCategories
|
import io.timelimit.android.ui.user.create.DefaultCategories
|
||||||
import io.timelimit.android.util.AndroidVersion
|
import io.timelimit.android.util.AndroidVersion
|
||||||
import io.timelimit.android.work.CheckUpdateWorker
|
import io.timelimit.android.work.CheckUpdateWorker
|
||||||
|
@ -58,6 +59,8 @@ class AppSetupLogic(private val appLogic: AppLogic) {
|
||||||
run {
|
run {
|
||||||
val customServerUrl = appLogic.database.config().getCustomServerUrlSync()
|
val customServerUrl = appLogic.database.config().getCustomServerUrlSync()
|
||||||
|
|
||||||
|
SetupUnprovisionedCheck.checkSync(appLogic.database)
|
||||||
|
|
||||||
// just for safety: delete everything except the custom server url
|
// just for safety: delete everything except the custom server url
|
||||||
appLogic.database.deleteAllData()
|
appLogic.database.deleteAllData()
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* TimeLimit Copyright <C> 2019 - 2021 Jonas Lochmann
|
* TimeLimit Copyright <C> 2019 - 2022 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,13 +22,19 @@ import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
|
import android.util.Log
|
||||||
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 android.widget.Toast
|
||||||
import androidx.fragment.app.Fragment
|
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.BuildConfig
|
||||||
import io.timelimit.android.R
|
import io.timelimit.android.R
|
||||||
|
import io.timelimit.android.async.Threads
|
||||||
|
import io.timelimit.android.coroutines.executeAndWait
|
||||||
|
import io.timelimit.android.coroutines.runAsync
|
||||||
import io.timelimit.android.databinding.FragmentSetupSelectModeBinding
|
import io.timelimit.android.databinding.FragmentSetupSelectModeBinding
|
||||||
import io.timelimit.android.extensions.safeNavigate
|
import io.timelimit.android.extensions.safeNavigate
|
||||||
import io.timelimit.android.logic.DefaultAppLogic
|
import io.timelimit.android.logic.DefaultAppLogic
|
||||||
|
@ -37,6 +43,7 @@ import io.timelimit.android.ui.setup.privacy.PrivacyInfoDialogFragment
|
||||||
|
|
||||||
class SetupSelectModeFragment : Fragment() {
|
class SetupSelectModeFragment : Fragment() {
|
||||||
companion object {
|
companion object {
|
||||||
|
private const val LOG_TAG = "SetupSelectModeFragment"
|
||||||
private const val REQ_SETUP_CONNECTED_PARENT = 1
|
private const val REQ_SETUP_CONNECTED_PARENT = 1
|
||||||
private const val REQ_SETUP_CONNECTED_CHILD = 2
|
private const val REQ_SETUP_CONNECTED_CHILD = 2
|
||||||
private const val REQUEST_SETUP_PARENT_MODE = 3
|
private const val REQUEST_SETUP_PARENT_MODE = 3
|
||||||
|
@ -82,18 +89,39 @@ class SetupSelectModeFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.btnUninstall.setOnClickListener {
|
binding.btnUninstall.setOnClickListener {
|
||||||
DefaultAppLogic.with(requireContext()).platformIntegration.disableDeviceAdmin()
|
val context = requireContext().applicationContext
|
||||||
|
val logic = DefaultAppLogic.with(requireContext())
|
||||||
|
|
||||||
|
runAsync {
|
||||||
|
try {
|
||||||
|
Threads.database.executeAndWait { SetupUnprovisionedCheck.checkSync(logic.database) }
|
||||||
|
|
||||||
|
logic.platformIntegration.disableDeviceAdmin()
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
startActivity(
|
context.startActivity(
|
||||||
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:${requireContext().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(
|
context.startActivity(
|
||||||
Intent(Intent.ACTION_UNINSTALL_PACKAGE, Uri.parse("package:${requireContext().packageName}"))
|
Intent(
|
||||||
|
Intent.ACTION_UNINSTALL_PACKAGE,
|
||||||
|
Uri.parse("package:${requireContext().packageName}")
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} catch (ex: Exception) {
|
||||||
|
if (BuildConfig.DEBUG) {
|
||||||
|
Log.w(LOG_TAG, "reset failed", ex)
|
||||||
|
}
|
||||||
|
|
||||||
|
Toast.makeText(context, R.string.error_general, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* TimeLimit Copyright <C> 2019 - 2022 Jonas Lochmann
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* the Free Software Foundation version 3 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package io.timelimit.android.ui.setup
|
||||||
|
|
||||||
|
import io.timelimit.android.data.Database
|
||||||
|
import java.lang.RuntimeException
|
||||||
|
|
||||||
|
object SetupUnprovisionedCheck {
|
||||||
|
fun checkSync(database: Database) {
|
||||||
|
if (database.config().getOwnDeviceIdSync() != null) {
|
||||||
|
throw ProvisionedException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProvisionedException: RuntimeException()
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann
|
* TimeLimit Copyright <C> 2019 - 2022 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.sync.ApplyServerDataStatus
|
||||||
import io.timelimit.android.sync.network.ClientDataStatus
|
import io.timelimit.android.sync.network.ClientDataStatus
|
||||||
import io.timelimit.android.sync.network.NewDeviceInfo
|
import io.timelimit.android.sync.network.NewDeviceInfo
|
||||||
import io.timelimit.android.sync.network.api.UnauthorizedHttpError
|
import io.timelimit.android.sync.network.api.UnauthorizedHttpError
|
||||||
|
import io.timelimit.android.ui.setup.SetupUnprovisionedCheck
|
||||||
|
|
||||||
class SetupRemoteChildViewModel(application: Application): AndroidViewModel(application) {
|
class SetupRemoteChildViewModel(application: Application): AndroidViewModel(application) {
|
||||||
private val statusInternal = MutableLiveData<SetupRemoteChildStatus>().apply { value = SetupRemoteChildStatus.Idle }
|
private val statusInternal = MutableLiveData<SetupRemoteChildStatus>().apply { value = SetupRemoteChildStatus.Idle }
|
||||||
|
@ -62,6 +63,8 @@ class SetupRemoteChildViewModel(application: Application): AndroidViewModel(appl
|
||||||
logic.database.runInTransaction {
|
logic.database.runInTransaction {
|
||||||
val customServerUrl = logic.database.config().getCustomServerUrlSync()
|
val customServerUrl = logic.database.config().getCustomServerUrlSync()
|
||||||
|
|
||||||
|
SetupUnprovisionedCheck.checkSync(logic.database)
|
||||||
|
|
||||||
logic.database.deleteAllData()
|
logic.database.deleteAllData()
|
||||||
logic.database.config().setCustomServerUrlSync(customServerUrl)
|
logic.database.config().setCustomServerUrlSync(customServerUrl)
|
||||||
logic.database.config().setOwnDeviceIdSync(registerResponse.ownDeviceId)
|
logic.database.config().setOwnDeviceIdSync(registerResponse.ownDeviceId)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* TimeLimit Copyright <C> 2019 - 2020 Jonas Lochmann
|
* TimeLimit Copyright <C> 2019 - 2022 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
|
||||||
|
@ -37,6 +37,7 @@ import io.timelimit.android.sync.network.ParentPassword
|
||||||
import io.timelimit.android.sync.network.StatusOfMailAddressResponse
|
import io.timelimit.android.sync.network.StatusOfMailAddressResponse
|
||||||
import io.timelimit.android.sync.network.api.ConflictHttpError
|
import io.timelimit.android.sync.network.api.ConflictHttpError
|
||||||
import io.timelimit.android.sync.network.api.UnauthorizedHttpError
|
import io.timelimit.android.sync.network.api.UnauthorizedHttpError
|
||||||
|
import io.timelimit.android.ui.setup.SetupUnprovisionedCheck
|
||||||
import io.timelimit.android.update.UpdateUtil
|
import io.timelimit.android.update.UpdateUtil
|
||||||
import io.timelimit.android.work.PeriodicSyncInBackgroundWorker
|
import io.timelimit.android.work.PeriodicSyncInBackgroundWorker
|
||||||
|
|
||||||
|
@ -106,6 +107,8 @@ class SetupParentModeModel(application: Application): AndroidViewModel(applicati
|
||||||
logic.database.runInTransaction {
|
logic.database.runInTransaction {
|
||||||
val customServerUrl = logic.database.config().getCustomServerUrlSync()
|
val customServerUrl = logic.database.config().getCustomServerUrlSync()
|
||||||
|
|
||||||
|
SetupUnprovisionedCheck.checkSync(logic.database)
|
||||||
|
|
||||||
database.deleteAllData()
|
database.deleteAllData()
|
||||||
|
|
||||||
database.config().setCustomServerUrlSync(customServerUrl)
|
database.config().setCustomServerUrlSync(customServerUrl)
|
||||||
|
@ -175,6 +178,8 @@ class SetupParentModeModel(application: Application): AndroidViewModel(applicati
|
||||||
logic.database.runInTransaction {
|
logic.database.runInTransaction {
|
||||||
val customServerUrl = logic.database.config().getCustomServerUrlSync()
|
val customServerUrl = logic.database.config().getCustomServerUrlSync()
|
||||||
|
|
||||||
|
SetupUnprovisionedCheck.checkSync(logic.database)
|
||||||
|
|
||||||
database.deleteAllData()
|
database.deleteAllData()
|
||||||
|
|
||||||
database.config().setCustomServerUrlSync(customServerUrl)
|
database.config().setCustomServerUrlSync(customServerUrl)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue