Skip to content

Commit

Permalink
misc. fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Dakotaa committed Dec 1, 2021
1 parent e899afc commit e60cd61
Show file tree
Hide file tree
Showing 9 changed files with 159 additions and 79 deletions.
11 changes: 9 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@
android:theme="@style/Theme.TimeApp">
<activity
android:name=".ui.SetupActivity"
android:exported="true"
android:label="First Time Setup"
android:screenOrientation="portrait"
android:exported="true" />
android:screenOrientation="portrait" />

<activity
android:name=".ui.MainActivity"
android:exported="true"
Expand All @@ -26,6 +27,12 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".notification.NotificationReceiver"
android:enabled="true"
android:exported="false"></receiver>

<service android:name=".ui.MainActivity$NotificationActionService" />
</application>

<uses-permission android:name="android.permission.SET_ALARM" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.dakotalal.timeapp.notification;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;

import com.dakotalal.timeapp.R;
import com.dakotalal.timeapp.room.entities.Timeslot;
import com.dakotalal.timeapp.ui.MainActivity;

import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;

public class NotificationReceiver extends BroadcastReceiver {
private NotificationManager notificationManager;
private static final int NOTIFICATION_ID = 0;
private static final String PRIMARY_CHANNEL_ID =
"primary_notification_channel";

@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onReceive(Context context, Intent intent) {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
int numEmptyTimeslots = intent.getExtras().getInt("EMPTY_TIMESLOTS");
deliverNotification(context, numEmptyTimeslots);
}

@RequiresApi(api = Build.VERSION_CODES.O)
public void deliverNotification(Context context, int numEmptyTimeslots) {
Intent contentIntent = new Intent(context, MainActivity.class);
PendingIntent contentPendingIntent = PendingIntent.getActivity
(context, NOTIFICATION_ID, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, PRIMARY_CHANNEL_ID)
.setSmallIcon(R.drawable.icon_timelog)
.setContentTitle(numEmptyTimeslots + " Timeslot(s) Empty!")
.setContentText("Tap to fill out today's empty timeslots.")
.setContentIntent(contentPendingIntent)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL);

// if (numEmptyTimeslots == 1) {
// Timeslot t = emptyTimeslots.get(0);
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
// String start = Instant.ofEpochSecond(t.getTimeStart()).atZone(ZoneId.systemDefault()).format(formatter);
// String end = Instant.ofEpochSecond(t.getTimeEnd()).atZone(ZoneId.systemDefault()).format(formatter);
// builder.setContentTitle("Timeslot empty: " + start + " - " + end)
// .setContentText("Tap to open Timelog");
// if (!mostCommonActivities.isEmpty()) {
// for (int i = 1; i < mostCommonActivities.size(); i++) {
// if (i <= 3) {
// String label = mostCommonActivities.get(i).getLabel();
// Intent actionIntent = new Intent(context, NotificationActionService.class).setAction(label);
// PendingIntent actionPendingIntent = PendingIntent.getService(context, 0, actionIntent, PendingIntent.FLAG_CANCEL_CURRENT);
// builder.addAction(R.id.nav_timelog, label, actionPendingIntent)
// .setContentText("Tap to open Timelog, or press one of the buttons below to enter an activity.");
// }
// }
// }
// }

notificationManager.notify(NOTIFICATION_ID, builder.build());
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,13 @@ public LiveData<Integer> getEmptyTimeslotCountSince(long start, long end) {
return timeslotDao.getEmptyTimeslotCountSince(start, end);
}

@RequiresApi(api = Build.VERSION_CODES.O)
public LiveData<List<Timeslot>> getEmptyTimeslotsToday() {
long start = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond();
long end = System.currentTimeMillis() / 1000;
return timeslotDao.getEmptyTimeslotsSince(start, end);
}


/**
* Creates a day in the database representing the current day
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/dakotalal/timeapp/room/TimeslotDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ public interface TimeslotDao {
@Query("SELECT count(*) from timeslot_table WHERE start >= :startTime AND start < :endTime AND activityLabel is NULL")
LiveData<Integer> getEmptyTimeslotCountSince(long startTime, long endTime);

// Get a LiveData List of all Timeslots without an activity
@Query("SELECT * from timeslot_table WHERE start >= :startTime AND start < :endTime AND activityLabel is NULL")
LiveData<List<Timeslot>> getEmptyTimeslotsSince(long startTime, long endTime);

@Query("SELECT * from timeslot_table")
LiveData<List<Timeslot>> getAllTimeslots();

Expand Down
6 changes: 5 additions & 1 deletion app/src/main/java/com/dakotalal/timeapp/ui/HomeFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,11 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
time = "Good evening";
}

welcomeText.setText(time + ", " + name + "!");
if (name.isEmpty()) {
welcomeText.setText(time + "!");
} else {
welcomeText.setText(time + ", " + name + "!");
}

TimeViewModel timeViewModel = new ViewModelProvider(this).get(TimeViewModel.class);
timeViewModel.createToday();
Expand Down
100 changes: 58 additions & 42 deletions app/src/main/java/com/dakotalal/timeapp/ui/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,60 +2,64 @@


import android.app.AlarmManager;
import android.app.IntentService;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;

import com.dakotalal.timeapp.R;

import com.dakotalal.timeapp.notification.Notification_Receiver;


import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import androidx.core.app.NotificationCompat;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import com.dakotalal.timeapp.databinding.ActivityMainBinding;
import com.dakotalal.timeapp.notification.NotificationReceiver;
import com.dakotalal.timeapp.room.entities.TimeActivity;
import com.dakotalal.timeapp.room.entities.Timeslot;
import com.dakotalal.timeapp.viewmodel.TimeViewModel;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;

import android.os.SystemClock;
import android.util.Log;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Calendar;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
private AppBarConfiguration appBarConfiguration;
private ActivityMainBinding binding;
private NotificationManager notificationManager;
// shared preference constants
public static String PREFS = "com.timeapp.prefs";
public static String PREFS_INTERVAL_LENGTH = "com.timeapp.prefs.interval_length";
public static String PREFS_NAME = "com.timeapp.prefs.name";
public static String PREFS_SETUP_COMPLETE = "com.timeapp.prefs.setup_complete";
// notification constants
private NotificationManager notificationManager;
private static final int NOTIFICATION_ID = 0;
private static final String PRIMARY_CHANNEL_ID =
"primary_notification_channel";
TimeViewModel viewModel;
int emptyTimeslots;
int numEmptyTimeslots;
private List<Timeslot> emptyTimeslots;
private List<TimeActivity> mostCommonActivities;

@RequiresApi(api = Build.VERSION_CODES.O)
@Override
Expand All @@ -82,12 +86,41 @@ protected void onCreate(Bundle savedInstanceState) {

createNotificationChannel();

// long startOfToday = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond();
// viewModel.getEmptyTimeslotCountSince(startOfToday).observe(this, i -> {
// emptyTimeslots = i;
// deliverNotification(MainActivity.this);
// });
Intent notifyIntent = new Intent(this, NotificationReceiver.class);
notifyIntent.putExtra("EMPTY_TIMESLOTS", numEmptyTimeslots);
PendingIntent notifyPendingIntent = PendingIntent.getBroadcast(this, NOTIFICATION_ID, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

numEmptyTimeslots = 0;

mostCommonActivities = new ArrayList<>();

viewModel.getEmptyTimeslotsToday().observe(this, timeslots -> {
emptyTimeslots = timeslots;
numEmptyTimeslots = timeslots.size();
Intent newNotifyIntent = new Intent(this, NotificationReceiver.class);
newNotifyIntent.putExtra("EMPTY_TIMESLOTS", numEmptyTimeslots);
PendingIntent newNotifyPendingIntent = PendingIntent.getBroadcast(this, NOTIFICATION_ID, newNotifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
setAlarm(alarmManager, newNotifyPendingIntent);
Log.d("Main", "empty: " + numEmptyTimeslots);
});

viewModel.getMostCommonTimeActivities().observe(this, timeActivities -> {
this.mostCommonActivities = timeActivities;
});

setAlarm(alarmManager, notifyPendingIntent);
}

public void setAlarm(AlarmManager alarmManager, PendingIntent notifyPendingIntent) {
if (alarmManager != null) {
long repeatInterval = AlarmManager.INTERVAL_HOUR;
long triggerTime = SystemClock.elapsedRealtime() + repeatInterval;
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
triggerTime, repeatInterval, notifyPendingIntent);
} else {
alarmManager.cancel(notifyPendingIntent);
}
}

@Override
Expand Down Expand Up @@ -119,45 +152,28 @@ public void createNotificationChannel() {
// Create the NotificationChannel with all the parameters.
NotificationChannel notificationChannel = new NotificationChannel
(PRIMARY_CHANNEL_ID,
"Time log reminder",
"Timelog reminder",
NotificationManager.IMPORTANCE_HIGH);

notificationChannel.enableLights(false);
notificationChannel.enableVibration(false);
notificationChannel.setDescription
("Reminder every 15 minutes to fill timelog");
("Reminder to fill timelog");
notificationManager.createNotificationChannel(notificationChannel);
}
}

public void deliverNotification(Context context) {
Intent contentIntent = new Intent(context, MainActivity.class);
PendingIntent contentPendingIntent = PendingIntent.getActivity
(context, NOTIFICATION_ID, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, PRIMARY_CHANNEL_ID)
.setSmallIcon(R.drawable.icon_timelog)
.setContentTitle(emptyTimeslots + " Timeslots Empty!")
.setContentText("Tap to fill out recent timelog intervals")
.setContentIntent(contentPendingIntent)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL);

viewModel.getMostCommonTimeActivities().observe(this, new Observer<List<TimeActivity>>() {
@Override
public void onChanged(List<TimeActivity> timeActivities) {
if (timeActivities.size() >= 1) {
for (int i = 1; i < timeActivities.size(); i++) {
if (i <= 3) {
builder.addAction(R.id.nav_timelog, timeActivities.get(i).getLabel(), contentPendingIntent);
notificationManager.notify(NOTIFICATION_ID, builder.build());
}
}
}
}
});

Log.d("MainActivity", "Delivering notifciation");
notificationManager.notify(NOTIFICATION_ID, builder.build());

public static class NotificationActionService extends IntentService {
public NotificationActionService() {
super(NotificationActionService.class.getSimpleName());
}

@Override
protected void onHandleIntent(Intent intent) {
String action = intent.getAction();
Log.d("MainActivity", "Received notification action: " + action);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,10 @@ public LiveData<Integer> getEmptyTimeslotCountSince(long start) {
return timeRepository.getEmptyTimeslotCountSince(start, end);
}

public LiveData<List<Timeslot>> getEmptyTimeslotsToday() {
return timeRepository.getEmptyTimeslotsToday();
}


/**
* Creates the timeslots for a day and inserts them into the database
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/layout/dialog_new_time_activity.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:background="#DADADA"
android:textColor="#000000"
android:hint="@string/hint_activity_name"
android:inputType="textCapSentences"
android:layout_marginBottom="8dp"/>
Expand Down

0 comments on commit e60cd61

Please sign in to comment.