Skip to content

Commit

Permalink
App name and logo
Browse files Browse the repository at this point in the history
  • Loading branch information
Dakotaa committed Nov 17, 2021
1 parent 558a04c commit e899afc
Show file tree
Hide file tree
Showing 37 changed files with 161 additions and 230 deletions.
3 changes: 3 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added app/src/main/ic_launcher-playstore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.dakotalal.timeapp.notification;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.Build;

import com.dakotalal.timeapp.R;

public class Notifications {



}
106 changes: 94 additions & 12 deletions app/src/main/java/com/dakotalal/timeapp/ui/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,68 +2,92 @@


import android.app.AlarmManager;
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.room.entities.TimeActivity;
import com.dakotalal.timeapp.viewmodel.TimeViewModel;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;

import android.util.Log;

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Calendar;
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 static final int NOTIFICATION_ID = 0;
private static final String PRIMARY_CHANNEL_ID =
"primary_notification_channel";
TimeViewModel viewModel;
int emptyTimeslots;

@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

binding = ActivityMainBinding.inflate(getLayoutInflater());
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
setContentView(binding.getRoot());

BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation_view);
bottomNavigationView.setLabelVisibilityMode(NavigationBarView.LABEL_VISIBILITY_LABELED);
NavController navController = Navigation.findNavController(findViewById(R.id.nav_fragment));
NavigationUI.setupWithNavController(bottomNavigationView, navController);

// setup repeating notification for timelog
Calendar calendar = Calendar.getInstance();
Log.d("MainActivity", calendar.getTime().toString());
Intent intent = new Intent(getApplicationContext(), Notification_Receiver.class);
intent.setAction("TIMELOG_NOTIFICATION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 55, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),30000,pendingIntent);

// if the user hasn't completed the setup, launch the setup activity
SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
boolean setupComplete = prefs.getBoolean(PREFS_SETUP_COMPLETE, false);
if (!setupComplete) {
launchFirstTimeSetup();
}

viewModel = new ViewModelProvider(this).get(TimeViewModel.class);

createNotificationChannel();

// long startOfToday = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond();
// viewModel.getEmptyTimeslotCountSince(startOfToday).observe(this, i -> {
// emptyTimeslots = i;
// deliverNotification(MainActivity.this);
// });

}

@Override
Expand All @@ -78,4 +102,62 @@ public void launchFirstTimeSetup() {
startActivity(intent);
}

/**
* Creates a Notification channel, for OREO and higher.
*/
public void createNotificationChannel() {

// Create a notification manager object.
notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// Notification channels are only available in OREO and higher.
// So, add a check on SDK version.
if (android.os.Build.VERSION.SDK_INT >=
android.os.Build.VERSION_CODES.O) {

// Create the NotificationChannel with all the parameters.
NotificationChannel notificationChannel = new NotificationChannel
(PRIMARY_CHANNEL_ID,
"Time log reminder",
NotificationManager.IMPORTANCE_HIGH);

notificationChannel.enableLights(false);
notificationChannel.enableVibration(false);
notificationChannel.setDescription
("Reminder every 15 minutes 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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
adapter.setPieStatFragments(fragments);
viewPager.setCurrentItem(fragments.size());
adapter.notifyDataSetChanged();
tabLayout.getTabAt(0).setText("All Time Statistics");
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
Expand All @@ -19,7 +18,6 @@
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

import java.text.MessageFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.ArrayList;
Expand Down Expand Up @@ -59,14 +60,14 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
@Override
public void onChanged(List<Day> days) {
List<PieStatFragment> fragments = new ArrayList<>();
LocalDate lastStart = LocalDate.now();
for (int i = days.size() - 1; i >= 0; i--) {
LocalDate lastStart = LocalDate.now();
Day d = days.get(i);
if (d.getDate().getDayOfWeek().equals(DayOfWeek.THURSDAY)) { // if this day is the start of the week, following 6 days make up the week
if (d.getDate().getDayOfWeek().equals(DayOfWeek.MONDAY)) { // if this day is the start of the week, following 6 days make up the week
lastStart = d.getDate();
fragments.add(PieStatFragment.newInstance(d.getDate().toEpochDay(), d.getDate().plusDays(6).toEpochDay(), d.getDate().toString() + " - " + d.getDate().plusDays(6).toString()));
fragments.add(PieStatFragment.newInstance(d.getDate().toEpochDay(), d.getDate().plusDays(6).toEpochDay(), getLabelFormat(d.getDate(), d.getDate().plusDays(6))));
} else if (i == 0) {
fragments.add(PieStatFragment.newInstance(lastStart.minusDays(7).toEpochDay(), lastStart.minusDays(1).toEpochDay(), lastStart.minusDays(7).toString() + " - " + lastStart.minusDays(1).toString()));
fragments.add(PieStatFragment.newInstance(lastStart.minusDays(7).toEpochDay(), lastStart.minusDays(1).toEpochDay(), getLabelFormat(lastStart.minusDays(7), lastStart.minusDays(1))));
}
}
Collections.reverse(fragments);
Expand All @@ -85,4 +86,11 @@ public void onChanged(List<Day> days) {
}
});
}

@RequiresApi(api = Build.VERSION_CODES.O)
private String getLabelFormat(LocalDate start, LocalDate end) {
String startFormat = MessageFormat.format("{0}. {1}, {2,number,#}", start.getMonth().toString().substring(0, 3), start.getDayOfMonth(), start.getYear());
String endFormat = MessageFormat.format("{0}. {1}, {2,number,#}", end.getMonth().toString().substring(0, 3), end.getDayOfMonth(), end.getYear());
return startFormat + " - " + endFormat;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
// setup and initialize the view model
timeViewModel = new ViewModelProvider(this).get(TimeViewModel.class);
// Observe the list of activities
timeViewModel.getMostCommonTimeActivities(LocalDate.now().minusDays(7).atStartOfDay(ZoneId.systemDefault()).toEpochSecond()).observe(this, new Observer<List<TimeActivity>>() {
timeViewModel.getMostCommonTimeActivitiesSince(LocalDate.now().minusDays(7).atStartOfDay(ZoneId.systemDefault()).toEpochSecond()).observe(this, new Observer<List<TimeActivity>>() {
@Override
public void onChanged(@Nullable final List<TimeActivity> timeActivities) {
// Update the cached copy of the activities in the adapter.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class TimeViewModel extends AndroidViewModel {
private LiveData<List<Day>> allDays;
private LiveData<List<Timeslot>> currentDayTimeslots;
private Hashtable<String, TimeActivity> timeActivitiesByLabel;
private LiveData<List<TimeActivity>> mostCommonActivities;

@RequiresApi(api = Build.VERSION_CODES.O)
public TimeViewModel(Application application) {
Expand Down Expand Up @@ -115,10 +116,18 @@ public LiveData<List<TimeActivity>> getAllTimeActivities() {
return this.allTimeActivities;
}

public LiveData<List<TimeActivity>> getMostCommonTimeActivities(long since) {
public LiveData<List<TimeActivity>> getMostCommonTimeActivitiesSince(long since) {
return timeRepository.getMostCommonTimeActivities(since);
}

public LiveData<List<TimeActivity>> getMostCommonTimeActivities() {
if (mostCommonActivities == null) {
mostCommonActivities = new MutableLiveData<>();
mostCommonActivities = timeRepository.getMostCommonTimeActivities(0);
}
return mostCommonActivities;
}

public LiveData<List<Day>> getAllDays() {
if (allDays == null) {
allDays = new MutableLiveData<>();
Expand Down
30 changes: 0 additions & 30 deletions app/src/main/res/drawable-v24/ic_launcher_foreground.xml

This file was deleted.

Loading

0 comments on commit e899afc

Please sign in to comment.