/*
* 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.list;
import android.app.*;
import android.content.*;
import android.net.*;
import android.support.annotation.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.common.dialogs.*;
import org.isoron.uhabits.activities.common.dialogs.ColorPickerDialog.*;
import org.isoron.uhabits.activities.habits.edit.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.intents.*;
import org.isoron.uhabits.io.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;
import java.io.*;
import javax.inject.*;
import static android.os.Build.VERSION.*;
import static android.os.Build.VERSION_CODES.*;
@ActivityScope
public class ListHabitsScreen extends BaseScreen
implements CommandRunner.Listener
{
public static final int RESULT_IMPORT_DATA = 1;
public static final int RESULT_EXPORT_CSV = 2;
public static final int RESULT_EXPORT_DB = 3;
public static final int RESULT_BUG_REPORT = 4;
public static final int RESULT_REPAIR_DB = 5;
public static final int REQUEST_OPEN_DOCUMENT = 6;
public static final int REQUEST_SETTINGS = 7;
@Nullable
private ListHabitsController controller;
@NonNull
private final IntentFactory intentFactory;
@NonNull
private final DirFinder dirFinder;
@NonNull
private final CommandRunner commandRunner;
@NonNull
private final ConfirmDeleteDialogFactory confirmDeleteDialogFactory;
@NonNull
private final CreateHabitDialogFactory createHabitDialogFactory;
@NonNull
private final FilePickerDialogFactory filePickerDialogFactory;
@NonNull
private final ColorPickerDialogFactory colorPickerFactory;
@NonNull
private final EditHabitDialogFactory editHabitDialogFactory;
@NonNull
private final ThemeSwitcher themeSwitcher;
@Inject
public ListHabitsScreen(@NonNull BaseActivity activity,
@NonNull CommandRunner commandRunner,
@NonNull DirFinder dirFinder,
@NonNull ListHabitsRootView rootView,
@NonNull IntentFactory intentFactory,
@NonNull ThemeSwitcher themeSwitcher,
@NonNull ConfirmDeleteDialogFactory confirmDeleteDialogFactory,
@NonNull CreateHabitDialogFactory createHabitDialogFactory,
@NonNull FilePickerDialogFactory filePickerDialogFactory,
@NonNull ColorPickerDialogFactory colorPickerFactory,
@NonNull EditHabitDialogFactory editHabitDialogFactory)
{
super(activity);
setRootView(rootView);
this.editHabitDialogFactory = editHabitDialogFactory;
this.colorPickerFactory = colorPickerFactory;
this.commandRunner = commandRunner;
this.confirmDeleteDialogFactory = confirmDeleteDialogFactory;
this.createHabitDialogFactory = createHabitDialogFactory;
this.dirFinder = dirFinder;
this.filePickerDialogFactory = filePickerDialogFactory;
this.intentFactory = intentFactory;
this.themeSwitcher = themeSwitcher;
}
public void onAttached()
{
commandRunner.addListener(this);
}
@Override
public void onCommandExecuted(@NonNull Command command,
@Nullable Long refreshKey)
{
showMessage(command.getExecuteStringId());
}
public void onDettached()
{
commandRunner.removeListener(this);
}
@Override
public void onResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUEST_OPEN_DOCUMENT)
onOpenDocumentResult(resultCode, data);
if (requestCode == REQUEST_SETTINGS)
onSettingsResult(resultCode);
}
private void onSettingsResult(int resultCode)
{
if (controller == null) return;
switch (resultCode)
{
case RESULT_IMPORT_DATA:
showImportScreen();
break;
case RESULT_EXPORT_CSV:
controller.onExportCSV();
break;
case RESULT_EXPORT_DB:
controller.onExportDB();
break;
case RESULT_BUG_REPORT:
controller.onSendBugReport();
break;
case RESULT_REPAIR_DB:
controller.onRepairDB();
break;
}
}
private void onOpenDocumentResult(int resultCode, Intent data)
{
if (controller == null) return;
if (resultCode != Activity.RESULT_OK) return;
try
{
Uri uri = data.getData();
ContentResolver cr = activity.getContentResolver();
InputStream is = cr.openInputStream(uri);
File cacheDir = activity.getExternalCacheDir();
File tempFile = File.createTempFile("import", "", cacheDir);
FileUtils.copy(is, tempFile);
controller.onImportData(tempFile, () -> tempFile.delete());
}
catch (IOException e)
{
showMessage(R.string.could_not_import);
e.printStackTrace();
}
}
public void setController(@Nullable ListHabitsController controller)
{
this.controller = controller;
}
public void showAboutScreen()
{
Intent intent = intentFactory.startAboutActivity(activity);
activity.startActivity(intent);
}
/**
* Displays a {@link ColorPickerDialog} to the user.
* <p>
* The selected color on the dialog is the color of the given habit.
*
* @param habit the habit
* @param callback
*/
public void showColorPicker(@NonNull Habit habit,
@NonNull OnColorSelectedListener callback)
{
ColorPickerDialog picker = colorPickerFactory.create(habit.getColor());
picker.setListener(callback);
activity.showDialog(picker, "picker");
}
public void showCreateHabitScreen()
{
activity.showDialog(createHabitDialogFactory.create(), "editHabit");
}
public void showDeleteConfirmationScreen(ConfirmDeleteDialog.Callback callback)
{
activity.showDialog(confirmDeleteDialogFactory.create(callback));
}
public void showEditHabitScreen(Habit habit)
{
EditHabitDialog dialog = editHabitDialogFactory.create(habit);
activity.showDialog(dialog, "editHabit");
}
public void showFAQScreen()
{
Intent intent = intentFactory.viewFAQ(activity);
activity.startActivity(intent);
}
public void showHabitScreen(@NonNull Habit habit)
{
Intent intent = intentFactory.startShowHabitActivity(activity, habit);
activity.startActivity(intent);
}
public void showImportScreen()
{
if (SDK_INT < KITKAT)
{
showImportScreenPreKitKat();
return;
}
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
activity.startActivityForResult(intent, REQUEST_OPEN_DOCUMENT);
}
public void showImportScreenPreKitKat()
{
File dir = dirFinder.findStorageDir(null);
if (dir == null)
{
showMessage(R.string.could_not_import);
return;
}
FilePickerDialog picker = filePickerDialogFactory.create(dir);
if (controller != null)
picker.setListener(file -> controller.onImportData(file, () -> {}));
activity.showDialog(picker.getDialog());
}
public void showIntroScreen()
{
Intent intent = intentFactory.startIntroActivity(activity);
activity.startActivity(intent);
}
public void showSettingsScreen()
{
Intent intent = intentFactory.startSettingsActivity(activity);
activity.startActivityForResult(intent, REQUEST_SETTINGS);
}
public void toggleNightMode()
{
themeSwitcher.toggleNightMode();
activity.restartWithFade();
}
}