mirror of https://github.com/iSoron/uhabits.git
parent
d5b9fda636
commit
f208601bc4
@ -1,103 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||
*
|
||||
* 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.receivers;
|
||||
|
||||
import android.content.*;
|
||||
import android.net.*;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.isoron.uhabits.core.*;
|
||||
import org.isoron.uhabits.core.models.*;
|
||||
import org.isoron.uhabits.core.preferences.*;
|
||||
import org.isoron.uhabits.core.reminders.*;
|
||||
import org.isoron.uhabits.core.ui.*;
|
||||
import org.isoron.uhabits.core.utils.*;
|
||||
import org.isoron.uhabits.notifications.*;
|
||||
|
||||
import javax.inject.*;
|
||||
|
||||
@AppScope
|
||||
public class ReminderController
|
||||
{
|
||||
@NonNull
|
||||
private final ReminderScheduler reminderScheduler;
|
||||
|
||||
@NonNull
|
||||
private final NotificationTray notificationTray;
|
||||
|
||||
@NonNull
|
||||
private Preferences preferences;
|
||||
|
||||
@Inject
|
||||
public ReminderController(@NonNull ReminderScheduler reminderScheduler,
|
||||
@NonNull NotificationTray notificationTray,
|
||||
@NonNull Preferences preferences)
|
||||
{
|
||||
this.reminderScheduler = reminderScheduler;
|
||||
this.notificationTray = notificationTray;
|
||||
this.preferences = preferences;
|
||||
}
|
||||
|
||||
public void onBootCompleted()
|
||||
{
|
||||
reminderScheduler.scheduleAll();
|
||||
}
|
||||
|
||||
public void onShowReminder(@NonNull Habit habit,
|
||||
Timestamp timestamp,
|
||||
long reminderTime)
|
||||
{
|
||||
notificationTray.show(habit, timestamp, reminderTime);
|
||||
reminderScheduler.scheduleAll();
|
||||
}
|
||||
|
||||
public void onSnoozePressed(@NonNull Habit habit, final Context context)
|
||||
{
|
||||
showSnoozeDelayPicker(habit, context);
|
||||
}
|
||||
|
||||
public void onSnoozeDelayPicked(Habit habit, int delayInMinutes)
|
||||
{
|
||||
reminderScheduler.snoozeReminder(habit, delayInMinutes);
|
||||
notificationTray.cancel(habit);
|
||||
}
|
||||
|
||||
public void onSnoozeTimePicked(Habit habit, int hour, int minute)
|
||||
{
|
||||
long time = DateUtils.getUpcomingTimeInMillis(hour, minute);
|
||||
reminderScheduler.scheduleAtTime(habit, time);
|
||||
notificationTray.cancel(habit);
|
||||
}
|
||||
|
||||
public void onDismiss(@NonNull Habit habit)
|
||||
{
|
||||
notificationTray.cancel(habit);
|
||||
}
|
||||
|
||||
private void showSnoozeDelayPicker(@NonNull Habit habit, Context context)
|
||||
{
|
||||
context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
|
||||
Intent intent = new Intent(context, SnoozeDelayPickerActivity.class);
|
||||
intent.setData(Uri.parse(habit.getUriString()));
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
}
|
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||
*
|
||||
* 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.receivers
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import org.isoron.uhabits.core.AppScope
|
||||
import org.isoron.uhabits.core.models.Habit
|
||||
import org.isoron.uhabits.core.models.Timestamp
|
||||
import org.isoron.uhabits.core.preferences.Preferences
|
||||
import org.isoron.uhabits.core.reminders.ReminderScheduler
|
||||
import org.isoron.uhabits.core.ui.NotificationTray
|
||||
import org.isoron.uhabits.core.utils.DateUtils.Companion.getUpcomingTimeInMillis
|
||||
import org.isoron.uhabits.notifications.SnoozeDelayPickerActivity
|
||||
import javax.inject.Inject
|
||||
|
||||
@AppScope
|
||||
class ReminderController @Inject constructor(
|
||||
private val reminderScheduler: ReminderScheduler,
|
||||
private val notificationTray: NotificationTray,
|
||||
private val preferences: Preferences
|
||||
) {
|
||||
fun onBootCompleted() {
|
||||
reminderScheduler.scheduleAll()
|
||||
}
|
||||
|
||||
fun onShowReminder(
|
||||
habit: Habit,
|
||||
timestamp: Timestamp?,
|
||||
reminderTime: Long
|
||||
) {
|
||||
notificationTray.show(habit, timestamp, reminderTime)
|
||||
reminderScheduler.scheduleAll()
|
||||
}
|
||||
|
||||
fun onSnoozePressed(habit: Habit, context: Context) {
|
||||
showSnoozeDelayPicker(habit, context)
|
||||
}
|
||||
|
||||
fun onSnoozeDelayPicked(habit: Habit?, delayInMinutes: Int) {
|
||||
reminderScheduler.snoozeReminder(habit, delayInMinutes.toLong())
|
||||
notificationTray.cancel(habit!!)
|
||||
}
|
||||
|
||||
fun onSnoozeTimePicked(habit: Habit?, hour: Int, minute: Int) {
|
||||
val time: Long = getUpcomingTimeInMillis(hour, minute)
|
||||
reminderScheduler.scheduleAtTime(habit!!, time)
|
||||
notificationTray.cancel(habit)
|
||||
}
|
||||
|
||||
fun onDismiss(habit: Habit) {
|
||||
notificationTray.cancel(habit)
|
||||
}
|
||||
|
||||
private fun showSnoozeDelayPicker(habit: Habit, context: Context) {
|
||||
context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
|
||||
val intent = Intent(context, SnoozeDelayPickerActivity::class.java)
|
||||
intent.data = Uri.parse(habit.uriString)
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
@ -1,124 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||
*
|
||||
* 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.receivers;
|
||||
|
||||
import android.content.*;
|
||||
import android.util.*;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.isoron.uhabits.*;
|
||||
import org.isoron.uhabits.core.models.*;
|
||||
import org.isoron.uhabits.core.utils.*;
|
||||
import org.isoron.uhabits.inject.*;
|
||||
|
||||
import static android.content.ContentUris.*;
|
||||
|
||||
/**
|
||||
* The Android BroadcastReceiver for Loop Habit Tracker.
|
||||
* <p>
|
||||
* All broadcast messages are received and processed by this class.
|
||||
*/
|
||||
public class ReminderReceiver extends BroadcastReceiver
|
||||
{
|
||||
public static final String ACTION_DISMISS_REMINDER =
|
||||
"org.isoron.uhabits.ACTION_DISMISS_REMINDER";
|
||||
|
||||
public static final String ACTION_SHOW_REMINDER =
|
||||
"org.isoron.uhabits.ACTION_SHOW_REMINDER";
|
||||
|
||||
public static final String ACTION_SNOOZE_REMINDER =
|
||||
"org.isoron.uhabits.ACTION_SNOOZE_REMINDER";
|
||||
|
||||
private static final String TAG = "ReminderReceiver";
|
||||
|
||||
private static Intent lastReceivedIntent = null;
|
||||
|
||||
@Override
|
||||
public void onReceive(@Nullable final Context context, @Nullable Intent intent)
|
||||
{
|
||||
if (context == null || intent == null) return;
|
||||
if (intent.getAction() == null) return;
|
||||
lastReceivedIntent = intent;
|
||||
|
||||
HabitsApplication app = (HabitsApplication) context.getApplicationContext();
|
||||
HabitsApplicationComponent appComponent = app.getComponent();
|
||||
HabitList habits = appComponent.getHabitList();
|
||||
ReminderController reminderController = appComponent.getReminderController();
|
||||
|
||||
Log.i(TAG, String.format("Received intent: %s", intent.toString()));
|
||||
|
||||
Habit habit = null;
|
||||
long today = DateUtils.getStartOfTodayWithOffset();
|
||||
|
||||
if (intent.getData() != null)
|
||||
habit = habits.getById(parseId(intent.getData()));
|
||||
final long timestamp = intent.getLongExtra("timestamp", today);
|
||||
final long reminderTime = intent.getLongExtra("reminderTime", today);
|
||||
|
||||
try
|
||||
{
|
||||
switch (intent.getAction())
|
||||
{
|
||||
case ACTION_SHOW_REMINDER:
|
||||
if (habit == null) return;
|
||||
Log.d("ReminderReceiver", String.format(
|
||||
"onShowReminder habit=%d timestamp=%d reminderTime=%d",
|
||||
habit.getId(),
|
||||
timestamp,
|
||||
reminderTime));
|
||||
reminderController.onShowReminder(habit,
|
||||
new Timestamp(timestamp), reminderTime);
|
||||
break;
|
||||
|
||||
case ACTION_DISMISS_REMINDER:
|
||||
if (habit == null) return;
|
||||
Log.d("ReminderReceiver", String.format("onDismiss habit=%d", habit.getId()));
|
||||
reminderController.onDismiss(habit);
|
||||
break;
|
||||
|
||||
case ACTION_SNOOZE_REMINDER:
|
||||
if (habit == null) return;
|
||||
Log.d("ReminderReceiver", String.format("onSnoozePressed habit=%d", habit.getId()));
|
||||
reminderController.onSnoozePressed(habit, context);
|
||||
break;
|
||||
|
||||
case Intent.ACTION_BOOT_COMPLETED:
|
||||
Log.d("ReminderReceiver", "onBootCompleted");
|
||||
reminderController.onBootCompleted();
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
Log.e(TAG, "could not process intent", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void clearLastReceivedIntent()
|
||||
{
|
||||
lastReceivedIntent = null;
|
||||
}
|
||||
|
||||
public static Intent getLastReceivedIntent()
|
||||
{
|
||||
return lastReceivedIntent;
|
||||
}
|
||||
}
|
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||
*
|
||||
* 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.receivers
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.ContentUris
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.util.Log
|
||||
import org.isoron.uhabits.HabitsApplication
|
||||
import org.isoron.uhabits.core.models.Habit
|
||||
import org.isoron.uhabits.core.models.Timestamp
|
||||
import org.isoron.uhabits.core.utils.DateUtils.Companion.getStartOfTodayWithOffset
|
||||
|
||||
/**
|
||||
* The Android BroadcastReceiver for Loop Habit Tracker.
|
||||
*
|
||||
*
|
||||
* All broadcast messages are received and processed by this class.
|
||||
*/
|
||||
class ReminderReceiver : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent?) {
|
||||
if (context == null || intent == null) return
|
||||
if (intent.action == null) return
|
||||
lastReceivedIntent = intent
|
||||
val app = context.applicationContext as HabitsApplication
|
||||
val appComponent = app.component
|
||||
val habits = appComponent.habitList
|
||||
val reminderController = appComponent.reminderController
|
||||
Log.i(TAG, String.format("Received intent: %s", intent.toString()))
|
||||
var habit: Habit? = null
|
||||
val today: Long = getStartOfTodayWithOffset()
|
||||
if (intent.data != null) habit = habits.getById(ContentUris.parseId(intent.data))
|
||||
val timestamp = intent.getLongExtra("timestamp", today)
|
||||
val reminderTime = intent.getLongExtra("reminderTime", today)
|
||||
try {
|
||||
when (intent.action) {
|
||||
ACTION_SHOW_REMINDER -> {
|
||||
if (habit == null) return
|
||||
Log.d(
|
||||
"ReminderReceiver",
|
||||
String.format(
|
||||
"onShowReminder habit=%d timestamp=%d reminderTime=%d",
|
||||
habit.id,
|
||||
timestamp,
|
||||
reminderTime
|
||||
)
|
||||
)
|
||||
reminderController.onShowReminder(
|
||||
habit,
|
||||
Timestamp(timestamp),
|
||||
reminderTime
|
||||
)
|
||||
}
|
||||
ACTION_DISMISS_REMINDER -> {
|
||||
if (habit == null) return
|
||||
Log.d("ReminderReceiver", String.format("onDismiss habit=%d", habit.id))
|
||||
reminderController.onDismiss(habit)
|
||||
}
|
||||
ACTION_SNOOZE_REMINDER -> {
|
||||
if (habit == null) return
|
||||
Log.d("ReminderReceiver", String.format("onSnoozePressed habit=%d", habit.id))
|
||||
reminderController.onSnoozePressed(habit, context)
|
||||
}
|
||||
Intent.ACTION_BOOT_COMPLETED -> {
|
||||
Log.d("ReminderReceiver", "onBootCompleted")
|
||||
reminderController.onBootCompleted()
|
||||
}
|
||||
}
|
||||
} catch (e: RuntimeException) {
|
||||
Log.e(TAG, "could not process intent", e)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val ACTION_DISMISS_REMINDER = "org.isoron.uhabits.ACTION_DISMISS_REMINDER"
|
||||
const val ACTION_SHOW_REMINDER = "org.isoron.uhabits.ACTION_SHOW_REMINDER"
|
||||
const val ACTION_SNOOZE_REMINDER = "org.isoron.uhabits.ACTION_SNOOZE_REMINDER"
|
||||
private const val TAG = "ReminderReceiver"
|
||||
var lastReceivedIntent: Intent? = null
|
||||
private set
|
||||
|
||||
fun clearLastReceivedIntent() {
|
||||
lastReceivedIntent = null
|
||||
}
|
||||
}
|
||||
}
|
@ -1,158 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||
*
|
||||
* 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.receivers;
|
||||
|
||||
import android.content.*;
|
||||
import android.util.*;
|
||||
|
||||
import org.isoron.uhabits.*;
|
||||
import org.isoron.uhabits.core.preferences.*;
|
||||
import org.isoron.uhabits.core.ui.widgets.*;
|
||||
import org.isoron.uhabits.inject.*;
|
||||
import org.isoron.uhabits.intents.*;
|
||||
import org.isoron.uhabits.widgets.*;
|
||||
import org.isoron.uhabits.widgets.activities.*;
|
||||
|
||||
import dagger.*;
|
||||
|
||||
/**
|
||||
* The Android BroadcastReceiver for Loop Habit Tracker.
|
||||
* <p>
|
||||
* All broadcast messages are received and processed by this class.
|
||||
*/
|
||||
public class WidgetReceiver extends BroadcastReceiver
|
||||
{
|
||||
public static final String ACTION_ADD_REPETITION =
|
||||
"org.isoron.uhabits.ACTION_ADD_REPETITION";
|
||||
|
||||
public static final String ACTION_DISMISS_REMINDER =
|
||||
"org.isoron.uhabits.ACTION_DISMISS_REMINDER";
|
||||
|
||||
public static final String ACTION_REMOVE_REPETITION =
|
||||
"org.isoron.uhabits.ACTION_REMOVE_REPETITION";
|
||||
|
||||
public static final String ACTION_TOGGLE_REPETITION =
|
||||
"org.isoron.uhabits.ACTION_TOGGLE_REPETITION";
|
||||
|
||||
public static final String ACTION_SET_NUMERICAL_VALUE =
|
||||
"org.isoron.uhabits.ACTION_SET_NUMERICAL_VALUE";
|
||||
|
||||
public static final String ACTION_UPDATE_WIDGETS_VALUE =
|
||||
"org.isoron.uhabits.ACTION_UPDATE_WIDGETS_VALUE";
|
||||
|
||||
private static final String TAG = "WidgetReceiver";
|
||||
|
||||
private static Intent lastReceivedIntent = null;
|
||||
|
||||
@Override
|
||||
public void onReceive(final Context context, Intent intent)
|
||||
{
|
||||
HabitsApplication app =
|
||||
(HabitsApplication) context.getApplicationContext();
|
||||
|
||||
WidgetComponent component = DaggerWidgetReceiver_WidgetComponent
|
||||
.builder()
|
||||
.habitsApplicationComponent(app.getComponent())
|
||||
.build();
|
||||
|
||||
IntentParser parser = app.getComponent().getIntentParser();
|
||||
WidgetBehavior controller = component.getWidgetController();
|
||||
Preferences prefs = app.getComponent().getPreferences();
|
||||
WidgetUpdater widgetUpdater = app.getComponent().getWidgetUpdater();
|
||||
|
||||
Log.i(TAG, String.format("Received intent: %s", intent.toString()));
|
||||
lastReceivedIntent = intent;
|
||||
|
||||
try
|
||||
{
|
||||
IntentParser.CheckmarkIntentData data = null;
|
||||
if (intent.getAction() != ACTION_UPDATE_WIDGETS_VALUE)
|
||||
{
|
||||
data = parser.parseCheckmarkIntent(intent);
|
||||
}
|
||||
|
||||
switch (intent.getAction())
|
||||
{
|
||||
case ACTION_ADD_REPETITION:
|
||||
Log.d(TAG, String.format(
|
||||
"onAddRepetition habit=%d timestamp=%d",
|
||||
data.getHabit().getId(),
|
||||
data.getTimestamp().getUnixTime()));
|
||||
controller.onAddRepetition(data.getHabit(),
|
||||
data.getTimestamp());
|
||||
break;
|
||||
|
||||
case ACTION_TOGGLE_REPETITION:
|
||||
Log.d(TAG, String.format(
|
||||
"onToggleRepetition habit=%d timestamp=%d",
|
||||
data.getHabit().getId(),
|
||||
data.getTimestamp().getUnixTime()));
|
||||
controller.onToggleRepetition(data.getHabit(),
|
||||
data.getTimestamp());
|
||||
break;
|
||||
|
||||
case ACTION_REMOVE_REPETITION:
|
||||
Log.d(TAG, String.format(
|
||||
"onRemoveRepetition habit=%d timestamp=%d",
|
||||
data.getHabit().getId(),
|
||||
data.getTimestamp().getUnixTime()));
|
||||
controller.onRemoveRepetition(data.getHabit(),
|
||||
data.getTimestamp());
|
||||
break;
|
||||
|
||||
case ACTION_SET_NUMERICAL_VALUE:
|
||||
context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
|
||||
Intent numberSelectorIntent = new Intent(context, NumericalCheckmarkWidgetActivity.class);
|
||||
numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||
numberSelectorIntent.setAction(NumericalCheckmarkWidgetActivity.ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY);
|
||||
parser.copyIntentData(intent,numberSelectorIntent);
|
||||
context.startActivity(numberSelectorIntent);
|
||||
break;
|
||||
|
||||
case ACTION_UPDATE_WIDGETS_VALUE:
|
||||
widgetUpdater.updateWidgets();
|
||||
widgetUpdater.scheduleStartDayWidgetUpdate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (RuntimeException e)
|
||||
{
|
||||
Log.e("WidgetReceiver", "could not process intent", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ReceiverScope
|
||||
@Component(dependencies = HabitsApplicationComponent.class)
|
||||
interface WidgetComponent
|
||||
{
|
||||
WidgetBehavior getWidgetController();
|
||||
}
|
||||
|
||||
public static Intent getLastReceivedIntent()
|
||||
{
|
||||
return lastReceivedIntent;
|
||||
}
|
||||
|
||||
public static void clearLastReceivedIntent()
|
||||
{
|
||||
lastReceivedIntent = null;
|
||||
}
|
||||
}
|
@ -0,0 +1,139 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||
*
|
||||
* 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.receivers
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.util.Log
|
||||
import dagger.Component
|
||||
import org.isoron.uhabits.HabitsApplication
|
||||
import org.isoron.uhabits.core.ui.widgets.WidgetBehavior
|
||||
import org.isoron.uhabits.inject.HabitsApplicationComponent
|
||||
import org.isoron.uhabits.intents.IntentParser.CheckmarkIntentData
|
||||
import org.isoron.uhabits.widgets.activities.NumericalCheckmarkWidgetActivity
|
||||
|
||||
/**
|
||||
* The Android BroadcastReceiver for Loop Habit Tracker.
|
||||
*
|
||||
*
|
||||
* All broadcast messages are received and processed by this class.
|
||||
*/
|
||||
class WidgetReceiver : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
val app = context.applicationContext as HabitsApplication
|
||||
val component = DaggerWidgetReceiver_WidgetComponent
|
||||
.builder()
|
||||
.habitsApplicationComponent(app.component)
|
||||
.build()
|
||||
val parser = app.component.intentParser
|
||||
val controller = component.widgetController
|
||||
val prefs = app.component.preferences
|
||||
val widgetUpdater = app.component.widgetUpdater
|
||||
Log.i(TAG, String.format("Received intent: %s", intent.toString()))
|
||||
lastReceivedIntent = intent
|
||||
try {
|
||||
var data: CheckmarkIntentData? = null
|
||||
if (intent.action !== ACTION_UPDATE_WIDGETS_VALUE) {
|
||||
data = parser.parseCheckmarkIntent(intent)
|
||||
}
|
||||
when (intent.action) {
|
||||
ACTION_ADD_REPETITION -> {
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"onAddRepetition habit=%d timestamp=%d",
|
||||
data!!.habit.id,
|
||||
data.timestamp.unixTime
|
||||
)
|
||||
)
|
||||
controller.onAddRepetition(
|
||||
data.habit,
|
||||
data.timestamp
|
||||
)
|
||||
}
|
||||
ACTION_TOGGLE_REPETITION -> {
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"onToggleRepetition habit=%d timestamp=%d",
|
||||
data!!.habit.id,
|
||||
data.timestamp.unixTime
|
||||
)
|
||||
)
|
||||
controller.onToggleRepetition(
|
||||
data.habit,
|
||||
data.timestamp
|
||||
)
|
||||
}
|
||||
ACTION_REMOVE_REPETITION -> {
|
||||
Log.d(
|
||||
TAG,
|
||||
String.format(
|
||||
"onRemoveRepetition habit=%d timestamp=%d",
|
||||
data!!.habit.id,
|
||||
data.timestamp.unixTime
|
||||
)
|
||||
)
|
||||
controller.onRemoveRepetition(
|
||||
data.habit,
|
||||
data.timestamp
|
||||
)
|
||||
}
|
||||
ACTION_SET_NUMERICAL_VALUE -> {
|
||||
context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
|
||||
val numberSelectorIntent = Intent(context, NumericalCheckmarkWidgetActivity::class.java)
|
||||
numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
|
||||
numberSelectorIntent.action = NumericalCheckmarkWidgetActivity.ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY
|
||||
parser.copyIntentData(intent, numberSelectorIntent)
|
||||
context.startActivity(numberSelectorIntent)
|
||||
}
|
||||
ACTION_UPDATE_WIDGETS_VALUE -> {
|
||||
widgetUpdater.updateWidgets()
|
||||
widgetUpdater.scheduleStartDayWidgetUpdate()
|
||||
}
|
||||
}
|
||||
} catch (e: RuntimeException) {
|
||||
Log.e("WidgetReceiver", "could not process intent", e)
|
||||
}
|
||||
}
|
||||
|
||||
@ReceiverScope
|
||||
@Component(dependencies = [HabitsApplicationComponent::class])
|
||||
internal interface WidgetComponent {
|
||||
val widgetController: WidgetBehavior
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val ACTION_ADD_REPETITION = "org.isoron.uhabits.ACTION_ADD_REPETITION"
|
||||
const val ACTION_DISMISS_REMINDER = "org.isoron.uhabits.ACTION_DISMISS_REMINDER"
|
||||
const val ACTION_REMOVE_REPETITION = "org.isoron.uhabits.ACTION_REMOVE_REPETITION"
|
||||
const val ACTION_TOGGLE_REPETITION = "org.isoron.uhabits.ACTION_TOGGLE_REPETITION"
|
||||
const val ACTION_SET_NUMERICAL_VALUE = "org.isoron.uhabits.ACTION_SET_NUMERICAL_VALUE"
|
||||
const val ACTION_UPDATE_WIDGETS_VALUE = "org.isoron.uhabits.ACTION_UPDATE_WIDGETS_VALUE"
|
||||
private const val TAG = "WidgetReceiver"
|
||||
var lastReceivedIntent: Intent? = null
|
||||
private set
|
||||
|
||||
fun clearLastReceivedIntent() {
|
||||
lastReceivedIntent = null
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue