Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.preference:preference:1.2.0'
implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.ashuh.nusmoduleplanner.settings;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.gridlayout.widget.GridLayout;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;

import com.ashuh.nusmoduleplanner.R;
import com.ashuh.nusmoduleplanner.common.util.ColorScheme;
import com.ashuh.nusmoduleplanner.timetable.presentation.TimetableView;

public class ColorSchemePreference extends Preference {
private static final int MARGIN_DP = 4;

private final TimetableSampleDataLoader loader = new TimetableSampleDataLoader();
private ColorScheme colorScheme;

public ColorSchemePreference(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}

@Nullable
@Override
protected Object onGetDefaultValue(@NonNull TypedArray a, int index) {
return a.getString(index);
}

@Override
public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
TimetableView timetableView = (TimetableView) holder.findViewById(R.id.timetable);
GridLayout gridLayout = (GridLayout) holder.findViewById(R.id.grid);

if (gridLayout.getChildCount() == 0) {
timetableView.setWeekViewLoader(loader);

for (int i = 0; i < ColorScheme.values().length; i++) {
ColorScheme colorScheme = ColorScheme.values()[i];
ColorSchemeView colorSchemeView = generateColorSchemeView(colorScheme, i);
gridLayout.addView(colorSchemeView);
}
} else {
for (int i = 0; i < gridLayout.getChildCount(); i++) {
ColorSchemeView child = (ColorSchemeView) gridLayout.getChildAt(i);
child.setSelected(this.colorScheme == child.getColorScheme());
}
}

loader.setColorScheme(colorScheme);
timetableView.notifyDatasetChanged();
}

@Override
protected void onSetInitialValue(@Nullable Object defaultValue) {
ColorScheme colorScheme = ColorScheme.valueOf(getPersistedString((String) defaultValue));
setColorScheme(colorScheme);
}

private ColorSchemeView generateColorSchemeView(ColorScheme colorScheme, int index) {
ColorSchemeView colorSchemeView = new ColorSchemeView(getContext());
colorSchemeView.setColorScheme(colorScheme);
colorSchemeView.setLayoutParams(getLayoutParams(index));
colorSchemeView.setSelected(this.colorScheme == colorScheme);
colorSchemeView.setOnClickListener(v -> setColorScheme(colorScheme));
return colorSchemeView;
}

private GridLayout.LayoutParams getLayoutParams(int index) {
GridLayout.LayoutParams param = new GridLayout.LayoutParams();
param.columnSpec = GridLayout.spec(index % 2, GridLayout.FILL, 1);
param.rowSpec = GridLayout.spec(index / 2, GridLayout.FILL, 1);
param.setGravity(Gravity.FILL_HORIZONTAL);
int marginPx = getMarginPx();
param.setMargins(marginPx, marginPx, marginPx, marginPx);
return param;
}

private void setColorScheme(@NonNull ColorScheme colorScheme) {
this.colorScheme = colorScheme;
persistString(colorScheme.name());
notifyChanged();
}

private int getMarginPx() {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
MARGIN_DP,
getContext().getResources().getDisplayMetrics()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.ashuh.nusmoduleplanner.settings;

import static com.ashuh.nusmoduleplanner.common.data.preferences.SharedPreferencesManager.PREFERENCE_FILE_KEY;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;

import com.ashuh.nusmoduleplanner.R;

public class ColorSchemeSettingsFragment extends NoMenuPreferenceFragment {
@Override
public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
PreferenceManager manager = getPreferenceManager();
manager.setSharedPreferencesName(PREFERENCE_FILE_KEY);
setPreferencesFromResource(R.xml.color_scheme_preferences, rootKey);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.ashuh.nusmoduleplanner.settings;

import static java.util.Objects.requireNonNull;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.ashuh.nusmoduleplanner.R;
import com.ashuh.nusmoduleplanner.common.util.ColorScheme;

import java.util.List;
import java.util.stream.Collectors;

public class ColorSchemeView extends FrameLayout {
private static final int BOX_SIZE_DP = 20;

private ColorScheme colorScheme;

public ColorSchemeView(@NonNull Context context) {
super(context);
init(context);
}

private void init(Context context) {
View.inflate(context, R.layout.color_scheme_layout, this);
setClickable(true);
setBackgroundResource(R.drawable.color_scheme_btn);
TypedValue outValue = new TypedValue();
context.getTheme()
.resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
}

public ColorSchemeView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}

public ColorScheme getColorScheme() {
return colorScheme;
}

public void setColorScheme(@NonNull ColorScheme colorScheme) {
requireNonNull(colorScheme);
this.colorScheme = colorScheme;

List<Integer> colors = colorScheme.getColors().stream()
.map(Color::toArgb)
.collect(Collectors.toList());

TextView nameView = findViewById(R.id.name);
nameView.setText(colorScheme.toString());

LinearLayout colorsView = findViewById(R.id.colors);
colorsView.removeAllViews();

int px = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
BOX_SIZE_DP,
getResources().getDisplayMetrics()
);

for (Integer s : colors) {
View a = new View(getContext());
a.setBackgroundColor(s);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(px, px);
a.setLayoutParams(params);
colorsView.addView(a);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.ashuh.nusmoduleplanner.settings;

import android.os.Bundle;
import android.view.Menu;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceFragmentCompat;

public abstract class NoMenuPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
menu.clear();
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,47 +3,27 @@
import static com.ashuh.nusmoduleplanner.common.data.preferences.SharedPreferencesManager.PREFERENCE_FILE_KEY;

import android.os.Bundle;
import android.view.Menu;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.ListPreference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.navigation.Navigation;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;

import com.ashuh.nusmoduleplanner.R;
import com.ashuh.nusmoduleplanner.common.util.ColorScheme;

import java.util.Arrays;

public class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
menu.clear();
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}

public class SettingsFragment extends NoMenuPreferenceFragment {
@Override
public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
PreferenceManager manager = getPreferenceManager();
manager.setSharedPreferencesName(PREFERENCE_FILE_KEY);
setPreferencesFromResource(R.xml.preferences, rootKey);
ListPreference colorSchemePreference = findPreference("color_scheme");
assert colorSchemePreference != null;

ColorScheme[] colorSchemes = ColorScheme.values();
CharSequence[] entries = Arrays.stream(colorSchemes)
.map(ColorScheme::toString)
.toArray(CharSequence[]::new);
CharSequence[] entryValues = Arrays.stream(colorSchemes)
.map(ColorScheme::name)
.toArray(CharSequence[]::new);
colorSchemePreference.setEntries(entries);
colorSchemePreference.setEntryValues(entryValues);
Preference colorSchemePreference = findPreference("color_scheme");
assert colorSchemePreference != null;
colorSchemePreference.setOnPreferenceClickListener(preference -> {
Navigation.findNavController(requireActivity(), R.id.nav_host_fragment)
.navigate(R.id.action_nav_settings_main_to_colorSchemeSettingsFragment);
return true;
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package com.ashuh.nusmoduleplanner.settings;

import androidx.annotation.NonNull;

import com.ashuh.nusmoduleplanner.common.domain.model.module.lesson.LessonType;
import com.ashuh.nusmoduleplanner.common.util.ColorScheme;
import com.ashuh.nusmoduleplanner.timetable.presentation.model.UiTimetableLessonOccurrence;

import org.threeten.bp.DayOfWeek;

import java.util.List;

import me.jlurena.revolvingweekview.DayTime;
import me.jlurena.revolvingweekview.WeekView;
import me.jlurena.revolvingweekview.WeekViewEvent;

public class TimetableSampleDataLoader implements WeekView.WeekViewLoader {
private static final UiTimetableLessonOccurrence SAMPLE_COLOR_0_1
= UiTimetableLessonOccurrence.create(
"COM1-B113",
new DayTime(DayOfWeek.TUESDAY, 10, 0),
new DayTime(DayOfWeek.TUESDAY, 11, 0),
"CS3235",
LessonType.TUTORIAL,
"2", 0);

private static final UiTimetableLessonOccurrence SAMPLE_COLOR_0_2
= UiTimetableLessonOccurrence.create(
"COM1-B113",
new DayTime(DayOfWeek.TUESDAY, 14, 0),
new DayTime(DayOfWeek.TUESDAY, 16, 0),
"CS3235",
LessonType.LECTURE,
"1", 0);

private static final UiTimetableLessonOccurrence SAMPLE_COLOR_2
= UiTimetableLessonOccurrence.create(
"AS1-0207",
new DayTime(DayOfWeek.WEDNESDAY, 10, 0),
new DayTime(DayOfWeek.WEDNESDAY, 12, 0),
"GER1000",
LessonType.TUTORIAL,
"A19", 0);

private static final UiTimetableLessonOccurrence SAMPLE_COLOR_4
= UiTimetableLessonOccurrence.create(
"i3-Aud",
new DayTime(DayOfWeek.WEDNESDAY, 12, 0),
new DayTime(DayOfWeek.WEDNESDAY, 14, 0),
"CS2100",
LessonType.LECTURE,
"1", 0);

private static final UiTimetableLessonOccurrence SAMPLE_COLOR_6
= UiTimetableLessonOccurrence.create(
"BIZ2-0509",
new DayTime(DayOfWeek.MONDAY, 10, 0),
new DayTime(DayOfWeek.MONDAY, 13, 0),
"ACC1006",
LessonType.SECTIONAL,
"1", 0);

private static final UiTimetableLessonOccurrence SAMPLE_COLOR_7_1
= UiTimetableLessonOccurrence.create(
"i3-Aud",
new DayTime(DayOfWeek.MONDAY, 14, 0),
new DayTime(DayOfWeek.MONDAY, 16, 0),
"CS2108",
LessonType.LECTURE,
"1", 0);

private static final UiTimetableLessonOccurrence SAMPLE_COLOR_7_2
= UiTimetableLessonOccurrence.create(
"COM1-0208",
new DayTime(DayOfWeek.TUESDAY, 11, 0),
new DayTime(DayOfWeek.TUESDAY, 12, 0),
"CS2108",
LessonType.TUTORIAL,
"2", 0);

@Override
public List<? extends WeekViewEvent> onWeekViewLoad() {
return List.of(SAMPLE_COLOR_0_1, SAMPLE_COLOR_0_2, SAMPLE_COLOR_2, SAMPLE_COLOR_4,
SAMPLE_COLOR_6, SAMPLE_COLOR_7_1, SAMPLE_COLOR_7_2);
}

public void setColorScheme(@NonNull ColorScheme colorScheme) {
int color0 = colorScheme.getColor(new ColorScheme.Index(0)).toArgb();
int color2 = colorScheme.getColor(new ColorScheme.Index(2)).toArgb();
int color4 = colorScheme.getColor(new ColorScheme.Index(4)).toArgb();
int color6 = colorScheme.getColor(new ColorScheme.Index(6)).toArgb();
int color7 = colorScheme.getColor(new ColorScheme.Index(7)).toArgb();

SAMPLE_COLOR_0_1.setColor(color0);
SAMPLE_COLOR_0_2.setColor(color0);
SAMPLE_COLOR_2.setColor(color2);
SAMPLE_COLOR_4.setColor(color4);
SAMPLE_COLOR_6.setColor(color6);
SAMPLE_COLOR_7_1.setColor(color7);
SAMPLE_COLOR_7_2.setColor(color7);
}
}
Loading