Før feilsøking
This commit is contained in:
parent
e89f7a3522
commit
b7c34401ee
2 changed files with 160 additions and 177 deletions
|
|
@ -122,7 +122,6 @@ public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
TaskViewHolder vh = (TaskViewHolder) holder;
|
TaskViewHolder vh = (TaskViewHolder) holder;
|
||||||
vh.title.setText(task.getTitle());
|
vh.title.setText(task.getTitle());
|
||||||
|
|
||||||
// FIKS: Vis "Ingen frist" hvis dato er 0
|
|
||||||
if (task.getDueDate() > 0) {
|
if (task.getDueDate() > 0) {
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("dd. MMM", Locale.getDefault());
|
SimpleDateFormat sdf = new SimpleDateFormat("dd. MMM", Locale.getDefault());
|
||||||
vh.date.setText("Frist: " + sdf.format(new Date(task.getDueDate())));
|
vh.date.setText("Frist: " + sdf.format(new Date(task.getDueDate())));
|
||||||
|
|
@ -145,6 +144,15 @@ public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
vh.date.setTextColor(ContextCompat.getColor(vh.itemView.getContext(), R.color.kbs_muted_blue_gray));
|
vh.date.setTextColor(ContextCompat.getColor(vh.itemView.getContext(), R.color.kbs_muted_blue_gray));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- REINTRODUSERT FREMDRIFTSBEREGNING ---
|
||||||
|
int total = task.getAssigneeStatus().size();
|
||||||
|
int done = 0;
|
||||||
|
for (Boolean isFinished : task.getAssigneeStatus().values()) {
|
||||||
|
if (isFinished) done++;
|
||||||
|
}
|
||||||
|
vh.progress.setText("Fremdrift: " + done + "/" + total);
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
vh.checkBox.setOnClickListener(v -> listener.onTaskStatusChanged(task, vh.checkBox.isChecked()));
|
vh.checkBox.setOnClickListener(v -> listener.onTaskStatusChanged(task, vh.checkBox.isChecked()));
|
||||||
vh.itemView.setOnClickListener(v -> listener.onTaskItemClick(task));
|
vh.itemView.setOnClickListener(v -> listener.onTaskItemClick(task));
|
||||||
}
|
}
|
||||||
|
|
@ -198,13 +206,14 @@ public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
}
|
}
|
||||||
|
|
||||||
static class TaskViewHolder extends RecyclerView.ViewHolder {
|
static class TaskViewHolder extends RecyclerView.ViewHolder {
|
||||||
TextView title, date;
|
TextView title, date, progress;
|
||||||
CheckBox checkBox;
|
CheckBox checkBox;
|
||||||
CardView cardView;
|
CardView cardView;
|
||||||
TaskViewHolder(View v) {
|
TaskViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
title = v.findViewById(R.id.task_title);
|
title = v.findViewById(R.id.task_title);
|
||||||
date = v.findViewById(R.id.task_date);
|
date = v.findViewById(R.id.task_date);
|
||||||
|
progress = v.findViewById(R.id.task_progress); // Husk denne
|
||||||
checkBox = v.findViewById(R.id.task_checkbox);
|
checkBox = v.findViewById(R.id.task_checkbox);
|
||||||
cardView = (CardView) v;
|
cardView = (CardView) v;
|
||||||
}
|
}
|
||||||
|
|
@ -227,7 +236,6 @@ public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
EmptyViewHolder(View v) { super(v); }
|
EmptyViewHolder(View v) { super(v); }
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- WRAPPER KLASSER ---
|
|
||||||
public static class CreateButtonItem {}
|
public static class CreateButtonItem {}
|
||||||
public static class EmptyTasksItem {}
|
public static class EmptyTasksItem {}
|
||||||
public static class SectionTitleItem {
|
public static class SectionTitleItem {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import android.content.pm.PackageManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
@ -20,7 +19,6 @@ import androidx.navigation.Navigation;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
import com.google.gson.JsonElement;
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
@ -30,10 +28,10 @@ import java.util.Locale;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
import retrofit2.Response;
|
import retrofit2.Response;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
|
||||||
public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickListener {
|
public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickListener {
|
||||||
|
|
||||||
private static final String TAG = "HomeFragment";
|
|
||||||
private RecyclerView recyclerView;
|
private RecyclerView recyclerView;
|
||||||
private HomeAdapter adapter;
|
private HomeAdapter adapter;
|
||||||
private ProgressBar mainProgressBar;
|
private ProgressBar mainProgressBar;
|
||||||
|
|
@ -44,12 +42,12 @@ public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickLis
|
||||||
private List<TaskItem> currentTasks = new ArrayList<>();
|
private List<TaskItem> currentTasks = new ArrayList<>();
|
||||||
|
|
||||||
private int activeNetworkCalls = 0;
|
private int activeNetworkCalls = 0;
|
||||||
|
// Cache lever i 60 minutter. PUSH vil ugyldiggjøre den før tiden ved behov.
|
||||||
|
private static final int CACHE_TTL_MINUTES = 60;
|
||||||
|
|
||||||
private Handler timeoutHandler = new Handler(Looper.getMainLooper());
|
private Handler timeoutHandler = new Handler(Looper.getMainLooper());
|
||||||
private Runnable timeoutRunnable = this::forceStopLoading;
|
private Runnable timeoutRunnable = this::forceStopLoading;
|
||||||
|
|
||||||
private static final int CACHE_TTL_MINUTES = 60;
|
|
||||||
|
|
||||||
private ActivityResultLauncher<String> requestPermissionLauncher;
|
private ActivityResultLauncher<String> requestPermissionLauncher;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -77,8 +75,10 @@ public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickLis
|
||||||
|
|
||||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||||
|
|
||||||
|
// Ved manuell swipe: Tving nettverksoppdatering
|
||||||
swipeRefreshLayout.setOnRefreshListener(() -> refreshData(true));
|
swipeRefreshLayout.setOnRefreshListener(() -> refreshData(true));
|
||||||
|
|
||||||
|
// Ved oppstart: Bruk cache (false = ikke tving nettverk)
|
||||||
refreshData(false);
|
refreshData(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -89,207 +89,174 @@ public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickLis
|
||||||
}
|
}
|
||||||
|
|
||||||
private void refreshData(boolean forceNetwork) {
|
private void refreshData(boolean forceNetwork) {
|
||||||
if (activeNetworkCalls > 0) return;
|
// 1. Last cache i bakgrunnen
|
||||||
|
new Thread(() -> {
|
||||||
|
if (getContext() == null) return;
|
||||||
|
|
||||||
boolean useCacheCalendar = !forceNetwork && CacheManager.isCacheValid(getContext(), "calendar", CACHE_TTL_MINUTES);
|
// Hent data fra disk
|
||||||
boolean useCacheNews = !forceNetwork && CacheManager.isCacheValid(getContext(), "news", CACHE_TTL_MINUTES);
|
List<CalendarEvent> cachedApiEvents = CacheManager.getCachedCalendarEvents(getContext());
|
||||||
boolean useCacheTasks = !forceNetwork && CacheManager.isCacheValid(getContext(), "tasks", CACHE_TTL_MINUTES);
|
List<CalendarEvent> deviceEvents = CalendarManager.getDeviceEvents(getContext(), true);
|
||||||
|
|
||||||
// Hvis alt er i cache, last direkte
|
for (CalendarEvent e : cachedApiEvents) CalendarManager.formatEventForUI(e);
|
||||||
if (useCacheCalendar && useCacheNews && useCacheTasks) {
|
List<CalendarEvent> mergedEvents = CalendarManager.mergeAndSort(cachedApiEvents, deviceEvents);
|
||||||
loadAllFromCache();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
activeNetworkCalls = 3;
|
List<WpPost> cachedNews = CacheManager.getCachedNewsPosts(getContext());
|
||||||
if (mainProgressBar != null) mainProgressBar.setVisibility(View.VISIBLE);
|
formatNewsDates(cachedNews);
|
||||||
|
|
||||||
timeoutHandler.removeCallbacks(timeoutRunnable);
|
List<TaskItem> cachedTasks = CacheManager.getTasks(getContext());
|
||||||
timeoutHandler.postDelayed(timeoutRunnable, 10000);
|
|
||||||
|
|
||||||
fetchCalendarData(useCacheCalendar);
|
// 2. Oppdater UI på hovedtråden
|
||||||
fetchNewsData(useCacheNews);
|
new Handler(Looper.getMainLooper()).post(() -> {
|
||||||
fetchTaskData(useCacheTasks);
|
if (!isAdded()) return;
|
||||||
|
|
||||||
|
// Oppdater variablene
|
||||||
|
currentEvents = mergedEvents;
|
||||||
|
currentNews = cachedNews;
|
||||||
|
currentTasks = cachedTasks;
|
||||||
|
|
||||||
|
// Vis dataene vi fant umiddelbart (fjerner spinner hvis den var der)
|
||||||
|
buildAndDisplayList();
|
||||||
|
|
||||||
|
// 3. Vurder om vi skal hente nytt fra nettet
|
||||||
|
boolean cacheValidCal = CacheManager.isCacheValid(getContext(), "calendar", CACHE_TTL_MINUTES);
|
||||||
|
boolean cacheValidNews = CacheManager.isCacheValid(getContext(), "news", CACHE_TTL_MINUTES);
|
||||||
|
boolean cacheValidTasks = CacheManager.isCacheValid(getContext(), "tasks", CACHE_TTL_MINUTES);
|
||||||
|
|
||||||
|
// Vi henter KUN hvis brukeren swiper (force) ELLER cachen er utgått på dato.
|
||||||
|
// Vi henter IKKE bare fordi listene er tomme (da stoler vi på at cachen er korrekt tom).
|
||||||
|
boolean needNetwork = forceNetwork || !cacheValidCal || !cacheValidNews || !cacheValidTasks;
|
||||||
|
|
||||||
|
if (needNetwork) {
|
||||||
|
// Vis spinner KUN hvis det er helt tomt fra før, eller ved manuell swipe
|
||||||
|
boolean isEverythingEmpty = currentNews.isEmpty() && currentTasks.isEmpty() && currentEvents.isEmpty();
|
||||||
|
|
||||||
|
if (isEverythingEmpty && mainProgressBar != null) {
|
||||||
|
mainProgressBar.setVisibility(View.VISIBLE);
|
||||||
|
} else if (forceNetwork && swipeRefreshLayout != null) {
|
||||||
|
swipeRefreshLayout.setRefreshing(true);
|
||||||
|
}
|
||||||
|
// Ellers: Silent update (ingen spinner, men vi henter i bakgrunnen)
|
||||||
|
|
||||||
|
activeNetworkCalls = 3;
|
||||||
|
timeoutHandler.removeCallbacks(timeoutRunnable);
|
||||||
|
timeoutHandler.postDelayed(timeoutRunnable, 10000); // 10 sek timeout
|
||||||
|
|
||||||
|
fetchCalendarData();
|
||||||
|
fetchNewsData();
|
||||||
|
fetchTaskData();
|
||||||
|
} else {
|
||||||
|
// Cachen er god nok! Skjul evt spinnere.
|
||||||
|
stopLoaders();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopLoaders() {
|
||||||
|
if (mainProgressBar != null) mainProgressBar.setVisibility(View.GONE);
|
||||||
|
if (swipeRefreshLayout != null) swipeRefreshLayout.setRefreshing(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void forceStopLoading() {
|
private void forceStopLoading() {
|
||||||
if (activeNetworkCalls > 0) {
|
if (activeNetworkCalls > 0) {
|
||||||
activeNetworkCalls = 0;
|
activeNetworkCalls = 0;
|
||||||
if (mainProgressBar != null) mainProgressBar.setVisibility(View.GONE);
|
stopLoaders();
|
||||||
if (swipeRefreshLayout != null) swipeRefreshLayout.setRefreshing(false);
|
|
||||||
buildAndDisplayList();
|
buildAndDisplayList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadAllFromCache() {
|
private void fetchCalendarData() {
|
||||||
if (mainProgressBar != null) mainProgressBar.setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
new Thread(() -> {
|
|
||||||
List<CalendarEvent> deviceEvents = CalendarManager.getDeviceEvents(getContext(), true);
|
|
||||||
new Handler(Looper.getMainLooper()).post(() -> {
|
|
||||||
if (!isAdded()) return;
|
|
||||||
|
|
||||||
List<CalendarEvent> cachedApi = CacheManager.getCachedCalendarEvents(getContext());
|
|
||||||
for (CalendarEvent e : cachedApi) CalendarManager.formatEventForUI(e);
|
|
||||||
currentEvents = CalendarManager.mergeAndSort(cachedApi, deviceEvents);
|
|
||||||
|
|
||||||
currentNews = CacheManager.getCachedNewsPosts(getContext());
|
|
||||||
formatNewsDates(currentNews);
|
|
||||||
|
|
||||||
currentTasks = CacheManager.getTasks(getContext());
|
|
||||||
|
|
||||||
// FIKS: Hvis cache er tom, prøv nettverk likevel for å unngå tom skjerm
|
|
||||||
if (currentTasks.isEmpty() && !CacheManager.isCacheValid(getContext(), "tasks", CACHE_TTL_MINUTES)) {
|
|
||||||
fetchTaskData(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mainProgressBar != null) mainProgressBar.setVisibility(View.GONE);
|
|
||||||
if (swipeRefreshLayout != null) swipeRefreshLayout.setRefreshing(false);
|
|
||||||
|
|
||||||
buildAndDisplayList();
|
|
||||||
});
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fetchCalendarData(boolean useCache) {
|
|
||||||
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
|
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
|
||||||
requestPermissionLauncher.launch(Manifest.permission.READ_CALENDAR);
|
requestPermissionLauncher.launch(Manifest.permission.READ_CALENDAR);
|
||||||
currentEvents.clear();
|
|
||||||
checkLoadingComplete();
|
checkLoadingComplete();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
new Thread(() -> {
|
RetrofitClient.getApiService().getCalendarEvents().enqueue(new Callback<List<CalendarEvent>>() {
|
||||||
try {
|
@Override
|
||||||
if (getContext() == null) {
|
public void onResponse(Call<List<CalendarEvent>> call, Response<List<CalendarEvent>> response) {
|
||||||
checkLoadingCompleteAsync();
|
if (response.isSuccessful() && response.body() != null) {
|
||||||
return;
|
List<CalendarEvent> apiEvents = response.body();
|
||||||
}
|
CacheManager.saveCalendarEvents(getContext(), apiEvents);
|
||||||
|
|
||||||
List<CalendarEvent> deviceEvents = CalendarManager.getDeviceEvents(getContext(), true);
|
new Thread(() -> {
|
||||||
|
List<CalendarEvent> deviceEvents = CalendarManager.getDeviceEvents(getContext(), true);
|
||||||
new Handler(Looper.getMainLooper()).post(() -> {
|
for (CalendarEvent e : apiEvents) CalendarManager.formatEventForUI(e);
|
||||||
if (!isAdded()) return;
|
List<CalendarEvent> merged = CalendarManager.mergeAndSort(apiEvents, deviceEvents);
|
||||||
|
new Handler(Looper.getMainLooper()).post(() -> {
|
||||||
if (useCache) {
|
currentEvents = merged;
|
||||||
List<CalendarEvent> cached = CacheManager.getCachedCalendarEvents(getContext());
|
checkLoadingComplete();
|
||||||
for (CalendarEvent e : cached) CalendarManager.formatEventForUI(e);
|
|
||||||
currentEvents = CalendarManager.mergeAndSort(cached, deviceEvents);
|
|
||||||
checkLoadingComplete();
|
|
||||||
} else {
|
|
||||||
RetrofitClient.getApiService().getCalendarEvents().enqueue(new Callback<List<CalendarEvent>>() {
|
|
||||||
@Override
|
|
||||||
public void onResponse(Call<List<CalendarEvent>> call, Response<List<CalendarEvent>> response) {
|
|
||||||
List<CalendarEvent> apiEvents = new ArrayList<>();
|
|
||||||
if (response.isSuccessful() && response.body() != null) {
|
|
||||||
apiEvents = response.body();
|
|
||||||
CacheManager.saveCalendarEvents(getContext(), apiEvents);
|
|
||||||
} else {
|
|
||||||
apiEvents = CacheManager.getCachedCalendarEvents(getContext());
|
|
||||||
}
|
|
||||||
for (CalendarEvent e : apiEvents) CalendarManager.formatEventForUI(e);
|
|
||||||
currentEvents = CalendarManager.mergeAndSort(apiEvents, deviceEvents);
|
|
||||||
checkLoadingComplete();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call<List<CalendarEvent>> call, Throwable t) {
|
|
||||||
List<CalendarEvent> cached = CacheManager.getCachedCalendarEvents(getContext());
|
|
||||||
for (CalendarEvent e : cached) CalendarManager.formatEventForUI(e);
|
|
||||||
currentEvents = CalendarManager.mergeAndSort(cached, deviceEvents);
|
|
||||||
checkLoadingComplete();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}).start();
|
||||||
});
|
} else {
|
||||||
} catch (Exception e) {
|
checkLoadingComplete();
|
||||||
checkLoadingCompleteAsync();
|
}
|
||||||
}
|
}
|
||||||
}).start();
|
@Override
|
||||||
}
|
public void onFailure(Call<List<CalendarEvent>> call, Throwable t) {
|
||||||
|
checkLoadingComplete();
|
||||||
private void fetchNewsData(boolean useCache) {
|
|
||||||
if (useCache) {
|
|
||||||
currentNews = CacheManager.getCachedNewsPosts(getContext());
|
|
||||||
formatNewsDates(currentNews);
|
|
||||||
checkLoadingComplete();
|
|
||||||
} else {
|
|
||||||
RetrofitClient.getApiService().getPosts().enqueue(new Callback<List<WpPost>>() {
|
|
||||||
@Override
|
|
||||||
public void onResponse(Call<List<WpPost>> call, Response<List<WpPost>> response) {
|
|
||||||
if (response.isSuccessful() && response.body() != null) {
|
|
||||||
currentNews = response.body();
|
|
||||||
CacheManager.saveNewsPosts(getContext(), currentNews);
|
|
||||||
} else {
|
|
||||||
currentNews = CacheManager.getCachedNewsPosts(getContext());
|
|
||||||
}
|
|
||||||
formatNewsDates(currentNews);
|
|
||||||
checkLoadingComplete();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call<List<WpPost>> call, Throwable t) {
|
|
||||||
currentNews = CacheManager.getCachedNewsPosts(getContext());
|
|
||||||
formatNewsDates(currentNews);
|
|
||||||
checkLoadingComplete();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fetchTaskData(boolean useCache) {
|
|
||||||
// FIKS: Hvis cache er valgt, men listen er tom, hent fra nett!
|
|
||||||
if (useCache) {
|
|
||||||
currentTasks = CacheManager.getTasks(getContext());
|
|
||||||
if (currentTasks.isEmpty()) {
|
|
||||||
fetchTaskData(false); // Rekursivt kall men tvinger nettverk
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
checkLoadingComplete();
|
});
|
||||||
} else {
|
|
||||||
RetrofitClient.getApiService().getTasks().enqueue(new Callback<List<TaskItem>>() {
|
|
||||||
@Override
|
|
||||||
public void onResponse(Call<List<TaskItem>> call, Response<List<TaskItem>> response) {
|
|
||||||
if (response.isSuccessful() && response.body() != null) {
|
|
||||||
currentTasks = response.body();
|
|
||||||
CacheManager.saveTasks(getContext(), currentTasks);
|
|
||||||
} else {
|
|
||||||
currentTasks = CacheManager.getTasks(getContext());
|
|
||||||
}
|
|
||||||
checkLoadingComplete();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void onFailure(Call<List<TaskItem>> call, Throwable t) {
|
|
||||||
currentTasks = CacheManager.getTasks(getContext());
|
|
||||||
checkLoadingComplete();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkLoadingCompleteAsync() {
|
private void fetchNewsData() {
|
||||||
new Handler(Looper.getMainLooper()).post(this::checkLoadingComplete);
|
RetrofitClient.getApiService().getPosts().enqueue(new Callback<List<WpPost>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(Call<List<WpPost>> call, Response<List<WpPost>> response) {
|
||||||
|
if (response.isSuccessful() && response.body() != null) {
|
||||||
|
currentNews = response.body();
|
||||||
|
CacheManager.saveNewsPosts(getContext(), currentNews);
|
||||||
|
formatNewsDates(currentNews);
|
||||||
|
}
|
||||||
|
checkLoadingComplete();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onFailure(Call<List<WpPost>> call, Throwable t) {
|
||||||
|
checkLoadingComplete();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fetchTaskData() {
|
||||||
|
RetrofitClient.getApiService().getTasks().enqueue(new Callback<List<TaskItem>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(Call<List<TaskItem>> call, Response<List<TaskItem>> response) {
|
||||||
|
if (response.isSuccessful() && response.body() != null) {
|
||||||
|
currentTasks = response.body();
|
||||||
|
CacheManager.saveTasks(getContext(), currentTasks);
|
||||||
|
}
|
||||||
|
checkLoadingComplete();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onFailure(Call<List<TaskItem>> call, Throwable t) {
|
||||||
|
checkLoadingComplete();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void formatNewsDates(List<WpPost> posts) {
|
private void formatNewsDates(List<WpPost> posts) {
|
||||||
|
if (posts == null) return;
|
||||||
SimpleDateFormat rawFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());
|
SimpleDateFormat rawFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault());
|
||||||
SimpleDateFormat targetFormat = new SimpleDateFormat("dd. MMM yyyy", Locale.getDefault());
|
SimpleDateFormat targetFormat = new SimpleDateFormat("dd. MMM yyyy", Locale.getDefault());
|
||||||
for (WpPost post : posts) {
|
for (WpPost post : posts) {
|
||||||
try {
|
try {
|
||||||
Date date = rawFormat.parse(post.date);
|
if (post.date != null && post.date.contains("T")) {
|
||||||
post.date = targetFormat.format(date);
|
Date date = rawFormat.parse(post.date);
|
||||||
|
post.date = targetFormat.format(date);
|
||||||
|
}
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void checkLoadingComplete() {
|
private synchronized void checkLoadingComplete() {
|
||||||
activeNetworkCalls--;
|
activeNetworkCalls--;
|
||||||
|
// Oppdater visningen fortløpende så snart data kommer inn
|
||||||
|
buildAndDisplayList();
|
||||||
|
|
||||||
if (activeNetworkCalls <= 0) {
|
if (activeNetworkCalls <= 0) {
|
||||||
activeNetworkCalls = 0;
|
activeNetworkCalls = 0;
|
||||||
timeoutHandler.removeCallbacks(timeoutRunnable);
|
timeoutHandler.removeCallbacks(timeoutRunnable);
|
||||||
|
stopLoaders();
|
||||||
if (mainProgressBar != null) mainProgressBar.setVisibility(View.GONE);
|
|
||||||
if (swipeRefreshLayout != null) swipeRefreshLayout.setRefreshing(false);
|
|
||||||
|
|
||||||
buildAndDisplayList();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -299,21 +266,26 @@ public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickLis
|
||||||
List<Object> items = new ArrayList<>();
|
List<Object> items = new ArrayList<>();
|
||||||
String myEmail = UserManager.getInstance().getUserEmail();
|
String myEmail = UserManager.getInstance().getUserEmail();
|
||||||
|
|
||||||
|
// 1. KALENDER
|
||||||
items.add(new HomeAdapter.SectionTitleItem("Kommende hendelser", HomeAdapter.SectionTitleItem.TYPE_CALENDAR));
|
items.add(new HomeAdapter.SectionTitleItem("Kommende hendelser", HomeAdapter.SectionTitleItem.TYPE_CALENDAR));
|
||||||
String today = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(new Date());
|
String today = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(new Date());
|
||||||
int calCount = 0;
|
int calCount = 0;
|
||||||
for (CalendarEvent e : currentEvents) {
|
if (currentEvents != null) {
|
||||||
if (e.getRawDate() != null && e.getRawDate().compareTo(today) >= 0) {
|
for (CalendarEvent e : currentEvents) {
|
||||||
items.add(e);
|
if (e.getRawDate() != null && e.getRawDate().compareTo(today) >= 0) {
|
||||||
calCount++;
|
items.add(e);
|
||||||
|
calCount++;
|
||||||
|
}
|
||||||
|
if (calCount >= 3) break;
|
||||||
}
|
}
|
||||||
if (calCount >= 3) break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 2. OPPGAVER
|
||||||
items.add(new HomeAdapter.SectionTitleItem("Mine oppgaver", HomeAdapter.SectionTitleItem.TYPE_TASKS));
|
items.add(new HomeAdapter.SectionTitleItem("Mine oppgaver", HomeAdapter.SectionTitleItem.TYPE_TASKS));
|
||||||
List<TaskItem> myActiveTasks = new ArrayList<>();
|
List<TaskItem> myActiveTasks = new ArrayList<>();
|
||||||
if (currentTasks != null) {
|
if (currentTasks != null) {
|
||||||
for (TaskItem t : currentTasks) {
|
for (TaskItem t : currentTasks) {
|
||||||
|
// Vis oppgaver jeg er deltaker i, som ikke er fullført av meg, og ikke helt lukket
|
||||||
if (t.isUserParticipant(myEmail) && !t.getParticipantStatus(myEmail) && !t.isFullyCompleted()) {
|
if (t.isUserParticipant(myEmail) && !t.getParticipantStatus(myEmail) && !t.isFullyCompleted()) {
|
||||||
myActiveTasks.add(t);
|
myActiveTasks.add(t);
|
||||||
}
|
}
|
||||||
|
|
@ -323,16 +295,16 @@ public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickLis
|
||||||
if (myActiveTasks.isEmpty()) {
|
if (myActiveTasks.isEmpty()) {
|
||||||
items.add(new HomeAdapter.EmptyTasksItem());
|
items.add(new HomeAdapter.EmptyTasksItem());
|
||||||
} else {
|
} else {
|
||||||
// NY SORTERING: Med frist først, så uten frist (alfabetisk)
|
// Sortering: Dato (stigende), deretter de uten dato (alfabetisk)
|
||||||
Collections.sort(myActiveTasks, (t1, t2) -> {
|
Collections.sort(myActiveTasks, (t1, t2) -> {
|
||||||
boolean t1HasDate = t1.getDueDate() > 0;
|
boolean t1HasDate = t1.getDueDate() > 0;
|
||||||
boolean t2HasDate = t2.getDueDate() > 0;
|
boolean t2HasDate = t2.getDueDate() > 0;
|
||||||
|
|
||||||
if (t1HasDate && !t2HasDate) return -1; // t1 først
|
if (t1HasDate && !t2HasDate) return -1;
|
||||||
if (!t1HasDate && t2HasDate) return 1; // t2 først
|
if (!t1HasDate && t2HasDate) return 1;
|
||||||
if (!t1HasDate && !t2HasDate) return t1.getTitle().compareToIgnoreCase(t2.getTitle()); // Alfabetisk
|
if (!t1HasDate && !t2HasDate) return t1.getTitle().compareToIgnoreCase(t2.getTitle());
|
||||||
|
|
||||||
return Long.compare(t1.getDueDate(), t2.getDueDate()); // Dato
|
return Long.compare(t1.getDueDate(), t2.getDueDate());
|
||||||
});
|
});
|
||||||
|
|
||||||
for (int i = 0; i < Math.min(myActiveTasks.size(), 3); i++) {
|
for (int i = 0; i < Math.min(myActiveTasks.size(), 3); i++) {
|
||||||
|
|
@ -340,6 +312,7 @@ public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickLis
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. NYHETER
|
||||||
items.add(new HomeAdapter.SectionTitleItem("Siste nytt", HomeAdapter.SectionTitleItem.TYPE_NEWS));
|
items.add(new HomeAdapter.SectionTitleItem("Siste nytt", HomeAdapter.SectionTitleItem.TYPE_NEWS));
|
||||||
if (currentNews != null) {
|
if (currentNews != null) {
|
||||||
items.addAll(currentNews);
|
items.addAll(currentNews);
|
||||||
|
|
@ -349,6 +322,8 @@ public class HomeFragment extends Fragment implements HomeAdapter.OnHomeClickLis
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- NAVIGASJON & KLIKK ---
|
||||||
|
|
||||||
@Override public void onCreateEventClick() { Navigation.findNavController(getView()).navigate(R.id.navigation_create_event); }
|
@Override public void onCreateEventClick() { Navigation.findNavController(getView()).navigate(R.id.navigation_create_event); }
|
||||||
@Override public void onViewAllCalendarClick() { Navigation.findNavController(getView()).navigate(R.id.navigation_calendar_full); }
|
@Override public void onViewAllCalendarClick() { Navigation.findNavController(getView()).navigate(R.id.navigation_calendar_full); }
|
||||||
@Override public void onViewAllNewsClick() { Navigation.findNavController(getView()).navigate(R.id.navigation_news_full); }
|
@Override public void onViewAllNewsClick() { Navigation.findNavController(getView()).navigate(R.id.navigation_news_full); }
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue