Før endringer av strømforbruket

This commit is contained in:
ErolHaagenrud 2026-01-08 12:03:03 +01:00
parent ee198150c2
commit f7eeba2037
4 changed files with 223 additions and 10111 deletions

View file

@ -34,15 +34,13 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
private TextView txtSheetTitle, txtDatePreview, txtUsersPreview; private TextView txtSheetTitle, txtDatePreview, txtUsersPreview;
private Calendar dueDate = Calendar.getInstance(); private Calendar dueDate = Calendar.getInstance();
private List<User> allUsersFromApi = new ArrayList<>();
private List<User> filteredUsers = new ArrayList<>(); private List<User> filteredUsers = new ArrayList<>();
private List<User> selectedUsers = new ArrayList<>(); private List<User> selectedUsers = new ArrayList<>();
private TaskItem taskToEdit = null;
private TaskItem taskToEdit = null; // NYTT: Hold oppgaven som skal endres
public interface OnTaskAddedListener { public interface OnTaskAddedListener {
void onTaskAdded(TaskItem task); void onTaskAdded(TaskItem task);
void onTaskUpdated(TaskItem task); // NYTT void onTaskUpdated(TaskItem task);
} }
private OnTaskAddedListener listener; private OnTaskAddedListener listener;
@ -51,7 +49,6 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
this.listener = listener; this.listener = listener;
} }
// NYTT: Metode for å sette oppgaven som skal redigeres
public void setTaskToEdit(TaskItem task) { public void setTaskToEdit(TaskItem task) {
this.taskToEdit = task; this.taskToEdit = task;
} }
@ -76,7 +73,7 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.bottom_sheet_add_task, container, false); View v = inflater.inflate(R.layout.bottom_sheet_add_task, container, false);
txtSheetTitle = v.findViewById(R.id.txt_sheet_title); // Pass at denne IDen finnes i XML txtSheetTitle = v.findViewById(R.id.txt_sheet_title);
etTitle = v.findViewById(R.id.et_task_title); etTitle = v.findViewById(R.id.et_task_title);
etDesc = v.findViewById(R.id.et_task_desc); etDesc = v.findViewById(R.id.et_task_desc);
btnDate = v.findViewById(R.id.btn_task_date); btnDate = v.findViewById(R.id.btn_task_date);
@ -107,24 +104,23 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
btnUsers.setOnClickListener(view -> showUserSelectionDialog()); btnUsers.setOnClickListener(view -> showUserSelectionDialog());
btnSave.setOnClickListener(view -> saveTask()); btnSave.setOnClickListener(view -> saveTask());
fetchUsers(); fetchAndFilterUsers();
return v; return v;
} }
private void fetchUsers() { private void fetchAndFilterUsers() {
RetrofitClient.getApiService().getUsersList().enqueue(new Callback<List<User>>() { RetrofitClient.getApiService().getUsersList().enqueue(new Callback<List<User>>() {
@Override @Override
public void onResponse(Call<List<User>> call, Response<List<User>> response) { public void onResponse(Call<List<User>> call, Response<List<User>> response) {
if (response.isSuccessful() && response.body() != null) { if (response.isSuccessful() && response.body() != null) {
allUsersFromApi = response.body(); // BRUKER HJELPEKLASSEN HER:
filterUsersByHierarchy(); filteredUsers = UserFilterHelper.getFilteredUsers(response.body());
// Hvis vi redigerer, vi mappe eksisterende deltakere til selectedUsers listen
if (taskToEdit != null) { if (taskToEdit != null) {
selectedUsers.clear(); selectedUsers.clear();
Map<String, Boolean> currentAssignees = taskToEdit.getAssigneeStatus(); Map<String, Boolean> currentAssignees = taskToEdit.getAssigneeStatus();
for (User u : allUsersFromApi) { for (User u : filteredUsers) {
if (currentAssignees.containsKey(u.getEmail())) { if (currentAssignees.containsKey(u.getEmail())) {
selectedUsers.add(u); selectedUsers.add(u);
} }
@ -138,46 +134,6 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
}); });
} }
private void filterUsersByHierarchy() {
filteredUsers.clear();
UserManager me = UserManager.getInstance();
List<String> myRoles = new ArrayList<>();
User self = null;
for (User u : allUsersFromApi) {
if (u.getEmail().equalsIgnoreCase(me.getUserEmail())) {
self = u;
for (String r : u.getRoles()) myRoles.add(r.toLowerCase());
break;
}
}
if (me.isEditorOrAbove()) {
filteredUsers.addAll(allUsersFromApi);
return;
}
for (User u : allUsersFromApi) {
if (u.getEmail().equalsIgnoreCase(me.getUserEmail())) {
if (!filteredUsers.contains(u)) filteredUsers.add(u);
continue;
}
boolean hasAccess = false;
for (String role : u.getRoles()) {
String r = role.toLowerCase();
if ((r.equals("serviceavdelingen") && myRoles.contains("serviceavdelingen")) ||
(r.equals("automasjonsavdelingen") && myRoles.contains("automasjonsavdelingen")) ||
(r.equals("prosjektavdelingen") && myRoles.contains("prosjektavdelingen")) ||
(r.equals("administrasjonen") && myRoles.contains("administrasjonen")) ||
(r.equals("kbs_alle") && myRoles.contains("kbs_alle"))) {
hasAccess = true;
break;
}
}
if (hasAccess && !filteredUsers.contains(u)) filteredUsers.add(u);
}
}
private void showUserSelectionDialog() { private void showUserSelectionDialog() {
if (filteredUsers.isEmpty()) { if (filteredUsers.isEmpty()) {
Toast.makeText(getContext(), "Henter tilgjengelige personer...", Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), "Henter tilgjengelige personer...", Toast.LENGTH_SHORT).show();
@ -187,7 +143,6 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
boolean[] checked = new boolean[filteredUsers.size()]; boolean[] checked = new boolean[filteredUsers.size()];
for (int i = 0; i < filteredUsers.size(); i++) { for (int i = 0; i < filteredUsers.size(); i++) {
names[i] = filteredUsers.get(i).getName(); names[i] = filteredUsers.get(i).getName();
// Sjekk om e-posten finnes i de valgte brukernes liste
boolean isSelected = false; boolean isSelected = false;
for(User su : selectedUsers) { for(User su : selectedUsers) {
if(su.getEmail().equalsIgnoreCase(filteredUsers.get(i).getEmail())) { if(su.getEmail().equalsIgnoreCase(filteredUsers.get(i).getEmail())) {
@ -202,13 +157,9 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
.setMultiChoiceItems(names, checked, (dialog, which, isChecked) -> { .setMultiChoiceItems(names, checked, (dialog, which, isChecked) -> {
User user = filteredUsers.get(which); User user = filteredUsers.get(which);
if (isChecked) { if (isChecked) {
boolean alreadyIn = false; selectedUsers.add(user);
for(User su : selectedUsers) if(su.getEmail().equalsIgnoreCase(user.getEmail())) alreadyIn = true;
if(!alreadyIn) selectedUsers.add(user);
} else { } else {
User toRemove = null; selectedUsers.removeIf(u -> u.getEmail().equalsIgnoreCase(user.getEmail()));
for(User su : selectedUsers) if(su.getEmail().equalsIgnoreCase(user.getEmail())) toRemove = su;
if(toRemove != null) selectedUsers.remove(toRemove);
} }
}) })
.setPositiveButton("OK", (dialog, which) -> updateUsersPreview()) .setPositiveButton("OK", (dialog, which) -> updateUsersPreview())
@ -234,12 +185,6 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
} }
if (taskToEdit != null) { if (taskToEdit != null) {
// REDIGER MODUS: Oppdater eksisterende objekt
// Vi beholde ID, Creator osv, men oppdatere innhold og deltakere
// OBS: Hvis vi fjerner deltakere som allerede hadde gjort oppgaven, forsvinner deres status.
// Dette er akseptabel oppførsel for enkelthets skyld.
// Lag en kopi av gamle statuser for å bevare "Fullført" for de som fortsatt er med
Map<String, Boolean> oldStatus = taskToEdit.getAssigneeStatus(); Map<String, Boolean> oldStatus = taskToEdit.getAssigneeStatus();
taskToEdit.getAssigneeStatus().clear(); taskToEdit.getAssigneeStatus().clear();
@ -255,25 +200,11 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
} }
} }
} }
taskToEdit.setTitle(title);
// Sjekk om tittelen eller beskrivelsen faktisk har endret seg for å sette titlene nytt taskToEdit.setDescription(etDesc.getText().toString());
// (Vi bruker reflection her eller bare setter verdiene direkte siden de er private i TaskItem) taskToEdit.setDueDate(dueDate.getTimeInMillis());
// Siden jeg ikke endret TaskItem til å ha public settlere, antar jeg at du legger til disse
// eller at vi bare lager en ny TaskItem med samme ID.
// Vi simulerer oppdatering av feltene (Sørg for at TaskItem har disse setterene!)
// Hvis du ikke har setttere, legg dem til i TaskItem.java:
// public void setTitle(String t) { this.title = t; }
// public void setDescription(String d) { this.description = d; }
// public void setDueDate(long d) { this.dueDate = d; }
// Jeg skriver logikken slik at den forventer setttere:
updateTaskFields(taskToEdit, title, etDesc.getText().toString(), dueDate.getTimeInMillis());
if (listener != null) listener.onTaskUpdated(taskToEdit); if (listener != null) listener.onTaskUpdated(taskToEdit);
} else { } else {
// NY OPPGAVE MODUS
TaskItem newTask = new TaskItem(title, etDesc.getText().toString(), dueDate.getTimeInMillis()); TaskItem newTask = new TaskItem(title, etDesc.getText().toString(), dueDate.getTimeInMillis());
if (selectedUsers.isEmpty()) { if (selectedUsers.isEmpty()) {
newTask.addAssignee(UserManager.getInstance().getUserEmail()); newTask.addAssignee(UserManager.getInstance().getUserEmail());
@ -284,13 +215,4 @@ public class AddTaskBottomSheet extends BottomSheetDialogFragment {
} }
dismiss(); dismiss();
} }
// Hjelpemetode (forutsetter at du legger til disse tre setterne i TaskItem.java)
private void updateTaskFields(TaskItem t, String title, String desc, long date) {
// Her kaller vi setterne vi legger til i TaskItem
// Se punkt 5 nedenfor for oppdatert TaskItem.java
t.setTitle(title);
t.setDescription(desc);
t.setDueDate(date);
}
} }

View file

@ -32,7 +32,6 @@ import com.google.gson.JsonElement;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -57,14 +56,10 @@ public class CreateEventFragment extends Fragment {
private String selectedRRule = null; private String selectedRRule = null;
private boolean isCustomRecurrence = false; private boolean isCustomRecurrence = false;
// Deltakere // BRUKERLISTER
private List<User> allUsers = new ArrayList<>();
private List<User> filteredUsers = new ArrayList<>(); private List<User> filteredUsers = new ArrayList<>();
// Arrangør-sporing (for å ikke overskrive opprinnelig arrangør ved redigering)
private String originalOrganizer = null; private String originalOrganizer = null;
// EDIT MODE
private CalendarEvent eventToEdit = null; private CalendarEvent eventToEdit = null;
@Nullable @Nullable
@ -77,29 +72,26 @@ public class CreateEventFragment extends Fragment {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
// Initialisering av Views
etTitle = view.findViewById(R.id.et_title); etTitle = view.findViewById(R.id.et_title);
etDesc = view.findViewById(R.id.et_desc); etDesc = view.findViewById(R.id.et_desc);
etLocation = view.findViewById(R.id.et_location); etLocation = view.findViewById(R.id.et_location);
switchAllDay = view.findViewById(R.id.switch_all_day); switchAllDay = view.findViewById(R.id.switch_all_day);
spinnerCalendar = view.findViewById(R.id.spinner_calendar); spinnerCalendar = view.findViewById(R.id.spinner_calendar);
spinnerRecurrence = view.findViewById(R.id.spinner_recurrence); spinnerRecurrence = view.findViewById(R.id.spinner_recurrence);
chipGroupReminders = view.findViewById(R.id.chip_group_reminders); chipGroupReminders = view.findViewById(R.id.chip_group_reminders);
txtPreview = view.findViewById(R.id.txt_time_preview); txtPreview = view.findViewById(R.id.txt_time_preview);
txtSelectedParticipants = view.findViewById(R.id.txt_selected_participants); txtSelectedParticipants = view.findViewById(R.id.txt_selected_participants);
btnStartDate = view.findViewById(R.id.btn_start_date); btnStartDate = view.findViewById(R.id.btn_start_date);
btnStartTime = view.findViewById(R.id.btn_start_time); btnStartTime = view.findViewById(R.id.btn_start_time);
btnEndDate = view.findViewById(R.id.btn_end_date); btnEndDate = view.findViewById(R.id.btn_end_date);
btnEndTime = view.findViewById(R.id.btn_end_time); btnEndTime = view.findViewById(R.id.btn_end_time);
btnSave = view.findViewById(R.id.btn_save_event); btnSave = view.findViewById(R.id.btn_save_event);
btnSelectParticipants = view.findViewById(R.id.btn_select_participants); btnSelectParticipants = view.findViewById(R.id.btn_select_participants);
rbAll = view.findViewById(R.id.rb_visibility_all); rbAll = view.findViewById(R.id.rb_visibility_all);
rbSpecific = view.findViewById(R.id.rb_visibility_specific); rbSpecific = view.findViewById(R.id.rb_visibility_specific);
// Initialiser tid (neste hele time) // Standardtidspunkt (neste time)
startCal.add(Calendar.HOUR_OF_DAY, 1); startCal.add(Calendar.HOUR_OF_DAY, 1);
startCal.set(Calendar.MINUTE, 0); startCal.set(Calendar.MINUTE, 0);
endCal.setTime(startCal.getTime()); endCal.setTime(startCal.getTime());
@ -109,7 +101,7 @@ public class CreateEventFragment extends Fragment {
setupReminderChips(); setupReminderChips();
fetchUsers(); fetchUsers();
// SJEKK OM VI ER I REDIGERINGS-MODUS // Sjekk om vi redigerer en eksisterende hendelse
if (getArguments() != null && getArguments().containsKey("edit_event")) { if (getArguments() != null && getArguments().containsKey("edit_event")) {
eventToEdit = (CalendarEvent) getArguments().getSerializable("edit_event"); eventToEdit = (CalendarEvent) getArguments().getSerializable("edit_event");
prefillForm(eventToEdit); prefillForm(eventToEdit);
@ -121,16 +113,12 @@ public class CreateEventFragment extends Fragment {
// Listeners // Listeners
switchAllDay.setOnCheckedChangeListener((btn, isChecked) -> updateUI()); switchAllDay.setOnCheckedChangeListener((btn, isChecked) -> updateUI());
btnStartDate.setOnClickListener(v -> pickDate(startCal, true)); btnStartDate.setOnClickListener(v -> pickDate(startCal, true));
btnEndDate.setOnClickListener(v -> pickDate(endCal, false)); btnEndDate.setOnClickListener(v -> pickDate(endCal, false));
btnStartTime.setOnClickListener(v -> pickTime(startCal)); btnStartTime.setOnClickListener(v -> pickTime(startCal));
btnEndTime.setOnClickListener(v -> pickTime(endCal)); btnEndTime.setOnClickListener(v -> pickTime(endCal));
btnSave.setOnClickListener(v -> submitEvent()); btnSave.setOnClickListener(v -> submitEvent());
// Vis/Skjul deltaker-knapp
rbAll.setOnCheckedChangeListener((buttonView, isChecked) -> { rbAll.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) { if (isChecked) {
btnSelectParticipants.setVisibility(View.GONE); btnSelectParticipants.setVisibility(View.GONE);
@ -150,7 +138,6 @@ public class CreateEventFragment extends Fragment {
@Override @Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (eventToEdit != null && position == 0 && selectedRRule != null) return; if (eventToEdit != null && position == 0 && selectedRRule != null) return;
String selected = parent.getItemAtPosition(position).toString(); String selected = parent.getItemAtPosition(position).toString();
if (selected.equals("Egendefinert...")) { if (selected.equals("Egendefinert...")) {
showCustomRecurrenceDialog(); showCustomRecurrenceDialog();
@ -162,15 +149,6 @@ public class CreateEventFragment extends Fragment {
} }
@Override public void onNothingSelected(AdapterView<?> parent) {} @Override public void onNothingSelected(AdapterView<?> parent) {}
}); });
spinnerCalendar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String calName = (String) parent.getItemAtPosition(position);
updateFilteredUsers(calName);
}
@Override public void onNothingSelected(AdapterView<?> parent) {}
});
} }
private void fetchUsers() { private void fetchUsers() {
@ -179,11 +157,8 @@ public class CreateEventFragment extends Fragment {
public void onResponse(Call<List<User>> call, Response<List<User>> response) { public void onResponse(Call<List<User>> call, Response<List<User>> response) {
if (!isAdded()) return; if (!isAdded()) return;
if (response.isSuccessful() && response.body() != null) { if (response.isSuccessful() && response.body() != null) {
allUsers = response.body(); // BRUKER DEN SENTRALE HJELPEKLASSEN FOR FILTRERING
filteredUsers = UserFilterHelper.getFilteredUsers(response.body());
if (spinnerCalendar.getSelectedItem() != null) {
updateFilteredUsers(spinnerCalendar.getSelectedItem().toString());
}
if (eventToEdit != null) { if (eventToEdit != null) {
parseParticipantsFromDescription(eventToEdit.getDescription()); parseParticipantsFromDescription(eventToEdit.getDescription());
@ -195,42 +170,9 @@ public class CreateEventFragment extends Fragment {
}); });
} }
private void updateFilteredUsers(String calendarName) {
if (allUsers == null || allUsers.isEmpty()) return;
filteredUsers.clear();
String requiredRole = "";
if (calendarName.equals("Serviceavdelingen")) requiredRole = "serviceavdelingen";
else if (calendarName.equals("Automasjonsavdelingen")) requiredRole = "automasjonsavdelingen";
else if (calendarName.equals("Prosjektavdelingen")) requiredRole = "prosjektavdelingen";
else if (calendarName.equals("Administrasjonen")) requiredRole = "administrasjonen";
else if (calendarName.equals("Felles")) requiredRole = "kbs_alle";
for (User user : allUsers) {
List<String> rawRoles = user.getRoles();
List<String> roles = new ArrayList<>();
for (String r : rawRoles) roles.add(r.toLowerCase());
boolean hasAccess = false;
if (roles.contains("administrator")) {
hasAccess = true;
}
else if (!requiredRole.isEmpty() && roles.contains(requiredRole.toLowerCase())) {
hasAccess = true;
}
if (hasAccess) {
filteredUsers.add(user);
}
}
}
private void showUserSelectionDialog() { private void showUserSelectionDialog() {
if (filteredUsers.isEmpty()) { if (filteredUsers.isEmpty()) {
Toast.makeText(getContext(), "Ingen personer med riktig tilgang funnet.", Toast.LENGTH_SHORT).show(); Toast.makeText(getContext(), "Ingen personer funnet.", Toast.LENGTH_SHORT).show();
return; return;
} }
@ -255,7 +197,7 @@ public class CreateEventFragment extends Fragment {
private void updateParticipantPreview() { private void updateParticipantPreview() {
StringBuilder sb = new StringBuilder("Valgte: "); StringBuilder sb = new StringBuilder("Valgte: ");
int count = 0; int count = 0;
for (User u : allUsers) { for (User u : filteredUsers) {
if (u.isSelected()) { if (u.isSelected()) {
if (count > 0) sb.append(", "); if (count > 0) sb.append(", ");
sb.append(u.getName()); sb.append(u.getName());
@ -274,11 +216,10 @@ public class CreateEventFragment extends Fragment {
if (m.find()) { if (m.find()) {
rbSpecific.setChecked(true); rbSpecific.setChecked(true);
String[] emails = m.group(1).split(","); String[] emails = m.group(1).split(",");
for (String email : emails) { for (String email : emails) {
for (int i = 0; i < allUsers.size(); i++) { for (User u : filteredUsers) {
if (allUsers.get(i).getEmail().equalsIgnoreCase(email.trim())) { if (u.getEmail().equalsIgnoreCase(email.trim())) {
allUsers.get(i).setSelected(true); u.setSelected(true);
} }
} }
} }
@ -290,19 +231,15 @@ public class CreateEventFragment extends Fragment {
private void prefillForm(CalendarEvent event) { private void prefillForm(CalendarEvent event) {
etTitle.setText(event.getTitle()); etTitle.setText(event.getTitle());
// Hent ut opprinnelig arrangør hvis den finnes
if (event.getDescription() != null) { if (event.getDescription() != null) {
Matcher m = Pattern.compile("#arrangor:(.+)").matcher(event.getDescription()); Matcher m = Pattern.compile("#arrangor:(.+)").matcher(event.getDescription());
if (m.find()) { if (m.find()) originalOrganizer = m.group(1).trim();
originalOrganizer = m.group(1).trim();
}
} }
String cleanDesc = event.getDescription() String cleanDesc = event.getDescription()
.replaceAll("#varsel:[\\d,]+", "") .replaceAll("#varsel:[\\d,]+", "")
.replaceAll("#deltakere:[^\\s]+", "") .replaceAll("#deltakere:[^\\s]+", "")
.replaceAll("#arrangor:.+", "") // Fjern også arrangør fra tekstfeltet .replaceAll("#arrangor:.+", "")
.trim(); .trim();
etDesc.setText(cleanDesc); etDesc.setText(cleanDesc);
etLocation.setText(event.getLocation()); etLocation.setText(event.getLocation());
@ -310,36 +247,29 @@ public class CreateEventFragment extends Fragment {
ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCalendar.getAdapter(); ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCalendar.getAdapter();
if (adapter != null) { if (adapter != null) {
int position = adapter.getPosition(event.getCalendarName()); int position = adapter.getPosition(event.getCalendarName());
if (position >= 0) { if (position >= 0) spinnerCalendar.setSelection(position);
spinnerCalendar.setSelection(position);
}
} }
spinnerCalendar.setEnabled(false); spinnerCalendar.setEnabled(false);
try { try {
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault()); SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());
SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
String start = event.getRawDate(); String start = event.getRawDate();
if (start != null) { if (start != null) {
if (start.length() == 10) { if (start.length() == 10) {
switchAllDay.setChecked(true); switchAllDay.setChecked(true);
Date d = simpleFormat.parse(start); startCal.setTime(simpleFormat.parse(start));
startCal.setTime(d);
if (event.getRawEndDate() != null) { if (event.getRawEndDate() != null) {
Date e = simpleFormat.parse(event.getRawEndDate());
Calendar c = Calendar.getInstance(); Calendar c = Calendar.getInstance();
c.setTime(e); c.setTime(simpleFormat.parse(event.getRawEndDate()));
c.add(Calendar.DAY_OF_MONTH, -1); c.add(Calendar.DAY_OF_MONTH, -1);
endCal.setTime(c.getTime()); endCal.setTime(c.getTime());
} else { } else {
endCal.setTime(d); endCal.setTime(startCal.getTime());
} }
} else if (start.contains("T")) { } else if (start.contains("T")) {
if (start.length() > 19) start = start.substring(0, 19); if (start.length() > 19) start = start.substring(0, 19);
startCal.setTime(isoFormat.parse(start)); startCal.setTime(isoFormat.parse(start));
String end = event.getRawEndDate(); String end = event.getRawEndDate();
if (end != null && end.contains("T")) { if (end != null && end.contains("T")) {
if (end.length() > 19) end = end.substring(0, 19); if (end.length() > 19) end = end.substring(0, 19);
@ -350,130 +280,96 @@ public class CreateEventFragment extends Fragment {
} }
} }
} }
List<Integer> existingReminders = event.getReminders(); List<Integer> existingReminders = event.getReminders();
if (!existingReminders.isEmpty()) { if (!existingReminders.isEmpty()) {
for (int i = 0; i < chipGroupReminders.getChildCount(); i++) { for (int i = 0; i < chipGroupReminders.getChildCount(); i++) {
((Chip) chipGroupReminders.getChildAt(i)).setChecked(false); Chip chip = (Chip) chipGroupReminders.getChildAt(i);
} chip.setChecked(existingReminders.contains((Integer) chip.getTag()));
for (int min : existingReminders) {
checkChipByMinutes(min);
} }
} }
} catch (Exception e) { } catch (Exception e) {
Log.e("KBS_EDIT", "Feil ved prefill", e); Log.e("KBS_EDIT", "Feil ved prefill", e);
} }
} }
private void checkChipByMinutes(int minutes) { private void setupCalendarSpinner() {
for (int i = 0; i < chipGroupReminders.getChildCount(); i++) { List<String> calendars = UserManager.getInstance().getWriteableCalendars();
Chip chip = (Chip) chipGroupReminders.getChildAt(i); if (calendars.isEmpty()) {
if ((int)chip.getTag() == minutes) { calendars = new ArrayList<>();
chip.setChecked(true); calendars.add("Felles");
}
} }
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, calendars) {
@NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
TextView view = (TextView) super.getView(position, convertView, parent);
view.setBackgroundColor(Color.parseColor(getCalendarColor(getItem(position))));
view.setTextColor(Color.WHITE);
view.setTypeface(null, Typeface.BOLD);
return view;
}
@Override public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getDropDownView(position, convertView, parent);
view.setTextColor(Color.parseColor(getCalendarColor(getItem(position))));
view.setTypeface(null, Typeface.BOLD);
return view;
}
};
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerCalendar.setAdapter(adapter);
} }
private String getCalendarColor(String name) { private String getCalendarColor(String name) {
if (name == null) return "#888888";
switch (name) { switch (name) {
case "Felles": return "#0069B3"; case "Felles": return "#0069B3"; // KBS Blå
case "AMU/HMS/Miljø": return "#2E7D32"; // Mørk grønn (Miljø-profil)
case "Administrasjonen": return "#607D8B"; case "Administrasjonen": return "#607D8B";
case "Serviceavdelingen": return "#E65100"; case "Serviceavdelingen": return "#E65100";
case "Automasjonsavdelingen": return "#2E7D32"; case "Automasjonsavdelingen": return "#2E7D32"; // Merk: Denne er lik Miljø , du kan bytte til f.eks #1B5E20 hvis ønskelig
case "Prosjektavdelingen": return "#7B1FA2"; case "Prosjektavdelingen": return "#7B1FA2";
default: return "#888888"; default: return "#888888";
} }
} }
private void setupCalendarSpinner() {
List<String> calendars = UserManager.getInstance().getWriteableCalendars();
if (calendars.isEmpty()) calendars.add("Felles");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, calendars) {
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
TextView view = (TextView) super.getView(position, convertView, parent);
String calName = getItem(position);
String colorHex = getCalendarColor(calName);
view.setBackgroundColor(Color.parseColor(colorHex));
view.setTextColor(Color.WHITE);
view.setTypeface(null, Typeface.BOLD);
return view;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getDropDownView(position, convertView, parent);
String calName = getItem(position);
String colorHex = getCalendarColor(calName);
view.setBackgroundColor(Color.WHITE);
view.setTextColor(Color.parseColor(colorHex));
view.setTypeface(null, Typeface.BOLD);
return view;
}
};
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerCalendar.setAdapter(adapter);
}
private void setupReminderChips() { private void setupReminderChips() {
addChip("Ved start", 0); chipGroupReminders.removeAllViews();
addChip("5 min", 5); addReminderChip("Ved start", 0);
addChip("10 min", 10); addReminderChip("5 min", 5);
addChip("15 min", 15); addReminderChip("10 min", 10);
addChip("30 min", 30); addReminderChip("15 min", 15);
addChip("1 time", 60); addReminderChip("30 min", 30);
addChip("2 timer", 120); addReminderChip("1 t", 60);
addChip("1 dag", 1440); addReminderChip("2 t", 120);
addChip("2 dager", 2880); addReminderChip("1 d", 1440);
addChip("1 uke", 10080); addReminderChip("2 d", 2880);
addReminderChip("1 u", 10080);
if (eventToEdit == null) checkChipByMinutes(15); if (eventToEdit == null) {
for (int i=0; i<chipGroupReminders.getChildCount(); i++) {
Chip c = (Chip) chipGroupReminders.getChildAt(i);
if ((int)c.getTag() == 15) c.setChecked(true);
}
}
} }
private void addChip(String text, int minutes) { private void addReminderChip(String text, int minutes) {
Chip chip = new Chip(getContext()); Chip chip = new Chip(getContext());
chip.setText(text); chip.setText(text);
chip.setTag(minutes); chip.setTag(minutes);
chip.setCheckable(true); chip.setCheckable(true);
chip.setClickable(true);
chipGroupReminders.addView(chip); chipGroupReminders.addView(chip);
} }
private List<Integer> getSelectedReminders() {
List<Integer> selected = new ArrayList<>();
for (int i = 0; i < chipGroupReminders.getChildCount(); i++) {
Chip chip = (Chip) chipGroupReminders.getChildAt(i);
if (chip.isChecked()) {
selected.add((Integer) chip.getTag());
}
}
return selected;
}
private void updateRecurrenceSpinner() { private void updateRecurrenceSpinner() {
String dayName = new SimpleDateFormat("EEEE", new Locale("no")).format(startCal.getTime()); String dayName = new SimpleDateFormat("EEEE", new Locale("no")).format(startCal.getTime());
int dayOfMonth = startCal.get(Calendar.DAY_OF_MONTH); int dayOfMonth = startCal.get(Calendar.DAY_OF_MONTH);
String monthName = new SimpleDateFormat("MMMM", new Locale("no")).format(startCal.getTime()); String monthName = new SimpleDateFormat("MMMM", new Locale("no")).format(startCal.getTime());
int weekNo = (startCal.get(Calendar.DAY_OF_MONTH) - 1) / 7 + 1; int weekNo = (startCal.get(Calendar.DAY_OF_MONTH) - 1) / 7 + 1;
String nthDayString = "månedlig den " + weekNo + ". " + dayName + "en";
List<String> options = new ArrayList<>(); List<String> options = new ArrayList<>();
options.add("Ikke gjenta"); options.add("Ikke gjenta"); options.add("Daglig"); options.add("Ukentlig på " + dayName);
options.add("Daglig"); options.add("Månedlig den " + dayOfMonth + "."); options.add("Månedlig den " + weekNo + ". " + dayName + "en");
options.add("Ukentlig på " + dayName); options.add("Årlig den " + dayOfMonth + ". " + monthName); options.add("Hver ukedag (man-fre)"); options.add("Egendefinert...");
options.add("Månedlig den " + dayOfMonth + "."); spinnerRecurrence.setAdapter(new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, options));
options.add(capitalize(nthDayString));
options.add("Årlig den " + dayOfMonth + ". " + monthName);
options.add("Hver ukedag (man-fre)");
options.add("Egendefinert...");
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item, options);
spinnerRecurrence.setAdapter(adapter);
} }
private void generateStandardRRule(int position) { private void generateStandardRRule(int position) {
@ -481,112 +377,59 @@ public class CreateEventFragment extends Fragment {
case 1: selectedRRule = "RRULE:FREQ=DAILY"; break; case 1: selectedRRule = "RRULE:FREQ=DAILY"; break;
case 2: selectedRRule = "RRULE:FREQ=WEEKLY"; break; case 2: selectedRRule = "RRULE:FREQ=WEEKLY"; break;
case 3: selectedRRule = "RRULE:FREQ=MONTHLY"; break; case 3: selectedRRule = "RRULE:FREQ=MONTHLY"; break;
case 4: case 4: selectedRRule = "RRULE:FREQ=MONTHLY;BYDAY=" + ((startCal.get(Calendar.DAY_OF_MONTH)-1)/7+1) + getDayCode(startCal.get(Calendar.DAY_OF_WEEK)); break;
int weekNo = (startCal.get(Calendar.DAY_OF_MONTH) - 1) / 7 + 1;
String dayCode = getDayCode(startCal.get(Calendar.DAY_OF_WEEK));
selectedRRule = "RRULE:FREQ=MONTHLY;BYDAY=" + weekNo + dayCode;
break;
case 5: selectedRRule = "RRULE:FREQ=YEARLY"; break; case 5: selectedRRule = "RRULE:FREQ=YEARLY"; break;
case 6: selectedRRule = "RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"; break; case 6: selectedRRule = "RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"; break;
default: selectedRRule = null; default: selectedRRule = null;
} }
} }
private String getDayCode(int calendarDay) {
switch (calendarDay) {
case Calendar.MONDAY: return "MO"; case Calendar.TUESDAY: return "TU"; case Calendar.WEDNESDAY: return "WE";
case Calendar.THURSDAY: return "TH"; case Calendar.FRIDAY: return "FR"; case Calendar.SATURDAY: return "SA";
case Calendar.SUNDAY: return "SU"; default: return "MO";
}
}
private void showCustomRecurrenceDialog() { private void showCustomRecurrenceDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_custom_recurrence, null); View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_custom_recurrence, null);
EditText etInterval = view.findViewById(R.id.et_interval), etCount = view.findViewById(R.id.et_count);
EditText etInterval = view.findViewById(R.id.et_interval);
Spinner spinnerFreq = view.findViewById(R.id.spinner_freq); Spinner spinnerFreq = view.findViewById(R.id.spinner_freq);
View layoutWeekdays = view.findViewById(R.id.layout_weekdays); View layoutWeekdays = view.findViewById(R.id.layout_weekdays);
ToggleButton[] toggles = {view.findViewById(R.id.tg_mon), view.findViewById(R.id.tg_tue), view.findViewById(R.id.tg_wed), view.findViewById(R.id.tg_thu), view.findViewById(R.id.tg_fri), view.findViewById(R.id.tg_sat), view.findViewById(R.id.tg_sun)};
ToggleButton[] toggles = {
view.findViewById(R.id.tg_mon), view.findViewById(R.id.tg_tue),
view.findViewById(R.id.tg_wed), view.findViewById(R.id.tg_thu),
view.findViewById(R.id.tg_fri), view.findViewById(R.id.tg_sat),
view.findViewById(R.id.tg_sun)
};
String[] labels = {"M", "T", "O", "T", "F", "L", "S"}; String[] labels = {"M", "T", "O", "T", "F", "L", "S"};
for(int i=0; i<7; i++) { toggles[i].setText(labels[i]); toggles[i].setTextOn(labels[i]); toggles[i].setTextOff(labels[i]); } for(int i=0; i<7; i++) { toggles[i].setText(labels[i]); toggles[i].setTextOn(labels[i]); toggles[i].setTextOff(labels[i]); }
RadioGroup rgEnd = view.findViewById(R.id.rg_end); Button btnEndDatePicker = view.findViewById(R.id.btn_end_date_picker);
RadioGroup rgEnd = view.findViewById(R.id.rg_end); Calendar customEndCal = Calendar.getInstance(); customEndCal.add(Calendar.MONTH, 1);
Button btnEndDatePicker = view.findViewById(R.id.btn_end_date_picker); btnEndDatePicker.setText(new SimpleDateFormat("d. MMM yyyy", Locale.getDefault()).format(customEndCal.getTime()));
EditText etCount = view.findViewById(R.id.et_count);
Calendar customEndCal = Calendar.getInstance();
customEndCal.add(Calendar.MONTH, 1);
SimpleDateFormat sdf = new SimpleDateFormat("d. MMM yyyy", Locale.getDefault());
btnEndDatePicker.setText(sdf.format(customEndCal.getTime()));
btnEndDatePicker.setOnClickListener(v -> { btnEndDatePicker.setOnClickListener(v -> {
rgEnd.check(R.id.rb_date); rgEnd.check(R.id.rb_date);
new DatePickerDialog(getContext(), (p, y, m, d) -> { new DatePickerDialog(getContext(), (p, y, m, d) -> { customEndCal.set(y, m, d); btnEndDatePicker.setText(new SimpleDateFormat("d. MMM yyyy", Locale.getDefault()).format(customEndCal.getTime())); }, customEndCal.get(Calendar.YEAR), customEndCal.get(Calendar.MONTH), customEndCal.get(Calendar.DAY_OF_MONTH)).show();
customEndCal.set(y, m, d);
btnEndDatePicker.setText(sdf.format(customEndCal.getTime()));
}, customEndCal.get(Calendar.YEAR), customEndCal.get(Calendar.MONTH), customEndCal.get(Calendar.DAY_OF_MONTH)).show();
}); });
spinnerFreq.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { spinnerFreq.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override @Override public void onItemSelected(AdapterView<?> p, View v, int pos, long id) { layoutWeekdays.setVisibility(pos == 1 ? View.VISIBLE : View.GONE); }
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { @Override public void onNothingSelected(AdapterView<?> p) {}
layoutWeekdays.setVisibility(position == 1 ? View.VISIBLE : View.GONE);
}
@Override public void onNothingSelected(AdapterView<?> parent) {}
}); });
builder.setView(view); AlertDialog dialog = builder.create();
builder.setView(view); view.findViewById(R.id.btn_cancel).setOnClickListener(v -> { dialog.dismiss(); spinnerRecurrence.setSelection(0); });
AlertDialog dialog = builder.create();
view.findViewById(R.id.btn_cancel).setOnClickListener(v -> {
dialog.dismiss();
spinnerRecurrence.setSelection(0);
});
view.findViewById(R.id.btn_done).setOnClickListener(v -> { view.findViewById(R.id.btn_done).setOnClickListener(v -> {
StringBuilder rrule = new StringBuilder("RRULE:"); StringBuilder rrule = new StringBuilder("RRULE:FREQ=");
int freqPos = spinnerFreq.getSelectedItemPosition(); rrule.append(new String[]{"DAILY", "WEEKLY", "MONTHLY", "YEARLY"}[spinnerFreq.getSelectedItemPosition()]);
String freq = ""; if (!etInterval.getText().toString().isEmpty() && !etInterval.getText().toString().equals("1")) rrule.append(";INTERVAL=").append(etInterval.getText().toString());
switch (freqPos) { if (spinnerFreq.getSelectedItemPosition() == 1) {
case 0: freq = "DAILY"; break; List<String> days = new ArrayList<>(); String[] codes = {"MO", "TU", "WE", "TH", "FR", "SA", "SU"};
case 1: freq = "WEEKLY"; break; for (int i=0; i<7; i++) if (toggles[i].isChecked()) days.add(codes[i]);
case 2: freq = "MONTHLY"; break; if (!days.isEmpty()) rrule.append(";BYDAY=").append(String.join(",", days));
case 3: freq = "YEARLY"; break;
} }
rrule.append("FREQ=").append(freq); if (rgEnd.getCheckedRadioButtonId() == R.id.rb_date) {
customEndCal.set(Calendar.HOUR_OF_DAY, 23); customEndCal.set(Calendar.MINUTE, 59);
String interval = etInterval.getText().toString(); SimpleDateFormat utc = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US); utc.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
if (!interval.isEmpty() && !interval.equals("1")) {
rrule.append(";INTERVAL=").append(interval);
}
if (freq.equals("WEEKLY")) {
List<String> days = new ArrayList<>();
String[] codes = {"MO", "TU", "WE", "TH", "FR", "SA", "SU"};
for (int i=0; i<7; i++) {
if (toggles[i].isChecked()) days.add(codes[i]);
}
if (!days.isEmpty()) {
rrule.append(";BYDAY=").append(String.join(",", days));
}
}
int checkedId = rgEnd.getCheckedRadioButtonId();
if (checkedId == R.id.rb_date) {
customEndCal.set(Calendar.HOUR_OF_DAY, 23);
customEndCal.set(Calendar.MINUTE, 59);
customEndCal.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
SimpleDateFormat utc = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US);
utc.setTimeZone(java.util.TimeZone.getTimeZone("UTC"));
rrule.append(";UNTIL=").append(utc.format(customEndCal.getTime())); rrule.append(";UNTIL=").append(utc.format(customEndCal.getTime()));
} else if (checkedId == R.id.rb_count) { } else if (rgEnd.getCheckedRadioButtonId() == R.id.rb_count) rrule.append(";COUNT=").append(etCount.getText().toString());
rrule.append(";COUNT=").append(etCount.getText().toString()); selectedRRule = rrule.toString(); isCustomRecurrence = true; dialog.dismiss();
}
selectedRRule = rrule.toString();
isCustomRecurrence = true;
dialog.dismiss();
}); });
dialog.show(); dialog.show();
} }
@ -594,12 +437,8 @@ public class CreateEventFragment extends Fragment {
new DatePickerDialog(getContext(), (view, y, m, d) -> { new DatePickerDialog(getContext(), (view, y, m, d) -> {
cal.set(y, m, d); cal.set(y, m, d);
if (isStart) { if (isStart) {
if (endCal.before(startCal)) { if (endCal.before(startCal)) { endCal.setTime(startCal.getTime()); if (!switchAllDay.isChecked()) endCal.add(Calendar.HOUR_OF_DAY, 1); }
endCal.setTime(startCal.getTime()); updateRecurrenceSpinner(); if (!isCustomRecurrence) spinnerRecurrence.setSelection(0);
if (!switchAllDay.isChecked()) endCal.add(Calendar.HOUR_OF_DAY, 1);
}
updateRecurrenceSpinner();
if (!isCustomRecurrence) spinnerRecurrence.setSelection(0);
} }
updateUI(); updateUI();
}, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)).show(); }, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)).show();
@ -607,165 +446,57 @@ public class CreateEventFragment extends Fragment {
private void pickTime(Calendar cal) { private void pickTime(Calendar cal) {
new TimePickerDialog(getContext(), (view, h, m) -> { new TimePickerDialog(getContext(), (view, h, m) -> {
cal.set(Calendar.HOUR_OF_DAY, h); cal.set(Calendar.HOUR_OF_DAY, h); cal.set(Calendar.MINUTE, m);
cal.set(Calendar.MINUTE, m); if (cal == startCal && endCal.before(startCal)) { endCal.setTime(startCal.getTime()); endCal.add(Calendar.HOUR_OF_DAY, 1); }
if (cal == startCal && endCal.before(startCal)) {
endCal.setTime(startCal.getTime());
endCal.add(Calendar.HOUR_OF_DAY, 1);
}
updateUI(); updateUI();
}, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true).show(); }, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true).show();
} }
private void updateUI() { private void updateUI() {
boolean isAllDay = switchAllDay.isChecked(); boolean isAllDay = switchAllDay.isChecked();
btnStartTime.setVisibility(isAllDay ? View.GONE : View.VISIBLE); btnStartTime.setVisibility(isAllDay ? View.GONE : View.VISIBLE);
btnEndTime.setVisibility(isAllDay ? View.GONE : View.VISIBLE); btnEndTime.setVisibility(isAllDay ? View.GONE : View.VISIBLE);
SimpleDateFormat dFmt = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()), tFmt = new SimpleDateFormat("HH:mm", Locale.getDefault());
SimpleDateFormat dateFmt = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()); btnStartDate.setText(dFmt.format(startCal.getTime())); btnEndDate.setText(dFmt.format(endCal.getTime()));
SimpleDateFormat timeFmt = new SimpleDateFormat("HH:mm", Locale.getDefault()); btnStartTime.setText(tFmt.format(startCal.getTime())); btnEndTime.setText(tFmt.format(endCal.getTime()));
String p = dFmt.format(startCal.getTime()) + (isAllDay ? "" : " " + tFmt.format(startCal.getTime())) + " - ";
btnStartDate.setText(dateFmt.format(startCal.getTime())); if (startCal.get(Calendar.YEAR) == endCal.get(Calendar.YEAR) && startCal.get(Calendar.DAY_OF_YEAR) == endCal.get(Calendar.DAY_OF_YEAR)) {
btnEndDate.setText(dateFmt.format(endCal.getTime())); p += (isAllDay ? "(Samme dag)" : tFmt.format(endCal.getTime()));
btnStartTime.setText(timeFmt.format(startCal.getTime())); } else p += dFmt.format(endCal.getTime()) + (isAllDay ? "" : " " + tFmt.format(endCal.getTime()));
btnEndTime.setText(timeFmt.format(endCal.getTime())); txtPreview.setText(p);
String preview = dateFmt.format(startCal.getTime());
if (!isAllDay) preview += " " + timeFmt.format(startCal.getTime());
preview += " - ";
if (isSameDay(startCal, endCal)) {
if (isAllDay) preview += " (Samme dag)";
else preview += timeFmt.format(endCal.getTime());
} else {
preview += dateFmt.format(endCal.getTime());
if (!isAllDay) preview += " " + timeFmt.format(endCal.getTime());
}
txtPreview.setText(preview);
}
private boolean isSameDay(Calendar c1, Calendar c2) {
return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) &&
c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR);
}
private String capitalize(String s) {
if (s == null || s.isEmpty()) return s;
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
private String getDayCode(int calendarDay) {
switch (calendarDay) {
case Calendar.MONDAY: return "MO";
case Calendar.TUESDAY: return "TU";
case Calendar.WEDNESDAY: return "WE";
case Calendar.THURSDAY: return "TH";
case Calendar.FRIDAY: return "FR";
case Calendar.SATURDAY: return "SA";
case Calendar.SUNDAY: return "SU";
default: return "MO";
}
}
private String getCalendarSlug() {
if (spinnerCalendar.getSelectedItem() != null) {
return spinnerCalendar.getSelectedItem().toString();
}
return "Felles";
} }
private void submitEvent() { private void submitEvent() {
String title = etTitle.getText().toString().trim(); String title = etTitle.getText().toString().trim();
if (title.isEmpty()) { if (title.isEmpty()) { etTitle.setError("Mangler tittel"); return; }
etTitle.setError("Mangler tittel"); SimpleDateFormat sdf = new SimpleDateFormat(switchAllDay.isChecked() ? "yyyy-MM-dd" : "yyyy-MM-dd'T'HH:mm", Locale.getDefault());
return; List<Integer> reminders = new ArrayList<>();
for (int i=0; i<chipGroupReminders.getChildCount(); i++) {
Chip c = (Chip) chipGroupReminders.getChildAt(i);
if (c.isChecked()) reminders.add((Integer) c.getTag());
} }
String desc = etDesc.getText().toString();
boolean isAllDay = switchAllDay.isChecked(); if (rbSpecific.isChecked()) {
String format = isAllDay ? "yyyy-MM-dd" : "yyyy-MM-dd'T'HH:mm"; StringBuilder sb = new StringBuilder(); boolean first = true;
SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault()); for (User u : filteredUsers) if (u.isSelected()) { if (!first) sb.append(","); sb.append(u.getEmail()); first = false; }
if (sb.length() > 0) desc += "\n\n#deltakere:" + sb.toString();
String startTimeStr = sdf.format(startCal.getTime());
String endTimeStr = sdf.format(endCal.getTime());
String location = etLocation.getText().toString();
String description = etDesc.getText().toString();
List<Integer> reminders = getSelectedReminders();
if (rbSpecific.isChecked() && allUsers != null) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (User u : allUsers) {
if (u.isSelected()) {
if (!first) sb.append(",");
sb.append(u.getEmail());
first = false;
}
}
if (sb.length() > 0) {
description += "\n\n#deltakere:" + sb.toString();
}
} }
desc += "\n#arrangor:" + (originalOrganizer != null ? originalOrganizer : UserManager.getInstance().getUserDisplayName());
// NYTT: Legg til arrangør String calSlug = spinnerCalendar.getSelectedItem() != null ? spinnerCalendar.getSelectedItem().toString() : "Felles";
String organizerTag;
if (originalOrganizer != null) {
organizerTag = originalOrganizer; // Behold opprinnelig ved redigering
} else {
organizerTag = UserManager.getInstance().getUserDisplayName(); // Ny hendelse
}
description += "\n#arrangor:" + organizerTag;
CreateEventRequest req = new CreateEventRequest( CreateEventRequest req = new CreateEventRequest(title, desc, etLocation.getText().toString(), sdf.format(startCal.getTime()), sdf.format(endCal.getTime()), calSlug, reminders, switchAllDay.isChecked(), selectedRRule);
title, description, location, startTimeStr, endTimeStr, if (eventToEdit != null) req.id = eventToEdit.getId();
getCalendarSlug(), reminders, isAllDay, selectedRRule
);
if (eventToEdit != null) {
req.id = eventToEdit.getId();
}
Toast.makeText(getContext(), eventToEdit != null ? "Oppdaterer..." : "Oppretter...", Toast.LENGTH_SHORT).show();
final Context appContext = requireContext().getApplicationContext();
Call<JsonElement> call;
if (eventToEdit != null) {
call = RetrofitClient.getApiService().updateCalendarEvent(req);
} else {
call = RetrofitClient.getApiService().createCalendarEvent(req);
}
Call<JsonElement> call = (eventToEdit != null) ? RetrofitClient.getApiService().updateCalendarEvent(req) : RetrofitClient.getApiService().createCalendarEvent(req);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@Override @Override public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
if (response.isSuccessful()) { if (response.isSuccessful()) {
Toast.makeText(getContext(), eventToEdit != null ? "Hendelse oppdatert!" : "Hendelse opprettet!", Toast.LENGTH_LONG).show(); Toast.makeText(getContext(), "Lagret!", Toast.LENGTH_LONG).show();
fetchCalendarAndSchedule(appContext);
Navigation.findNavController(getView()).navigateUp(); Navigation.findNavController(getView()).navigateUp();
} else {
Toast.makeText(getContext(), "Feil (" + response.code() + ")", Toast.LENGTH_LONG).show();
} }
} }
@Override public void onFailure(Call<JsonElement> call, Throwable t) { Toast.makeText(getContext(), "Feil!", Toast.LENGTH_SHORT).show(); }
@Override
public void onFailure(Call<JsonElement> call, Throwable t) {
Toast.makeText(getContext(), "Nettverksfeil", Toast.LENGTH_SHORT).show();
}
}); });
} }
private void fetchCalendarAndSchedule(Context context) {
new Thread(() -> {
try {
if (context == null) return;
Response<List<CalendarEvent>> response = RetrofitClient.getApiService().getCalendarEvents().execute();
if (response.isSuccessful() && response.body() != null) {
AlarmScheduler.scheduleAlarmsForEvents(context, response.body());
}
} catch (Exception e) {
Log.e("CreateEvent", "Kunne ikke oppdatere alarmer", e);
}
}).start();
}
} }

View file

@ -0,0 +1,80 @@
package com.kbs.kbsintranett;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class UserFilterHelper {
private static final List<Integer> EXCLUDED_IDS = Arrays.asList(50, 51); // felles@kbs.no og kbs@kbs.no
private static final String REQUIRED_DOMAIN = "@kbs.no";
public static List<User> getFilteredUsers(List<User> allUsers) {
if (allUsers == null) return new ArrayList<>();
UserManager me = UserManager.getInstance();
String myEmail = me.getUserEmail();
List<User> sanitizedList = new ArrayList<>();
for (User u : allUsers) {
String email = u.getEmail() != null ? u.getEmail().toLowerCase() : "";
if (!email.endsWith(REQUIRED_DOMAIN)) continue;
if (EXCLUDED_IDS.contains(u.getId())) continue;
if (u.getRoles() == null || u.getRoles().isEmpty()) continue;
sanitizedList.add(u);
}
if (me.isEditorOrAbove()) {
return sanitizedList;
}
List<User> finalResult = new ArrayList<>();
List<String> myRoles = getRolesForEmail(sanitizedList, myEmail);
// NY ROLLE LAGT TIL I LISTEN: amuhmsmiljogruppa
List<String> deptRoles = Arrays.asList(
"serviceavdelingen",
"automasjonsavdelingen",
"prosjektavdelingen",
"administrasjonen",
"kbs_alle",
"amuhmsmiljogruppa"
);
for (User u : sanitizedList) {
if (u.getEmail().equalsIgnoreCase(myEmail)) {
finalResult.add(u);
continue;
}
boolean sharesDepartment = false;
for (String role : u.getRoles()) {
String r = role.toLowerCase();
if (deptRoles.contains(r) && myRoles.contains(r)) {
sharesDepartment = true;
break;
}
}
if (sharesDepartment) {
finalResult.add(u);
}
}
return finalResult;
}
private static List<String> getRolesForEmail(List<User> users, String email) {
List<String> roles = new ArrayList<>();
for (User u : users) {
if (u.getEmail().equalsIgnoreCase(email)) {
if (u.getRoles() != null) {
for (String r : u.getRoles()) roles.add(r.toLowerCase());
}
break;
}
}
return roles;
}
}

File diff suppressed because it is too large Load diff