diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.kt b/android/android-base/src/main/java/org/isoron/androidbase/ActivityContext.kt similarity index 92% rename from android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.kt rename to android/android-base/src/main/java/org/isoron/androidbase/ActivityContext.kt index 3ff33478d..22a285cd1 100644 --- a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.kt +++ b/android/android-base/src/main/java/org/isoron/androidbase/ActivityContext.kt @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ -package org.isoron.androidbase.activities +package org.isoron.androidbase import javax.inject.* diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContextModule.java b/android/android-base/src/main/java/org/isoron/androidbase/ActivityContextModule.java similarity index 90% rename from android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContextModule.java rename to android/android-base/src/main/java/org/isoron/androidbase/ActivityContextModule.java index af7e26442..88d7da3af 100644 --- a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContextModule.java +++ b/android/android-base/src/main/java/org/isoron/androidbase/ActivityContextModule.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Álinson Santos Xavier + * Copyright (C) 2016-2020 Álinson Santos Xavier * * This file is part of Loop Habit Tracker. * @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.androidbase.activities; +package org.isoron.androidbase; import android.content.*; diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.kt b/android/android-base/src/main/java/org/isoron/androidbase/ActivityScope.kt similarity index 92% rename from android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.kt rename to android/android-base/src/main/java/org/isoron/androidbase/ActivityScope.kt index 957e980da..df4386329 100644 --- a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.kt +++ b/android/android-base/src/main/java/org/isoron/androidbase/ActivityScope.kt @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ -package org.isoron.androidbase.activities +package org.isoron.androidbase import javax.inject.* diff --git a/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.kt b/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.kt index c6907f3ec..cf66b9220 100644 --- a/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.kt +++ b/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.kt @@ -18,9 +18,9 @@ */ package org.isoron.androidbase -import org.isoron.androidbase.activities.BaseActivity +import android.app.* -class BaseExceptionHandler(private val activity: BaseActivity) : Thread.UncaughtExceptionHandler { +class BaseExceptionHandler(private val activity: Activity) : Thread.UncaughtExceptionHandler { private val originalHandler: Thread.UncaughtExceptionHandler? = Thread.getDefaultUncaughtExceptionHandler() diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivity.kt b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivity.kt deleted file mode 100644 index 617aad65a..000000000 --- a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivity.kt +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2016 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker 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 . - */ -package org.isoron.androidbase.activities - -import android.R.anim -import android.content.* -import android.os.* -import android.view.* -import androidx.appcompat.app.* -import org.isoron.androidbase.* - -/** - * Base class for all activities in the application. - * - * This class delegates the responsibilities of an Android activity to other classes. For example, - * callbacks related to menus are forwarded to a []BaseMenu], while callbacks related to activity - * results are forwarded to a [BaseScreen]. - * - * - * A BaseActivity also installs an [java.lang.Thread.UncaughtExceptionHandler] to the main thread. - * By default, this handler is an instance of BaseExceptionHandler, which logs the exception to the - * disk before the application crashes. To the default handler, you should override the method - * getExceptionHandler. - */ -abstract class BaseActivity : AppCompatActivity() { - private var screen: BaseScreen? = null - - fun restartWithFade(cls: Class<*>?) { - Handler().postDelayed({ - finish() - overridePendingTransition(anim.fade_in, anim.fade_out) - startActivity(Intent(this, cls)) - }, 500) // HACK: Let the menu disappear first - } - - fun setScreen(screen: BaseScreen?) { - this.screen = screen - } - - fun showDialog(dialog: AppCompatDialogFragment, tag: String?) { - dialog.show(supportFragmentManager, tag) - } - - fun showDialog(dialog: AppCompatDialog) { - dialog.show() - } - - override fun onActivityResult(request: Int, result: Int, data: Intent?) { - val screen = screen - if(screen == null) super.onActivityResult(request, result, data) - else screen.onResult(request, result, data) - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - Thread.setDefaultUncaughtExceptionHandler(getExceptionHandler()) - } - - private fun getExceptionHandler() = BaseExceptionHandler(this) - - override fun onResume() { - super.onResume() - screen?.reattachDialogs() - } -} \ No newline at end of file diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivityModule.java b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivityModule.java deleted file mode 100644 index 96e5ec476..000000000 --- a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivityModule.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2016 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker 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 . - */ - -package org.isoron.androidbase.activities; - -import dagger.*; - -@Module -public class BaseActivityModule -{ - private BaseActivity activity; - - public BaseActivityModule(BaseActivity activity) - { - this.activity = activity; - } - - @Provides - public BaseActivity getBaseActivity() - { - return activity; - } -} diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseScreen.kt b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseScreen.kt deleted file mode 100644 index 4ef72cd91..000000000 --- a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseScreen.kt +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2016 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker 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, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker 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 . - */ -package org.isoron.androidbase.activities - -import android.content.* -import android.graphics.* -import android.graphics.drawable.* -import android.view.* -import android.widget.* -import androidx.annotation.* -import androidx.appcompat.app.* -import androidx.appcompat.view.ActionMode -import androidx.appcompat.widget.Toolbar -import androidx.core.content.* -import com.google.android.material.snackbar.* -import org.isoron.androidbase.* -import org.isoron.androidbase.utils.* -import org.isoron.androidbase.utils.ColorUtils.mixColors -import org.isoron.androidbase.utils.InterfaceUtils.dpToPixels -import java.io.* - -/** - * Base class for all screens in the application. - * - * Screens are responsible for deciding what root views and what menus should be attached to the - * main window. They are also responsible for showing other screens and for receiving their results. - */ -open class BaseScreen(@JvmField protected var activity: BaseActivity) { - - private var snackbar: Snackbar? = null - - /** - * Called when another Activity has finished, and has returned some result. - * - * @param requestCode the request code originally supplied to startActivityForResult. - * @param resultCode the result code sent by the other activity. - * @param data an Intent containing extra data sent by the other - * activity. - * @see {@link android.app.Activity.onActivityResult - */ - open fun onResult(requestCode: Int, resultCode: Int, data: Intent?) {} - - /** - * Called after activity has been recreated, and the dialogs should be - * reattached to their controllers. - */ - open fun reattachDialogs() {} - - - /** - * Shows a message on the screen. - * - * @param stringId the string resource id for this message. - */ - fun showMessage(@StringRes stringId: Int?, rootView: View?) { - var snackbar = this.snackbar - if (stringId == null || rootView == null) return - if (snackbar == null) { - snackbar = Snackbar.make(rootView, stringId, Snackbar.LENGTH_SHORT) - val tvId = R.id.snackbar_text - val tv = snackbar.view.findViewById(tvId) - tv.setTextColor(Color.WHITE) - this.snackbar = snackbar - } - snackbar.setText(stringId) - snackbar.show() - } - - fun showSendEmailScreen(@StringRes toId: Int, @StringRes subjectId: Int, content: String?) { - val to = activity.getString(toId) - val subject = activity.getString(subjectId) - activity.startActivity(Intent().apply { - action = Intent.ACTION_SEND - type = "message/rfc822" - putExtra(Intent.EXTRA_EMAIL, arrayOf(to)) - putExtra(Intent.EXTRA_SUBJECT, subject) - putExtra(Intent.EXTRA_TEXT, content) - }) - } - - fun showSendFileScreen(archiveFilename: String) { - val file = File(archiveFilename) - val fileUri = FileProvider.getUriForFile(activity, "org.isoron.uhabits", file) - activity.startActivity(Intent().apply { - action = Intent.ACTION_SEND - type = "application/zip" - putExtra(Intent.EXTRA_STREAM, fileUri) - flags = Intent.FLAG_GRANT_READ_URI_PERMISSION - }) - } -} \ No newline at end of file diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java index ce4664b2a..06385ad9b 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java @@ -33,9 +33,7 @@ import androidx.test.uiautomator.*; import junit.framework.*; import org.isoron.androidbase.*; -import org.isoron.androidbase.activities.*; import org.isoron.androidbase.utils.*; -import org.isoron.uhabits.core.database.*; import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.preferences.*; import org.isoron.uhabits.core.tasks.*; diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt index 79d34cad9..bb60854ba 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt @@ -20,11 +20,10 @@ package org.isoron.uhabits import dagger.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.uhabits.activities.* import org.isoron.uhabits.activities.habits.list.* import org.isoron.uhabits.activities.habits.list.views.* -import org.isoron.uhabits.activities.habits.show.* import org.isoron.uhabits.core.ui.screens.habits.list.* import org.mockito.Mockito.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt index c0d5bd786..55187acf8 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt @@ -20,25 +20,25 @@ package org.isoron.uhabits.activities import android.app.* +import android.content.* import android.content.res.Configuration.* import android.os.Build.VERSION.* import androidx.core.content.* -import org.isoron.androidbase.activities.* -import org.isoron.uhabits.* +import org.isoron.androidbase.* +import org.isoron.uhabits.R import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.ui.* -import javax.inject.* @ActivityScope class AndroidThemeSwitcher constructor( - private val activity: Activity, + @ActivityContext val context: Context, preferences: Preferences ) : ThemeSwitcher(preferences) { override fun getSystemTheme(): Int { - if(SDK_INT < 29) return THEME_LIGHT; - val uiMode = activity.resources.configuration.uiMode + if (SDK_INT < 29) return THEME_LIGHT; + val uiMode = context.resources.configuration.uiMode return if ((uiMode and UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES) { THEME_DARK; } else { @@ -47,25 +47,18 @@ constructor( } override fun applyDarkTheme() { - activity.setTheme(R.style.AppBaseThemeDark) - activity.window.navigationBarColor = - ContextCompat.getColor(activity, R.color.grey_900) + context.setTheme(R.style.AppBaseThemeDark) + (context as Activity).window.navigationBarColor = + ContextCompat.getColor(context, R.color.grey_900) } override fun applyLightTheme() { - activity.setTheme(R.style.AppBaseTheme) + context.setTheme(R.style.AppBaseTheme) } override fun applyPureBlackTheme() { - activity.setTheme(R.style.AppBaseThemeDark_PureBlack) - activity.window.navigationBarColor = - ContextCompat.getColor(activity, R.color.black) - } - - fun getDialogTheme(): Int { - return when { - isNightMode -> R.style.DarkDialogWithTitle - else -> R.style.DialogWithTitle - } + context.setTheme(R.style.AppBaseThemeDark_PureBlack) + (context as Activity).window.navigationBarColor = + ContextCompat.getColor(context, R.color.black) } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivity.kt index 47175d7b1..5efb38ba0 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivity.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivity.kt @@ -21,11 +21,12 @@ package org.isoron.uhabits.activities import android.content.* import android.os.* -import org.isoron.androidbase.activities.* +import androidx.appcompat.app.* +import org.isoron.androidbase.* import org.isoron.uhabits.* import org.isoron.uhabits.core.models.* -abstract class HabitsActivity : BaseActivity() { +abstract class HabitsActivity : AppCompatActivity() { lateinit var component: HabitsActivityComponent lateinit var appComponent: HabitsApplicationComponent @@ -43,8 +44,6 @@ abstract class HabitsActivity : BaseActivity() { component = DaggerHabitsActivityComponent .builder() .activityContextModule(ActivityContextModule(this)) - .baseActivityModule(BaseActivityModule(this)) - .habitModule(HabitModule(habit)) .habitsApplicationComponent(appComponent) .build() diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityComponent.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityComponent.kt index 93e7dce7e..8fc66c304 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityComponent.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityComponent.kt @@ -20,20 +20,17 @@ package org.isoron.uhabits.activities import dagger.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.uhabits.* -import org.isoron.uhabits.activities.about.* import org.isoron.uhabits.activities.common.dialogs.* import org.isoron.uhabits.activities.habits.list.* import org.isoron.uhabits.activities.habits.list.views.* -import org.isoron.uhabits.activities.habits.show.* import org.isoron.uhabits.core.ui.* import org.isoron.uhabits.core.ui.screens.habits.list.* @ActivityScope @Component(modules = arrayOf( ActivityContextModule::class, - BaseActivityModule::class, HabitsActivityModule::class, ListHabitsModule::class, HabitModule::class diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityModule.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityModule.kt index e074c17c4..3cccd2109 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityModule.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityModule.kt @@ -19,8 +19,9 @@ package org.isoron.uhabits.activities +import android.content.* import dagger.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.ui.* @@ -29,9 +30,10 @@ class HabitsActivityModule { @Provides @ActivityScope - fun getThemeSwitcher(activity: BaseActivity, - prefs: Preferences - ): ThemeSwitcher { - return AndroidThemeSwitcher(activity, prefs) + fun getThemeSwitcher( + @ActivityContext context: Context, + prefs: Preferences + ): ThemeSwitcher { + return AndroidThemeSwitcher(context, prefs) } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java index ad47801ab..360937e20 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java @@ -21,7 +21,7 @@ package org.isoron.uhabits.activities.common.dialogs; import android.content.*; -import org.isoron.androidbase.activities.*; +import org.isoron.androidbase.*; import org.isoron.androidbase.utils.*; import org.isoron.uhabits.R; import org.isoron.uhabits.core.models.*; diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java index a84384952..e130c9a25 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java @@ -27,9 +27,9 @@ import androidx.appcompat.app.*; import com.google.auto.factory.*; -import org.isoron.androidbase.activities.*; -import org.isoron.uhabits.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.core.ui.callbacks.*; +import org.isoron.uhabits.R; /** * Dialog that asks the user confirmation before executing a delete operation. diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmSyncKeyDialog.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmSyncKeyDialog.java index 82fe12c51..5a6017ec6 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmSyncKeyDialog.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmSyncKeyDialog.java @@ -27,9 +27,9 @@ import androidx.appcompat.app.*; import com.google.auto.factory.*; -import org.isoron.androidbase.activities.*; -import org.isoron.uhabits.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.core.ui.callbacks.*; +import org.isoron.uhabits.R; @AutoFactory(allowSubclasses = true) public class ConfirmSyncKeyDialog extends AlertDialog diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt index d50907100..04fa5b119 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt @@ -26,9 +26,9 @@ import android.view.* import android.view.WindowManager.LayoutParams.* import android.view.inputmethod.* import android.widget.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.androidbase.utils.* -import org.isoron.uhabits.* +import org.isoron.uhabits.R import org.isoron.uhabits.core.ui.screens.habits.list.* import javax.inject.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index 90ad83c59..1e4444ddb 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -19,10 +19,11 @@ package org.isoron.uhabits.activities.habits.list +import android.content.* import android.os.* import android.view.* import kotlinx.coroutines.* -import org.isoron.uhabits.* +import org.isoron.androidbase.* import org.isoron.uhabits.activities.* import org.isoron.uhabits.activities.habits.list.views.* import org.isoron.uhabits.core.preferences.* @@ -31,6 +32,7 @@ import org.isoron.uhabits.core.tasks.* import org.isoron.uhabits.core.ui.ThemeSwitcher.* import org.isoron.uhabits.core.utils.* import org.isoron.uhabits.database.* +import org.isoron.uhabits.utils.* class ListHabitsActivity : HabitsActivity() { @@ -57,8 +59,7 @@ class ListHabitsActivity : HabitsActivity() { adapter = component.habitCardListAdapter taskRunner = appComponent.taskRunner menu = component.listHabitsMenu - - setScreen(screen) + Thread.setDefaultUncaughtExceptionHandler(BaseExceptionHandler(this)) component.listHabitsBehavior.onStartup() setContentView(rootView) } @@ -98,4 +99,9 @@ class ListHabitsActivity : HabitsActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { return menu.onItemSelected(item) } + + override fun onActivityResult(request: Int, result: Int, data: Intent?) { + super.onActivityResult(request, result, data) + screen.onResult(request, result, data) + } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt index 944d1a848..932b007ae 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt @@ -19,9 +19,11 @@ package org.isoron.uhabits.activities.habits.list +import android.content.* import android.view.* -import org.isoron.androidbase.activities.* -import org.isoron.uhabits.* +import androidx.appcompat.app.* +import org.isoron.androidbase.* +import org.isoron.uhabits.R import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.ui.* import org.isoron.uhabits.core.ui.screens.habits.list.* @@ -29,11 +31,12 @@ import javax.inject.* @ActivityScope class ListHabitsMenu @Inject constructor( - private val activity: BaseActivity, + @ActivityContext context: Context, private val preferences: Preferences, private val themeSwitcher: ThemeSwitcher, private val behavior: ListHabitsMenuBehavior ) { + val activity = (context as AppCompatActivity) fun onCreate(inflater: MenuInflater, menu: Menu) { menu.clear() diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt index 7f00d586c..01efd1d3d 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt @@ -20,13 +20,10 @@ package org.isoron.uhabits.activities.habits.list import android.content.* -import android.os.Build.VERSION.* -import android.os.Build.VERSION_CODES.* -import androidx.appcompat.widget.Toolbar import android.view.ViewGroup.LayoutParams.* import android.widget.* -import org.isoron.androidbase.activities.* -import org.isoron.uhabits.* +import org.isoron.androidbase.* +import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.* import org.isoron.uhabits.activities.habits.list.views.* import org.isoron.uhabits.core.models.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt index 990365fb5..eddafe1d5 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt @@ -23,10 +23,11 @@ import android.app.* import android.content.* import android.util.* import androidx.annotation.* +import androidx.appcompat.app.* import dagger.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.androidbase.utils.* -import org.isoron.uhabits.* +import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.dialogs.* import org.isoron.uhabits.activities.habits.edit.* import org.isoron.uhabits.activities.habits.list.views.* @@ -54,8 +55,7 @@ const val REQUEST_SETTINGS = 107 @ActivityScope class ListHabitsScreen @Inject constructor( - activity: BaseActivity, - rootView: ListHabitsRootView, + @ActivityContext val context: Context, private val commandRunner: CommandRunner, private val intentFactory: IntentFactory, private val themeSwitcher: ThemeSwitcher, @@ -68,12 +68,13 @@ class ListHabitsScreen private val colorPickerFactory: ColorPickerDialogFactory, private val numberPickerFactory: NumberPickerFactory, private val behavior: Lazy -) : BaseScreen(activity), - CommandRunner.Listener, +) : CommandRunner.Listener, ListHabitsBehavior.Screen, ListHabitsMenuBehavior.Screen, ListHabitsSelectionMenuBehavior.Screen { + val activity = (context as AppCompatActivity) + fun onAttached() { commandRunner.addListener(this) if(activity.intent.action == "android.intent.action.VIEW") { @@ -98,7 +99,7 @@ class ListHabitsScreen } } - override fun onResult(requestCode: Int, resultCode: Int, data: Intent?) { + fun onResult(requestCode: Int, resultCode: Int, data: Intent?) { when (requestCode) { REQUEST_OPEN_DOCUMENT -> onOpenDocumentResult(resultCode, data) REQUEST_SETTINGS -> onSettingsResult(resultCode) @@ -142,15 +143,15 @@ class ListHabitsScreen override fun showSelectHabitTypeDialog() { val dialog = HabitTypeDialog() - activity.showDialog(dialog, "habitType") + dialog.show(activity.supportFragmentManager, "habitType") } override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) { - activity.showDialog(confirmDeleteDialogFactory.create(callback)) + confirmDeleteDialogFactory.create(callback).show() } override fun showEditHabitsScreen(habits: List) { - val intent = intentFactory.startEditActivity(activity!!, habits[0]) + val intent = intentFactory.startEditActivity(activity, habits[0]) activity.startActivity(intent) } @@ -190,7 +191,11 @@ class ListHabitsScreen override fun showSendBugReportToDeveloperScreen(log: String) { val to = R.string.bugReportTo val subject = R.string.bugReportSubject - showSendEmailScreen(to, subject, log) + activity.showSendEmailScreen(to, subject, log) + } + + override fun showSendFileScreen(filename: String) { + activity.showSendFileScreen(filename) } override fun showSettingsScreen() { @@ -202,7 +207,7 @@ class ListHabitsScreen callback: OnColorPickedCallback) { val picker = colorPickerFactory.create(defaultColor) picker.setListener(callback) - activity.showDialog(picker, "picker") + picker.show(activity.supportFragmentManager, "picker") } override fun showNumberPicker(value: Double, @@ -212,7 +217,7 @@ class ListHabitsScreen } override fun showConfirmInstallSyncKey(callback: OnConfirmedCallback) { - activity.showDialog(confirmSyncKeyDialogFactory.create(callback)) + confirmSyncKeyDialogFactory.create(callback).show() } @StringRes @@ -244,7 +249,7 @@ class ListHabitsScreen private fun onExportDB() { taskRunner.execute(exportDBFactory.create { filename -> - if (filename != null) showSendFileScreen(filename) + if (filename != null) activity.showSendFileScreen(filename) else activity.showMessage(R.string.could_not_export) }) } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt index 3bcc08a31..546113e51 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.kt @@ -19,11 +19,13 @@ package org.isoron.uhabits.activities.habits.list +import android.content.* import android.view.* +import androidx.appcompat.app.* import androidx.appcompat.view.ActionMode import dagger.* -import org.isoron.androidbase.activities.* -import org.isoron.uhabits.* +import org.isoron.androidbase.* +import org.isoron.uhabits.R import org.isoron.uhabits.activities.habits.list.views.* import org.isoron.uhabits.core.commands.* import org.isoron.uhabits.core.preferences.* @@ -34,7 +36,7 @@ import javax.inject.* @ActivityScope class ListHabitsSelectionMenu @Inject constructor( - private val activity: BaseActivity, + @ActivityContext context: Context, private val listAdapter: HabitCardListAdapter, var commandRunner: CommandRunner, private val prefs: Preferences, @@ -43,6 +45,8 @@ class ListHabitsSelectionMenu @Inject constructor( private val notificationTray: NotificationTray ) : ActionMode.Callback { + val activity = (context as AppCompatActivity) + var activeActionMode: ActionMode? = null fun onSelectionStart() { diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt index e59b165b7..4c8cf5c7a 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt @@ -25,8 +25,8 @@ import android.text.* import android.view.* import android.view.View.MeasureSpec.* import com.google.auto.factory.* -import org.isoron.androidbase.activities.* -import org.isoron.uhabits.* +import org.isoron.androidbase.* +import org.isoron.uhabits.R import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.Checkmark.* import org.isoron.uhabits.core.preferences.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt index 8048ad0c1..0a8d8e2b4 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.kt @@ -21,7 +21,7 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.* import com.google.auto.factory.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.Checkmark.* import org.isoron.uhabits.core.preferences.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java index 95bffc3ae..de74a4ffe 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java @@ -26,7 +26,7 @@ import android.view.*; import androidx.recyclerview.widget.RecyclerView; -import org.isoron.androidbase.activities.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.activities.habits.list.*; import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.preferences.*; diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListController.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListController.kt index b68f3b24c..8690d1d19 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListController.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListController.kt @@ -20,7 +20,7 @@ package org.isoron.uhabits.activities.habits.list.views import dagger.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.uhabits.activities.habits.list.* import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.ui.screens.habits.list.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt index 02f1d6421..62e5be7af 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt @@ -21,13 +21,12 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.* import android.os.* -import androidx.appcompat.widget.* import androidx.recyclerview.widget.* import androidx.recyclerview.widget.ItemTouchHelper.* import android.view.* import com.google.auto.factory.* import dagger.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.* import org.isoron.uhabits.core.models.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index 27a51803d..b90c25534 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -28,8 +28,8 @@ import android.view.* import android.view.ViewGroup.LayoutParams.* import android.widget.* import com.google.auto.factory.* -import org.isoron.androidbase.activities.* -import org.isoron.uhabits.* +import org.isoron.androidbase.* +import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.* import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.ui.screens.habits.list.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 6c94366df..44975b6b6 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -25,10 +25,10 @@ import android.text.* import android.view.* import android.view.View.* import com.google.auto.factory.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.androidbase.utils.* import org.isoron.androidbase.utils.InterfaceUtils.getDimension -import org.isoron.uhabits.* +import org.isoron.uhabits.R import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.utils.* import java.text.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt index 9597736c5..5e4095d8f 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.kt @@ -21,7 +21,7 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.* import com.google.auto.factory.* -import org.isoron.androidbase.activities.* +import org.isoron.androidbase.* import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.utils.* diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.kt index 8c683edc2..322cef1c4 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.kt @@ -20,14 +20,14 @@ package org.isoron.uhabits.activities.settings import android.os.* import android.view.* -import org.isoron.androidbase.activities.* +import androidx.appcompat.app.* import org.isoron.uhabits.* import org.isoron.uhabits.activities.* import org.isoron.uhabits.core.models.* import org.isoron.uhabits.databinding.* import org.isoron.uhabits.utils.* -class SettingsActivity : BaseActivity() { +class SettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val component = (application as HabitsApplication).component diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index 432b58382..1c955609c 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -23,7 +23,7 @@ import android.app.* import android.content.* import android.graphics.* import android.graphics.drawable.* -import android.util.* +import android.os.* import android.view.* import android.view.ViewGroup.LayoutParams.* import android.widget.* @@ -109,11 +109,35 @@ fun Activity.showSendFileScreen(archiveFilename: String) { fun Activity.startActivitySafely(intent: Intent) { try { startActivity(intent) - } catch(e: ActivityNotFoundException) { + } catch (e: ActivityNotFoundException) { this.showMessage(R.string.activity_not_found) } } +fun Activity.showSendEmailScreen(@StringRes toId: Int, @StringRes subjectId: Int, content: String?) { + val to = this.getString(toId) + val subject = this.getString(subjectId) + this.startActivity(Intent().apply { + action = Intent.ACTION_SEND + type = "message/rfc822" + putExtra(Intent.EXTRA_EMAIL, arrayOf(to)) + putExtra(Intent.EXTRA_SUBJECT, subject) + putExtra(Intent.EXTRA_TEXT, content) + }) +} + +fun Activity.restartWithFade(cls: Class<*>?) { + Handler().postDelayed( + { + finish() + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) + startActivity(Intent(this, cls)) + }, + 500, + ) // HACK: Let the menu disappear first +} + + fun View.setupToolbar( toolbar: Toolbar, title: String,