Skip to content

Commit

Permalink
improved stats - now shows stats for specific days, weeks, months, al…
Browse files Browse the repository at this point in the history
…l-time
  • Loading branch information
Dakotaa committed Nov 16, 2021
1 parent bfaabf3 commit 558a04c
Show file tree
Hide file tree
Showing 21 changed files with 524 additions and 50 deletions.
2 changes: 2 additions & 0 deletions .idea/misc.xml

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

2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
android:supportsRtl="true"
android:theme="@style/Theme.TimeApp">
<activity
android:name=".ui.Statistics.SetupActivity"
android:name=".ui.SetupActivity"
android:label="First Time Setup"
android:screenOrientation="portrait"
android:exported="true" />
Expand Down
25 changes: 24 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 @@ -8,6 +8,7 @@
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
Expand All @@ -20,14 +21,17 @@
import com.dakotalal.timeapp.viewmodel.TimeViewModel;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZoneOffset;

import static android.content.Context.MODE_PRIVATE;

public class HomeFragment extends Fragment {

// local counts for empty timeslots
private int totalEmpty, emptyToday, emptyThisWeek;
private TextView textTotalEmpty, textSpecificEmpty;
private TextView welcomeText, textTotalEmpty, textSpecificEmpty;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Expand All @@ -45,8 +49,27 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
long weekStart = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).minusDays(7).toEpochSecond();
textTotalEmpty = view.findViewById(R.id.timeslotsTotal);
textSpecificEmpty = view.findViewById(R.id.timeslotsSpecific);
welcomeText = view.findViewById(R.id.welcomeMessage);

SharedPreferences prefs = requireActivity().getSharedPreferences(MainActivity.PREFS, MODE_PRIVATE);
String name = prefs.getString(MainActivity.PREFS_NAME, "");
String time = "";
int hour = LocalTime.now().getHour();
if (hour >= 6 && hour < 12) {
time = "Good morning";
} else if (hour >= 12 && hour < 17) {
time = "Good afternoon";
} else {
time = "Good evening";
}

welcomeText.setText(time + ", " + name + "!");

TimeViewModel timeViewModel = new ViewModelProvider(this).get(TimeViewModel.class);
timeViewModel.createToday();
for (int i = 1; i < 50; i++) {
timeViewModel.createDay(LocalDate.now().minusDays(i));
}

timeViewModel.getEmptyTimeslotCountSince(0).observe(requireActivity(), count -> {
totalEmpty = count;
Expand Down
7 changes: 0 additions & 7 deletions app/src/main/java/com/dakotalal/timeapp/ui/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@
import com.dakotalal.timeapp.R;

import com.dakotalal.timeapp.notification.Notification_Receiver;
import com.dakotalal.timeapp.ui.Statistics.SetupActivity;
import com.dakotalal.timeapp.ui.TimeActivities.TimeActivityListFragment;
import com.dakotalal.timeapp.ui.Timelog.TimelogFragment;


import androidx.appcompat.app.AppCompatActivity;
Expand All @@ -27,12 +24,8 @@
import com.google.android.material.navigation.NavigationBarView;

import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import java.util.Calendar;
import java.util.zip.Inflater;

public class MainActivity extends AppCompatActivity {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.dakotalal.timeapp.ui.Statistics;
package com.dakotalal.timeapp.ui;

import androidx.appcompat.app.AppCompatActivity;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.dakotalal.timeapp.ui.Statistics;

import android.os.Build;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewpager2.widget.ViewPager2;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.dakotalal.timeapp.R;
import com.dakotalal.timeapp.room.entities.Day;
import com.dakotalal.timeapp.viewmodel.TimeViewModel;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class AllTimeStatsFragment extends IntervalStatsFragment {
ViewPager2 viewPager;
TimeViewModel viewModel;
public AllTimeStatsFragment() {
// Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_interval_stats, container, false);
}

@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
viewPager = requireView().findViewById(R.id.daily_stats_view_pager);
viewPager.setAdapter(createStatsCollectionAdapter());
viewModel = new ViewModelProvider(this).get(TimeViewModel.class);

TabLayout tabLayout = requireView().findViewById(R.id.daily_stats_tab_layout);
tabLayout.setTabMode(TabLayout.MODE_AUTO);
new TabLayoutMediator(tabLayout, viewPager,
(tab, position) -> tab.setText(" " + (position + 1))
).attach();

// get the days and insert them into the adapter
viewModel.getAllDays().observe(requireActivity(), days -> {
List<PieStatFragment> fragments = new ArrayList<>();
fragments.add(PieStatFragment.newInstance(0, LocalDate.now().toEpochDay(), "All Time"));
adapter.setPieStatFragments(fragments);
viewPager.setCurrentItem(fragments.size());
adapter.notifyDataSetChanged();
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package com.dakotalal.timeapp.ui.Statistics;

import android.os.Build;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewpager2.widget.ViewPager2;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.dakotalal.timeapp.R;
import com.dakotalal.timeapp.room.entities.Day;
import com.dakotalal.timeapp.viewmodel.TimeViewModel;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;

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

public class DailyStatsFragment extends IntervalStatsFragment {
ViewPager2 viewPager;
TimeViewModel viewModel;
public DailyStatsFragment() {
// Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_interval_stats, container, false);
}

@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
viewPager = requireView().findViewById(R.id.daily_stats_view_pager);
viewPager.setAdapter(createStatsCollectionAdapter());
viewModel = new ViewModelProvider(this).get(TimeViewModel.class);

TabLayout tabLayout = requireView().findViewById(R.id.daily_stats_tab_layout);
tabLayout.setTabMode(TabLayout.MODE_AUTO);
new TabLayoutMediator(tabLayout, viewPager,
(tab, position) -> tab.setText(" " + (position + 1))
).attach();

// make sure today is loaded
List<PieStatFragment> fragments = new ArrayList<>();
fragments.add(PieStatFragment.newInstance(LocalDate.now().toEpochDay(), LocalDate.now().toEpochDay(), "Today"));
adapter.setPieStatFragments(fragments);
adapter.notifyDataSetChanged();

// get the days and insert them into the adapter
viewModel.getAllDays().observe(requireActivity(), new Observer<List<Day>>() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onChanged(List<Day> days) {
List<PieStatFragment> fragments = new ArrayList<>();
List<String> labels = new ArrayList<>();
for (Day d: days) {
LocalDate date = d.getDate();
String label;
String dayOfWeek = date.getDayOfWeek().toString();
String year = Integer.toString(date.getYear());
String month = Integer.toString(date.getMonthValue());
String monthString = date.getMonth().toString();
String day = Integer.toString(date.getDayOfMonth());
fragments.add(PieStatFragment.newInstance(d.getDate().toEpochDay(), d.getDate().toEpochDay(), MessageFormat.format("{0} {1} {2}, {3}", dayOfWeek, monthString, day, year)));
if (date.isAfter(LocalDate.now().minusDays(7))) {
if (date.equals(LocalDate.now())) {
label = MessageFormat.format("Today ({0}/{1}/{2})", day, month, year);
} else if (date.equals(LocalDate.now().minusDays(1))) {
label = MessageFormat.format("Yesterday ({0}/{1}/{2})", day, month, year);
} else {
label = MessageFormat.format("{0} ({1}/{2}/{3})", dayOfWeek, day, month, year);
}
} else { // show only the date for anything further than a week back
label = MessageFormat.format("{0}/{1}/{2}", day, month, year);
}
labels.add(label);
}
adapter.setPieStatFragments(fragments);
viewPager.setCurrentItem(fragments.size());
adapter.notifyDataSetChanged();
for (int i = 0; i < fragments.size(); i++) {
TabLayout.Tab tab = tabLayout.getTabAt(i);
if (tab != null) {
tab.setText(labels.get(i));
}
}

}
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.dakotalal.timeapp.ui.Statistics;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.dakotalal.timeapp.R;

import androidx.fragment.app.Fragment;

public class IntervalStatsFragment extends Fragment {

StatsCollectionAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_interval_stats, container, false);
}

public StatsCollectionAdapter createStatsCollectionAdapter() {
adapter = new StatsCollectionAdapter(getActivity());
return adapter;
}
}
Loading

0 comments on commit 558a04c

Please sign in to comment.