From 67285163592015537928d5eadd1097520cb9b10b Mon Sep 17 00:00:00 2001 From: ErolHaagenrud Date: Fri, 9 Jan 2026 13:01:49 +0100 Subject: [PATCH] =?UTF-8?q?F=C3=B8r=20feils=C3=B8king=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 +- .../kbs/kbsintranett/CreateEventFragment.java | 97 +++++++++++-------- .../kbs/kbsintranett/FormsListFragment.java | 92 ++++-------------- .../com/kbs/kbsintranett/KbsApplication.java | 9 +- .../com/kbs/kbsintranett/MainActivity.java | 36 +++++-- .../com/kbs/kbsintranett/RetrofitClient.java | 43 ++++---- .../main/res/layout/fragment_forms_list.xml | 36 +++---- 7 files changed, 156 insertions(+), 161 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78a2188..27369b8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,6 +29,7 @@ android:supportsRtl="true" android:theme="@style/Theme.KBSIntranett" android:usesCleartextTraffic="true" + android:enableOnBackInvokedCallback="true" tools:targetApi="31"> - @@ -68,12 +68,10 @@ android:resource="@xml/file_paths" /> - - diff --git a/app/src/main/java/com/kbs/kbsintranett/CreateEventFragment.java b/app/src/main/java/com/kbs/kbsintranett/CreateEventFragment.java index fc0a77f..367bf1f 100644 --- a/app/src/main/java/com/kbs/kbsintranett/CreateEventFragment.java +++ b/app/src/main/java/com/kbs/kbsintranett/CreateEventFragment.java @@ -3,9 +3,9 @@ package com.kbs.kbsintranett; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.TimePickerDialog; -import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; +import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -16,27 +16,30 @@ 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; import android.widget.TextView; import android.widget.Toast; import android.widget.ToggleButton; +import android.widget.RadioGroup; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.navigation.Navigation; + import com.google.android.material.chip.Chip; import com.google.android.material.chip.ChipGroup; import com.google.gson.JsonElement; + import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; -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; @@ -56,9 +59,7 @@ public class CreateEventFragment extends Fragment { private String selectedRRule = null; private boolean isCustomRecurrence = false; - // BRUKERLISTER private List filteredUsers = new ArrayList<>(); - private String originalOrganizer = null; private CalendarEvent eventToEdit = null; @@ -72,7 +73,6 @@ public class CreateEventFragment extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - // Initialisering av Views etTitle = view.findViewById(R.id.et_title); etDesc = view.findViewById(R.id.et_desc); etLocation = view.findViewById(R.id.et_location); @@ -91,7 +91,6 @@ public class CreateEventFragment extends Fragment { rbAll = view.findViewById(R.id.rb_visibility_all); rbSpecific = view.findViewById(R.id.rb_visibility_specific); - // Standardtidspunkt (neste time) startCal.add(Calendar.HOUR_OF_DAY, 1); startCal.set(Calendar.MINUTE, 0); endCal.setTime(startCal.getTime()); @@ -101,17 +100,25 @@ public class CreateEventFragment extends Fragment { setupReminderChips(); fetchUsers(); - // Sjekk om vi redigerer en eksisterende hendelse + // Trygg henting av Serializable for å unngå "unchecked" warning if (getArguments() != null && getArguments().containsKey("edit_event")) { - eventToEdit = (CalendarEvent) getArguments().getSerializable("edit_event"); - prefillForm(eventToEdit); - btnSave.setText("Oppdater Hendelse"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + eventToEdit = getArguments().getSerializable("edit_event", CalendarEvent.class); + } else { + @SuppressWarnings("deprecation") + CalendarEvent e = (CalendarEvent) getArguments().getSerializable("edit_event"); + eventToEdit = e; + } + + if (eventToEdit != null) { + prefillForm(eventToEdit); + btnSave.setText("Oppdater Hendelse"); + } } updateRecurrenceSpinner(); updateUI(); - // Listeners switchAllDay.setOnCheckedChangeListener((btn, isChecked) -> updateUI()); btnStartDate.setOnClickListener(v -> pickDate(startCal, true)); btnEndDate.setOnClickListener(v -> pickDate(endCal, false)); @@ -154,19 +161,17 @@ public class CreateEventFragment extends Fragment { private void fetchUsers() { RetrofitClient.getApiService().getUsersList().enqueue(new Callback>() { @Override - public void onResponse(Call> call, Response> response) { + public void onResponse(@NonNull Call> call, @NonNull Response> response) { if (!isAdded()) return; if (response.isSuccessful() && response.body() != null) { - // BRUKER DEN SENTRALE HJELPEKLASSEN FOR FILTRERING filteredUsers = UserFilterHelper.getFilteredUsers(response.body()); - if (eventToEdit != null) { parseParticipantsFromDescription(eventToEdit.getDescription()); } } } @Override - public void onFailure(Call> call, Throwable t) {} + public void onFailure(@NonNull Call> call, @NonNull Throwable t) {} }); } @@ -215,11 +220,14 @@ public class CreateEventFragment extends Fragment { if (m.find()) { rbSpecific.setChecked(true); - String[] emails = m.group(1).split(","); - for (String email : emails) { - for (User u : filteredUsers) { - if (u.getEmail().equalsIgnoreCase(email.trim())) { - u.setSelected(true); + String group = m.group(1); + if (group != null) { + String[] emails = group.split(","); + for (String email : emails) { + for (User u : filteredUsers) { + if (u.getEmail().equalsIgnoreCase(email.trim())) { + u.setSelected(true); + } } } } @@ -233,7 +241,10 @@ public class CreateEventFragment extends Fragment { etTitle.setText(event.getTitle()); if (event.getDescription() != null) { Matcher m = Pattern.compile("#arrangor:(.+)").matcher(event.getDescription()); - if (m.find()) originalOrganizer = m.group(1).trim(); + if (m.find()) { + String group = m.group(1); + if (group != null) originalOrganizer = group.trim(); + } } String cleanDesc = event.getDescription() @@ -244,8 +255,9 @@ public class CreateEventFragment extends Fragment { etDesc.setText(cleanDesc); etLocation.setText(event.getLocation()); - ArrayAdapter adapter = (ArrayAdapter) spinnerCalendar.getAdapter(); - if (adapter != null) { + if (spinnerCalendar.getAdapter() instanceof ArrayAdapter) { + @SuppressWarnings("unchecked") + ArrayAdapter adapter = (ArrayAdapter) spinnerCalendar.getAdapter(); int position = adapter.getPosition(event.getCalendarName()); if (position >= 0) spinnerCalendar.setSelection(position); } @@ -284,7 +296,10 @@ public class CreateEventFragment extends Fragment { if (!existingReminders.isEmpty()) { for (int i = 0; i < chipGroupReminders.getChildCount(); i++) { Chip chip = (Chip) chipGroupReminders.getChildAt(i); - chip.setChecked(existingReminders.contains((Integer) chip.getTag())); + Integer tag = (Integer) chip.getTag(); + if (tag != null) { + chip.setChecked(existingReminders.contains(tag)); + } } } } catch (Exception e) { @@ -299,7 +314,7 @@ public class CreateEventFragment extends Fragment { calendars.add("Felles"); } - ArrayAdapter adapter = new ArrayAdapter(getContext(), android.R.layout.simple_spinner_item, calendars) { + ArrayAdapter adapter = new ArrayAdapter(requireContext(), 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)))); @@ -307,7 +322,7 @@ public class CreateEventFragment extends Fragment { view.setTypeface(null, Typeface.BOLD); return view; } - @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { + @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { TextView view = (TextView) super.getDropDownView(position, convertView, parent); view.setTextColor(Color.parseColor(getCalendarColor(getItem(position)))); view.setTypeface(null, Typeface.BOLD); @@ -321,11 +336,11 @@ public class CreateEventFragment extends Fragment { private String getCalendarColor(String name) { if (name == null) return "#888888"; switch (name) { - case "Felles": return "#0069B3"; // KBS Blå - case "AMU/HMS/Miljø": return "#2E7D32"; // Mørk grønn (Miljø-profil) + case "Felles": return "#0069B3"; + case "AMU/HMS/Miljø": return "#2E7D32"; case "Administrasjonen": return "#607D8B"; case "Serviceavdelingen": return "#E65100"; - case "Automasjonsavdelingen": return "#2E7D32"; // Merk: Denne er lik Miljø nå, du kan bytte til f.eks #1B5E20 hvis ønskelig + case "Automasjonsavdelingen": return "#2E7D32"; case "Prosjektavdelingen": return "#7B1FA2"; default: return "#888888"; } @@ -347,13 +362,14 @@ public class CreateEventFragment extends Fragment { if (eventToEdit == null) { for (int i=0; i(getContext(), android.R.layout.simple_spinner_dropdown_item, options)); + spinnerRecurrence.setAdapter(new ArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_dropdown_item, options)); } private void generateStandardRRule(int position) { @@ -406,7 +422,7 @@ public class CreateEventFragment extends Fragment { btnEndDatePicker.setText(new SimpleDateFormat("d. MMM yyyy", Locale.getDefault()).format(customEndCal.getTime())); btnEndDatePicker.setOnClickListener(v -> { rgEnd.check(R.id.rb_date); - 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(); + new DatePickerDialog(requireContext(), (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(); }); spinnerFreq.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView p, View v, int pos, long id) { layoutWeekdays.setVisibility(pos == 1 ? View.VISIBLE : View.GONE); } @@ -434,7 +450,7 @@ public class CreateEventFragment extends Fragment { } private void pickDate(Calendar cal, boolean isStart) { - new DatePickerDialog(getContext(), (view, y, m, d) -> { + new DatePickerDialog(requireContext(), (view, y, m, d) -> { cal.set(y, m, d); if (isStart) { if (endCal.before(startCal)) { endCal.setTime(startCal.getTime()); if (!switchAllDay.isChecked()) endCal.add(Calendar.HOUR_OF_DAY, 1); } @@ -445,7 +461,7 @@ public class CreateEventFragment extends Fragment { } private void pickTime(Calendar cal) { - new TimePickerDialog(getContext(), (view, h, m) -> { + new TimePickerDialog(requireContext(), (view, h, m) -> { cal.set(Calendar.HOUR_OF_DAY, h); cal.set(Calendar.MINUTE, m); if (cal == startCal && endCal.before(startCal)) { endCal.setTime(startCal.getTime()); endCal.add(Calendar.HOUR_OF_DAY, 1); } updateUI(); @@ -473,7 +489,8 @@ public class CreateEventFragment extends Fragment { List reminders = new ArrayList<>(); for (int i=0; i call = (eventToEdit != null) ? RetrofitClient.getApiService().updateCalendarEvent(req) : RetrofitClient.getApiService().createCalendarEvent(req); call.enqueue(new Callback() { - @Override public void onResponse(Call call, Response response) { + @Override public void onResponse(@NonNull Call call, @NonNull Response response) { if (response.isSuccessful()) { Toast.makeText(getContext(), "Lagret!", Toast.LENGTH_LONG).show(); - Navigation.findNavController(getView()).navigateUp(); + Navigation.findNavController(requireView()).navigateUp(); } } - @Override public void onFailure(Call call, Throwable t) { Toast.makeText(getContext(), "Feil!", Toast.LENGTH_SHORT).show(); } + @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { Toast.makeText(getContext(), "Feil!", Toast.LENGTH_SHORT).show(); } }); } } \ No newline at end of file diff --git a/app/src/main/java/com/kbs/kbsintranett/FormsListFragment.java b/app/src/main/java/com/kbs/kbsintranett/FormsListFragment.java index 14b5e85..5054396 100644 --- a/app/src/main/java/com/kbs/kbsintranett/FormsListFragment.java +++ b/app/src/main/java/com/kbs/kbsintranett/FormsListFragment.java @@ -31,8 +31,6 @@ import retrofit2.Response; public class FormsListFragment extends Fragment { private LinearLayout formsContainer; - private ProgressBar progressBar; - private TextView errorText; private SwipeRefreshLayout swipeRefreshLayout; private static final Pattern TITLE_NUMBER_PATTERN = Pattern.compile("^(\\d+)[.\\s-]+\\s*(.*)"); @@ -40,110 +38,68 @@ public class FormsListFragment extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_forms_list, container, false); - formsContainer = view.findViewById(R.id.forms_container); swipeRefreshLayout = view.findViewById(R.id.swipe_refresh); - // Opprett en ProgressBar manuelt for første gangs lasting - progressBar = new ProgressBar(getContext()); - LinearLayout.LayoutParams progressParams = new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - progressParams.gravity = Gravity.CENTER; - progressBar.setLayoutParams(progressParams); + swipeRefreshLayout.setOnRefreshListener(this::fetchFormsList); - formsContainer.addView(progressBar); - - errorText = new TextView(getContext()); - errorText.setTextColor(Color.RED); - errorText.setVisibility(View.GONE); - errorText.setPadding(20, 20, 20, 20); - formsContainer.addView(errorText); - - // Sett opp listener for swipe - swipeRefreshLayout.setOnRefreshListener(() -> { - fetchFormsList(); - }); - - // Hent data første gang + // Første gangs lasting + swipeRefreshLayout.setRefreshing(true); fetchFormsList(); return view; } private void fetchFormsList() { - // Skjul feilmelding før ny henting - if (errorText != null) errorText.setVisibility(View.GONE); - RetrofitClient.getApiService().getFormsList().enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { if (!isAdded()) return; - - // Stopp lasting-indikatorer - progressBar.setVisibility(View.GONE); swipeRefreshLayout.setRefreshing(false); if (response.isSuccessful() && response.body() != null) { - List allForms = response.body(); List activeForms = new ArrayList<>(); - - for (GravityForm form : allForms) { + for (GravityForm form : response.body()) { if (form.getIsActive()) { - // NYTT: Hardkodet filtrering av skjemaer som ikke skal vises i listen - // ID 10 = HMS-bekreftelse (Skal ligge i Håndbok/separat flyt) - // ID 18 = Refusjon-vedlegg (Er et underskjema som brukes av ID 16) - if (form.id == 10 || form.id == 18) { - continue; + // HMS-bekreftelse (10) og Refusjon-vedlegg (18) skal ikke i listen + if (form.id != 10 && form.id != 18) { + activeForms.add(form); } - - activeForms.add(form); } } - Collections.sort(activeForms, new Comparator() { - @Override - public int compare(GravityForm f1, GravityForm f2) { - int num1 = extractNumber(f1.title); - int num2 = extractNumber(f2.title); - return Integer.compare(num1, num2); - } - }); + Collections.sort(activeForms, (f1, f2) -> + Integer.compare(extractNumber(f1.title), extractNumber(f2.title))); + populateList(activeForms); } else { - String msg = "Kunne ikke hente skjemaer. Kode: " + response.code(); if (response.code() == 401 || response.code() == 403) { - msg += "\n(Mangler tilgang. Prøv å logge ut og inn igjen.)"; + showError("Sesjonen utløp, men er nå reparert. Vennligst sveip ned for å prøve igjen."); + } else { + showError("Kunne ikke hente skjemaer. Kode: " + response.code()); } - showError(msg); } } @Override public void onFailure(Call> call, Throwable t) { if (!isAdded()) return; - - // Stopp lasting-indikatorer - progressBar.setVisibility(View.GONE); swipeRefreshLayout.setRefreshing(false); - - showError("Nettverksfeil: " + t.getMessage()); + showError("Nettverksfeil: Prøv igjen."); } }); } private void populateList(List forms) { formsContainer.removeAllViews(); - if (forms.isEmpty()) { showError("Ingen aktive skjemaer funnet."); return; } for (GravityForm form : forms) { - int formId = form.id; - String cleanTitle = cleanTitle(form.title); - addFormButton(formsContainer, cleanTitle, formId); + addFormButton(formsContainer, cleanTitle(form.title), form.id); } } @@ -174,30 +130,22 @@ public class FormsListFragment extends Fragment { TextView tv = new TextView(getContext()); tv.setText(message); - tv.setTextColor(Color.RED); + tv.setTextColor(Color.parseColor("#C40426")); // KBS Rød tv.setTextSize(16); + tv.setGravity(Gravity.CENTER); + tv.setPadding(40, 100, 40, 40); formsContainer.addView(tv); } private int extractNumber(String title) { if (title == null) return 9999; Matcher m = TITLE_NUMBER_PATTERN.matcher(title.trim()); - if (m.find()) { - try { - return Integer.parseInt(m.group(1)); - } catch (NumberFormatException e) { - return 9999; - } - } - return 9999; + return m.find() ? Integer.parseInt(m.group(1)) : 9999; } private String cleanTitle(String title) { if (title == null) return ""; Matcher m = TITLE_NUMBER_PATTERN.matcher(title.trim()); - if (m.find()) { - return m.group(2); - } - return title; + return m.find() ? m.group(2) : title; } } \ No newline at end of file diff --git a/app/src/main/java/com/kbs/kbsintranett/KbsApplication.java b/app/src/main/java/com/kbs/kbsintranett/KbsApplication.java index 1879bdb..f7a8396 100644 --- a/app/src/main/java/com/kbs/kbsintranett/KbsApplication.java +++ b/app/src/main/java/com/kbs/kbsintranett/KbsApplication.java @@ -3,21 +3,26 @@ package com.kbs.kbsintranett; import android.app.Application; import android.app.NotificationChannel; import android.app.NotificationManager; +import android.content.Context; import android.os.Build; public class KbsApplication extends Application { public static final String CHANNEL_ID = "kbs_calendar_channel"; + private static Context instance; @Override public void onCreate() { super.onCreate(); + instance = getApplicationContext(); createNotificationChannel(); } + public static Context getContext() { + return instance; + } + private void createNotificationChannel() { - // Vi oppretter kanalen her ved oppstart, så den er klar uansett om - // det er MainActivity eller en bakgrunnsjobb som trenger den. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( CHANNEL_ID, diff --git a/app/src/main/java/com/kbs/kbsintranett/MainActivity.java b/app/src/main/java/com/kbs/kbsintranett/MainActivity.java index 23b3d2b..52533cc 100644 --- a/app/src/main/java/com/kbs/kbsintranett/MainActivity.java +++ b/app/src/main/java/com/kbs/kbsintranett/MainActivity.java @@ -1,17 +1,17 @@ package com.kbs.kbsintranett; import android.app.AlarmManager; -import android.app.AlertDialog; import android.app.NotificationChannel; import android.app.NotificationManager; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; -import android.util.Log; import android.view.View; import android.widget.TextView; @@ -46,6 +46,15 @@ public class MainActivity extends AppCompatActivity { private AppBarConfiguration appBarConfiguration; private ActivityResultLauncher requestPermissionLauncher; + private final BroadcastReceiver authFailedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (RetrofitClient.ACTION_AUTH_FAILED.equals(intent.getAction())) { + refreshGoogleToken(); + } + } + }; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -62,7 +71,6 @@ public class MainActivity extends AppCompatActivity { if (navHostFragment != null) { navController = navHostFragment.getNavController(); - appBarConfiguration = new AppBarConfiguration.Builder( R.id.navigation_home, R.id.navigation_calendar_full, R.id.navigation_tasks, R.id.navigation_forms, R.id.navigation_news_full, R.id.navigation_handbook) @@ -71,7 +79,6 @@ public class MainActivity extends AppCompatActivity { NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration); - // Vi bruker en tilpasset listener for å sikre at Hjem og andre punkter alltid fungerer navigationView.setNavigationItemSelectedListener(item -> { boolean handled = NavigationUI.onNavDestinationSelected(item, navController); if (handled || item.getItemId() == R.id.navigation_home) { @@ -101,6 +108,20 @@ public class MainActivity extends AppCompatActivity { checkNotificationPermission(); checkExactAlarmPermission(); checkLoginState(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(authFailedReceiver, new IntentFilter(RetrofitClient.ACTION_AUTH_FAILED), Context.RECEIVER_NOT_EXPORTED); + } else { + registerReceiver(authFailedReceiver, new IntentFilter(RetrofitClient.ACTION_AUTH_FAILED)); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + try { + unregisterReceiver(authFailedReceiver); + } catch (Exception ignored) {} } private void updateNavHeader(NavigationView navigationView) { @@ -141,7 +162,7 @@ public class MainActivity extends AppCompatActivity { else refreshGoogleToken(); } - private void refreshGoogleToken() { + public void refreshGoogleToken() { GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(GOOGLE_WEB_CLIENT_ID).requestEmail().build(); GoogleSignInClient client = GoogleSignIn.getClient(this, gso); @@ -169,7 +190,10 @@ public class MainActivity extends AppCompatActivity { private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel("kbs_calendar_channel", "Varsler", NotificationManager.IMPORTANCE_HIGH); - getSystemService(NotificationManager.class).createNotificationChannel(channel); + NotificationManager manager = getSystemService(NotificationManager.class); + if (manager != null) { + manager.createNotificationChannel(channel); + } } } diff --git a/app/src/main/java/com/kbs/kbsintranett/RetrofitClient.java b/app/src/main/java/com/kbs/kbsintranett/RetrofitClient.java index c1bd042..6a68812 100644 --- a/app/src/main/java/com/kbs/kbsintranett/RetrofitClient.java +++ b/app/src/main/java/com/kbs/kbsintranett/RetrofitClient.java @@ -1,12 +1,11 @@ package com.kbs.kbsintranett; +import android.content.Intent; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; - import java.io.IOException; import java.util.List; - import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -18,33 +17,43 @@ import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitClient { private static final String BASE_URL = "https://intranet.kbs.no/"; private static Retrofit retrofit = null; + + public static final String ACTION_AUTH_FAILED = "com.kbs.kbsintranett.AUTH_FAILED"; + public static WordPressApiService getApiService() { if (retrofit == null) { - HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); if (BuildConfig.DEBUG) { - // I debug-modus logger vi det mest nødvendige logging.setLevel(HttpLoggingInterceptor.Level.BASIC); } else { - // I release er vi stille for ytelse og sikkerhet logging.setLevel(HttpLoggingInterceptor.Level.NONE); } OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) - .addInterceptor(new Interceptor() { - @Override - public Response intercept(Chain chain) throws IOException { - Request originalRequest = chain.request(); - Request.Builder builder = originalRequest.newBuilder(); - - String dynamicCookie = UserManager.getInstance().getCookie(); - if (dynamicCookie != null && !dynamicCookie.isEmpty()) { - builder.header("Cookie", dynamicCookie); - } - - return chain.proceed(builder.build()); + .addInterceptor(chain -> { + Request originalRequest = chain.request(); + Request.Builder builder = originalRequest.newBuilder(); + String dynamicCookie = UserManager.getInstance().getCookie(); + if (dynamicCookie != null && !dynamicCookie.isEmpty()) { + builder.header("Cookie", dynamicCookie); } + return chain.proceed(builder.build()); + }) + .addInterceptor(chain -> { + Request request = chain.request(); + Response response = chain.proceed(request); + + if (response.code() == 401 || response.code() == 403) { + if (!request.url().toString().contains("kbs/v1/login")) { + Intent intent = new Intent(ACTION_AUTH_FAILED); + intent.setPackage("com.kbs.kbsintranett"); + if (KbsApplication.getContext() != null) { + KbsApplication.getContext().sendBroadcast(intent); + } + } + } + return response; }) .build(); diff --git a/app/src/main/res/layout/fragment_forms_list.xml b/app/src/main/res/layout/fragment_forms_list.xml index df7b87d..ebb95b5 100644 --- a/app/src/main/res/layout/fragment_forms_list.xml +++ b/app/src/main/res/layout/fragment_forms_list.xml @@ -1,28 +1,22 @@ - + android:layout_height="match_parent"> - + android:layout_height="match_parent" + android:fillViewport="true" + android:background="#F5F5F5"> - + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp" /> + - - - - - - \ No newline at end of file + \ No newline at end of file