Refactor ShowHabitRootView; convert ShowHabitActivity to Kotlin

pull/699/head
Alinson S. Xavier 5 years ago
parent 4c1c6e76fc
commit 98d17d60a5

@ -40,6 +40,7 @@ import org.isoron.uhabits.core.ui.screens.habits.list.*
HabitModule::class
), dependencies = arrayOf(HabitsApplicationComponent::class))
interface HabitsActivityComponent {
val showHabitPresenter: ShowHabitPresenter
val colorPickerDialogFactory: ColorPickerDialogFactory
val habitCardListAdapter: HabitCardListAdapter
val listHabitsBehavior: ListHabitsBehavior

@ -16,24 +16,14 @@
* 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.uhabits.activities.habits.show
package org.isoron.uhabits.activities.habits.show;
import android.os.*
import org.isoron.uhabits.activities.*
import android.os.*;
import org.isoron.uhabits.activities.*;
/**
* Activity that allows the user to see more information about a single habit.
* <p>
* Shows all the metadata for the habit, in addition to several charts.
*/
public class ShowHabitActivity extends HabitsActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setScreen(getComponent().getShowHabitScreen());
class ShowHabitActivity : HabitsActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setScreen(component.showHabitScreen)
}
}
}

@ -16,23 +16,20 @@
* 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.uhabits.activities.habits.show
package org.isoron.uhabits.activities.habits.show;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.core.ui.screens.habits.show.*;
import dagger.*;
import dagger.*
import org.isoron.uhabits.activities.*
import org.isoron.uhabits.core.ui.screens.habits.show.*
@Module
public abstract class ShowHabitModule
{
abstract class ShowHabitModule {
@Binds
abstract ShowHabitBehavior.Screen getScreen(ShowHabitScreen screen);
abstract fun getScreen(screen: ShowHabitScreen): ShowHabitBehavior.Screen
@Binds
abstract ShowHabitMenuBehavior.Screen getMenuScreen(ShowHabitScreen screen);
abstract fun getMenuScreen(screen: ShowHabitScreen): ShowHabitMenuBehavior.Screen
@Binds
abstract ShowHabitMenuBehavior.System getSystem(HabitsDirFinder system);
}
abstract fun getSystem(system: HabitsDirFinder): ShowHabitMenuBehavior.System
}

@ -0,0 +1,53 @@
/*
* Copyright (C) 2016-2020 Á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.uhabits.activities.habits.show
import org.isoron.androidbase.activities.*
import org.isoron.uhabits.core.models.*
import javax.inject.*
@ActivityScope
class ShowHabitPresenter
@Inject constructor(
val habit: Habit,
) {
private val listeners = mutableListOf<Listener>()
private fun build() = ShowHabitViewModel(
title = habit.name,
isNumerical = habit.isNumerical,
)
fun addListener(listener: Listener) {
listeners.add(listener)
}
fun removeListener(listener: Listener) {
listeners.remove(listener)
}
fun requestData(listener: Listener) {
listener.onData(build())
}
interface Listener {
fun onData(data: ShowHabitViewModel)
}
}

@ -1,171 +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.uhabits.activities.habits.show;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.*;
import org.isoron.androidbase.activities.*;
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.habits.show.views.*;
import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.utils.*;
import javax.inject.*;
import butterknife.*;
@ActivityScope
public class ShowHabitRootView extends BaseRootView
implements ModelObservable.Listener
{
@NonNull
private Habit habit;
@BindView(R.id.frequencyCard)
FrequencyCard frequencyCard;
@BindView(R.id.streakCard)
StreakCard streakCard;
@BindView(R.id.subtitleCard)
SubtitleCard subtitleCard;
@BindView(R.id.notesCard)
NotesCard notesCard;
@BindView(R.id.habitNotes)
TextView habitNotes;
@BindView(R.id.overviewCard)
OverviewCard overviewCard;
@BindView(R.id.scoreCard)
ScoreCard scoreCard;
@BindView(R.id.historyCard)
HistoryCard historyCard;
@BindView(R.id.barCard)
BarCard barCard;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.targetCard)
TargetCard targetCard;
@NonNull
private Controller controller;
@Inject
public ShowHabitRootView(@NonNull @ActivityContext Context context,
@NonNull Habit habit)
{
super(context);
this.habit = habit;
addView(inflate(getContext(), R.layout.show_habit, null));
ButterKnife.bind(this);
controller = new Controller() {};
setDisplayHomeAsUp(true);
initCards();
initToolbar();
}
@Override
public int getToolbarColor()
{
StyledResources res = new StyledResources(getContext());
if (!res.getBoolean(R.attr.useHabitColorAsPrimary))
return super.getToolbarColor();
return PaletteUtilsKt.toThemedAndroidColor(habit.getColor(), getContext());
}
@Override
public void onModelChange()
{
new Handler(Looper.getMainLooper()).post(() -> {
toolbar.setTitle(habit.getName());
});
controller.onToolbarChanged();
}
public void setController(@NonNull Controller controller)
{
this.controller = controller;
historyCard.setController(controller);
}
@Override
protected void initToolbar()
{
super.initToolbar();
toolbar.setTitle(habit.getName());
}
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
habit.getObservable().addListener(this);
}
@Override
protected void onDetachedFromWindow()
{
habit.getObservable().removeListener(this);
super.onDetachedFromWindow();
}
private void initCards()
{
subtitleCard.setHabit(habit);
notesCard.setHabit(habit);
overviewCard.setHabit(habit);
scoreCard.setHabit(habit);
historyCard.setHabit(habit);
streakCard.setHabit(habit);
frequencyCard.setHabit(habit);
barCard.setHabit(habit);
targetCard.setHabit(habit);
if(habit.isNumerical()) {
overviewCard.setVisibility(View.GONE);
streakCard.setVisibility(View.GONE);
} else {
targetCard.setVisibility(View.GONE);
}
}
public interface Controller extends HistoryCard.Controller
{
default void onToolbarChanged() {}
}
}

@ -0,0 +1,97 @@
/*
* 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.uhabits.activities.habits.show
import android.content.*
import android.view.*
import org.isoron.androidbase.activities.*
import org.isoron.androidbase.utils.*
import org.isoron.uhabits.*
import org.isoron.uhabits.activities.habits.show.views.*
import org.isoron.uhabits.core.models.*
import org.isoron.uhabits.databinding.*
import org.isoron.uhabits.utils.*
import javax.inject.*
@ActivityScope
class ShowHabitRootView
@Inject constructor(
@ActivityContext context: Context,
private val habit: Habit,
private val presenter: ShowHabitPresenter,
) : BaseRootView(context), ShowHabitPresenter.Listener {
private var controller: Controller = object : Controller {}
private var binding = ShowHabitBinding.inflate(LayoutInflater.from(context))
init {
addView(binding.root)
displayHomeAsUp = true
binding.subtitleCard.habit = habit
binding.notesCard.habit = habit
binding.overviewCard.habit = habit
binding.scoreCard.habit = habit
binding.historyCard.habit = habit
binding.streakCard.habit = habit
binding.frequencyCard.habit = habit
binding.barCard.habit = habit
binding.targetCard.habit = habit
initToolbar()
}
override fun getToolbarColor(): Int {
val res = StyledResources(context)
return if (!res.getBoolean(R.attr.useHabitColorAsPrimary)) super.getToolbarColor()
else habit.color.toThemedAndroidColor(context)
}
fun setController(controller: Controller) {
this.controller = controller
binding.historyCard.setController(controller)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
presenter.addListener(this)
presenter.requestData(this)
}
override fun onDetachedFromWindow() {
presenter.removeListener(this)
super.onDetachedFromWindow()
}
override fun onData(data: ShowHabitViewModel) {
binding.toolbar.title = data.title
if (data.isNumerical) {
binding.overviewCard.visibility = GONE
binding.streakCard.visibility = GONE
} else {
binding.targetCard.visibility = GONE
}
controller.onToolbarChanged()
}
interface Controller : HistoryCard.Controller {
fun onToolbarChanged() {}
}
}

@ -0,0 +1,25 @@
/*
* Copyright (C) 2016-2020 Á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.uhabits.activities.habits.show
data class ShowHabitViewModel(
val title: String,
val isNumerical: Boolean,
)

@ -31,8 +31,63 @@
app:popupTheme="?toolbarPopupTheme"
android:layout_alignParentTop="true"/>
<!-- Separate file so that we can use the layout editor to preview it -->
<include layout="@layout/show_habit_inner"/>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:background="?windowBackgroundColor"
android:clipToPadding="false">
<LinearLayout
style="@style/CardList"
android:clipToPadding="false">
<org.isoron.uhabits.activities.habits.show.views.SubtitleCard
android:id="@+id/subtitleCard"
style="@style/ShowHabit.Subtitle"/>
<org.isoron.uhabits.activities.habits.show.views.NotesCard
android:id="@+id/notesCard"
style="@style/Card"
android:gravity="center" />
<org.isoron.uhabits.activities.habits.show.views.OverviewCard
android:id="@+id/overviewCard"
style="@style/Card"
android:paddingTop="12dp"/>
<org.isoron.uhabits.activities.habits.show.views.TargetCard
android:id="@+id/targetCard"
style="@style/Card"
android:paddingTop="12dp"/>
<org.isoron.uhabits.activities.habits.show.views.ScoreCard
android:id="@+id/scoreCard"
style="@style/Card"
android:gravity="center"/>
<org.isoron.uhabits.activities.habits.show.views.BarCard
android:id="@+id/barCard"
style="@style/Card"
android:gravity="center"/>
<org.isoron.uhabits.activities.habits.show.views.HistoryCard
android:id="@+id/historyCard"
style="@style/Card"
android:gravity="center"
android:paddingBottom="0dp"/>
<org.isoron.uhabits.activities.habits.show.views.StreakCard
android:id="@+id/streakCard"
style="@style/Card"/>
<org.isoron.uhabits.activities.habits.show.views.FrequencyCard
android:id="@+id/frequencyCard"
style="@style/Card"/>
</LinearLayout>
</ScrollView>
<View
android:id="@+id/toolbarShadow"

@ -1,81 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ 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/>.
-->
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:background="?windowBackgroundColor"
android:clipToPadding="false"
android:fillViewport="true"
tools:showIn="@layout/show_habit">
<LinearLayout
style="@style/CardList"
android:clipToPadding="false">
<org.isoron.uhabits.activities.habits.show.views.SubtitleCard
android:id="@+id/subtitleCard"
style="@style/ShowHabit.Subtitle"/>
<org.isoron.uhabits.activities.habits.show.views.NotesCard
android:id="@+id/notesCard"
style="@style/Card"
android:gravity="center" />
<org.isoron.uhabits.activities.habits.show.views.OverviewCard
android:id="@+id/overviewCard"
style="@style/Card"
android:paddingTop="12dp"/>
<org.isoron.uhabits.activities.habits.show.views.TargetCard
android:id="@+id/targetCard"
style="@style/Card"
android:paddingTop="12dp"/>
<org.isoron.uhabits.activities.habits.show.views.ScoreCard
android:id="@+id/scoreCard"
style="@style/Card"
android:gravity="center"/>
<org.isoron.uhabits.activities.habits.show.views.BarCard
android:id="@+id/barCard"
style="@style/Card"
android:gravity="center"/>
<org.isoron.uhabits.activities.habits.show.views.HistoryCard
android:id="@+id/historyCard"
style="@style/Card"
android:gravity="center"
android:paddingBottom="0dp"/>
<org.isoron.uhabits.activities.habits.show.views.StreakCard
android:id="@+id/streakCard"
style="@style/Card"/>
<org.isoron.uhabits.activities.habits.show.views.FrequencyCard
android:id="@+id/frequencyCard"
style="@style/Card"/>
</LinearLayout>
</ScrollView>
Loading…
Cancel
Save