diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.kt b/app/src/main/java/info/nightscout/androidaps/MainActivity.kt index e447b4eb2a..2ef61fd07d 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.kt @@ -37,11 +37,11 @@ import info.nightscout.androidaps.activities.SingleFragmentActivity import info.nightscout.androidaps.databinding.ActivityMainBinding import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.plugins.constraints.versionChecker.VersionCheckerUtils -import info.nightscout.androidaps.utils.protection.PasswordCheck -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.configuration.setupwizard.SetupWizardActivity import info.nightscout.core.ui.UIRunnable import info.nightscout.core.ui.dialogs.OKDialog +import info.nightscout.core.ui.toast.ToastUtils +import info.nightscout.core.utils.CryptoUtil import info.nightscout.core.utils.fabric.FabricPrivacy import info.nightscout.core.utils.isRunningRealPumpTest import info.nightscout.database.entities.UserEntry.Action @@ -51,9 +51,11 @@ import info.nightscout.interfaces.Config import info.nightscout.interfaces.aps.Loop import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.locale.LocaleHelper +import info.nightscout.interfaces.maintenance.PrefFileListProvider import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.smsCommunicator.SmsCommunicator import info.nightscout.interfaces.ui.IconsProvider import info.nightscout.plugins.constraints.signatureVerifier.SignatureVerifierPlugin @@ -71,6 +73,7 @@ import info.nightscout.ui.activities.TreatmentsActivity import info.nightscout.ui.tabs.TabPageAdapter import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign +import java.io.File import java.util.Locale import javax.inject.Inject import kotlin.system.exitProcess @@ -95,7 +98,8 @@ class MainActivity : NoSplashAppCompatActivity() { @Inject lateinit var signatureVerifierPlugin: SignatureVerifierPlugin @Inject lateinit var uel: UserEntryLogger @Inject lateinit var profileFunction: ProfileFunction - @Inject lateinit var passwordCheck: PasswordCheck + @Inject lateinit var fileListProvider: PrefFileListProvider + @Inject lateinit var cryptoUtil: CryptoUtil private lateinit var actionBarDrawerToggle: ActionBarDrawerToggle private var pluginPreferencesMenuItem: MenuItem? = null @@ -150,9 +154,7 @@ class MainActivity : NoSplashAppCompatActivity() { disposable += rxBus .toObservable(EventInitializationChanged::class.java) .observeOn(aapsSchedulers.main) - .subscribe({ - passwordCheck.passwordResetCheck(this) - }, fabricPrivacy::logException) + .subscribe({ passwordResetCheck(this) }, fabricPrivacy::logException) if (startWizard() && !isRunningRealPumpTest()) { protectionCheck.queryProtection(this, ProtectionCheck.Protection.PREFERENCES, { startActivity(Intent(this, SetupWizardActivity::class.java)) @@ -467,4 +469,17 @@ class MainActivity : NoSplashAppCompatActivity() { FirebaseCrashlytics.getInstance().setCustomKey("Email", sp.getString(R.string.key_email_for_crash_report, "")) } + /** + * Check for existing PasswordReset file and + * reset password to SN of active pump if file exists + */ + fun passwordResetCheck(context: Context) { + val passwordReset = File(fileListProvider.ensureExtraDirExists(), "PasswordReset") + if (passwordReset.exists()) { + val sn = activePlugin.activePump.serialNumber() + sp.putString(info.nightscout.core.main.R.string.key_master_password, cryptoUtil.hashPassword(sn)) + passwordReset.delete() + ToastUtils.okToast(context, context.getString(info.nightscout.core.main.R.string.password_set)) + } + } } diff --git a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt index b76eda7756..cd61f569e5 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt @@ -23,7 +23,6 @@ import info.nightscout.androidaps.danar.DanaRPlugin import info.nightscout.androidaps.danars.DanaRSPlugin import info.nightscout.androidaps.diaconn.DiaconnG8Plugin import info.nightscout.androidaps.plugin.general.openhumans.OpenHumansUploaderPlugin -import info.nightscout.plugins.aps.loop.LoopPlugin import info.nightscout.androidaps.plugins.configBuilder.PluginStore import info.nightscout.androidaps.plugins.general.maintenance.MaintenancePlugin import info.nightscout.androidaps.plugins.general.wear.WearPlugin @@ -31,14 +30,6 @@ import info.nightscout.androidaps.plugins.pump.combo.ComboPlugin import info.nightscout.androidaps.plugins.pump.eopatch.EopatchPumpPlugin import info.nightscout.androidaps.plugins.pump.insight.LocalInsightPlugin import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin -import info.nightscout.sensitivity.SensitivityAAPSPlugin -import info.nightscout.sensitivity.SensitivityOref1Plugin -import info.nightscout.sensitivity.SensitivityWeightedAveragePlugin -import info.nightscout.androidaps.utils.protection.PasswordCheck -import info.nightscout.androidaps.utils.protection.ProtectionCheck.ProtectionType.BIOMETRIC -import info.nightscout.androidaps.utils.protection.ProtectionCheck.ProtectionType.CUSTOM_PASSWORD -import info.nightscout.androidaps.utils.protection.ProtectionCheck.ProtectionType.CUSTOM_PIN -import info.nightscout.androidaps.utils.protection.ProtectionCheck.ProtectionType.NONE import info.nightscout.automation.AutomationPlugin import info.nightscout.core.profile.toCurrentUnits import info.nightscout.core.ui.dialogs.OKDialog @@ -46,6 +37,12 @@ import info.nightscout.interfaces.Config import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.PasswordCheck +import info.nightscout.interfaces.protection.ProtectionCheck.ProtectionType.BIOMETRIC +import info.nightscout.interfaces.protection.ProtectionCheck.ProtectionType.CUSTOM_PASSWORD +import info.nightscout.interfaces.protection.ProtectionCheck.ProtectionType.CUSTOM_PIN +import info.nightscout.interfaces.protection.ProtectionCheck.ProtectionType.NONE +import info.nightscout.plugins.aps.loop.LoopPlugin import info.nightscout.plugins.constraints.safety.SafetyPlugin import info.nightscout.plugins.general.smsCommunicator.SmsCommunicatorPlugin import info.nightscout.plugins.general.xdripStatusline.StatusLinePlugin @@ -66,6 +63,9 @@ import info.nightscout.plugins.sync.tidepool.TidepoolPlugin import info.nightscout.rx.bus.RxBus import info.nightscout.rx.events.EventPreferenceChange import info.nightscout.rx.events.EventRebuildTabs +import info.nightscout.sensitivity.SensitivityAAPSPlugin +import info.nightscout.sensitivity.SensitivityOref1Plugin +import info.nightscout.sensitivity.SensitivityWeightedAveragePlugin import info.nightscout.shared.SafeParse import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.sharedPreferences.SP diff --git a/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt index c3d19e1e83..3887be5998 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.kt @@ -7,9 +7,9 @@ import android.view.Menu import android.view.MenuItem import info.nightscout.androidaps.R import info.nightscout.androidaps.plugins.configBuilder.PluginStore -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.interfaces.locale.LocaleHelper import info.nightscout.interfaces.plugin.PluginBase +import info.nightscout.interfaces.protection.ProtectionCheck import javax.inject.Inject class SingleFragmentActivity : DaggerAppCompatActivityWithResult() { diff --git a/app/src/main/java/info/nightscout/androidaps/di/FragmentsModule.kt b/app/src/main/java/info/nightscout/androidaps/di/FragmentsModule.kt index 0ed14de275..b70100ec24 100644 --- a/app/src/main/java/info/nightscout/androidaps/di/FragmentsModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/di/FragmentsModule.kt @@ -3,18 +3,11 @@ package info.nightscout.androidaps.di import dagger.Module import dagger.android.ContributesAndroidInjector import info.nightscout.androidaps.activities.MyPreferenceFragment -import info.nightscout.plugins.aps.loop.LoopFragment import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderFragment import info.nightscout.androidaps.plugins.general.maintenance.MaintenanceFragment import info.nightscout.androidaps.plugins.general.overview.OverviewFragment import info.nightscout.androidaps.plugins.general.overview.dialogs.EditQuickWizardDialog import info.nightscout.androidaps.plugins.general.wear.WearFragment -import info.nightscout.androidaps.utils.protection.PasswordCheck -import info.nightscout.plugins.constraints.objectives.ObjectivesFragment -import info.nightscout.plugins.constraints.objectives.activities.ObjectivesExamDialog -import info.nightscout.plugins.constraints.objectives.dialogs.NtpProgressDialog -import info.nightscout.plugins.general.actions.ActionsFragment -import info.nightscout.ui.dialogs.WizardDialog @Module @Suppress("unused") @@ -22,19 +15,10 @@ abstract class FragmentsModule { @ContributesAndroidInjector abstract fun contributesPreferencesFragment(): MyPreferenceFragment - @ContributesAndroidInjector abstract fun contributesActionsFragment(): ActionsFragment @ContributesAndroidInjector abstract fun contributesConfigBuilderFragment(): ConfigBuilderFragment - @ContributesAndroidInjector abstract fun contributesObjectivesFragment(): ObjectivesFragment - @ContributesAndroidInjector abstract fun contributesOpenAPSFragment(): info.nightscout.plugins.aps.OpenAPSFragment @ContributesAndroidInjector abstract fun contributesOverviewFragment(): OverviewFragment - @ContributesAndroidInjector abstract fun contributesLoopFragment(): LoopFragment @ContributesAndroidInjector abstract fun contributesMaintenanceFragment(): MaintenanceFragment @ContributesAndroidInjector abstract fun contributesWearFragment(): WearFragment @ContributesAndroidInjector abstract fun contributesEditQuickWizardDialog(): EditQuickWizardDialog - - @ContributesAndroidInjector abstract fun contributesObjectivesExamDialog(): ObjectivesExamDialog - @ContributesAndroidInjector abstract fun contributesWizardDialog(): WizardDialog - @ContributesAndroidInjector abstract fun contributesNtpProgressDialog(): NtpProgressDialog - @ContributesAndroidInjector abstract fun contributesPasswordCheck(): PasswordCheck } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderFragment.kt index 2b09cfd633..a94327d7bf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderFragment.kt @@ -20,13 +20,13 @@ import info.nightscout.androidaps.activities.PreferencesActivity import info.nightscout.androidaps.activities.SingleFragmentActivity import info.nightscout.androidaps.databinding.ConfigbuilderFragmentBinding import info.nightscout.androidaps.plugins.configBuilder.events.EventConfigBuilderUpdateGui -import info.nightscout.androidaps.utils.protection.ProtectionCheck -import info.nightscout.androidaps.utils.protection.ProtectionCheck.Protection.PREFERENCES import info.nightscout.core.utils.fabric.FabricPrivacy import info.nightscout.interfaces.Config import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.plugin.PluginType +import info.nightscout.interfaces.protection.ProtectionCheck +import info.nightscout.interfaces.protection.ProtectionCheck.Protection.PREFERENCES import info.nightscout.rx.AapsSchedulers import info.nightscout.rx.bus.RxBus import info.nightscout.rx.events.EventRebuildTabs diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefsImpl.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefsImpl.kt index b1c903e96e..e486d2421d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefsImpl.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefsImpl.kt @@ -27,7 +27,6 @@ import info.nightscout.androidaps.activities.PreferencesActivity import info.nightscout.androidaps.diaconn.events.EventDiaconnG8PumpLogReset import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.plugins.general.maintenance.formats.EncryptedPrefsFormat -import info.nightscout.androidaps.utils.protection.PasswordCheck import info.nightscout.androidaps.utils.userEntry.UserEntryPresentationHelper import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.ui.dialogs.TwoMessagesAlertDialog @@ -48,6 +47,7 @@ import info.nightscout.interfaces.maintenance.PrefsFile import info.nightscout.interfaces.maintenance.PrefsFormat import info.nightscout.interfaces.maintenance.PrefsMetadataKey import info.nightscout.interfaces.maintenance.PrefsStatus +import info.nightscout.interfaces.protection.PasswordCheck import info.nightscout.interfaces.storage.Storage import info.nightscout.interfaces.utils.MidnightTime import info.nightscout.rx.bus.RxBus diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenanceFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenanceFragment.kt index 701f97db60..163a2ffecd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenanceFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/MaintenanceFragment.kt @@ -18,8 +18,6 @@ import info.nightscout.androidaps.plugins.general.maintenance.activities.LogSett import info.nightscout.androidaps.plugins.general.overview.OverviewData import info.nightscout.androidaps.plugins.pump.omnipod.dash.history.database.DashHistoryDatabase import info.nightscout.androidaps.plugins.pump.omnipod.eros.history.database.ErosHistoryDatabase -import info.nightscout.androidaps.utils.protection.ProtectionCheck -import info.nightscout.androidaps.utils.protection.ProtectionCheck.Protection.PREFERENCES import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.utils.fabric.FabricPrivacy import info.nightscout.database.entities.UserEntry.Action @@ -27,6 +25,8 @@ import info.nightscout.database.entities.UserEntry.Sources import info.nightscout.database.impl.AppRepository import info.nightscout.interfaces.iob.IobCobCalculator import info.nightscout.interfaces.maintenance.ImportExportPrefs +import info.nightscout.interfaces.protection.ProtectionCheck +import info.nightscout.interfaces.protection.ProtectionCheck.Protection.PREFERENCES import info.nightscout.interfaces.pump.PumpSync import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.utils.HtmlHelper diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt index d00e906186..65dc4188db 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt @@ -43,7 +43,6 @@ import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin import info.nightscout.androidaps.utils.DefaultValueHelper -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.automation.AutomationPlugin import info.nightscout.core.iob.displayText import info.nightscout.core.profile.toSignedUnitsString @@ -70,6 +69,7 @@ import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.defs.PumpType import info.nightscout.interfaces.ui.ActivityNames import info.nightscout.interfaces.utils.JsonHelper diff --git a/app/src/main/java/info/nightscout/androidaps/utils/ProcessLifecycleListener.kt b/app/src/main/java/info/nightscout/androidaps/utils/ProcessLifecycleListener.kt index e1bc3a719b..3160e80a0e 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/ProcessLifecycleListener.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/ProcessLifecycleListener.kt @@ -2,7 +2,7 @@ package info.nightscout.androidaps.utils import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner -import info.nightscout.androidaps.utils.protection.ProtectionCheck +import info.nightscout.interfaces.protection.ProtectionCheck import javax.inject.Inject class ProcessLifecycleListener @Inject constructor(private val protectionCheck: ProtectionCheck) : DefaultLifecycleObserver { diff --git a/core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/ProtectionCheck.kt b/core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/ProtectionCheck.kt deleted file mode 100644 index 27fb7c29f9..0000000000 --- a/core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/ProtectionCheck.kt +++ /dev/null @@ -1,109 +0,0 @@ -package info.nightscout.androidaps.utils.protection - -import androidx.fragment.app.FragmentActivity -import info.nightscout.core.main.R -import info.nightscout.shared.utils.DateUtil -import info.nightscout.shared.sharedPreferences.SP -import java.util.concurrent.TimeUnit -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class ProtectionCheck @Inject constructor( - val sp: SP, - val passwordCheck: PasswordCheck, - val dateUtil: DateUtil -) { - - private var lastAuthorization = mutableListOf(0L, 0L, 0L) - - enum class Protection { - PREFERENCES, - APPLICATION, - BOLUS - } - - enum class ProtectionType { - NONE, - BIOMETRIC, - MASTER_PASSWORD, - CUSTOM_PASSWORD, - CUSTOM_PIN - } - - private val passwordsResourceIDs = listOf( - R.string.key_settings_password, - R.string.key_application_password, - R.string.key_bolus_password) - - private val pinsResourceIDs = listOf( - R.string.key_settings_pin, - R.string.key_application_pin, - R.string.key_bolus_pin) - - private val protectionTypeResourceIDs = listOf( - R.string.key_settings_protection, - R.string.key_application_protection, - R.string.key_bolus_protection) - - private val titlePassResourceIDs = listOf( - R.string.settings_password, - R.string.application_password, - R.string.bolus_password) - - private val titlePinResourceIDs = listOf( - R.string.settings_pin, - R.string.application_pin, - R.string.bolus_pin) - - fun isLocked(protection: Protection): Boolean { - if (activeSession(protection)) { - return false - } - return when (ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionType.NONE.ordinal)]) { - ProtectionType.NONE -> false - ProtectionType.BIOMETRIC -> true - ProtectionType.MASTER_PASSWORD -> sp.getString(R.string.key_master_password, "") != "" - ProtectionType.CUSTOM_PASSWORD -> sp.getString(passwordsResourceIDs[protection.ordinal], "") != "" - ProtectionType.CUSTOM_PIN -> sp.getString(pinsResourceIDs[protection.ordinal], "") != "" - } - } - - fun resetAuthorization() { - lastAuthorization = mutableListOf(0L, 0L, 0L) - } - - private fun activeSession(protection: Protection): Boolean { - var timeout = TimeUnit.SECONDS.toMillis(sp.getInt(R.string.key_protection_timeout, 0).toLong()) - // Default timeout to pass the resume check at start of an activity - timeout = if (timeout < 1000) 1000 else timeout - val last = lastAuthorization[protection.ordinal] - val diff = dateUtil.now() - last - return diff < timeout - } - - private fun onOk(protection: Protection) { - lastAuthorization[protection.ordinal] = dateUtil.now() - } - - fun queryProtection(activity: FragmentActivity, protection: Protection, ok: Runnable?, cancel: Runnable? = null, fail: Runnable? = null) { - if (activeSession(protection)) { - onOk(protection) - ok?.run() - return - } - - when (ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionType.NONE.ordinal)]) { - ProtectionType.NONE -> - ok?.run() - ProtectionType.BIOMETRIC -> - BiometricCheck.biometricPrompt(activity, titlePassResourceIDs[protection.ordinal], { onOk(protection); ok?.run() }, cancel, fail, passwordCheck) - ProtectionType.MASTER_PASSWORD -> - passwordCheck.queryPassword(activity, R.string.master_password, R.string.key_master_password, { onOk(protection); ok?.run() }, { cancel?.run() }, { fail?.run() }) - ProtectionType.CUSTOM_PASSWORD -> - passwordCheck.queryPassword(activity, titlePassResourceIDs[protection.ordinal], passwordsResourceIDs[protection.ordinal], { onOk(protection); ok?.run() }, { cancel?.run() }, { fail?.run() }) - ProtectionType.CUSTOM_PIN -> - passwordCheck.queryPassword(activity, titlePinResourceIDs[protection.ordinal], pinsResourceIDs[protection.ordinal], { onOk(protection); ok?.run() }, { cancel?.run() }, { fail?.run() }, true) - } - } -} diff --git a/implementation/src/main/java/info/nightscout/implementation/di/ImplementationModule.kt b/implementation/src/main/java/info/nightscout/implementation/di/ImplementationModule.kt index ed7319efbb..fdb2f23ba0 100644 --- a/implementation/src/main/java/info/nightscout/implementation/di/ImplementationModule.kt +++ b/implementation/src/main/java/info/nightscout/implementation/di/ImplementationModule.kt @@ -6,18 +6,23 @@ import dagger.Module import dagger.Provides import info.nightscout.androidaps.plugins.constraints.versionChecker.VersionCheckerUtils import info.nightscout.androidaps.plugins.general.maintenance.formats.EncryptedPrefsFormat +import info.nightscout.core.utils.CryptoUtil import info.nightscout.core.utils.fabric.FabricPrivacy import info.nightscout.database.impl.AppRepository import info.nightscout.implementation.HardLimitsImpl import info.nightscout.implementation.logging.LoggerUtilsImpl import info.nightscout.implementation.maintenance.PrefFileListProviderImpl import info.nightscout.implementation.profiling.ProfilerImpl +import info.nightscout.implementation.protection.PasswordCheckImpl +import info.nightscout.implementation.protection.ProtectionCheckImpl import info.nightscout.implementation.pump.WarnColorsImpl import info.nightscout.implementation.resources.ResourceHelperImpl import info.nightscout.interfaces.Config import info.nightscout.interfaces.logging.LoggerUtils import info.nightscout.interfaces.maintenance.PrefFileListProvider import info.nightscout.interfaces.profiling.Profiler +import info.nightscout.interfaces.protection.PasswordCheck +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.WarnColors import info.nightscout.interfaces.storage.Storage import info.nightscout.interfaces.utils.HardLimits @@ -25,6 +30,7 @@ import info.nightscout.rx.bus.RxBus import info.nightscout.rx.logging.AAPSLogger import info.nightscout.shared.interfaces.ResourceHelper import info.nightscout.shared.sharedPreferences.SP +import info.nightscout.shared.utils.DateUtil import javax.inject.Singleton @Module( @@ -58,6 +64,14 @@ open class ImplementationModule { @Singleton fun provideLoggerUtils(prefFileListProvider: PrefFileListProvider): LoggerUtils = LoggerUtilsImpl(prefFileListProvider) + @Provides + @Singleton + fun providePasswordCheck(sp: SP, cryptoUtil: CryptoUtil): PasswordCheck = PasswordCheckImpl(sp, cryptoUtil) + + @Provides + @Singleton + fun provideProtectionCheck(sp: SP, passwordCheck: PasswordCheck, dateUtil: DateUtil): ProtectionCheck = ProtectionCheckImpl(sp, passwordCheck, dateUtil) + @Provides @Singleton fun providePrefFileListProvider( diff --git a/core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/BiometricCheck.kt b/implementation/src/main/java/info/nightscout/implementation/protection/BiometricCheck.kt similarity index 97% rename from core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/BiometricCheck.kt rename to implementation/src/main/java/info/nightscout/implementation/protection/BiometricCheck.kt index 9e1dbb77c6..385607eae1 100644 --- a/core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/BiometricCheck.kt +++ b/implementation/src/main/java/info/nightscout/implementation/protection/BiometricCheck.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.utils.protection +package info.nightscout.implementation.protection import androidx.biometric.BiometricPrompt import androidx.biometric.BiometricPrompt.AuthenticationResult @@ -19,6 +19,7 @@ import androidx.biometric.BiometricPrompt.PromptInfo import androidx.fragment.app.FragmentActivity import info.nightscout.core.main.R import info.nightscout.core.ui.toast.ToastUtils +import info.nightscout.interfaces.protection.PasswordCheck import info.nightscout.shared.extensions.runOnUiThread import java.util.concurrent.Executors diff --git a/core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/PasswordCheck.kt b/implementation/src/main/java/info/nightscout/implementation/protection/PasswordCheckImpl.kt similarity index 83% rename from core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/PasswordCheck.kt rename to implementation/src/main/java/info/nightscout/implementation/protection/PasswordCheckImpl.kt index e73d6ed9cc..6b45e31b06 100644 --- a/core/core-main/src/main/java/info/nightscout/androidaps/utils/protection/PasswordCheck.kt +++ b/implementation/src/main/java/info/nightscout/implementation/protection/PasswordCheckImpl.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.utils.protection +package info.nightscout.implementation.protection import android.annotation.SuppressLint import android.content.Context @@ -15,29 +15,26 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import info.nightscout.core.main.R import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.core.utils.CryptoUtil -import info.nightscout.interfaces.maintenance.PrefFileListProvider -import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.protection.PasswordCheck import info.nightscout.shared.sharedPreferences.SP -import java.io.File import javax.inject.Inject import javax.inject.Singleton -// since androidx.autofill.HintConstants are not available -const val AUTOFILL_HINT_NEW_PASSWORD = "newPassword" - @Singleton -class PasswordCheck @Inject constructor( +class PasswordCheckImpl @Inject constructor( private val sp: SP, - private val cryptoUtil: CryptoUtil, - private val fileListProvider: PrefFileListProvider, - private val activePlugin: ActivePlugin -) { + private val cryptoUtil: CryptoUtil +) : PasswordCheck { + + // since androidx.autofill.HintConstants are not available + @Suppress("PrivatePropertyName") + private val AUTOFILL_HINT_NEW_PASSWORD = "newPassword" /** Asks for "managed" kind of password, checking if it is valid. */ @SuppressLint("InflateParams") - fun queryPassword(context: Context, @StringRes labelId: Int, @StringRes preference: Int, ok: ((String) -> Unit)?, cancel: (() -> Unit)? = null, fail: (() -> Unit)? = null, pinInput: Boolean = false) { + override fun queryPassword(context: Context, @StringRes labelId: Int, @StringRes preference: Int, ok: ((String) -> Unit)?, cancel: (() -> Unit)?, fail: (() -> Unit)?, pinInput: Boolean) { val password = sp.getString(preference, "") if (password == "") { ok?.invoke("") @@ -99,7 +96,7 @@ class PasswordCheck @Inject constructor( } @SuppressLint("InflateParams") - fun setPassword(context: Context, @StringRes labelId: Int, @StringRes preference: Int, ok: ((String) -> Unit)? = null, cancel: (() -> Unit)? = null, clear: (() -> Unit)? = null, pinInput: Boolean = false) { + override fun setPassword(context: Context, @StringRes labelId: Int, @StringRes preference: Int, ok: ((String) -> Unit)?, cancel: (() -> Unit)?, clear: (() -> Unit)?, pinInput: Boolean) { val promptsView = LayoutInflater.from(context).inflate(R.layout.passwordprompt, null) val alertDialogBuilder = MaterialAlertDialogBuilder(context, R.style.DialogTheme) alertDialogBuilder.setView(promptsView) @@ -161,8 +158,10 @@ class PasswordCheck @Inject constructor( since this query does NOT check validity of password. */ @SuppressLint("InflateParams") - fun queryAnyPassword(context: Context, @StringRes labelId: Int, @StringRes preference: Int, @StringRes passwordExplanation: Int?, - @StringRes passwordWarning: Int?, ok: ((String) -> Unit)?, cancel: (() -> Unit)? = null) { + override fun queryAnyPassword( + context: Context, @StringRes labelId: Int, @StringRes preference: Int, @StringRes passwordExplanation: Int?, + @StringRes passwordWarning: Int?, ok: ((String) -> Unit)?, cancel: (() -> Unit)? + ) { val promptsView = LayoutInflater.from(context).inflate(R.layout.passwordprompt, null) val alertDialogBuilder = MaterialAlertDialogBuilder(context, R.style.DialogTheme) @@ -214,18 +213,4 @@ class PasswordCheck @Inject constructor( } } } - - /** - * Check for existing PasswordReset file and - * reset password to SN of active pump if file exists - */ - fun passwordResetCheck(context: Context) { - val passwordReset = File(fileListProvider.ensureExtraDirExists(), "PasswordReset") - if (passwordReset.exists()) { - val sn = activePlugin.activePump.serialNumber() - sp.putString(R.string.key_master_password, cryptoUtil.hashPassword(sn)) - passwordReset.delete() - ToastUtils.okToast(context, context.getString(R.string.password_set)) - } - } } diff --git a/implementation/src/main/java/info/nightscout/implementation/protection/ProtectionCheckImpl.kt b/implementation/src/main/java/info/nightscout/implementation/protection/ProtectionCheckImpl.kt new file mode 100644 index 0000000000..b4fc1aa9c4 --- /dev/null +++ b/implementation/src/main/java/info/nightscout/implementation/protection/ProtectionCheckImpl.kt @@ -0,0 +1,116 @@ +package info.nightscout.implementation.protection + +import androidx.fragment.app.FragmentActivity +import info.nightscout.core.main.R +import info.nightscout.interfaces.protection.PasswordCheck +import info.nightscout.interfaces.protection.ProtectionCheck +import info.nightscout.shared.sharedPreferences.SP +import info.nightscout.shared.utils.DateUtil +import java.util.concurrent.TimeUnit +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ProtectionCheckImpl @Inject constructor( + private val sp: SP, + private val passwordCheck: PasswordCheck, + private val dateUtil: DateUtil +) : ProtectionCheck { + + private var lastAuthorization = mutableListOf(0L, 0L, 0L) + + private val passwordsResourceIDs = listOf( + R.string.key_settings_password, + R.string.key_application_password, + R.string.key_bolus_password + ) + + private val pinsResourceIDs = listOf( + R.string.key_settings_pin, + R.string.key_application_pin, + R.string.key_bolus_pin) + + private val protectionTypeResourceIDs = listOf( + R.string.key_settings_protection, + R.string.key_application_protection, + R.string.key_bolus_protection) + + private val titlePassResourceIDs = listOf( + R.string.settings_password, + R.string.application_password, + R.string.bolus_password) + + private val titlePinResourceIDs = listOf( + R.string.settings_pin, + R.string.application_pin, + R.string.bolus_pin) + + override fun isLocked(protection: ProtectionCheck.Protection): Boolean { + if (activeSession(protection)) { + return false + } + return when (ProtectionCheck.ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionCheck.ProtectionType.NONE.ordinal)]) { + ProtectionCheck.ProtectionType.NONE -> false + ProtectionCheck.ProtectionType.BIOMETRIC -> true + ProtectionCheck.ProtectionType.MASTER_PASSWORD -> sp.getString(R.string.key_master_password, "") != "" + ProtectionCheck.ProtectionType.CUSTOM_PASSWORD -> sp.getString(passwordsResourceIDs[protection.ordinal], "") != "" + ProtectionCheck.ProtectionType.CUSTOM_PIN -> sp.getString(pinsResourceIDs[protection.ordinal], "") != "" + } + } + + override fun resetAuthorization() { + lastAuthorization = mutableListOf(0L, 0L, 0L) + } + + private fun activeSession(protection: ProtectionCheck.Protection): Boolean { + var timeout = TimeUnit.SECONDS.toMillis(sp.getInt(R.string.key_protection_timeout, 0).toLong()) + // Default timeout to pass the resume check at start of an activity + timeout = if (timeout < 1000) 1000 else timeout + val last = lastAuthorization[protection.ordinal] + val diff = dateUtil.now() - last + return diff < timeout + } + + private fun onOk(protection: ProtectionCheck.Protection) { + lastAuthorization[protection.ordinal] = dateUtil.now() + } + + override fun queryProtection(activity: FragmentActivity, protection: ProtectionCheck.Protection, ok: Runnable?, cancel: Runnable?, fail: Runnable?) { + if (activeSession(protection)) { + onOk(protection) + ok?.run() + return + } + + when (ProtectionCheck.ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionCheck.ProtectionType.NONE.ordinal)]) { + ProtectionCheck.ProtectionType.NONE -> + ok?.run() + + ProtectionCheck.ProtectionType.BIOMETRIC -> + BiometricCheck.biometricPrompt(activity, titlePassResourceIDs[protection.ordinal], { onOk(protection); ok?.run() }, cancel, fail, passwordCheck) + + ProtectionCheck.ProtectionType.MASTER_PASSWORD -> + passwordCheck.queryPassword(activity, R.string.master_password, R.string.key_master_password, { onOk(protection); ok?.run() }, { cancel?.run() }, { fail?.run() }) + + ProtectionCheck.ProtectionType.CUSTOM_PASSWORD -> + passwordCheck.queryPassword( + activity, + titlePassResourceIDs[protection.ordinal], + passwordsResourceIDs[protection.ordinal], + { onOk(protection); ok?.run() }, + { cancel?.run() }, + { fail?.run() }) + + ProtectionCheck.ProtectionType.CUSTOM_PIN -> + passwordCheck.queryPassword( + activity, + titlePinResourceIDs[protection.ordinal], + pinsResourceIDs[protection.ordinal], + { onOk(protection); ok?.run() }, + { cancel?.run() }, + { fail?.run() }, + true + ) + } + } +} diff --git a/interfaces/src/main/java/info/nightscout/interfaces/protection/PasswordCheck.kt b/interfaces/src/main/java/info/nightscout/interfaces/protection/PasswordCheck.kt new file mode 100644 index 0000000000..acc821552e --- /dev/null +++ b/interfaces/src/main/java/info/nightscout/interfaces/protection/PasswordCheck.kt @@ -0,0 +1,40 @@ +package info.nightscout.interfaces.protection + +import android.content.Context +import androidx.annotation.StringRes + +interface PasswordCheck { + + /** + * Asks for "managed" kind of password, checking if it is valid. + */ + fun queryPassword( + context: Context, + @StringRes labelId: Int, + @StringRes preference: Int, + ok: ((String) -> Unit)?, + cancel: (() -> Unit)? = null, + fail: (() -> Unit)? = null, + pinInput: Boolean = false + ) + + fun setPassword( + context: Context, + @StringRes labelId: Int, + @StringRes preference: Int, + ok: ((String) -> Unit)? = null, + cancel: (() -> Unit)? = null, + clear: (() -> Unit)? = null, + pinInput: Boolean = false + ) + + /** + * Prompt free-form password, with additional help and warning messages. + * Preference ID (preference) is used only to generate ID for password managers, + * since this query does NOT check validity of password. + */ + fun queryAnyPassword( + context: Context, @StringRes labelId: Int, @StringRes preference: Int, @StringRes passwordExplanation: Int?, + @StringRes passwordWarning: Int?, ok: ((String) -> Unit)?, cancel: (() -> Unit)? = null + ) +} \ No newline at end of file diff --git a/interfaces/src/main/java/info/nightscout/interfaces/protection/ProtectionCheck.kt b/interfaces/src/main/java/info/nightscout/interfaces/protection/ProtectionCheck.kt new file mode 100644 index 0000000000..8a2df60afe --- /dev/null +++ b/interfaces/src/main/java/info/nightscout/interfaces/protection/ProtectionCheck.kt @@ -0,0 +1,23 @@ +package info.nightscout.interfaces.protection + +import androidx.fragment.app.FragmentActivity + +interface ProtectionCheck { + enum class Protection { + PREFERENCES, + APPLICATION, + BOLUS + } + + enum class ProtectionType { + NONE, + BIOMETRIC, + MASTER_PASSWORD, + CUSTOM_PASSWORD, + CUSTOM_PIN + } + + fun isLocked(protection: Protection): Boolean + fun resetAuthorization() + fun queryProtection(activity: FragmentActivity, protection: Protection, ok: Runnable?, cancel: Runnable? = null, fail: Runnable? = null) +} \ No newline at end of file diff --git a/plugins/aps/src/main/java/info/nightscout/plugins/aps/di/ApsModule.kt b/plugins/aps/src/main/java/info/nightscout/plugins/aps/di/ApsModule.kt index adea2a0593..ff34136b4e 100644 --- a/plugins/aps/src/main/java/info/nightscout/plugins/aps/di/ApsModule.kt +++ b/plugins/aps/src/main/java/info/nightscout/plugins/aps/di/ApsModule.kt @@ -1,6 +1,8 @@ package info.nightscout.plugins.aps.di import dagger.Module +import dagger.android.ContributesAndroidInjector +import info.nightscout.plugins.aps.OpenAPSFragment import info.nightscout.plugins.di.AutotuneModule @Module( @@ -11,4 +13,6 @@ import info.nightscout.plugins.di.AutotuneModule ) @Suppress("unused") -abstract class ApsModule \ No newline at end of file +abstract class ApsModule { + @ContributesAndroidInjector abstract fun contributesOpenAPSFragment(): OpenAPSFragment +} \ No newline at end of file diff --git a/plugins/configuration/src/main/java/info/nightscout/configuration/setupwizard/elements/SWItem.kt b/plugins/configuration/src/main/java/info/nightscout/configuration/setupwizard/elements/SWItem.kt index 9dd004bb88..820286b22e 100644 --- a/plugins/configuration/src/main/java/info/nightscout/configuration/setupwizard/elements/SWItem.kt +++ b/plugins/configuration/src/main/java/info/nightscout/configuration/setupwizard/elements/SWItem.kt @@ -7,7 +7,7 @@ import android.widget.LinearLayout import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity import dagger.android.HasAndroidInjector -import info.nightscout.androidaps.utils.protection.PasswordCheck +import info.nightscout.interfaces.protection.PasswordCheck import info.nightscout.rx.bus.RxBus import info.nightscout.rx.events.EventPreferenceChange import info.nightscout.rx.events.EventSWUpdate diff --git a/plugins/main/src/main/java/info/nightscout/plugins/di/ActionsModule.kt b/plugins/main/src/main/java/info/nightscout/plugins/di/ActionsModule.kt new file mode 100644 index 0000000000..e757edb790 --- /dev/null +++ b/plugins/main/src/main/java/info/nightscout/plugins/di/ActionsModule.kt @@ -0,0 +1,12 @@ +package info.nightscout.plugins.di + +import dagger.Module +import dagger.android.ContributesAndroidInjector +import info.nightscout.plugins.general.actions.ActionsFragment + +@Module +@Suppress("unused") +abstract class ActionsModule { + + @ContributesAndroidInjector abstract fun contributesActionsFragment(): ActionsFragment +} \ No newline at end of file diff --git a/plugins/main/src/main/java/info/nightscout/plugins/di/LoopModule.kt b/plugins/main/src/main/java/info/nightscout/plugins/di/LoopModule.kt index b253e7b8fe..97cd0b00a2 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/di/LoopModule.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/di/LoopModule.kt @@ -3,10 +3,11 @@ package info.nightscout.plugins.di import dagger.Module import dagger.android.ContributesAndroidInjector import info.nightscout.plugins.aps.loop.CarbSuggestionReceiver +import info.nightscout.plugins.aps.loop.LoopFragment @Module @Suppress("unused") abstract class LoopModule { - + @ContributesAndroidInjector abstract fun contributesLoopFragment(): LoopFragment @ContributesAndroidInjector abstract fun contributesCarbSuggestionReceiver(): CarbSuggestionReceiver } \ No newline at end of file diff --git a/plugins/main/src/main/java/info/nightscout/plugins/di/ObjectivesModule.kt b/plugins/main/src/main/java/info/nightscout/plugins/di/ObjectivesModule.kt index b9c9943ebf..c6adf3c874 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/di/ObjectivesModule.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/di/ObjectivesModule.kt @@ -2,6 +2,9 @@ package info.nightscout.plugins.di import dagger.Module import dagger.android.ContributesAndroidInjector +import info.nightscout.plugins.constraints.objectives.ObjectivesFragment +import info.nightscout.plugins.constraints.objectives.activities.ObjectivesExamDialog +import info.nightscout.plugins.constraints.objectives.dialogs.NtpProgressDialog import info.nightscout.plugins.constraints.objectives.objectives.Objective import info.nightscout.plugins.constraints.objectives.objectives.Objective0 import info.nightscout.plugins.constraints.objectives.objectives.Objective1 @@ -18,6 +21,10 @@ import info.nightscout.plugins.constraints.objectives.objectives.Objective9 @Suppress("unused") abstract class ObjectivesModule { + @ContributesAndroidInjector abstract fun contributesObjectivesFragment(): ObjectivesFragment + @ContributesAndroidInjector abstract fun contributesObjectivesExamDialog(): ObjectivesExamDialog + @ContributesAndroidInjector abstract fun contributesNtpProgressDialog(): NtpProgressDialog + @ContributesAndroidInjector abstract fun objectiveInjector(): Objective @ContributesAndroidInjector abstract fun objective0Injector(): Objective0 @ContributesAndroidInjector abstract fun objective1Injector(): Objective1 @@ -29,5 +36,4 @@ abstract class ObjectivesModule { @ContributesAndroidInjector abstract fun objective7Injector(): Objective7 @ContributesAndroidInjector abstract fun objective9Injector(): Objective9 @ContributesAndroidInjector abstract fun objective10Injector(): Objective10 - } \ No newline at end of file diff --git a/plugins/main/src/main/java/info/nightscout/plugins/di/PluginsModule.kt b/plugins/main/src/main/java/info/nightscout/plugins/di/PluginsModule.kt index 0101840517..b981fc8a37 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/di/PluginsModule.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/di/PluginsModule.kt @@ -14,7 +14,8 @@ import dagger.Module ObjectivesModule::class, SkinsModule::class, SkinsUiModule::class, - LoopModule::class + LoopModule::class, + ActionsModule::class ] ) diff --git a/plugins/main/src/main/java/info/nightscout/plugins/general/actions/ActionsFragment.kt b/plugins/main/src/main/java/info/nightscout/plugins/general/actions/ActionsFragment.kt index daf0109584..adcd6cc455 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/general/actions/ActionsFragment.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/general/actions/ActionsFragment.kt @@ -13,7 +13,6 @@ import dagger.android.support.DaggerFragment import info.nightscout.androidaps.extensions.toStringMedium import info.nightscout.androidaps.extensions.toStringShort import info.nightscout.androidaps.logging.UserEntryLogger -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.ui.UIRunnable import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.ui.elements.SingleClickButton @@ -27,6 +26,7 @@ import info.nightscout.interfaces.aps.Loop import info.nightscout.interfaces.iob.IobCobCalculator import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.actions.CustomAction import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue diff --git a/plugins/main/src/main/java/info/nightscout/plugins/general/food/FoodFragment.kt b/plugins/main/src/main/java/info/nightscout/plugins/general/food/FoodFragment.kt index 0aba61c476..92adc4991b 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/general/food/FoodFragment.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/general/food/FoodFragment.kt @@ -13,7 +13,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import dagger.android.support.DaggerFragment import info.nightscout.androidaps.logging.UserEntryLogger -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.ui.UIRunnable import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.utils.fabric.FabricPrivacy @@ -22,6 +21,7 @@ import info.nightscout.database.entities.UserEntry.Action import info.nightscout.database.entities.UserEntry.Sources import info.nightscout.database.impl.AppRepository import info.nightscout.database.impl.transactions.InvalidateFoodTransaction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.ui.ActivityNames import info.nightscout.plugins.R import info.nightscout.plugins.databinding.FoodFragmentBinding diff --git a/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfileFragment.kt b/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfileFragment.kt index a5c6dec506..d936de4c4f 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfileFragment.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfileFragment.kt @@ -13,7 +13,6 @@ import dagger.android.support.DaggerFragment import info.nightscout.androidaps.data.ProfileSealed import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.utils.DecimalFormatter -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.profile.fromMgdlToUnits import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.utils.fabric.FabricPrivacy @@ -24,6 +23,7 @@ import info.nightscout.interfaces.GlucoseUnit import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.ui.ActivityNames import info.nightscout.interfaces.utils.HardLimits import info.nightscout.plugins.R diff --git a/pump/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/OmnipodDashOverviewFragment.kt b/pump/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/OmnipodDashOverviewFragment.kt index 709ad7a36d..079cb333c0 100644 --- a/pump/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/OmnipodDashOverviewFragment.kt +++ b/pump/omnipod-dash/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dash/ui/OmnipodDashOverviewFragment.kt @@ -25,13 +25,13 @@ import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.definitio import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.definition.AlertType import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.definition.PodConstants import info.nightscout.androidaps.plugins.pump.omnipod.dash.driver.pod.state.OmnipodDashPodStateManager -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.ui.UIRunnable import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.utils.fabric.FabricPrivacy import info.nightscout.interfaces.Config import info.nightscout.interfaces.Constants import info.nightscout.interfaces.notifications.Notification +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue import info.nightscout.interfaces.ui.ActivityNames diff --git a/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/OmnipodErosOverviewFragment.kt b/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/OmnipodErosOverviewFragment.kt index 712badadc2..795cc22a7f 100644 --- a/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/OmnipodErosOverviewFragment.kt +++ b/pump/omnipod-eros/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/eros/ui/OmnipodErosOverviewFragment.kt @@ -34,12 +34,12 @@ import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodE import info.nightscout.androidaps.plugins.pump.omnipod.eros.queue.command.CommandGetPodStatus import info.nightscout.androidaps.plugins.pump.omnipod.eros.util.AapsOmnipodUtil import info.nightscout.androidaps.plugins.pump.omnipod.eros.util.OmnipodAlertUtil -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.utils.fabric.FabricPrivacy import info.nightscout.interfaces.Constants import info.nightscout.interfaces.notifications.Notification import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue import info.nightscout.interfaces.ui.ActivityNames diff --git a/ui/src/main/java/info/nightscout/ui/di/UiModule.kt b/ui/src/main/java/info/nightscout/ui/di/UiModule.kt index 04fc9f37d8..6dacdebb0f 100644 --- a/ui/src/main/java/info/nightscout/ui/di/UiModule.kt +++ b/ui/src/main/java/info/nightscout/ui/di/UiModule.kt @@ -28,6 +28,7 @@ import info.nightscout.ui.dialogs.ProfileViewerDialog import info.nightscout.ui.dialogs.TempBasalDialog import info.nightscout.ui.dialogs.TempTargetDialog import info.nightscout.ui.dialogs.TreatmentDialog +import info.nightscout.ui.dialogs.WizardDialog import info.nightscout.ui.dialogs.WizardInfoDialog import info.nightscout.ui.widget.Widget import info.nightscout.ui.widget.WidgetConfigureActivity @@ -39,6 +40,7 @@ abstract class UiModule { @ContributesAndroidInjector abstract fun contributesWidget(): Widget @ContributesAndroidInjector abstract fun contributesWidgetConfigureActivity(): WidgetConfigureActivity + @ContributesAndroidInjector abstract fun contributesWizardDialog(): WizardDialog @ContributesAndroidInjector abstract fun contributesCalibrationDialog(): CalibrationDialog @ContributesAndroidInjector abstract fun contributesCarbsDialog(): CarbsDialog @ContributesAndroidInjector abstract fun contributesCareDialog(): CareDialog diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/CarbsDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/CarbsDialog.kt index 13401515fc..41cd1a7ab5 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/CarbsDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/CarbsDialog.kt @@ -13,8 +13,6 @@ import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider import info.nightscout.androidaps.utils.DecimalFormatter import info.nightscout.androidaps.utils.DefaultValueHelper -import info.nightscout.androidaps.utils.protection.ProtectionCheck -import info.nightscout.androidaps.utils.protection.ProtectionCheck.Protection.BOLUS import info.nightscout.core.profile.toMgdl import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.ui.toast.ToastUtils @@ -33,6 +31,8 @@ import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.iob.IobCobCalculator import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck +import info.nightscout.interfaces.protection.ProtectionCheck.Protection.BOLUS import info.nightscout.interfaces.pump.DetailedBolusInfo import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/ExtendedBolusDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/ExtendedBolusDialog.kt index c96da8feb0..eaac34a6ad 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/ExtendedBolusDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/ExtendedBolusDialog.kt @@ -8,7 +8,6 @@ import android.view.ViewGroup import com.google.common.base.Joiner import info.nightscout.androidaps.dialogs.DialogFragmentWithDate import info.nightscout.androidaps.logging.UserEntryLogger -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.core.utils.extensions.formatColor @@ -17,6 +16,7 @@ import info.nightscout.database.entities.ValueWithUnit import info.nightscout.interfaces.constraints.Constraint import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue import info.nightscout.interfaces.ui.ActivityNames diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/FillDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/FillDialog.kt index 476a8e058b..33686f28fd 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/FillDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/FillDialog.kt @@ -9,7 +9,6 @@ import com.google.common.base.Joiner import info.nightscout.androidaps.dialogs.DialogFragmentWithDate import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.utils.DecimalFormatter -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.core.utils.extensions.formatColor @@ -21,6 +20,7 @@ import info.nightscout.database.impl.transactions.InsertIfNewByTimestampTherapyE import info.nightscout.interfaces.constraints.Constraint import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.DetailedBolusInfo import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/InsulinDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/InsulinDialog.kt index ede241bce6..ab7d99f70b 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/InsulinDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/InsulinDialog.kt @@ -12,7 +12,6 @@ import info.nightscout.androidaps.dialogs.DialogFragmentWithDate import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.utils.DecimalFormatter import info.nightscout.androidaps.utils.DefaultValueHelper -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.profile.toMgdl import info.nightscout.core.pump.insertBolusTransaction import info.nightscout.core.ui.dialogs.OKDialog @@ -31,6 +30,7 @@ import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.DetailedBolusInfo import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/LoopDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/LoopDialog.kt index 83442c6064..6e66ba027a 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/LoopDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/LoopDialog.kt @@ -12,7 +12,6 @@ import android.view.WindowManager import androidx.fragment.app.FragmentManager import dagger.android.support.DaggerDialogFragment import info.nightscout.androidaps.logging.UserEntryLogger -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.core.utils.fabric.FabricPrivacy @@ -31,6 +30,7 @@ import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.defs.PumpDescription import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/ProfileSwitchDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/ProfileSwitchDialog.kt index c0a675c948..407e803be8 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/ProfileSwitchDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/ProfileSwitchDialog.kt @@ -13,7 +13,6 @@ import info.nightscout.androidaps.data.ProfileSealed import info.nightscout.androidaps.dialogs.DialogFragmentWithDate import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.utils.DefaultValueHelper -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.profile.toMgdl import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.ui.toast.ToastUtils @@ -27,6 +26,7 @@ import info.nightscout.interfaces.Constants import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.utils.HardLimits import info.nightscout.interfaces.utils.HtmlHelper import info.nightscout.rx.bus.RxBus diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/TempBasalDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/TempBasalDialog.kt index 51febe4abf..9c8616b2a5 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/TempBasalDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/TempBasalDialog.kt @@ -8,7 +8,6 @@ import android.view.ViewGroup import com.google.common.base.Joiner import info.nightscout.androidaps.dialogs.DialogFragmentWithDate import info.nightscout.androidaps.logging.UserEntryLogger -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.ui.dialogs.OKDialog import info.nightscout.core.ui.toast.ToastUtils import info.nightscout.core.utils.extensions.formatColor @@ -18,6 +17,7 @@ import info.nightscout.interfaces.constraints.Constraint import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.PumpSync import info.nightscout.interfaces.pump.defs.PumpDescription import info.nightscout.interfaces.queue.Callback diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/TempTargetDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/TempTargetDialog.kt index 63301cd664..605e3a3e5e 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/TempTargetDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/TempTargetDialog.kt @@ -11,7 +11,6 @@ import com.google.common.collect.Lists import info.nightscout.androidaps.dialogs.DialogFragmentWithDate import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.utils.DefaultValueHelper -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.profile.toCurrentUnitsString import info.nightscout.core.profile.toMgdl import info.nightscout.core.ui.dialogs.OKDialog @@ -28,6 +27,7 @@ import info.nightscout.interfaces.GlucoseUnit import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.utils.HtmlHelper import info.nightscout.rx.logging.LTag import info.nightscout.shared.interfaces.ResourceHelper diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/TreatmentDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/TreatmentDialog.kt index 96b4188fbf..29d2b1dc24 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/TreatmentDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/TreatmentDialog.kt @@ -11,7 +11,6 @@ import com.google.common.base.Joiner import info.nightscout.androidaps.dialogs.DialogFragmentWithDate import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.utils.DecimalFormatter -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.pump.insertBolusTransaction import info.nightscout.core.pump.insertCarbsTransaction import info.nightscout.core.ui.dialogs.OKDialog @@ -24,6 +23,7 @@ import info.nightscout.interfaces.Config import info.nightscout.interfaces.constraints.Constraint import info.nightscout.interfaces.constraints.Constraints import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.DetailedBolusInfo import info.nightscout.interfaces.queue.Callback import info.nightscout.interfaces.queue.CommandQueue diff --git a/ui/src/main/java/info/nightscout/ui/dialogs/WizardDialog.kt b/ui/src/main/java/info/nightscout/ui/dialogs/WizardDialog.kt index 4620272696..28711069ae 100644 --- a/ui/src/main/java/info/nightscout/ui/dialogs/WizardDialog.kt +++ b/ui/src/main/java/info/nightscout/ui/dialogs/WizardDialog.kt @@ -21,7 +21,6 @@ import dagger.android.support.DaggerDialogFragment import info.nightscout.androidaps.data.ProfileSealed import info.nightscout.androidaps.extensions.valueToUnits import info.nightscout.androidaps.utils.DecimalFormatter -import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.core.iob.round import info.nightscout.core.profile.toMgdl import info.nightscout.core.profile.toUnitsString @@ -39,6 +38,7 @@ import info.nightscout.interfaces.iob.IobCobCalculator import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.utils.HtmlHelper import info.nightscout.interfaces.utils.Round import info.nightscout.rx.AapsSchedulers