Før oppdateringer av fragment.home.xml, HomeAdapter.java og HomeFragment.java

This commit is contained in:
ErolHaagenrud 2026-01-06 14:15:02 +01:00
parent 93092f33d9
commit 3b89af6605
9 changed files with 993 additions and 329 deletions

View file

@ -13,7 +13,7 @@ android {
minSdk = 28
targetSdk = 34
versionCode = 4
versionName = "1.5.0"
versionName = "1.5.1"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

View file

@ -16,6 +16,9 @@ public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHo
private List<CalendarEvent> events;
private final OnItemClickListener listener;
// Farge for individuelle/private hendelser (Deep Purple)
private static final String PRIVATE_EVENT_COLOR = "#673AB7";
public interface OnItemClickListener {
void onItemClick(CalendarEvent event);
}
@ -40,9 +43,18 @@ public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHo
holder.time.setText(event.getTime());
holder.title.setText(event.getTitle());
// NYTT: Sett farge datoboksen
// NYTT: Sjekk om hendelsen er "privat" (har deltakere)
boolean isPrivate = event.getDescription() != null && event.getDescription().contains("#deltakere:");
try {
int color = Color.parseColor(event.getCalendarColor());
int color;
if (isPrivate) {
// Bruk privat farge
color = Color.parseColor(PRIVATE_EVENT_COLOR);
} else {
// Bruk kalenderens standardfarge
color = Color.parseColor(event.getCalendarColor());
}
holder.dateBox.setBackgroundTintList(ColorStateList.valueOf(color));
} catch (Exception e) {
// Fallback til standard blå hvis fargekoden er ugyldig
@ -63,7 +75,7 @@ public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHo
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView day, month, title, time;
LinearLayout dateBox; // NYTT
LinearLayout dateBox;
public ViewHolder(View view) {
super(view);
@ -71,7 +83,7 @@ public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.ViewHo
month = view.findViewById(R.id.cal_month);
title = view.findViewById(R.id.cal_title);
time = view.findViewById(R.id.cal_time);
dateBox = view.findViewById(R.id.date_box_background); // NYTT
dateBox = view.findViewById(R.id.date_box_background);
}
}
}

View file

@ -22,6 +22,8 @@ import androidx.navigation.fragment.NavHostFragment;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.gson.JsonElement;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -30,7 +32,8 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
private CalendarEvent event;
private OnEventChangeListener changeListener;
// Interface for å varsle foreldre-fragmentet om endringer
private static final String PRIVATE_EVENT_COLOR = "#673AB7";
public interface OnEventChangeListener {
void onEventChanged();
}
@ -53,6 +56,8 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
TextView desc = view.findViewById(R.id.sheet_desc);
TextView loc = view.findViewById(R.id.sheet_location);
TextView calName = view.findViewById(R.id.sheet_calendar_name);
TextView participantsView = view.findViewById(R.id.sheet_participants);
TextView organizerView = view.findViewById(R.id.sheet_organizer); // NYTT
LinearLayout adminLayout = view.findViewById(R.id.layout_admin_buttons);
Button btnDelete = view.findViewById(R.id.btn_delete);
@ -61,48 +66,62 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
title.setText(event.getTitle());
time.setText(event.getTime() + " (" + event.getDay() + ". " + event.getMonth() + ")");
calName.setText(event.getCalendarName().toUpperCase());
try {
int color = Color.parseColor(event.getCalendarColor());
calName.setBackgroundTintList(ColorStateList.valueOf(color));
} catch (Exception e) {}
// Sjekk om privat
boolean isPrivate = event.getDescription() != null && event.getDescription().contains("#deltakere:");
if (isPrivate) {
calName.setText(event.getCalendarName().toUpperCase() + " (BEGRENSET INNSYN)");
try {
calName.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor(PRIVATE_EVENT_COLOR)));
} catch (Exception e) {}
showParticipants(event.getDescription(), participantsView);
} else {
calName.setText(event.getCalendarName().toUpperCase());
try {
int color = Color.parseColor(event.getCalendarColor());
calName.setBackgroundTintList(ColorStateList.valueOf(color));
} catch (Exception e) {}
participantsView.setVisibility(View.GONE);
}
// VIS ARRANGØR ALLTID
showOrganizer(event.getDescription(), organizerView);
// --- BESKRIVELSE OG LENKER ---
if (!event.getDescription().isEmpty()) {
String cleanDesc = event.getDescription().replaceAll("#varsel:[\\d,]+", "").trim();
String cleanDesc = event.getDescription()
.replaceAll("#varsel:[\\d,]+", "")
.replaceAll("#deltakere:[^\\s]+", "")
.replaceAll("#arrangor:.+", "") // Fjern arrangør fra brødtekst
.trim();
// Konverter HTML til Spannable
desc.setText(Html.fromHtml(cleanDesc, Html.FROM_HTML_MODE_COMPACT));
// Sørg for at rene tekst-lenker (uten <a href>) også blir klikkbare
Linkify.addLinks(desc, Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);
// Gjør at man kan klikke lenkene
desc.setMovementMethod(LinkMovementMethod.getInstance());
desc.setVisibility(View.VISIBLE);
if (!cleanDesc.isEmpty()) {
desc.setText(Html.fromHtml(cleanDesc, Html.FROM_HTML_MODE_COMPACT));
Linkify.addLinks(desc, Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);
desc.setMovementMethod(LinkMovementMethod.getInstance());
desc.setVisibility(View.VISIBLE);
} else {
desc.setVisibility(View.GONE);
}
} else {
desc.setVisibility(View.GONE);
}
// --- ADRESSE OG KART ---
if (!event.getLocation().isEmpty()) {
loc.setText(event.getLocation()); // Viser kun teksten, ikonet ligger i XML
loc.setText(event.getLocation());
loc.setVisibility(View.VISIBLE);
// Gjør adressen klikkbar for å åpne kart
loc.setOnClickListener(v -> {
String location = event.getLocation();
// Opprett en geo-URI. "q=" søker etter stedet.
Uri gmmIntentUri = Uri.parse("geo:0,0?q=" + Uri.encode(location));
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
// Sett pakke til Google Maps for å foretrekke det, men la systemet velge hvis ikke installert
mapIntent.setPackage("com.google.android.apps.maps");
try {
startActivity(mapIntent);
} catch (Exception e) {
// Fallback: Hvis Google Maps ikke finnes, prøv uten pakkenavn (hvilken som helst kart-app)
mapIntent.setPackage(null);
try {
startActivity(mapIntent);
@ -137,6 +156,35 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
return view;
}
private void showParticipants(String rawDescription, TextView view) {
if (rawDescription == null) return;
Matcher m = Pattern.compile("#deltakere:([^\\s]+)").matcher(rawDescription);
if (m.find()) {
String allEmails = m.group(1);
String[] emails = allEmails.split(",");
StringBuilder sb = new StringBuilder();
sb.append("<b>Synlig for:</b><br/>");
for (String email : emails) {
sb.append("").append(email.trim()).append("<br/>");
}
view.setText(Html.fromHtml(sb.toString(), Html.FROM_HTML_MODE_COMPACT));
view.setVisibility(View.VISIBLE);
}
}
// NYTT: Vis arrangør
private void showOrganizer(String rawDescription, TextView view) {
if (rawDescription == null) return;
Matcher m = Pattern.compile("#arrangor:(.+)").matcher(rawDescription);
if (m.find()) {
String organizer = m.group(1).trim();
view.setText("Invitert av: " + organizer);
view.setVisibility(View.VISIBLE);
} else {
view.setVisibility(View.GONE);
}
}
private void confirmDelete() {
new AlertDialog.Builder(getContext())
.setTitle("Slett hendelse")
@ -157,12 +205,9 @@ public class CalendarDetailsBottomSheet extends BottomSheetDialogFragment {
public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
if (response.isSuccessful()) {
Toast.makeText(getContext(), "Slettet!", Toast.LENGTH_SHORT).show();
// VARSLE LISTEN OM AT NOE ER SLETTET
if (changeListener != null) {
changeListener.onEventChanged();
}
dismiss();
} else {
Toast.makeText(getContext(), "Kunne ikke slette", Toast.LENGTH_LONG).show();

View file

@ -15,6 +15,7 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Switch;
@ -31,9 +32,12 @@ import com.google.gson.JsonElement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -43,8 +47,9 @@ public class CreateEventFragment extends Fragment {
private Spinner spinnerCalendar, spinnerRecurrence;
private ChipGroup chipGroupReminders;
private Switch switchAllDay;
private TextView txtPreview;
private Button btnStartDate, btnStartTime, btnEndDate, btnEndTime, btnSave;
private TextView txtPreview, txtSelectedParticipants;
private Button btnStartDate, btnStartTime, btnEndDate, btnEndTime, btnSave, btnSelectParticipants;
private RadioButton rbAll, rbSpecific;
private Calendar startCal = Calendar.getInstance();
private Calendar endCal = Calendar.getInstance();
@ -52,6 +57,13 @@ public class CreateEventFragment extends Fragment {
private String selectedRRule = null;
private boolean isCustomRecurrence = false;
// Deltakere
private List<User> allUsers = new ArrayList<>();
private List<User> filteredUsers = new ArrayList<>();
// Arrangør-sporing (for å ikke overskrive opprinnelig arrangør ved redigering)
private String originalOrganizer = null;
// EDIT MODE
private CalendarEvent eventToEdit = null;
@ -75,13 +87,17 @@ public class CreateEventFragment extends Fragment {
chipGroupReminders = view.findViewById(R.id.chip_group_reminders);
txtPreview = view.findViewById(R.id.txt_time_preview);
txtSelectedParticipants = view.findViewById(R.id.txt_selected_participants);
btnStartDate = view.findViewById(R.id.btn_start_date);
btnStartTime = view.findViewById(R.id.btn_start_time);
btnEndDate = view.findViewById(R.id.btn_end_date);
btnEndTime = view.findViewById(R.id.btn_end_time);
btnSave = view.findViewById(R.id.btn_save_event);
btnSelectParticipants = view.findViewById(R.id.btn_select_participants);
rbAll = view.findViewById(R.id.rb_visibility_all);
rbSpecific = view.findViewById(R.id.rb_visibility_specific);
// Initialiser tid (neste hele time)
startCal.add(Calendar.HOUR_OF_DAY, 1);
@ -91,6 +107,7 @@ public class CreateEventFragment extends Fragment {
setupCalendarSpinner();
setupReminderChips();
fetchUsers();
// SJEKK OM VI ER I REDIGERINGS-MODUS
if (getArguments() != null && getArguments().containsKey("edit_event")) {
@ -113,6 +130,22 @@ public class CreateEventFragment extends Fragment {
btnSave.setOnClickListener(v -> submitEvent());
// Vis/Skjul deltaker-knapp
rbAll.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
btnSelectParticipants.setVisibility(View.GONE);
txtSelectedParticipants.setVisibility(View.GONE);
}
});
rbSpecific.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
btnSelectParticipants.setVisibility(View.VISIBLE);
txtSelectedParticipants.setVisibility(View.VISIBLE);
}
});
btnSelectParticipants.setOnClickListener(v -> showUserSelectionDialog());
spinnerRecurrence.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
@ -129,12 +162,148 @@ public class CreateEventFragment extends Fragment {
}
@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() {
RetrofitClient.getApiService().getUsersList().enqueue(new Callback<List<User>>() {
@Override
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
if (!isAdded()) return;
if (response.isSuccessful() && response.body() != null) {
allUsers = response.body();
if (spinnerCalendar.getSelectedItem() != null) {
updateFilteredUsers(spinnerCalendar.getSelectedItem().toString());
}
if (eventToEdit != null) {
parseParticipantsFromDescription(eventToEdit.getDescription());
}
}
}
@Override
public void onFailure(Call<List<User>> call, Throwable t) {}
});
}
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() {
if (filteredUsers.isEmpty()) {
Toast.makeText(getContext(), "Ingen personer med riktig tilgang funnet.", Toast.LENGTH_SHORT).show();
return;
}
String[] userNames = new String[filteredUsers.size()];
boolean[] checkedItems = new boolean[filteredUsers.size()];
for (int i = 0; i < filteredUsers.size(); i++) {
userNames[i] = filteredUsers.get(i).getName();
checkedItems[i] = filteredUsers.get(i).isSelected();
}
new AlertDialog.Builder(getContext())
.setTitle("Velg deltakere")
.setMultiChoiceItems(userNames, checkedItems, (dialog, which, isChecked) -> {
filteredUsers.get(which).setSelected(isChecked);
})
.setPositiveButton("OK", (dialog, which) -> updateParticipantPreview())
.setNegativeButton("Avbryt", null)
.show();
}
private void updateParticipantPreview() {
StringBuilder sb = new StringBuilder("Valgte: ");
int count = 0;
for (User u : allUsers) {
if (u.isSelected()) {
if (count > 0) sb.append(", ");
sb.append(u.getName());
count++;
}
}
if (count == 0) txtSelectedParticipants.setText("Ingen valgt");
else txtSelectedParticipants.setText(sb.toString());
}
private void parseParticipantsFromDescription(String desc) {
if (desc == null) return;
Pattern p = Pattern.compile("#deltakere:([^\\s]+)");
Matcher m = p.matcher(desc);
if (m.find()) {
rbSpecific.setChecked(true);
String[] emails = m.group(1).split(",");
for (String email : emails) {
for (int i = 0; i < allUsers.size(); i++) {
if (allUsers.get(i).getEmail().equalsIgnoreCase(email.trim())) {
allUsers.get(i).setSelected(true);
}
}
}
updateParticipantPreview();
} else {
rbAll.setChecked(true);
}
}
private void prefillForm(CalendarEvent event) {
etTitle.setText(event.getTitle());
String cleanDesc = event.getDescription().replaceAll("#varsel:[\\d,]+", "").trim();
// Hent ut opprinnelig arrangør hvis den finnes
if (event.getDescription() != null) {
Matcher m = Pattern.compile("#arrangor:(.+)").matcher(event.getDescription());
if (m.find()) {
originalOrganizer = m.group(1).trim();
}
}
String cleanDesc = event.getDescription()
.replaceAll("#varsel:[\\d,]+", "")
.replaceAll("#deltakere:[^\\s]+", "")
.replaceAll("#arrangor:.+", "") // Fjern også arrangør fra tekstfeltet
.trim();
etDesc.setText(cleanDesc);
etLocation.setText(event.getLocation());
@ -523,6 +692,30 @@ public class CreateEventFragment extends Fragment {
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();
}
}
// NYTT: Legg til arrangør
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(
title, description, location, startTimeStr, endTimeStr,
getCalendarSlug(), reminders, isAllDay, selectedRRule
@ -534,8 +727,6 @@ public class CreateEventFragment extends Fragment {
Toast.makeText(getContext(), eventToEdit != null ? "Oppdaterer..." : "Oppretter...", Toast.LENGTH_SHORT).show();
// **VIKTIG ENDRING:**
// Vi henter context her (mens Fragmentet lever) for å bruke den i bakgrunnstråden
final Context appContext = requireContext().getApplicationContext();
Call<JsonElement> call;
@ -550,10 +741,7 @@ public class CreateEventFragment extends Fragment {
public void onResponse(Call<JsonElement> call, Response<JsonElement> response) {
if (response.isSuccessful()) {
Toast.makeText(getContext(), eventToEdit != null ? "Hendelse oppdatert!" : "Hendelse opprettet!", Toast.LENGTH_LONG).show();
// Start oppdatering av alarmer i bakgrunnen
fetchCalendarAndSchedule(appContext);
Navigation.findNavController(getView()).navigateUp();
} else {
Toast.makeText(getContext(), "Feil (" + response.code() + ")", Toast.LENGTH_LONG).show();
@ -567,16 +755,12 @@ public class CreateEventFragment extends Fragment {
});
}
// Oppdatert metode som tar imot context som parameter
private void fetchCalendarAndSchedule(Context context) {
new Thread(() -> {
try {
// Sjekk en ekstra gang for å være sikker
if (context == null) return;
Response<List<CalendarEvent>> response = RetrofitClient.getApiService().getCalendarEvents().execute();
if (response.isSuccessful() && response.body() != null) {
// Bruk contexten vi fikk tilsendt, ikke getContext() som kan være null
AlarmScheduler.scheduleAlarmsForEvents(context, response.body());
}
} catch (Exception e) {

View file

@ -0,0 +1,36 @@
package com.kbs.kbsintranett;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class User implements Serializable {
@SerializedName("id")
private int id;
@SerializedName("name")
private String name;
@SerializedName("email")
private String email;
@SerializedName("roles")
private List<String> roles; // NYTT: Liste over roller
// For bruk i UI (sjekkbokser)
private boolean isSelected = false;
public int getId() { return id; }
public String getName() { return name; }
public String getEmail() { return email; }
public List<String> getRoles() { return roles != null ? roles : new ArrayList<>(); }
public boolean isSelected() { return isSelected; }
public void setSelected(boolean selected) { isSelected = selected; }
@Override
public String toString() {
return name;
}
}

View file

@ -45,6 +45,10 @@ public interface WordPressApiService {
@POST("wp-json/kbs/v1/calendar/create")
Call<JsonElement> createCalendarEvent(@Body CreateEventRequest request);
// NYTT ENDEPUNKT
@GET("wp-json/kbs/v1/users")
Call<List<User>> getUsersList();
@GET("wp-json/gf/v2/entries")
Call<GravityEntryResponse> getEntries(
@Query("form_ids") int formId,
@ -73,7 +77,6 @@ public interface WordPressApiService {
@POST("wp-json/kbs/v1/calendar/delete")
Call<JsonElement> deleteCalendarEvent(@Body CreateEventRequest request);
// NYTT: Registrer enhet for push-varsler
@POST("wp-json/kbs/v1/device/register")
Call<JsonElement> registerDevice(@Body RegisterDeviceRequest request);
}

View file

@ -42,10 +42,6 @@
android:drawablePadding="8dp"
app:drawableStartCompat="@android:drawable/ic_menu_recent_history"/>
<!--
ENDRET: Lagt til kart-ikon, blå tekstfarge, og gjort den klikkbar visuelt
med background="?attr/selectableItemBackground"
-->
<TextView
android:id="@+id/sheet_location"
android:layout_width="match_parent"
@ -62,10 +58,32 @@
android:paddingVertical="8dp"
app:drawableStartCompat="@android:drawable/ic_dialog_map"/>
<!--
ENDRET: Lagt til autoLink for web, email og phone
Dette hjelper TextView å forstå linker automatisk
-->
<!-- NYTT: Arrangør -->
<TextView
android:id="@+id/sheet_organizer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Invitert av: ..."
android:textSize="14sp"
android:textColor="#333"
android:background="#F5F5F5"
android:padding="12dp"
android:layout_marginBottom="4dp"
android:visibility="gone"/>
<!-- Deltakere -->
<TextView
android:id="@+id/sheet_participants"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Synlig for: ..."
android:textSize="14sp"
android:textColor="#333"
android:background="#F5F5F5"
android:padding="12dp"
android:layout_marginBottom="16dp"
android:visibility="gone"/>
<TextView
android:id="@+id/sheet_desc"
android:layout_width="match_parent"

View file

@ -71,6 +71,54 @@
android:layout_marginBottom="16dp"
android:padding="12dp"/>
<!-- SYNLIGHET / DELTAKERE (NYTT) -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Synlighet / Deltakere:"
android:textSize="14sp"
android:textColor="#666"
android:layout_marginTop="8dp"/>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginBottom="8dp">
<RadioButton
android:id="@+id/rb_visibility_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alle i kalenderen (Standard)"
android:checked="true"/>
<RadioButton
android:id="@+id/rb_visibility_specific"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Begrens til valgte personer..."/>
</RadioGroup>
<Button
android:id="@+id/btn_select_participants"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Velg personer"
android:visibility="gone"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_marginBottom="16dp"/>
<TextView
android:id="@+id/txt_selected_participants"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Ingen valgt"
android:textSize="12sp"
android:textStyle="italic"
android:visibility="gone"
android:layout_marginBottom="16dp"/>
<!-- HELE DAGEN -->
<Switch
android:id="@+id/switch_all_day"
@ -151,7 +199,7 @@
android:layout_marginBottom="16dp"
android:padding="12dp"/>
<!-- NYTT: VARSLING MED CHIPS (MULTIVALG) -->
<!-- VARSLING MED CHIPS -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -172,7 +220,6 @@
android:layout_height="wrap_content"
app:singleLine="true"
app:selectionRequired="false">
<!-- Chips legges til programmatisk i Java -->
</com.google.android.material.chip.ChipGroup>
</HorizontalScrollView>

File diff suppressed because it is too large Load diff