Remove BaseActivity and BaseScreen

pull/699/head
Alinson S. Xavier 5 years ago
parent a58c60b8ce
commit 3f3ddc3955

@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.isoron.androidbase.activities package org.isoron.androidbase
import javax.inject.* import javax.inject.*

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com> * Copyright (C) 2016-2020 Álinson Santos Xavier <isoron@gmail.com>
* *
* This file is part of Loop Habit Tracker. * This file is part of Loop Habit Tracker.
* *
@ -17,7 +17,7 @@
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.isoron.androidbase.activities; package org.isoron.androidbase;
import android.content.*; import android.content.*;

@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>. * with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.isoron.androidbase.activities package org.isoron.androidbase
import javax.inject.* import javax.inject.*

@ -18,9 +18,9 @@
*/ */
package org.isoron.androidbase 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? = private val originalHandler: Thread.UncaughtExceptionHandler? =
Thread.getDefaultUncaughtExceptionHandler() Thread.getDefaultUncaughtExceptionHandler()

@ -1,81 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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()
}
}

@ -1,39 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

@ -1,107 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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<TextView>(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
})
}
}

@ -33,9 +33,7 @@ import androidx.test.uiautomator.*;
import junit.framework.*; import junit.framework.*;
import org.isoron.androidbase.*; import org.isoron.androidbase.*;
import org.isoron.androidbase.activities.*;
import org.isoron.androidbase.utils.*; import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.core.database.*;
import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.preferences.*; import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.core.tasks.*;

@ -20,11 +20,10 @@
package org.isoron.uhabits package org.isoron.uhabits
import dagger.* import dagger.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.activities.* import org.isoron.uhabits.activities.*
import org.isoron.uhabits.activities.habits.list.* import org.isoron.uhabits.activities.habits.list.*
import org.isoron.uhabits.activities.habits.list.views.* 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.isoron.uhabits.core.ui.screens.habits.list.*
import org.mockito.Mockito.* import org.mockito.Mockito.*

@ -20,25 +20,25 @@
package org.isoron.uhabits.activities package org.isoron.uhabits.activities
import android.app.* import android.app.*
import android.content.*
import android.content.res.Configuration.* import android.content.res.Configuration.*
import android.os.Build.VERSION.* import android.os.Build.VERSION.*
import androidx.core.content.* import androidx.core.content.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.* import org.isoron.uhabits.R
import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.preferences.*
import org.isoron.uhabits.core.ui.* import org.isoron.uhabits.core.ui.*
import javax.inject.*
@ActivityScope @ActivityScope
class AndroidThemeSwitcher class AndroidThemeSwitcher
constructor( constructor(
private val activity: Activity, @ActivityContext val context: Context,
preferences: Preferences preferences: Preferences
) : ThemeSwitcher(preferences) { ) : ThemeSwitcher(preferences) {
override fun getSystemTheme(): Int { override fun getSystemTheme(): Int {
if(SDK_INT < 29) return THEME_LIGHT; if (SDK_INT < 29) return THEME_LIGHT;
val uiMode = activity.resources.configuration.uiMode val uiMode = context.resources.configuration.uiMode
return if ((uiMode and UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES) { return if ((uiMode and UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES) {
THEME_DARK; THEME_DARK;
} else { } else {
@ -47,25 +47,18 @@ constructor(
} }
override fun applyDarkTheme() { override fun applyDarkTheme() {
activity.setTheme(R.style.AppBaseThemeDark) context.setTheme(R.style.AppBaseThemeDark)
activity.window.navigationBarColor = (context as Activity).window.navigationBarColor =
ContextCompat.getColor(activity, R.color.grey_900) ContextCompat.getColor(context, R.color.grey_900)
} }
override fun applyLightTheme() { override fun applyLightTheme() {
activity.setTheme(R.style.AppBaseTheme) context.setTheme(R.style.AppBaseTheme)
} }
override fun applyPureBlackTheme() { override fun applyPureBlackTheme() {
activity.setTheme(R.style.AppBaseThemeDark_PureBlack) context.setTheme(R.style.AppBaseThemeDark_PureBlack)
activity.window.navigationBarColor = (context as Activity).window.navigationBarColor =
ContextCompat.getColor(activity, R.color.black) ContextCompat.getColor(context, R.color.black)
}
fun getDialogTheme(): Int {
return when {
isNightMode -> R.style.DarkDialogWithTitle
else -> R.style.DialogWithTitle
}
} }
} }

@ -21,11 +21,12 @@ package org.isoron.uhabits.activities
import android.content.* import android.content.*
import android.os.* import android.os.*
import org.isoron.androidbase.activities.* import androidx.appcompat.app.*
import org.isoron.androidbase.*
import org.isoron.uhabits.* import org.isoron.uhabits.*
import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.*
abstract class HabitsActivity : BaseActivity() { abstract class HabitsActivity : AppCompatActivity() {
lateinit var component: HabitsActivityComponent lateinit var component: HabitsActivityComponent
lateinit var appComponent: HabitsApplicationComponent lateinit var appComponent: HabitsApplicationComponent
@ -43,8 +44,6 @@ abstract class HabitsActivity : BaseActivity() {
component = DaggerHabitsActivityComponent component = DaggerHabitsActivityComponent
.builder() .builder()
.activityContextModule(ActivityContextModule(this)) .activityContextModule(ActivityContextModule(this))
.baseActivityModule(BaseActivityModule(this))
.habitModule(HabitModule(habit))
.habitsApplicationComponent(appComponent) .habitsApplicationComponent(appComponent)
.build() .build()

@ -20,20 +20,17 @@
package org.isoron.uhabits.activities package org.isoron.uhabits.activities
import dagger.* import dagger.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.* import org.isoron.uhabits.*
import org.isoron.uhabits.activities.about.*
import org.isoron.uhabits.activities.common.dialogs.* import org.isoron.uhabits.activities.common.dialogs.*
import org.isoron.uhabits.activities.habits.list.* import org.isoron.uhabits.activities.habits.list.*
import org.isoron.uhabits.activities.habits.list.views.* 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.*
import org.isoron.uhabits.core.ui.screens.habits.list.* import org.isoron.uhabits.core.ui.screens.habits.list.*
@ActivityScope @ActivityScope
@Component(modules = arrayOf( @Component(modules = arrayOf(
ActivityContextModule::class, ActivityContextModule::class,
BaseActivityModule::class,
HabitsActivityModule::class, HabitsActivityModule::class,
ListHabitsModule::class, ListHabitsModule::class,
HabitModule::class HabitModule::class

@ -19,8 +19,9 @@
package org.isoron.uhabits.activities package org.isoron.uhabits.activities
import android.content.*
import dagger.* import dagger.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.preferences.*
import org.isoron.uhabits.core.ui.* import org.isoron.uhabits.core.ui.*
@ -29,9 +30,10 @@ class HabitsActivityModule {
@Provides @Provides
@ActivityScope @ActivityScope
fun getThemeSwitcher(activity: BaseActivity, fun getThemeSwitcher(
@ActivityContext context: Context,
prefs: Preferences prefs: Preferences
): ThemeSwitcher { ): ThemeSwitcher {
return AndroidThemeSwitcher(activity, prefs) return AndroidThemeSwitcher(context, prefs)
} }
} }

@ -21,7 +21,7 @@ package org.isoron.uhabits.activities.common.dialogs;
import android.content.*; import android.content.*;
import org.isoron.androidbase.activities.*; import org.isoron.androidbase.*;
import org.isoron.androidbase.utils.*; import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.R; import org.isoron.uhabits.R;
import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.models.*;

@ -27,9 +27,9 @@ import androidx.appcompat.app.*;
import com.google.auto.factory.*; import com.google.auto.factory.*;
import org.isoron.androidbase.activities.*; import org.isoron.androidbase.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.ui.callbacks.*; import org.isoron.uhabits.core.ui.callbacks.*;
import org.isoron.uhabits.R;
/** /**
* Dialog that asks the user confirmation before executing a delete operation. * Dialog that asks the user confirmation before executing a delete operation.

@ -27,9 +27,9 @@ import androidx.appcompat.app.*;
import com.google.auto.factory.*; import com.google.auto.factory.*;
import org.isoron.androidbase.activities.*; import org.isoron.androidbase.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.ui.callbacks.*; import org.isoron.uhabits.core.ui.callbacks.*;
import org.isoron.uhabits.R;
@AutoFactory(allowSubclasses = true) @AutoFactory(allowSubclasses = true)
public class ConfirmSyncKeyDialog extends AlertDialog public class ConfirmSyncKeyDialog extends AlertDialog

@ -26,9 +26,9 @@ import android.view.*
import android.view.WindowManager.LayoutParams.* import android.view.WindowManager.LayoutParams.*
import android.view.inputmethod.* import android.view.inputmethod.*
import android.widget.* import android.widget.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.androidbase.utils.* import org.isoron.androidbase.utils.*
import org.isoron.uhabits.* import org.isoron.uhabits.R
import org.isoron.uhabits.core.ui.screens.habits.list.* import org.isoron.uhabits.core.ui.screens.habits.list.*
import javax.inject.* import javax.inject.*

@ -19,10 +19,11 @@
package org.isoron.uhabits.activities.habits.list package org.isoron.uhabits.activities.habits.list
import android.content.*
import android.os.* import android.os.*
import android.view.* import android.view.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import org.isoron.uhabits.* import org.isoron.androidbase.*
import org.isoron.uhabits.activities.* import org.isoron.uhabits.activities.*
import org.isoron.uhabits.activities.habits.list.views.* import org.isoron.uhabits.activities.habits.list.views.*
import org.isoron.uhabits.core.preferences.* 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.ui.ThemeSwitcher.*
import org.isoron.uhabits.core.utils.* import org.isoron.uhabits.core.utils.*
import org.isoron.uhabits.database.* import org.isoron.uhabits.database.*
import org.isoron.uhabits.utils.*
class ListHabitsActivity : HabitsActivity() { class ListHabitsActivity : HabitsActivity() {
@ -57,8 +59,7 @@ class ListHabitsActivity : HabitsActivity() {
adapter = component.habitCardListAdapter adapter = component.habitCardListAdapter
taskRunner = appComponent.taskRunner taskRunner = appComponent.taskRunner
menu = component.listHabitsMenu menu = component.listHabitsMenu
Thread.setDefaultUncaughtExceptionHandler(BaseExceptionHandler(this))
setScreen(screen)
component.listHabitsBehavior.onStartup() component.listHabitsBehavior.onStartup()
setContentView(rootView) setContentView(rootView)
} }
@ -98,4 +99,9 @@ class ListHabitsActivity : HabitsActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
return menu.onItemSelected(item) return menu.onItemSelected(item)
} }
override fun onActivityResult(request: Int, result: Int, data: Intent?) {
super.onActivityResult(request, result, data)
screen.onResult(request, result, data)
}
} }

@ -19,9 +19,11 @@
package org.isoron.uhabits.activities.habits.list package org.isoron.uhabits.activities.habits.list
import android.content.*
import android.view.* import android.view.*
import org.isoron.androidbase.activities.* import androidx.appcompat.app.*
import org.isoron.uhabits.* import org.isoron.androidbase.*
import org.isoron.uhabits.R
import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.preferences.*
import org.isoron.uhabits.core.ui.* import org.isoron.uhabits.core.ui.*
import org.isoron.uhabits.core.ui.screens.habits.list.* import org.isoron.uhabits.core.ui.screens.habits.list.*
@ -29,11 +31,12 @@ import javax.inject.*
@ActivityScope @ActivityScope
class ListHabitsMenu @Inject constructor( class ListHabitsMenu @Inject constructor(
private val activity: BaseActivity, @ActivityContext context: Context,
private val preferences: Preferences, private val preferences: Preferences,
private val themeSwitcher: ThemeSwitcher, private val themeSwitcher: ThemeSwitcher,
private val behavior: ListHabitsMenuBehavior private val behavior: ListHabitsMenuBehavior
) { ) {
val activity = (context as AppCompatActivity)
fun onCreate(inflater: MenuInflater, menu: Menu) { fun onCreate(inflater: MenuInflater, menu: Menu) {
menu.clear() menu.clear()

@ -20,13 +20,10 @@
package org.isoron.uhabits.activities.habits.list package org.isoron.uhabits.activities.habits.list
import android.content.* 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.view.ViewGroup.LayoutParams.*
import android.widget.* import android.widget.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.* import org.isoron.uhabits.R
import org.isoron.uhabits.activities.common.views.* import org.isoron.uhabits.activities.common.views.*
import org.isoron.uhabits.activities.habits.list.views.* import org.isoron.uhabits.activities.habits.list.views.*
import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.*

@ -23,10 +23,11 @@ import android.app.*
import android.content.* import android.content.*
import android.util.* import android.util.*
import androidx.annotation.* import androidx.annotation.*
import androidx.appcompat.app.*
import dagger.* import dagger.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.androidbase.utils.* 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.common.dialogs.*
import org.isoron.uhabits.activities.habits.edit.* import org.isoron.uhabits.activities.habits.edit.*
import org.isoron.uhabits.activities.habits.list.views.* import org.isoron.uhabits.activities.habits.list.views.*
@ -54,8 +55,7 @@ const val REQUEST_SETTINGS = 107
@ActivityScope @ActivityScope
class ListHabitsScreen class ListHabitsScreen
@Inject constructor( @Inject constructor(
activity: BaseActivity, @ActivityContext val context: Context,
rootView: ListHabitsRootView,
private val commandRunner: CommandRunner, private val commandRunner: CommandRunner,
private val intentFactory: IntentFactory, private val intentFactory: IntentFactory,
private val themeSwitcher: ThemeSwitcher, private val themeSwitcher: ThemeSwitcher,
@ -68,12 +68,13 @@ class ListHabitsScreen
private val colorPickerFactory: ColorPickerDialogFactory, private val colorPickerFactory: ColorPickerDialogFactory,
private val numberPickerFactory: NumberPickerFactory, private val numberPickerFactory: NumberPickerFactory,
private val behavior: Lazy<ListHabitsBehavior> private val behavior: Lazy<ListHabitsBehavior>
) : BaseScreen(activity), ) : CommandRunner.Listener,
CommandRunner.Listener,
ListHabitsBehavior.Screen, ListHabitsBehavior.Screen,
ListHabitsMenuBehavior.Screen, ListHabitsMenuBehavior.Screen,
ListHabitsSelectionMenuBehavior.Screen { ListHabitsSelectionMenuBehavior.Screen {
val activity = (context as AppCompatActivity)
fun onAttached() { fun onAttached() {
commandRunner.addListener(this) commandRunner.addListener(this)
if(activity.intent.action == "android.intent.action.VIEW") { 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) { when (requestCode) {
REQUEST_OPEN_DOCUMENT -> onOpenDocumentResult(resultCode, data) REQUEST_OPEN_DOCUMENT -> onOpenDocumentResult(resultCode, data)
REQUEST_SETTINGS -> onSettingsResult(resultCode) REQUEST_SETTINGS -> onSettingsResult(resultCode)
@ -142,15 +143,15 @@ class ListHabitsScreen
override fun showSelectHabitTypeDialog() { override fun showSelectHabitTypeDialog() {
val dialog = HabitTypeDialog() val dialog = HabitTypeDialog()
activity.showDialog(dialog, "habitType") dialog.show(activity.supportFragmentManager, "habitType")
} }
override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) { override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) {
activity.showDialog(confirmDeleteDialogFactory.create(callback)) confirmDeleteDialogFactory.create(callback).show()
} }
override fun showEditHabitsScreen(habits: List<Habit>) { override fun showEditHabitsScreen(habits: List<Habit>) {
val intent = intentFactory.startEditActivity(activity!!, habits[0]) val intent = intentFactory.startEditActivity(activity, habits[0])
activity.startActivity(intent) activity.startActivity(intent)
} }
@ -190,7 +191,11 @@ class ListHabitsScreen
override fun showSendBugReportToDeveloperScreen(log: String) { override fun showSendBugReportToDeveloperScreen(log: String) {
val to = R.string.bugReportTo val to = R.string.bugReportTo
val subject = R.string.bugReportSubject 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() { override fun showSettingsScreen() {
@ -202,7 +207,7 @@ class ListHabitsScreen
callback: OnColorPickedCallback) { callback: OnColorPickedCallback) {
val picker = colorPickerFactory.create(defaultColor) val picker = colorPickerFactory.create(defaultColor)
picker.setListener(callback) picker.setListener(callback)
activity.showDialog(picker, "picker") picker.show(activity.supportFragmentManager, "picker")
} }
override fun showNumberPicker(value: Double, override fun showNumberPicker(value: Double,
@ -212,7 +217,7 @@ class ListHabitsScreen
} }
override fun showConfirmInstallSyncKey(callback: OnConfirmedCallback) { override fun showConfirmInstallSyncKey(callback: OnConfirmedCallback) {
activity.showDialog(confirmSyncKeyDialogFactory.create(callback)) confirmSyncKeyDialogFactory.create(callback).show()
} }
@StringRes @StringRes
@ -244,7 +249,7 @@ class ListHabitsScreen
private fun onExportDB() { private fun onExportDB() {
taskRunner.execute(exportDBFactory.create { filename -> taskRunner.execute(exportDBFactory.create { filename ->
if (filename != null) showSendFileScreen(filename) if (filename != null) activity.showSendFileScreen(filename)
else activity.showMessage(R.string.could_not_export) else activity.showMessage(R.string.could_not_export)
}) })
} }

@ -19,11 +19,13 @@
package org.isoron.uhabits.activities.habits.list package org.isoron.uhabits.activities.habits.list
import android.content.*
import android.view.* import android.view.*
import androidx.appcompat.app.*
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import dagger.* import dagger.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.* import org.isoron.uhabits.R
import org.isoron.uhabits.activities.habits.list.views.* import org.isoron.uhabits.activities.habits.list.views.*
import org.isoron.uhabits.core.commands.* import org.isoron.uhabits.core.commands.*
import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.preferences.*
@ -34,7 +36,7 @@ import javax.inject.*
@ActivityScope @ActivityScope
class ListHabitsSelectionMenu @Inject constructor( class ListHabitsSelectionMenu @Inject constructor(
private val activity: BaseActivity, @ActivityContext context: Context,
private val listAdapter: HabitCardListAdapter, private val listAdapter: HabitCardListAdapter,
var commandRunner: CommandRunner, var commandRunner: CommandRunner,
private val prefs: Preferences, private val prefs: Preferences,
@ -43,6 +45,8 @@ class ListHabitsSelectionMenu @Inject constructor(
private val notificationTray: NotificationTray private val notificationTray: NotificationTray
) : ActionMode.Callback { ) : ActionMode.Callback {
val activity = (context as AppCompatActivity)
var activeActionMode: ActionMode? = null var activeActionMode: ActionMode? = null
fun onSelectionStart() { fun onSelectionStart() {

@ -25,8 +25,8 @@ import android.text.*
import android.view.* import android.view.*
import android.view.View.MeasureSpec.* import android.view.View.MeasureSpec.*
import com.google.auto.factory.* import com.google.auto.factory.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.* import org.isoron.uhabits.R
import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.*
import org.isoron.uhabits.core.models.Checkmark.* import org.isoron.uhabits.core.models.Checkmark.*
import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.preferences.*

@ -21,7 +21,7 @@ package org.isoron.uhabits.activities.habits.list.views
import android.content.* import android.content.*
import com.google.auto.factory.* 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.*
import org.isoron.uhabits.core.models.Checkmark.* import org.isoron.uhabits.core.models.Checkmark.*
import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.preferences.*

@ -26,7 +26,7 @@ import android.view.*;
import androidx.recyclerview.widget.RecyclerView; 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.activities.habits.list.*;
import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.preferences.*; import org.isoron.uhabits.core.preferences.*;

@ -20,7 +20,7 @@
package org.isoron.uhabits.activities.habits.list.views package org.isoron.uhabits.activities.habits.list.views
import dagger.* import dagger.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.activities.habits.list.* import org.isoron.uhabits.activities.habits.list.*
import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.*
import org.isoron.uhabits.core.ui.screens.habits.list.* import org.isoron.uhabits.core.ui.screens.habits.list.*

@ -21,13 +21,12 @@ package org.isoron.uhabits.activities.habits.list.views
import android.content.* import android.content.*
import android.os.* import android.os.*
import androidx.appcompat.widget.*
import androidx.recyclerview.widget.* import androidx.recyclerview.widget.*
import androidx.recyclerview.widget.ItemTouchHelper.* import androidx.recyclerview.widget.ItemTouchHelper.*
import android.view.* import android.view.*
import com.google.auto.factory.* import com.google.auto.factory.*
import dagger.* import dagger.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.R import org.isoron.uhabits.R
import org.isoron.uhabits.activities.common.views.* import org.isoron.uhabits.activities.common.views.*
import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.*

@ -28,8 +28,8 @@ import android.view.*
import android.view.ViewGroup.LayoutParams.* import android.view.ViewGroup.LayoutParams.*
import android.widget.* import android.widget.*
import com.google.auto.factory.* import com.google.auto.factory.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.uhabits.* import org.isoron.uhabits.R
import org.isoron.uhabits.activities.common.views.* import org.isoron.uhabits.activities.common.views.*
import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.*
import org.isoron.uhabits.core.ui.screens.habits.list.* import org.isoron.uhabits.core.ui.screens.habits.list.*

@ -25,10 +25,10 @@ import android.text.*
import android.view.* import android.view.*
import android.view.View.* import android.view.View.*
import com.google.auto.factory.* import com.google.auto.factory.*
import org.isoron.androidbase.activities.* import org.isoron.androidbase.*
import org.isoron.androidbase.utils.* import org.isoron.androidbase.utils.*
import org.isoron.androidbase.utils.InterfaceUtils.getDimension 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.core.preferences.*
import org.isoron.uhabits.utils.* import org.isoron.uhabits.utils.*
import java.text.* import java.text.*

@ -21,7 +21,7 @@ package org.isoron.uhabits.activities.habits.list.views
import android.content.* import android.content.*
import com.google.auto.factory.* 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.*
import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.preferences.*
import org.isoron.uhabits.core.utils.* import org.isoron.uhabits.core.utils.*

@ -20,14 +20,14 @@ package org.isoron.uhabits.activities.settings
import android.os.* import android.os.*
import android.view.* import android.view.*
import org.isoron.androidbase.activities.* import androidx.appcompat.app.*
import org.isoron.uhabits.* import org.isoron.uhabits.*
import org.isoron.uhabits.activities.* import org.isoron.uhabits.activities.*
import org.isoron.uhabits.core.models.* import org.isoron.uhabits.core.models.*
import org.isoron.uhabits.databinding.* import org.isoron.uhabits.databinding.*
import org.isoron.uhabits.utils.* import org.isoron.uhabits.utils.*
class SettingsActivity : BaseActivity() { class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val component = (application as HabitsApplication).component val component = (application as HabitsApplication).component

@ -23,7 +23,7 @@ import android.app.*
import android.content.* import android.content.*
import android.graphics.* import android.graphics.*
import android.graphics.drawable.* import android.graphics.drawable.*
import android.util.* import android.os.*
import android.view.* import android.view.*
import android.view.ViewGroup.LayoutParams.* import android.view.ViewGroup.LayoutParams.*
import android.widget.* import android.widget.*
@ -109,11 +109,35 @@ fun Activity.showSendFileScreen(archiveFilename: String) {
fun Activity.startActivitySafely(intent: Intent) { fun Activity.startActivitySafely(intent: Intent) {
try { try {
startActivity(intent) startActivity(intent)
} catch(e: ActivityNotFoundException) { } catch (e: ActivityNotFoundException) {
this.showMessage(R.string.activity_not_found) 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( fun View.setupToolbar(
toolbar: Toolbar, toolbar: Toolbar,
title: String, title: String,

Loading…
Cancel
Save